[PATCH 0/2] MR4921: kernel32: Implement GetFirmwareType()
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 -- https://gitlab.winehq.org/wine/wine/-/merge_requests/4921
From: Dāvis Mosāns <davispuh(a)gmail.com> Co-authored-by: Daniel Clark <megadjc(a)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 */ -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/4921
From: Dāvis Mosāns <davispuh(a)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; } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/4921
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
participants (2)
-
Dāvis Mosāns -
Marvin