static void WINAPI service_main(DWORD argc, char **argv) { SERVICE_STATUS status; BOOL res; service_ok(argc == 1, "argc = %d", argc); if(argc) service_ok(!strcmp(argv[0], service_name), "argv[0] = %s, expected %s", argv[0], service_name); service_handle = pRegisterServiceCtrlHandlerExA(service_name, service_handler, NULL); service_ok(service_handle != NULL, "RegisterServiceCtrlHandlerEx failed: %u\n", GetLastError()); if(!service_handle) return; status.dwServiceType = SERVICE_WIN32; status.dwCurrentState = SERVICE_RUNNING; status.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN; status.dwWin32ExitCode = 0; status.dwServiceSpecificExitCode = 0; status.dwCheckPoint = 0; status.dwWaitHint = 10000; res = SetServiceStatus(service_handle, &status); service_ok(res, "SetServiceStatus(SERVICE_RUNNING) failed: %u", GetLastError()); service_event("RUNNING"); WaitForSingleObject(service_stop_event, INFINITE); status.dwCurrentState = SERVICE_STOPPED; status.dwControlsAccepted = 0; res = SetServiceStatus(service_handle, &status); service_ok(res, "SetServiceStatus(SERVICE_STOPPED) failed: %u", GetLastError()); }
static DWORD WINAPI service_handler(DWORD ctrl, DWORD event_type, void *event_data, void *context) { SERVICE_STATUS status; status.dwServiceType = SERVICE_WIN32; status.dwControlsAccepted = SERVICE_ACCEPT_STOP; status.dwWin32ExitCode = 0; status.dwServiceSpecificExitCode = 0; status.dwCheckPoint = 0; status.dwWaitHint = 0; switch(ctrl) { case SERVICE_CONTROL_STOP: case SERVICE_CONTROL_SHUTDOWN: service_event("STOP"); status.dwCurrentState = SERVICE_STOP_PENDING; status.dwControlsAccepted = 0; SetServiceStatus(service_handle, &status); SetEvent(service_stop_event); return NO_ERROR; default: status.dwCurrentState = SERVICE_RUNNING; SetServiceStatus( service_handle, &status ); return NO_ERROR; } }
int photon_input_pulse(input_region_data_t *regdat) { static PhEvent_t *event; if (event == NULL) { if ((event = malloc(EVENT_SIZE)) == NULL) { perror("malloc"); return -1; } } switch( PhEventPeek(event, EVENT_SIZE)) { case Ph_EVENT_MSG: if (event->type == Ph_EV_SYSTEM) { system_event(event, regdat); } else if (event->type == Ph_EV_SERVICE) { service_event(event, regdat); } break; case _Ph_SERV_INTERACT: case _Ph_SERV_KEYBOARD: case _Ph_SERV_POINTER: service_message((struct _Ph_msg_forward *) event, regdat); break; case -1: perror( "PhEventPeek failed" ); break; } return (0); }