diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2018-11-05 10:56:42 -0500 |
|---|---|---|
| committer | Andrew Kelley <superjoe30@gmail.com> | 2018-11-05 10:56:42 -0500 |
| commit | f8d6f5daff5ac9b9f69319b9bd827ccc34ea9d72 (patch) | |
| tree | fc0da10e6a69eb167e7d994f348148917c8ef98b /src/windows_sdk.cpp | |
| parent | ce912e29640e0a3b39a5c304c86bdbb5fff67169 (diff) | |
| parent | 973e0abe79abf33cb5e9f4550fe323cb93eb6ee1 (diff) | |
| download | zig-f8d6f5daff5ac9b9f69319b9bd827ccc34ea9d72.tar.gz zig-f8d6f5daff5ac9b9f69319b9bd827ccc34ea9d72.zip | |
Merge remote-tracking branch 'origin/master' into llvm8
Diffstat (limited to 'src/windows_sdk.cpp')
| -rw-r--r-- | src/windows_sdk.cpp | 124 |
1 files changed, 71 insertions, 53 deletions
diff --git a/src/windows_sdk.cpp b/src/windows_sdk.cpp index c6e79f85cd..fd88374311 100644 --- a/src/windows_sdk.cpp +++ b/src/windows_sdk.cpp @@ -13,6 +13,8 @@ #include <inttypes.h> #include <assert.h> +const char *ZIG_WINDOWS_KIT_REG_KEY = "SOFTWARE\\Microsoft\\Windows Kits\\Installed Roots"; + struct ZigWindowsSDKPrivate { ZigWindowsSDK base; }; @@ -179,57 +181,53 @@ com_done:; } static ZigFindWindowsSdkError find_10_version(ZigWindowsSDKPrivate *priv) { - if (priv->base.path10_ptr == nullptr) + if (priv->base.path10_ptr == nullptr) { return ZigFindWindowsSdkErrorNone; - - char sdk_lib_dir[4096]; - int n = snprintf(sdk_lib_dir, 4096, "%s\\Lib\\*", priv->base.path10_ptr); - if (n < 0 || n >= 4096) { - return ZigFindWindowsSdkErrorPathTooLong; } - // enumerate files in sdk path looking for latest version - WIN32_FIND_DATA ffd; - HANDLE hFind = FindFirstFileA(sdk_lib_dir, &ffd); - if (hFind == INVALID_HANDLE_VALUE) { - return ZigFindWindowsSdkErrorNotFound; - } - int v0 = 0, v1 = 0, v2 = 0, v3 = 0; - for (;;) { - if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { - int c0 = 0, c1 = 0, c2 = 0, c3 = 0; - sscanf(ffd.cFileName, "%d.%d.%d.%d", &c0, &c1, &c2, &c3); - if (c0 == 10 && c1 == 0 && c2 == 10240 && c3 == 0) { - // Microsoft released 26624 as 10240 accidentally. - // https://developer.microsoft.com/en-us/windows/downloads/sdk-archive - c2 = 26624; - } - - if ( (c0 > v0) - || (c0 == v0 && c1 > v1) - || (c0 == v0 && c1 == v1 && c2 > v2) - || (c0 == v0 && c1 == v1 && c2 == v2 && c3 > v3) ) { - v0 = c0, v1 = c1, v2 = c2, v3 = c3; - free((void*)priv->base.version10_ptr); - priv->base.version10_ptr = strdup(ffd.cFileName); - if (priv->base.version10_ptr == nullptr) { - FindClose(hFind); - return ZigFindWindowsSdkErrorOutOfMemory; - } - } - } - if (FindNextFile(hFind, &ffd) == 0) { - FindClose(hFind); - break; - } - } - priv->base.version10_len = strlen(priv->base.version10_ptr); + char reg_query[MAX_PATH] = { 0 }; + int n = snprintf(reg_query, MAX_PATH, "%s\\%s.0\\Installed Options", ZIG_WINDOWS_KIT_REG_KEY, priv->base.version10_ptr); + if (n < 0 || n >= MAX_PATH) { + return ZigFindWindowsSdkErrorPathTooLong; + } + + HKEY options_key; + HRESULT rc; + rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, reg_query, 0, + KEY_QUERY_VALUE | KEY_WOW64_32KEY | KEY_ENUMERATE_SUB_KEYS, &options_key); + if (rc != ERROR_SUCCESS) { + return ZigFindWindowsSdkErrorNotFound; + } + + const char *option_name = nullptr; + switch (native_arch) { + case NativeArchArm: + option_name = "OptionId.DesktopCPParm"; + break; + case NativeArchx86_64: + option_name = "OptionId.DesktopCPPx64"; + break; + case NativeArchi386: + option_name = "OptionId.DesktopCPPx86"; + break; + default: + return ZigFindWindowsSdkErrorNotFound; + } + + DWORD val_sz = sizeof(DWORD); + DWORD reg_val = 0; + DWORD type = REG_DWORD; + rc = RegQueryValueEx(options_key, option_name, NULL, &type, (LPBYTE)®_val, &val_sz); + if (rc != ERROR_SUCCESS || reg_val != 1) { + return ZigFindWindowsSdkErrorNotFound; + } return ZigFindWindowsSdkErrorNone; } static ZigFindWindowsSdkError find_81_version(ZigWindowsSDKPrivate *priv) { - if (priv->base.path81_ptr == nullptr) + if (priv->base.path81_ptr == nullptr) { return ZigFindWindowsSdkErrorNone; + } char sdk_lib_dir[4096]; int n = snprintf(sdk_lib_dir, 4096, "%s\\Lib\\winv*", priv->base.path81_ptr); @@ -274,23 +272,32 @@ ZigFindWindowsSdkError zig_find_windows_sdk(struct ZigWindowsSDK **out_sdk) { return ZigFindWindowsSdkErrorOutOfMemory; } - HKEY key; - HRESULT rc; - rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows Kits\\Installed Roots", 0, - KEY_QUERY_VALUE | KEY_WOW64_32KEY | KEY_ENUMERATE_SUB_KEYS, &key); - if (rc != ERROR_SUCCESS) { - zig_free_windows_sdk(&priv->base); - return ZigFindWindowsSdkErrorNotFound; - } + HRESULT rc; + + //note(dimenus): If this key doesn't exist, neither the Win 8 SDK nor the Win 10 SDK is installed + HKEY roots_key; + rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, ZIG_WINDOWS_KIT_REG_KEY, 0, + KEY_QUERY_VALUE | KEY_WOW64_32KEY | KEY_ENUMERATE_SUB_KEYS, &roots_key); + if (rc != ERROR_SUCCESS) { + zig_free_windows_sdk(&priv->base); + return ZigFindWindowsSdkErrorNotFound; + } { + HKEY v10_key; + rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v10.0", 0, + KEY_QUERY_VALUE | KEY_WOW64_32KEY | KEY_ENUMERATE_SUB_KEYS, &v10_key); + if (rc != ERROR_SUCCESS) { + goto find_win10_sdk_done; + } + DWORD tmp_buf_len = MAX_PATH; priv->base.path10_ptr = (const char *)calloc(tmp_buf_len, 1); if (priv->base.path10_ptr == nullptr) { zig_free_windows_sdk(&priv->base); return ZigFindWindowsSdkErrorOutOfMemory; } - rc = RegQueryValueEx(key, "KitsRoot10", NULL, NULL, (LPBYTE)priv->base.path10_ptr, &tmp_buf_len); + rc = RegQueryValueEx(v10_key, "InstallationFolder", NULL, NULL, (LPBYTE)priv->base.path10_ptr, &tmp_buf_len); if (rc == ERROR_SUCCESS) { priv->base.path10_len = tmp_buf_len - 1; if (priv->base.path10_ptr[priv->base.path10_len - 1] == '\\') { @@ -300,7 +307,18 @@ ZigFindWindowsSdkError zig_find_windows_sdk(struct ZigWindowsSDK **out_sdk) { free((void*)priv->base.path10_ptr); priv->base.path10_ptr = nullptr; } + + priv->base.version10_ptr = (const char*)calloc(tmp_buf_len, 1); + rc = RegQueryValueEx(v10_key, "ProductVersion", NULL, NULL, (LPBYTE)priv->base.version10_ptr, &tmp_buf_len); + if (rc == ERROR_SUCCESS) { + snprintf((char*)priv->base.version10_ptr, MAX_PATH, "%s.0", priv->base.version10_ptr); + priv->base.version10_len = tmp_buf_len - 1 + 2; // note(dimenus): Microsoft doesn't include the .0 in the ProductVersion key.... + } else { + free((void*)priv->base.version10_ptr); + priv->base.version10_ptr = nullptr; + } } + find_win10_sdk_done: { DWORD tmp_buf_len = MAX_PATH; priv->base.path81_ptr = (const char *)calloc(tmp_buf_len, 1); @@ -308,7 +326,7 @@ ZigFindWindowsSdkError zig_find_windows_sdk(struct ZigWindowsSDK **out_sdk) { zig_free_windows_sdk(&priv->base); return ZigFindWindowsSdkErrorOutOfMemory; } - rc = RegQueryValueEx(key, "KitsRoot81", NULL, NULL, (LPBYTE)priv->base.path81_ptr, &tmp_buf_len); + rc = RegQueryValueEx(roots_key, "KitsRoot81", NULL, NULL, (LPBYTE)priv->base.path81_ptr, &tmp_buf_len); if (rc == ERROR_SUCCESS) { priv->base.path81_len = tmp_buf_len - 1; if (priv->base.path81_ptr[priv->base.path81_len - 1] == '\\') { |
