Как я могу получить версию сборки Windows 10, номер редакции в WINAPI?

#winapi

#winapi

Вопрос:

Я хочу получить версию сборки в Windows 10 с помощью WINAPI. Текущая версия окна: 10.0.19042.685

Я пытался получить его с помощью запросов WMI.

 select Version, BuildNumber from Win32_OperatingSystem.
-> Version: 10.0.19042, BuildNumber: 19042
 

Я попытался получить его, вызвав RtlGetVersion().

 HMODULE hMod = ::GetModuleHandleW(L"ntdll.dll");
if (hMod) {
    typedef NTSTATUS(WINAPI* RtlGetVersionPtr)(PRTL_OSVERSIONINFOEXW);
    RtlGetVersionPtr fxPtr = (RtlGetVersionPtr)::GetProcAddress(hMod, "RtlGetVersion");
    if (fxPtr != nullptr) {
        RTL_OSVERSIONINFOEXW rovi = { 0 };
        rovi.dwOSVersionInfoSize = sizeof(rovi);
        if (0 == fxPtr(amp;rovi)) {
            printf("dwMajorVersion: %lun", rovi.dwMajorVersion);
            printf("dwMinorVersion: %lun", rovi.dwMinorVersion);
            printf("dwBuildNumber: %lun", rovi.dwBuildNumber);
        }
    }
}

dwMajorVersion: 10
dwMinorVersion: 0
dwBuildNumber: 19042
 

Мне не удалось получить номер редакции с помощью WMI query и RtlGetVerion() API.

Я хочу получить ‘685’ из ‘10.0.19042.685’.

Как я могу получить версию сборки Windows, номер редакции с помощью WINAPI?

Комментарии:

1. Вы проверили GetProductInfo ? Это может быть dwSpMinorVersion поле, которое оно возвращает. У меня нет удобного доступа к машине для тестирования.

2. 19042 — это правильный номер сборки. 685 — это «Обновление версии сборки», которое, насколько я знаю, можно прочитать только из значения реестра HKLMSoftwareMicrosoftWindows NTCurrentVersionUBR .

3. Значения реестра HKLMSoftwareMicrosoftWindows NTCurrentVersionUBR можно легко изменить. Я обнаружил, что версия файла «ntoskrnl.exe » это версия ядра. Спасибо за подсказку.

4. Реестр @snh действительно может быть не самым надежным, но другая информация, такая как удобная для пользователя версия, может быть найдена только там, например ReleaseID . = 2004 под тем же ключом.

5. Бывает ли ситуация, когда номер редакции в версии продукта ntoskrnl.exe не соответствует значению реестра UBR (при условии, что UBR не был изменен)?