static void service_process(void (WINAPI *p_service_main)(DWORD, char **)) { BOOL res; SERVICE_TABLE_ENTRYA servtbl[] = { {service_name, p_service_main}, {NULL, NULL} }; res = WaitNamedPipeA(named_pipe_name, NMPWAIT_USE_DEFAULT_WAIT); if(!res) return; pipe_handle = CreateFileA(named_pipe_name, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if(pipe_handle == INVALID_HANDLE_VALUE) return; service_trace("Starting..."); service_stop_event = CreateEventA(NULL, TRUE, FALSE, NULL); service_ok(service_stop_event != NULL, "Could not create event: %u\n", GetLastError()); if(!service_stop_event) return; res = StartServiceCtrlDispatcherA(servtbl); service_ok(res, "StartServiceCtrlDispatcher failed: %u\n", GetLastError()); /* Let service thread terminate */ Sleep(50); CloseHandle(service_stop_event); CloseHandle(pipe_handle); }
void RunService() // this is the main thread of our injection service // we have to call StartServiceCtrlDispatcher as soon as possible here { SERVICE_TABLE_ENTRY st [2]; ZeroMemory(&st, sizeof(st)); st[0].lpServiceName = CServiceName; st[0].lpServiceProc = &ServiceProc; StartServiceCtrlDispatcherA(st); }
void CNTService::Dispatch(void) { SERVICE_TABLE_ENTRYA ServiceDispatchTable[2]; memset(ServiceDispatchTable, 0, sizeof(SERVICE_TABLE_ENTRYA) * 2); ServiceDispatchTable[0].lpServiceName = (char *) m_ServiceName.GetBuffer(); ServiceDispatchTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTIONA) ServiceMain; if (!StartServiceCtrlDispatcherA(ServiceDispatchTable)) { // report some kind of error to the event log CHandler :: Terminate(GetLastError()); } }
DWORD DoService(void) { char service_name[] = "MSIServer"; const SERVICE_TABLE_ENTRYA service[] = { {service_name, ServiceMain}, {NULL, NULL}, }; WINE_TRACE("Starting MSIServer service\n"); if (!StartServiceCtrlDispatcherA(service)) { fprintf(stderr, "Failed to start MSIServer service\n"); return 1; } return 0; }
static LRESULT CALLBACK WindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { static SERVICE_TABLE_ENTRYA service_table[] = { {server_name, (LPSERVICE_MAIN_FUNCTIONA) ServiceMain}, {NULL, NULL} }; int service_installed; char buf[200], *service_argv[] = {__argv[0], NULL}; POINT pt; HMENU hMenu; switch (msg) { case WM_CREATE: if (__argv[1] != NULL && !strcmp(__argv[1], service_magic_argument)) { start_mongoose(1, service_argv); StartServiceCtrlDispatcherA(service_table); exit(EXIT_SUCCESS); } else { start_mongoose(__argc, __argv); } break; case WM_COMMAND: switch (LOWORD(wParam)) { case ID_QUIT: mg_stop(ctx); Shell_NotifyIconA(NIM_DELETE, &TrayIcon); PostQuitMessage(EXIT_SUCCESS); break; case ID_EDIT_CONFIG: edit_config_file(ctx); break; case ID_INSTALL_SERVICE: case ID_REMOVE_SERVICE: manage_service(LOWORD(wParam)); break; } break; case WM_USER: switch (lParam) { case WM_RBUTTONUP: case WM_LBUTTONUP: case WM_LBUTTONDBLCLK: hMenu = CreatePopupMenu(); AppendMenuA(hMenu, MF_STRING | MF_GRAYED, ID_SEPARATOR, server_name); AppendMenuA(hMenu, MF_SEPARATOR, ID_SEPARATOR, ""); service_installed = manage_service(0); snprintf(buf, sizeof(buf), "NT service: %s installed", service_installed ? "" : "not"); AppendMenuA(hMenu, MF_STRING | MF_GRAYED, ID_SEPARATOR, buf); AppendMenuA(hMenu, MF_STRING | (service_installed ? MF_GRAYED : 0), ID_INSTALL_SERVICE, "Install service"); AppendMenuA(hMenu, MF_STRING | (!service_installed ? MF_GRAYED : 0), ID_REMOVE_SERVICE, "Deinstall service"); AppendMenuA(hMenu, MF_SEPARATOR, ID_SEPARATOR, ""); AppendMenuA(hMenu, MF_STRING, ID_EDIT_CONFIG, "Edit config file"); AppendMenuA(hMenu, MF_STRING, ID_QUIT, "Exit"); GetCursorPos(&pt); SetForegroundWindow(hWnd); TrackPopupMenu(hMenu, 0, pt.x, pt.y, 0, hWnd, NULL); PostMessage(hWnd, WM_NULL, 0, 0); DestroyMenu(hMenu); break; } break; case WM_CLOSE: mg_stop(ctx); Shell_NotifyIconA(NIM_DELETE, &TrayIcon); PostQuitMessage(EXIT_SUCCESS); return 0; // We've just sent our own quit message, with proper hwnd. } return DefWindowProc(hWnd, msg, wParam, lParam); }