#define UNICODE #define WINVER 0x502 #include #include #include #define SERVICE_NAME L"MediaSpy Service" #define SLEEP_TIME 5000 SERVICE_STATUS Status; SERVICE_STATUS_HANDLE hStatus; HDEVNOTIFY hDeviceNotify; FILE* Log; void ServiceMain(); DWORD ControlHandler(DWORD, DWORD, LPVOID, LPVOID); void main() { Log = fopen("C:\\mss.log", "w"); fprintf(Log, "Logging started...\n"); fprintf(Log, "Service executable started...\n"); SERVICE_TABLE_ENTRY ServiceTable[1]; ServiceTable[0].lpServiceName = SERVICE_NAME; ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain; fprintf(Log, "Invoking StartServiceCtrlDispatcher...\n"); StartServiceCtrlDispatcher(ServiceTable); fprintf(Log, "Logging finished!\n"); fclose(Log); } void ServiceMain() { fprintf(Log, "Entering ServiceMain function...\n"); Status.dwServiceType = SERVICE_WIN32_OWN_PROCESS; Status.dwCurrentState = SERVICE_START_PENDING; Status.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN; Status.dwWin32ExitCode = 0; Status.dwServiceSpecificExitCode = 0; Status.dwCheckPoint = 0; Status.dwWaitHint = 0; hStatus = RegisterServiceCtrlHandlerEx( SERVICE_NAME, (LPHANDLER_FUNCTION_EX)ControlHandler, 0 ); fprintf(Log, "RegisterServiceCtrlHandlerEx returned %p\n", hStatus); if(hStatus == (SERVICE_STATUS_HANDLE)0) ; // Error SetServiceStatus(hStatus, &Status); // Some initialization fprintf(Log, "Registering device notification...\n"); DEV_BROADCAST_DEVICEINTERFACE NotificationFilter; hDeviceNotify = NULL; static const GUID GuidDevInterfaceDisk = { 0x53F56307, 0xB6BF, 0x11D0, { 0x94, 0xF2, 0x00, 0xA0, 0xC9, 0x1E, 0xFB, 0x8B } }; ZeroMemory(&NotificationFilter, sizeof(NotificationFilter)); NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE); NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; // NotificationFilter.dbcc_classguid = GuidDevInterfaceDisk; hDeviceNotify = RegisterDeviceNotification( (HANDLE)hStatus, &NotificationFilter, DEVICE_NOTIFY_SERVICE_HANDLE | DEVICE_NOTIFY_ALL_INTERFACE_CLASSES ); fprintf(Log, "RegisterDeviceNotification returned %p\n", hDeviceNotify); if(hDeviceNotify == NULL) ; // Error Status.dwCurrentState = SERVICE_RUNNING; SetServiceStatus(hStatus, &Status); fprintf(Log, "Running...\n"); while(Status.dwCurrentState == SERVICE_RUNNING) { Sleep(SLEEP_TIME); } } DWORD ControlHandler( DWORD dwControl, DWORD dwEventType, LPVOID lpEventData, LPVOID lpContext ) { fprintf(Log, "ControlHandler call with %d:%d\n", dwControl, dwEventType); switch(dwControl) { case SERVICE_CONTROL_STOP: UnregisterDeviceNotification(hDeviceNotify); Status.dwCurrentState = SERVICE_STOPPED; SetServiceStatus(hStatus, &Status); return NO_ERROR; case SERVICE_CONTROL_SHUTDOWN: UnregisterDeviceNotification(hDeviceNotify); Status.dwCurrentState = SERVICE_STOPPED; SetServiceStatus(hStatus, &Status); return NO_ERROR; case SERVICE_CONTROL_DEVICEEVENT: fprintf(Log, "SERVICE_CONTROL_DEVICEEVENT! "); switch(dwEventType) { case DBT_DEVICEARRIVAL: // Handle fprintf(Log, "DBT_DEVICEARRIVAL\n"); break; case DBT_DEVICEREMOVECOMPLETE: fprintf(Log, "DBT_DEVICEREMOVECOMPLETE\n"); // Handle break; } default: fprintf(Log, "Unknown dwControl: %d\n", dwControl); SetServiceStatus(hStatus, &Status); break; } return NO_ERROR; }