Просмотр исходного кода

Merge pull request #758 from zhibog/master

Fixed getting windows version. The former function is no longer worki…
gingerBill 4 лет назад
Родитель
Сommit
6772cb0f3b
3 измененных файлов с 37 добавлено и 29 удалено
  1. 16 17
      core/os/os_windows.odin
  2. 8 0
      core/sys/windows/ntdll.odin
  3. 13 12
      core/sys/windows/types.odin

+ 16 - 17
core/os/os_windows.odin

@@ -160,40 +160,39 @@ _alloc_command_line_arguments :: proc() -> []string {
 	return arg_list;
 }
 
-get_windows_version_ansi :: proc() -> win32.OSVERSIONINFOEXW {
+get_windows_version_w :: proc() -> win32.OSVERSIONINFOEXW {
 	osvi : win32.OSVERSIONINFOEXW;
-	osvi.os_version_info_size = size_of(win32.OSVERSIONINFOEXW);
-    win32.GetVersionExW(&osvi);
+	osvi.dwOSVersionInfoSize = size_of(win32.OSVERSIONINFOEXW);
+    win32.RtlGetVersion(&osvi);
     return osvi;
 }
 
 is_windows_xp :: proc() -> bool {
-	osvi := get_windows_version_ansi();
-	return (osvi.major_version == 5 && osvi.minor_version == 1);
+	osvi := get_windows_version_w();
+	return (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1);
 }
 
 is_windows_vista :: proc() -> bool {
-	osvi := get_windows_version_ansi();
-	return (osvi.major_version == 6 && osvi.minor_version == 0);
+	osvi := get_windows_version_w();
+	return (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0);
 }
 
 is_windows_7 :: proc() -> bool {
-	osvi := get_windows_version_ansi();
-	return (osvi.major_version == 6 && osvi.minor_version == 1);
+	osvi := get_windows_version_w();
+	return (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 1);
 }
 
 is_windows_8 :: proc() -> bool {
-	osvi := get_windows_version_ansi();
-	return (osvi.major_version == 6 && osvi.minor_version == 2);
+	osvi := get_windows_version_w();
+	return (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 2);
 }
 
 is_windows_8_1 :: proc() -> bool {
-	osvi := get_windows_version_ansi();
-	return (osvi.major_version == 6 && osvi.minor_version == 3);
+	osvi := get_windows_version_w();
+	return (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 3);
 }
 
 is_windows_10 :: proc() -> bool {
-	osvi := get_windows_version_ansi();
-	return (osvi.major_version == 10 && osvi.minor_version == 0);
-}
-
+	osvi := get_windows_version_w();
+	return (osvi.dwMajorVersion == 10 && osvi.dwMinorVersion == 0);
+}

+ 8 - 0
core/sys/windows/ntdll.odin

@@ -0,0 +1,8 @@
+package sys_windows
+
+foreign import ntdll_lib "system:ntdll.lib"
+
+@(default_calling_convention="std")
+foreign ntdll_lib {
+    RtlGetVersion :: proc(lpVersionInformation: ^OSVERSIONINFOEXW) -> NTSTATUS ---;
+}

+ 13 - 12
core/sys/windows/types.odin

@@ -36,6 +36,7 @@ ULONG_PTR :: uint;
 DWORD_PTR :: ULONG_PTR;
 ULONG :: c_ulong;
 UCHAR :: BYTE;
+NTSTATUS :: c.long;
 
 PDWORD_PTR :: ^DWORD_PTR;
 ATOM :: distinct WORD;
@@ -721,15 +722,15 @@ SYSTEM_INFO :: struct {
 
 // https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/ns-wdm-_osversioninfoexw
 OSVERSIONINFOEXW :: struct {
-	os_version_info_size: ULONG,
-	major_version:        ULONG,
-	minor_version:        ULONG,
-	build_number:         ULONG,
-	platform_id :         ULONG,
-	service_pack_string:  [128]WCHAR,
-	service_pack_major:   USHORT,
-	service_pack_minor:   USHORT,
-	suite_mask:           USHORT,
-	product_type:         UCHAR,
-	reserved:             UCHAR,
-}
+    dwOSVersionInfoSize: ULONG, 
+    dwMajorVersion:      ULONG,
+    dwMinorVersion:      ULONG,
+    dwBuildNumber:       ULONG,
+    dwPlatformId:        ULONG,
+    szCSDVersion:        [128]WCHAR,
+    wServicePackMajor:   USHORT,
+    wServicePackMinor:   USHORT,
+    wSuiteMask:          USHORT,
+    wProductType:        UCHAR,
+    wReserved:           UCHAR,
+};