| /* |
| * Copyright (c) 2016 The Khronos Group Inc. |
| * |
| * Permission is hereby granted, free of charge, to any person obtaining a copy |
| * of this software source and associated documentation files (the "Materials"), |
| * to deal in the Materials without restriction, including without limitation |
| * the rights to use, copy, modify, compile, merge, publish, distribute, |
| * sublicense, and/or sell copies of the Materials, and to permit persons to |
| * whom the Materials are furnished to do so, subject the following terms and |
| * conditions: |
| * |
| * All modifications to the Materials used to create a binary that is |
| * distributed to third parties shall be provided to Khronos with an |
| * unrestricted license to use for the purposes of implementing bug fixes and |
| * enhancements to the Materials; |
| * |
| * If the binary is used as part of an OpenCL(TM) implementation, whether binary |
| * is distributed together with or separately to that implementation, then |
| * recipient must become an OpenCL Adopter and follow the published OpenCL |
| * conformance process for that implementation, details at: |
| * http://www.khronos.org/conformance/; |
| * |
| * The above copyright notice, the OpenCL trademark license, and this permission |
| * notice shall be included in all copies or substantial portions of the |
| * Materials. |
| * |
| * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
| * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
| * OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS IN |
| * THE MATERIALS. |
| * |
| * OpenCL is a trademark of Apple Inc. used under license by Khronos. |
| */ |
| |
| #include "icd.h" |
| #include "icd_windows_hkr.h" |
| #include <stdio.h> |
| #include <windows.h> |
| #include <winreg.h> |
| |
| static INIT_ONCE initialized = INIT_ONCE_STATIC_INIT; |
| |
| /* |
| * |
| * Vendor enumeration functions |
| * |
| */ |
| |
| // go through the list of vendors in the registry and call khrIcdVendorAdd |
| // for each vendor encountered |
| BOOL CALLBACK khrIcdOsVendorsEnumerate(PINIT_ONCE InitOnce, PVOID Parameter, PVOID *lpContext) |
| { |
| LONG result; |
| const char* platformsName = "SOFTWARE\\Khronos\\OpenCL\\Vendors"; |
| HKEY platformsKey = NULL; |
| DWORD dwIndex; |
| |
| if (!khrIcdOsVendorsEnumerateHKR()) |
| { |
| KHR_ICD_TRACE("Failed to enumerate HKR entries, continuing\n"); |
| } |
| |
| KHR_ICD_TRACE("Opening key HKLM\\%s...\n", platformsName); |
| result = RegOpenKeyExA( |
| HKEY_LOCAL_MACHINE, |
| platformsName, |
| 0, |
| KEY_READ, |
| &platformsKey); |
| if (ERROR_SUCCESS != result) |
| { |
| KHR_ICD_TRACE("Failed to open platforms key %s, continuing\n", platformsName); |
| return FALSE; |
| } |
| |
| // for each value |
| for (dwIndex = 0;; ++dwIndex) |
| { |
| char cszLibraryName[1024] = {0}; |
| DWORD dwLibraryNameSize = sizeof(cszLibraryName); |
| DWORD dwLibraryNameType = 0; |
| DWORD dwValue = 0; |
| DWORD dwValueSize = sizeof(dwValue); |
| |
| // read the value name |
| KHR_ICD_TRACE("Reading value %d...\n", dwIndex); |
| result = RegEnumValueA( |
| platformsKey, |
| dwIndex, |
| cszLibraryName, |
| &dwLibraryNameSize, |
| NULL, |
| &dwLibraryNameType, |
| (LPBYTE)&dwValue, |
| &dwValueSize); |
| // if RegEnumKeyEx fails, we are done with the enumeration |
| if (ERROR_SUCCESS != result) |
| { |
| KHR_ICD_TRACE("Failed to read value %d, done reading key.\n", dwIndex); |
| break; |
| } |
| KHR_ICD_TRACE("Value %s found...\n", cszLibraryName); |
| |
| // Require that the value be a DWORD and equal zero |
| if (REG_DWORD != dwLibraryNameType) |
| { |
| KHR_ICD_TRACE("Value not a DWORD, skipping\n"); |
| continue; |
| } |
| if (dwValue) |
| { |
| KHR_ICD_TRACE("Value not zero, skipping\n"); |
| continue; |
| } |
| |
| // add the library |
| khrIcdVendorAdd(cszLibraryName); |
| } |
| |
| result = RegCloseKey(platformsKey); |
| if (ERROR_SUCCESS != result) |
| { |
| KHR_ICD_TRACE("Failed to close platforms key %s, ignoring\n", platformsName); |
| } |
| |
| return TRUE; |
| } |
| |
| // go through the list of vendors only once |
| void khrIcdOsVendorsEnumerateOnce() |
| { |
| InitOnceExecuteOnce(&initialized, khrIcdOsVendorsEnumerate, NULL, NULL); |
| } |
| |
| /* |
| * |
| * Dynamic library loading functions |
| * |
| */ |
| |
| // dynamically load a library. returns NULL on failure |
| void *khrIcdOsLibraryLoad(const char *libraryName) |
| { |
| return (void *)LoadLibraryA(libraryName); |
| } |
| |
| // get a function pointer from a loaded library. returns NULL on failure. |
| void *khrIcdOsLibraryGetFunctionAddress(void *library, const char *functionName) |
| { |
| if (!library || !functionName) |
| { |
| return NULL; |
| } |
| return GetProcAddress( (HMODULE)library, functionName); |
| } |
| |
| // unload a library. |
| void khrIcdOsLibraryUnload(void *library) |
| { |
| FreeLibrary( (HMODULE)library); |
| } |
| |