This MR implements [GetFirmwareType()](https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-getfi...) and `NtQuerySystemInformation(SystemBootEnvironmentInformation)` functions which currently don't have real implementation.
For more context/background info see !4832
From: Dāvis Mosāns davispuh@gmail.com
Co-authored-by: Daniel Clark megadjc@gmail.com Co-authored-by: Haltinulo --- dlls/ntdll/unix/system.c | 29 +++++++++++++++++++++++++++++ include/winternl.h | 11 +++++++++++ 2 files changed, 40 insertions(+)
diff --git a/dlls/ntdll/unix/system.c b/dlls/ntdll/unix/system.c index 879a5893758..52d27c7c472 100644 --- a/dlls/ntdll/unix/system.c +++ b/dlls/ntdll/unix/system.c @@ -3261,6 +3261,35 @@ NTSTATUS WINAPI NtQuerySystemInformation( SYSTEM_INFORMATION_CLASS class, case SystemCpuSetInformation: /* 175 */ return NtQuerySystemInformationEx(class, NULL, 0, info, size, ret_size);
+ case SystemBootEnvironmentInformation: + { + PSYSTEM_BOOT_ENVIRONMENT_INFORMATION result; + + len = sizeof(SYSTEM_BOOT_ENVIRONMENT_INFORMATION); + if (size >= sizeof(SYSTEM_BOOT_ENVIRONMENT_V1)) + { + if (!info) ret = STATUS_ACCESS_VIOLATION; + else + { + result = (PSYSTEM_BOOT_ENVIRONMENT_INFORMATION)info; + get_system_uuid(&result->BootIdentifier); + + if (access("/sys/firmware/efi", F_OK) == 0) + { + result->FirmwareType = FirmwareTypeUefi; + } else + { + result->FirmwareType = FirmwareTypeBios; + } + + if (size >= len) result->BootFlags = 0; + else len = sizeof(SYSTEM_BOOT_ENVIRONMENT_V1); + } + } + else ret = STATUS_INFO_LENGTH_MISMATCH; + break; + } + /* Wine extensions */
case SystemWineVersionInformation: /* 1000 */ diff --git a/include/winternl.h b/include/winternl.h index b551e404fc9..917988a69dd 100644 --- a/include/winternl.h +++ b/include/winternl.h @@ -2644,6 +2644,17 @@ typedef struct _SYSTEM_CPU_INFORMATION { ULONG ProcessorFeatureBits; } SYSTEM_CPU_INFORMATION, *PSYSTEM_CPU_INFORMATION;
+typedef struct _SYSTEM_BOOT_ENVIRONMENT_V1 { + GUID BootIdentifier; + FIRMWARE_TYPE FirmwareType; +} SYSTEM_BOOT_ENVIRONMENT_V1, *PSYSTEM_BOOT_ENVIRONMENT_V1; + +typedef struct _SYSTEM_BOOT_ENVIRONMENT_INFORMATION { + GUID BootIdentifier; + FIRMWARE_TYPE FirmwareType; + ULONGLONG BootFlags; +} SYSTEM_BOOT_ENVIRONMENT_INFORMATION, *PSYSTEM_BOOT_ENVIRONMENT_INFORMATION; + /* definitions of bits in the Feature set for the x86 processors */ #define CPU_FEATURE_VME 0x00000005 /* Virtual 86 Mode Extensions */ #define CPU_FEATURE_TSC 0x00000002 /* Time Stamp Counter available */
From: Dāvis Mosāns davispuh@gmail.com
--- dlls/kernel32/process.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c index d56118a0fe3..9345f867f51 100644 --- a/dlls/kernel32/process.c +++ b/dlls/kernel32/process.c @@ -753,10 +753,17 @@ BOOL WINAPI SetFirmwareEnvironmentVariableW(const WCHAR *name, const WCHAR *guid */ BOOL WINAPI GetFirmwareType(FIRMWARE_TYPE *type) { + SYSTEM_BOOT_ENVIRONMENT_INFORMATION info; + if (!type) return FALSE;
- *type = FirmwareTypeUnknown; + if (NtQuerySystemInformation(SystemBootEnvironmentInformation, &info, sizeof(info), NULL) != STATUS_SUCCESS) + { + return FALSE; + } + + *type = info.FirmwareType; return TRUE; }
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=142299
Your paranoid android.
=== debian11 (build log) ===
../wine/dlls/kernel32/process.c:756:5: error: unknown type name ���SYSTEM_BOOT_ENVIRONMENT_INFORMATION���; did you mean ���SYSTEM_LOOKASIDE_INFORMATION���? ../wine/dlls/kernel32/process.c:766:17: error: request for member ���FirmwareType��� in something not a structure or union Task: The win32 Wine build failed
=== debian11b (build log) ===
../wine/dlls/kernel32/process.c:756:5: error: unknown type name ���SYSTEM_BOOT_ENVIRONMENT_INFORMATION���; did you mean ���SYSTEM_LOOKASIDE_INFORMATION���? ../wine/dlls/kernel32/process.c:766:17: error: request for member ���FirmwareType��� in something not a structure or union Task: The wow64 Wine build failed