// Creates a dummy window for behind-the-scenes work // static HWND createHelperWindow(void) { HWND window = CreateWindowExW(WS_EX_OVERLAPPEDWINDOW, _GLFW_WNDCLASSNAME, L"GLFW helper window", WS_CLIPSIBLINGS | WS_CLIPCHILDREN, 0, 0, 1, 1, HWND_MESSAGE, NULL, GetModuleHandleW(NULL), NULL); if (!window) { _glfwInputError(GLFW_PLATFORM_ERROR, "Win32: Failed to create helper window"); return NULL; } // Register for HID device notifications { DEV_BROADCAST_DEVICEINTERFACE_W dbi; ZeroMemory(&dbi, sizeof(dbi)); dbi.dbcc_size = sizeof(dbi); dbi.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; dbi.dbcc_classguid = GUID_DEVINTERFACE_HID; RegisterDeviceNotificationW(window, (DEV_BROADCAST_HDR*) &dbi, DEVICE_NOTIFY_WINDOW_HANDLE); } return window; }
BOOL RegisterForDeviceNotifications() { DEV_BROADCAST_DEVICEINTERFACE notification_filter; const GUID wdmaud_guid = {STATIC_KSCATEGORY_AUDIO}; ZeroMemory(¬ification_filter, sizeof(notification_filter)); notification_filter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE); notification_filter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; notification_filter.dbcc_classguid = wdmaud_guid; device_notification_handle = RegisterDeviceNotificationW((HANDLE) service_status_handle, ¬ification_filter, DEVICE_NOTIFY_SERVICE_HANDLE /* | DEVICE_NOTIFY_ALL_INTERFACE_CLASSES*/); if ( ! device_notification_handle ) { logmsg("RegisterDeviceNotification() failed with error %d\n", GetLastError()); } return ( device_notification_handle != NULL ); }
/*********************************************************************** * RegisterDeviceNotificationA (USER32.@) */ HDEVNOTIFY WINAPI RegisterDeviceNotificationA( HANDLE hnd, LPVOID notifyfilter, DWORD flags ) { FIXME_(win32)("Not converting strings in notifyfilter(%p) to WCHAR\n"); HDEVNOTIFY result = RegisterDeviceNotificationW( hnd, notifyfilter, flags ); return result; }
HDEVNOTIFY CEnumerator::GetRegisteredDevNotify(HANDLE HidDeviceObject) { DEV_BROADCAST_HANDLE NotificationFilter; memset(&NotificationFilter, 0, sizeof(DEV_BROADCAST_HANDLE)); NotificationFilter.dbch_size = sizeof(DEV_BROADCAST_HANDLE); NotificationFilter.dbch_devicetype = 6; NotificationFilter.dbch_handle = HidDeviceObject; return RegisterDeviceNotificationW(m_hEnumNotifWnd, &NotificationFilter, 0); }
// Creates a dummy window for behind-the-scenes work // static GLFWbool createHelperWindow(void) { MSG msg; _glfw.win32.helperWindowHandle = CreateWindowExW(WS_EX_OVERLAPPEDWINDOW, _GLFW_WNDCLASSNAME, L"GLFW message window", WS_CLIPSIBLINGS | WS_CLIPCHILDREN, 0, 0, 1, 1, NULL, NULL, GetModuleHandleW(NULL), NULL); if (!_glfw.win32.helperWindowHandle) { _glfwInputErrorWin32(GLFW_PLATFORM_ERROR, "Win32: Failed to create helper window"); return GLFW_FALSE; } // HACK: The command to the first ShowWindow call is ignored if the parent // process passed along a STARTUPINFO, so clear that with a no-op call ShowWindow(_glfw.win32.helperWindowHandle, SW_HIDE); // Register for HID device notifications { DEV_BROADCAST_DEVICEINTERFACE_W dbi; ZeroMemory(&dbi, sizeof(dbi)); dbi.dbcc_size = sizeof(dbi); dbi.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; dbi.dbcc_classguid = GUID_DEVINTERFACE_HID; _glfw.win32.deviceNotificationHandle = RegisterDeviceNotificationW(_glfw.win32.helperWindowHandle, (DEV_BROADCAST_HDR*) &dbi, DEVICE_NOTIFY_WINDOW_HANDLE); } while (PeekMessageW(&msg, _glfw.win32.helperWindowHandle, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessageW(&msg); } return GLFW_TRUE; }
VOID WINAPI ServiceStart(DWORD argc, LPTSTR *argv) { if (!SetSecurityPrivilage(TRUE)) { DebugOut("Failed to get privilage!\n"); return; } if (!InitFunctions()) { DebugOut("Failed to init functions!\n"); return; } ObjectPrefix = DEFAULT_OBJECT_PREFIX; ObjectPrefixLength = wcslen(ObjectPrefix); if (!GetSidByName(AccountName, &gpSid, &gSidLength)) { DebugOut("GetSidByName(%S, ...) failed!\n", AccountName); return; } ServiceStatus.dwServiceType = SERVICE_WIN32; ServiceStatus.dwCurrentState = SERVICE_START_PENDING; ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP; ServiceStatus.dwWin32ExitCode = 0; ServiceStatus.dwServiceSpecificExitCode = 0; ServiceStatus.dwCheckPoint = 0; ServiceStatus.dwWaitHint = 0; hServiceStatus = RegisterServiceCtrlHandlerExW(SERVICE_NAME, ServiceCtrlHandlerEx, NULL); if (hServiceStatus == (SERVICE_STATUS_HANDLE)0) { DebugOut("RegisterServiceCtrlHandlerW failed! (LastError=0x%x)\n", GetLastError()); return; } DEV_BROADCAST_DEVICEINTERFACE NotificationFilter; ZeroMemory(&NotificationFilter, sizeof(NotificationFilter)); NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE); NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; hDevNotify = RegisterDeviceNotificationW(hServiceStatus, &NotificationFilter, DEVICE_NOTIFY_SERVICE_HANDLE | DEVICE_NOTIFY_ALL_INTERFACE_CLASSES); if (!SetServiceStatus(hServiceStatus, &ServiceStatus)) { // Send current status. DebugOut("SetServiceStatus failed! (LastError=0x%x)\n", GetLastError()); } ScanApplyObjectsRules(); }
// Creates a dummy window for behind-the-scenes work // static HWND createHelperWindow(void) { HWND window = CreateWindowExW(WS_EX_OVERLAPPEDWINDOW, _GLFW_WNDCLASSNAME, L"GLFW helper window", WS_CLIPSIBLINGS | WS_CLIPCHILDREN, 0, 0, 1, 1, HWND_MESSAGE, NULL, GetModuleHandleW(NULL), NULL); if (!window) { _glfwInputError(GLFW_PLATFORM_ERROR, "Win32: Failed to create helper window"); return NULL; } // HACK: The first call to ShowWindow is ignored if the parent process // passed along a STARTUPINFO, so clear that flag with a no-op call ShowWindow(window, SW_HIDE); // Register for HID device notifications { DEV_BROADCAST_DEVICEINTERFACE_W dbi; ZeroMemory(&dbi, sizeof(dbi)); dbi.dbcc_size = sizeof(dbi); dbi.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; dbi.dbcc_classguid = GUID_DEVINTERFACE_HID; RegisterDeviceNotificationW(window, (DEV_BROADCAST_HDR*) &dbi, DEVICE_NOTIFY_WINDOW_HANDLE); } return window; }