|
|
/*++
Copyright (c) 1997-1999 Microsoft Corporation
Module Name:
wmiexe.c
Abstract: WMI exe scaffolding
Author:
16-Jan-1997 AlanWar
Revision History:
--*/
#include "wmiump.h"
#if DBG
BOOLEAN WmipLoggingEnabled; #endif
#ifdef MEMPHIS
typedef (*RSPAPI)(DWORD, DWORD); #define RSP_SIMPLE_SERVICE 1
#define RSP_UNREGISTER_SERVICE 0
int WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ULONG Status; HMODULE Module; RSPAPI RspApi; HANDLE HackEvent; HANDLE EventHandle;
HackEvent = CreateEvent(NULL, TRUE, FALSE, "WMI_UNIQUE_EVENT_NAME"); if (HackEvent == NULL) { Status = GetLastError(); WmipDebugPrint(("WMI: Couldn't create WMI_UNIQUE_EVENT_NAME %d\n", Status)); return(Status); } if ((HackEvent != NULL) && (GetLastError() == ERROR_ALREADY_EXISTS)) { CloseHandle(HackEvent); WmipDebugPrint(("WMI: Previous instance of WMIEXE running, exiting...\n")); #ifndef RUN_AS_SERVICE
MessageBox(NULL, "Another copy of WMIEXE.EXE is already running\n", "WMI", MB_OK); #endif
return(0); } Status = WmiInitializeService(); if (Status != ERROR_SUCCESS) { WmipDebugPrint(("WMI: WmiInitializeService failed %d\n", Status)); } else { EventHandle = (HANDLE)atoi(lpCmdLine); if (EventHandle != NULL) { SetEvent(EventHandle); CloseHandle(EventHandle); } #ifdef RUN_AS_SERVICE
Module = GetModuleHandle("Kernel32"); if (Module == NULL) { WmipDebugPrint(("WMI: Kernel32 not loaded\n")); return(GetLastError()); } RspApi = (RSPAPI)GetProcAddress(Module, "RegisterServiceProcess"); if (RspApi == NULL) { WmipDebugPrint(("WMI: RspApi not loaded\n")); return(GetLastError()); }
(*RspApi)(GetCurrentProcessId(), RSP_SIMPLE_SERVICE); #endif
Status = WmiRunService( 0 #ifdef MEMPHIS
, hInstance #endif
);
if (Status != ERROR_SUCCESS) { WmipDebugPrint(("WMI: WmiRunService failed %d\n", Status)); } WmiDeinitializeService(); } CloseHandle(HackEvent); return(Status); } #else
void WmiServiceMain( DWORD argc, LPWSTR *argv );
void WmiServiceCtrlHandler( DWORD Opcode );
SERVICE_STATUS WmiServiceStatus; SERVICE_STATUS_HANDLE WmiServiceStatusHandle;
int _cdecl main(int argc, WCHAR *argv[]) { #ifdef RUN_AS_SERVICE
SERVICE_TABLE_ENTRY DispatchTable[] = { { L"Wmi", WmiServiceMain }, { NULL, NULL } }; if (!StartServiceCtrlDispatcher( DispatchTable)) { WmipDebugPrint(("WMI: StartServiceCtrlDispatcher error = %d\n", GetLastError())); } return(0); #else
DWORD Status; //
// Initialize the WMI service
Status = WmiInitializeService(); if (Status != ERROR_SUCCESS) { return(Status); } //
// All set to start doing the real work of the service
Status = WmiRunService(0);
WmiDeinitializeService();
return(Status); #endif
}
void WmiServiceMain(DWORD argc, LPWSTR *argv) { DWORD Status; WmiServiceStatus.dwServiceType = SERVICE_WIN32; WmiServiceStatus.dwCurrentState = SERVICE_START_PENDING; WmiServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP; WmiServiceStatus.dwWin32ExitCode = 0; WmiServiceStatus.dwServiceSpecificExitCode = 0; WmiServiceStatus.dwCheckPoint = 0; WmiServiceStatus.dwWaitHint = 0; WmiServiceStatusHandle = RegisterServiceCtrlHandler(L"Wmi", WmiServiceCtrlHandler); if (WmiServiceStatusHandle == (SERVICE_STATUS_HANDLE)NULL) { WmipDebugPrint(("WMI: RegisterServiceCtrlHandler failed %d\n", GetLastError())); return; } //
// Initialize the WMI service
Status = WmiInitializeService(); if (Status != ERROR_SUCCESS) { //
// If an error occurs we just stop ourselves
WmiServiceStatus.dwCurrentState = SERVICE_STOPPED; WmiServiceStatus.dwCheckPoint = 0; WmiServiceStatus.dwWaitHint = 0; WmiServiceStatus.dwWin32ExitCode = Status; WmiServiceStatus.dwServiceSpecificExitCode = Status; SetServiceStatus (WmiServiceStatusHandle, &WmiServiceStatus); return; } // Initialization complete - report running status.
WmiServiceStatus.dwCurrentState = SERVICE_RUNNING; WmiServiceStatus.dwCheckPoint = 0; WmiServiceStatus.dwWaitHint = 0; if (!SetServiceStatus (WmiServiceStatusHandle, &WmiServiceStatus)) { Status = GetLastError(); WmipDebugPrint(("WMI: SetServiceStatus error %ld\n",Status)); }
//
// All set to start doing the real work of the service
Status = WmiRunService(0);
WmiDeinitializeService();
WmiServiceStatus.dwCurrentState = SERVICE_STOPPED; WmiServiceStatus.dwCheckPoint = 0; WmiServiceStatus.dwWaitHint = 0; WmiServiceStatus.dwWin32ExitCode = Status; WmiServiceStatus.dwServiceSpecificExitCode = Status; SetServiceStatus (WmiServiceStatusHandle, &WmiServiceStatus); return; }
void WmiServiceCtrlHandler (DWORD Opcode) { ULONG Status; switch(Opcode) { case SERVICE_CONTROL_PAUSE: { WmipDebugPrint(("WMI: service does not support Pause\n")); break; } case SERVICE_CONTROL_CONTINUE: { WmipDebugPrint(("WMI: service does not support Continue\n")); break; } case SERVICE_CONTROL_STOP: { // TODO: Do something to stop main service thread
WmiServiceStatus.dwWin32ExitCode = 0; WmiServiceStatus.dwCurrentState = SERVICE_STOP_PENDING; WmiServiceStatus.dwCheckPoint = 0; WmiServiceStatus.dwWaitHint = 0; if (!SetServiceStatus (WmiServiceStatusHandle, &WmiServiceStatus)) { Status = GetLastError(); WmipDebugPrint(("WMI: SetServiceStatus error %ld\n", Status)); }
WmiTerminateService(); WmipDebugPrint(("WMI: Leaving Service\n")); return; } case SERVICE_CONTROL_INTERROGATE: { // Fall through to send current status.
break; } default: { WmipDebugPrint(("WMI: Unrecognized opcode %ld\n", Opcode)); break; } }
//
// Send current status.
if (!SetServiceStatus (WmiServiceStatusHandle, &WmiServiceStatus)) { Status = GetLastError(); WmipDebugPrint(("WMI: SetServiceStatus error %ld\n",Status)); } return; }
#endif
#ifdef MEMPHIS
#if DBG
void __cdecl DebugOut(char *Format, ...) { char Buffer[1024]; va_list pArg; ULONG i; va_start(pArg, Format); i = _vsnprintf(Buffer, sizeof(Buffer), Format, pArg); OutputDebugString(Buffer); } #endif
#endif
|