This MR implements `EnumSystemFirmwareTables()` and `NtQuerySystemInformation(SystemFirmwareTableInformation)` with `SystemFirmwareTable_Enumerate` which are currently not implemented.
For more context/background info see !4832
From: Dāvis Mosāns davispuh@gmail.com
Co-authored-by: Haltinulo --- dlls/ntdll/unix/system.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+)
diff --git a/dlls/ntdll/unix/system.c b/dlls/ntdll/unix/system.c index 879a5893758..c4bec068f5e 100644 --- a/dlls/ntdll/unix/system.c +++ b/dlls/ntdll/unix/system.c @@ -1617,6 +1617,32 @@ static void get_system_uuid( GUID *uuid ) } }
+static NTSTATUS enum_firmware_info( SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti, ULONG available_len, + ULONG *required_len ) { + switch (sfti->ProviderSignature) + { + case RSMB: + { + char *buffer = (char*)sfti->TableBuffer; + *required_len = 4; + sfti->TableBufferLength = *required_len; + *required_len += FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer); + if (available_len < *required_len) + return STATUS_BUFFER_TOO_SMALL; + memset(buffer, 0, 4); + return STATUS_SUCCESS; + } + case FIRM: + { + /* on UEFI systems this is expected result */ + return STATUS_NOT_IMPLEMENTED; + } + default: + FIXME("info_class SYSTEM_FIRMWARE_TABLE_INFORMATION provider %08x\n", (int)sfti->ProviderSignature); + return STATUS_NOT_IMPLEMENTED; + } +} + static NTSTATUS get_firmware_info( SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti, ULONG available_len, ULONG *required_len ) { @@ -1882,6 +1908,13 @@ static NTSTATUS get_firmware_info( SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti, ULON
#else
+static NTSTATUS enum_firmware_info( SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti, ULONG available_len, + ULONG *required_len ) { + FIXME("info_class SYSTEM_FIRMWARE_TABLE_INFORMATION\n"); + sfti->TableBufferLength = 0; + return STATUS_NOT_IMPLEMENTED; +} + static NTSTATUS get_firmware_info( SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti, ULONG available_len, ULONG *required_len ) { @@ -3148,6 +3181,11 @@ NTSTATUS WINAPI NtQuerySystemInformation( SYSTEM_INFORMATION_CLASS class,
switch (sfti->Action) { + case SystemFirmwareTable_Enumerate: + { + ret = enum_firmware_info(sfti, size, &len); + break; + } case SystemFirmwareTable_Get: ret = get_firmware_info(sfti, size, &len); break;
From: Dāvis Mosāns davispuh@gmail.com
Co-authored-by: Haltinulo --- dlls/kernelbase/memory.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-)
diff --git a/dlls/kernelbase/memory.c b/dlls/kernelbase/memory.c index 4f4bba9a13b..f424fc49c4d 100644 --- a/dlls/kernelbase/memory.c +++ b/dlls/kernelbase/memory.c @@ -1663,8 +1663,27 @@ BOOL WINAPI GetXStateFeaturesMask( CONTEXT *context, DWORD64 *feature_mask ) */ UINT WINAPI EnumSystemFirmwareTables( DWORD provider, void *buffer, DWORD size ) { - FIXME( "(0x%08lx, %p, %ld)\n", provider, buffer, size ); - return 0; + SYSTEM_FIRMWARE_TABLE_INFORMATION *info; + ULONG buffer_size = offsetof( SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer ) + size; + + TRACE( "(0x%08lx, %p, %ld)\n", provider, buffer, size ); + + if (!(info = RtlAllocateHeap( GetProcessHeap(), 0, buffer_size ))) + { + SetLastError( ERROR_OUTOFMEMORY ); + return 0; + } + + info->ProviderSignature = provider; + info->Action = SystemFirmwareTable_Enumerate; + + set_ntstatus( NtQuerySystemInformation( SystemFirmwareTableInformation, + info, buffer_size, &buffer_size )); + buffer_size -= offsetof( SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer ); + if (buffer_size <= size) memcpy( buffer, info->TableBuffer, buffer_size ); + + HeapFree( GetProcessHeap(), 0, info ); + return buffer_size; }
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 tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=141842
Your paranoid android.
=== debian11 (32 bit report) ===
ntdll: info.c:1567: Test failed: Expected length 0, got 16
=== debian11b (64 bit WoW report) ===
ntdll: info.c:1567: Test failed: Expected length 0, got 16