/* Wine Vulkan ICD implementation * * Copyright 2017 Roderick Colenbrander * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include "windef.h" #include "winbase.h" #include "winreg.h" #include "winuser.h" #include "vulkan_private.h" WINE_DEFAULT_DEBUG_CHANNEL(vulkan); static HINSTANCE hinstance; BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, void *reserved) { TRACE("%p, %u, %p\n", hinst, reason, reserved); switch (reason) { case DLL_PROCESS_ATTACH: hinstance = hinst; DisableThreadLibraryCalls(hinst); break; } return TRUE; } static const WCHAR winevulkan_json_resW[] = {'w','i','n','e','v','u','l','k','a','n','_','j','s','o','n',0}; static const WCHAR winevulkan_json_pathW[] = {'\\','w','i','n','e','v','u','l','k','a','n','.','j','s','o','n',0}; static const WCHAR vulkan_driversW[] = {'S','o','f','t','w','a','r','e','\\','K','h','r','o','n','o','s','\\', 'V','u','l','k','a','n','\\','D','r','i','v','e','r','s',0}; HRESULT WINAPI DllRegisterServer(void) { WCHAR json_path[MAX_PATH]; HRSRC rsrc; const char *data; DWORD datalen, written, zero = 0; HANDLE file; HKEY key; /* Create the JSON manifest and registry key to register this ICD with the official Vulkan loader. */ TRACE("\n"); rsrc = FindResourceW(hinstance, winevulkan_json_resW, (const WCHAR *)RT_RCDATA); data = LockResource(LoadResource(hinstance, rsrc)); datalen = SizeofResource(hinstance, rsrc); GetSystemDirectoryW(json_path, ARRAY_SIZE(json_path)); lstrcatW(json_path, winevulkan_json_pathW); file = CreateFileW(json_path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (file == INVALID_HANDLE_VALUE) { ERR("Unable to create JSON manifest.\n"); return E_UNEXPECTED; } WriteFile(file, data, datalen, &written, NULL); CloseHandle(file); if (!RegCreateKeyExW(HKEY_LOCAL_MACHINE, vulkan_driversW, 0, NULL, 0, KEY_SET_VALUE, NULL, &key, NULL)) { RegSetValueExW(key, json_path, 0, REG_DWORD, (const BYTE *)&zero, sizeof(zero)); RegCloseKey(key); } return S_OK; } HRESULT WINAPI DllUnregisterServer(void) { WCHAR json_path[MAX_PATH]; HKEY key; /* Remove the JSON manifest and registry key */ TRACE("\n"); GetSystemDirectoryW(json_path, ARRAY_SIZE(json_path)); lstrcatW(json_path, winevulkan_json_pathW); DeleteFileW(json_path); if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, vulkan_driversW, 0, KEY_SET_VALUE, &key) == ERROR_SUCCESS) { RegDeleteValueW(key, json_path); RegCloseKey(key); } return S_OK; }