Signed-off-by: Alex Henrie alexhenrie24@gmail.com --- include/winternl.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)
diff --git a/include/winternl.h b/include/winternl.h index 58c475dfff..6e0bd987b6 100644 --- a/include/winternl.h +++ b/include/winternl.h @@ -1579,6 +1579,23 @@ typedef struct _SYSTEM_TIME_ADJUSTMENT { BOOLEAN TimeAdjustmentDisabled; } SYSTEM_TIME_ADJUSTMENT, *PSYSTEM_TIME_ADJUSTMENT;
+typedef enum _SYSTEM_FIRMWARE_TABLE_ACTION +{ + SystemFirmwareTable_Enumerate = 0, + SystemFirmwareTable_Get = 1 +} SYSTEM_FIRMWARE_TABLE_ACTION, *PSYSTEM_FIRMWARE_TABLE_ACTION; + +/* System Information Class 0x4C */ + +typedef struct _SYSTEM_FIRMWARE_TABLE_INFORMATION +{ + ULONG ProviderSignature; + SYSTEM_FIRMWARE_TABLE_ACTION Action; + ULONG TableID; + ULONG TableBufferLength; + UCHAR TableBuffer[1]; +} SYSTEM_FIRMWARE_TABLE_INFORMATION, *PSYSTEM_FIRMWARE_TABLE_INFORMATION; + typedef struct _TIME_FIELDS { CSHORT Year; CSHORT Month;
Signed-off-by: Alex Henrie alexhenrie24@gmail.com --- dlls/ntdll/tests/info.c | 48 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+)
diff --git a/dlls/ntdll/tests/info.c b/dlls/ntdll/tests/info.c index 6c93c3cd58..cdb91e1b73 100644 --- a/dlls/ntdll/tests/info.c +++ b/dlls/ntdll/tests/info.c @@ -54,6 +54,11 @@ static DWORD one_before_last_pid = 0; } \ } while(0)
+/* Firmware table providers */ +#define ACPI 0x41435049 +#define FIRM 0x4649524D +#define RSMB 0x52534D42 + static BOOL InitFunctionPtrs(void) { /* All needed functions are NT based, so using GetModuleHandle is a good check */ @@ -826,6 +831,45 @@ static void test_query_logicalprocex(void) } }
+static void test_query_firmware(void) +{ + ULONG len1, len2; + NTSTATUS status; + SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 16); + + ok(!!sfti, "Failed to allocate memory\n"); + + status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 15, &len1); +todo_wine + ok(status == STATUS_INFO_LENGTH_MISMATCH, "Expected STATUS_INFO_LENGTH_MISMATCH, got %08x\n", status); +todo_wine + ok(len1 == 16, "Expected length 16, got %u\n", len1); + + status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 16, &len1); +todo_wine + ok(status == STATUS_NOT_IMPLEMENTED, "Expected STATUS_NOT_IMPLEMENTED, got %08x\n", status); + ok(len1 == 0, "Expected length 0, got %u\n", len1); + + sfti->ProviderSignature = RSMB; + sfti->Action = SystemFirmwareTable_Get; + + status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 16, &len1); +todo_wine + ok(status == STATUS_BUFFER_TOO_SMALL, "Expected STATUS_BUFFER_TOO_SMALL, got %08x\n", status); +todo_wine + ok(len1 >= 16, "Expected length >= 16, got %u\n", len1); + + sfti = HeapReAlloc(GetProcessHeap(), 0, sfti, len1); + ok(!!sfti, "Failed to allocate memory\n"); + + status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, len1, &len2); +todo_wine + ok(status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %08x\n", status); + ok(len2 == len1, "Expected length %u, got %u\n", len1, len2); + + HeapFree(GetProcessHeap(), 0, sfti); +} + static void test_query_processor_power_info(void) { NTSTATUS status; @@ -2267,6 +2311,10 @@ START_TEST(info) trace("Starting test_process_debug_flags()\n"); test_query_process_debug_flags(argc, argv);
+ /* 0x4C SystemFirmwareTableInformation */ + trace("Starting test_query_firmware()\n"); + test_query_firmware(); + /* belongs to its own file */ trace("Starting test_readvirtualmemory()\n"); test_readvirtualmemory();
Hi,
While running your changed tests on Windows, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check? Full results can be found at https://testbot.winehq.org/JobDetails.pl?Key=39153
Your paranoid android.
=== wxppro (32 bit info) === info.c:844: Test failed: Expected STATUS_INFO_LENGTH_MISMATCH, got c0000003 info.c:846: Test failed: Expected length 16, got 0 info.c:850: Test failed: Expected STATUS_NOT_IMPLEMENTED, got c0000003 info.c:858: Test failed: Expected STATUS_BUFFER_TOO_SMALL, got c0000003 info.c:860: Test failed: Expected length >= 16, got 0 info.c:867: Test failed: Expected STATUS_SUCCESS, got c0000003
=== w2003std (32 bit info) === info.c:846: Test failed: Expected length 16, got 0 info.c:850: Test failed: Expected STATUS_NOT_IMPLEMENTED, got c0000004 info.c:858: Test failed: Expected STATUS_BUFFER_TOO_SMALL, got c0000004 info.c:860: Test failed: Expected length >= 16, got 0 info.c:867: Test failed: Expected STATUS_SUCCESS, got c0000004
=== wvistau64 (32 bit info) === info.c:1836: Test failed: Expected STATUS_SUCCESS, got c0000022 0b9c:info: unhandled exception c0000005 at 003D0000
=== wvistau64_zh_CN (32 bit info) === info.c:1836: Test failed: Expected STATUS_SUCCESS, got c0000022 0bd0:info: unhandled exception c0000005 at 00360000
=== wvistau64_fr (32 bit info) === info.c:1836: Test failed: Expected STATUS_SUCCESS, got c0000022 072c:info: unhandled exception c0000005 at 003E0000
=== wvistau64_he (32 bit info) === info.c:1836: Test failed: Expected STATUS_SUCCESS, got c0000022 0be0:info: unhandled exception c0000005 at 003D0000
=== w2008s64 (32 bit info) === info.c:1836: Test failed: Expected STATUS_SUCCESS, got c0000022 0874:info: unhandled exception c0000005 at 002C0000
=== w7u (32 bit info) === info.c:1836: Test failed: Expected STATUS_SUCCESS, got c0000022
=== w7pro64 (32 bit info) === info.c:1836: Test failed: Expected STATUS_SUCCESS, got c0000022 0bf8:info: unhandled exception c0000005 at 003C0000
=== w8 (32 bit info) === info.c:1836: Test failed: Expected STATUS_SUCCESS, got c0000022 0fdc:info: unhandled exception c0000005 at 003E0000
=== w864 (32 bit info) === info.c:1836: Test failed: Expected STATUS_SUCCESS, got c0000022 0d10:info: unhandled exception c0000005 at 00360000
=== w1064 (32 bit info) === info.c:1836: Test failed: Expected STATUS_SUCCESS, got c0000022 064c:info: unhandled exception c0000005 at 002D0000
On Fri, Jun 15, 2018 at 12:59:08AM -0600, Alex Henrie wrote:
Signed-off-by: Alex Henrie alexhenrie24@gmail.com
dlls/ntdll/tests/info.c | 48 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+)
diff --git a/dlls/ntdll/tests/info.c b/dlls/ntdll/tests/info.c index 6c93c3cd58..cdb91e1b73 100644 --- a/dlls/ntdll/tests/info.c +++ b/dlls/ntdll/tests/info.c @@ -54,6 +54,11 @@ static DWORD one_before_last_pid = 0; } \ } while(0)
+/* Firmware table providers */ +#define ACPI 0x41435049 +#define FIRM 0x4649524D +#define RSMB 0x52534D42
static BOOL InitFunctionPtrs(void) { /* All needed functions are NT based, so using GetModuleHandle is a good check */ @@ -826,6 +831,45 @@ static void test_query_logicalprocex(void) } }
+static void test_query_firmware(void) +{
- ULONG len1, len2;
- NTSTATUS status;
- SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 16);
- ok(!!sfti, "Failed to allocate memory\n");
- status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 15, &len1);
+todo_wine
- ok(status == STATUS_INFO_LENGTH_MISMATCH, "Expected STATUS_INFO_LENGTH_MISMATCH, got %08x\n", status);
+todo_wine
- ok(len1 == 16, "Expected length 16, got %u\n", len1);
- status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 16, &len1);
+todo_wine
- ok(status == STATUS_NOT_IMPLEMENTED, "Expected STATUS_NOT_IMPLEMENTED, got %08x\n", status);
- ok(len1 == 0, "Expected length 0, got %u\n", len1);
- sfti->ProviderSignature = RSMB;
- sfti->Action = SystemFirmwareTable_Get;
- status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 16, &len1);
+todo_wine
- ok(status == STATUS_BUFFER_TOO_SMALL, "Expected STATUS_BUFFER_TOO_SMALL, got %08x\n", status);
+todo_wine
- ok(len1 >= 16, "Expected length >= 16, got %u\n", len1);
testing TableBufferLength == len1 - 16 would be useful here.
- sfti = HeapReAlloc(GetProcessHeap(), 0, sfti, len1);
- ok(!!sfti, "Failed to allocate memory\n");
- status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, len1, &len2);
+todo_wine
- ok(status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %08x\n", status);
- ok(len2 == len1, "Expected length %u, got %u\n", len1, len2);
and here.
- HeapFree(GetProcessHeap(), 0, sfti);
+}
static void test_query_processor_power_info(void) { NTSTATUS status; @@ -2267,6 +2311,10 @@ START_TEST(info) trace("Starting test_process_debug_flags()\n"); test_query_process_debug_flags(argc, argv);
- /* 0x4C SystemFirmwareTableInformation */
- trace("Starting test_query_firmware()\n");
- test_query_firmware();
- /* belongs to its own file */ trace("Starting test_readvirtualmemory()\n"); test_readvirtualmemory();
-- 2.17.1
Signed-off-by: Alex Henrie alexhenrie24@gmail.com --- dlls/kernel32/tests/version.c | 42 +++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+)
diff --git a/dlls/kernel32/tests/version.c b/dlls/kernel32/tests/version.c index eb78a383d2..6ca45f0b2e 100644 --- a/dlls/kernel32/tests/version.c +++ b/dlls/kernel32/tests/version.c @@ -26,11 +26,17 @@ #include "winternl.h"
static BOOL (WINAPI * pGetProductInfo)(DWORD, DWORD, DWORD, DWORD, DWORD *); +static NTSTATUS (WINAPI * pNtQuerySystemInformation)(SYSTEM_INFORMATION_CLASS, void *, ULONG, ULONG *); static NTSTATUS (WINAPI * pRtlGetVersion)(RTL_OSVERSIONINFOEXW *);
#define GET_PROC(func) \ p##func = (void *)GetProcAddress(hmod, #func);
+/* Firmware table providers */ +#define ACPI 0x41435049 +#define FIRM 0x4649524D +#define RSMB 0x52534D42 + static void init_function_pointers(void) { HMODULE hmod; @@ -41,6 +47,7 @@ static void init_function_pointers(void)
hmod = GetModuleHandleA("ntdll.dll");
+ GET_PROC(NtQuerySystemInformation); GET_PROC(RtlGetVersion); }
@@ -697,6 +704,40 @@ static void test_VerifyVersionInfo(void) ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); }
+void test_GetSystemFirmwareTable(void) +{ + ULONG expected_len, i; + UINT len; + SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti = HeapAlloc(GetProcessHeap(), 0, 16); + UCHAR *smbios_table = NULL; + + ok(!!sfti, "Failed to allocate memory\n"); + sfti->ProviderSignature = RSMB; + sfti->Action = SystemFirmwareTable_Get; + pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 16, &expected_len); + sfti = HeapReAlloc(GetProcessHeap(), 0, sfti, expected_len); + ok(!!sfti, "Failed to allocate memory\n"); + pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, expected_len, &expected_len); + + expected_len -= 16; + len = GetSystemFirmwareTable(RSMB, 0, smbios_table, 0); +todo_wine + ok(len == expected_len, "Expected length %u, got %u\n", expected_len, len); + + smbios_table = HeapAlloc(GetProcessHeap(), 0, len); + len = GetSystemFirmwareTable(RSMB, 0, smbios_table, len); +todo_wine + ok(len == expected_len, "Expected length %u, got %u\n", expected_len, len); + for (i = 0; i < len; i++) + { + ok(smbios_table[i] == sfti->TableBuffer[i], + "Offset %u: Expected %02x, got %02x\n", i, sfti->TableBuffer[i], smbios_table[i]); + } + + HeapFree(GetProcessHeap(), 0, sfti); + HeapFree(GetProcessHeap(), 0, smbios_table); +} + START_TEST(version) { init_function_pointers(); @@ -704,4 +745,5 @@ START_TEST(version) test_GetProductInfo(); test_GetVersionEx(); test_VerifyVersionInfo(); + test_GetSystemFirmwareTable(); }
Hi,
While running your changed tests on Windows, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check? Full results can be found at https://testbot.winehq.org/JobDetails.pl?Key=39154
Your paranoid android.
=== w2003std (32 bit version) === version.c:725: Test failed: Expected length 4294967280, got 449 version.c:730: Test failed: Expected length 4294967280, got 449 version.c:733: Test failed: Offset 0: Expected 3a, got 00 version.c:733: Test failed: Offset 1: Expected 00, got 02 version.c:733: Test failed: Offset 2: Expected 03, got 08 version.c:733: Test failed: Offset 3: Expected 00, got 28 version.c:733: Test failed: Offset 4: Expected e5, got b9 version.c:733: Test failed: Offset 6: Expected 0f, got 00 version.c:733: Test failed: Offset 9: Expected 02, got 18 version.c:733: Test failed: Offset 10: Expected 08, got 00 version.c:733: Test failed: Offset 11: Expected 28, got 00 version.c:733: Test failed: Offset 12: Expected b9, got 01 version.c:733: Test failed: Offset 13: Expected 01, got 02 version.c:733: Test failed: Offset 15: Expected 00, got e8 version.c:733: Test failed: Offset 16: Expected 00, got 03 version.c:733: Test failed: Offset 17: Expected 18, got 00 version.c:733: Test failed: Offset 18: Expected 00, got 08 version.c:733: Test failed: Offset 20: Expected 01, got 00 version.c:733: Test failed: Offset 21: Expected 02, got 00 version.c:733: Test failed: Offset 23: Expected e8, got 00 version.c:733: Test failed: Offset 24: Expected 03, got 00 version.c:733: Test failed: Offset 26: Expected 08, got 00 version.c:733: Test failed: Offset 27: Expected 00, got 04 version.c:733: Test failed: Offset 30: Expected 00, got ff version.c:733: Test failed: Offset 31: Expected 00, got ff version.c:733: Test failed: Offset 32: Expected 00, got 53 version.c:733: Test failed: Offset 33: Expected 00, got 65 version.c:733: Test failed: Offset 34: Expected 00, got 61 version.c:733: Test failed: Offset 35: Expected 04, got 42 version.c:733: Test failed: Offset 36: Expected 00, got 49 version.c:733: Test failed: Offset 37: Expected 00, got 4f version.c:733: Test failed: Offset 38: Expected ff, got 53 version.c:733: Test failed: Offset 39: Expected ff, got 00 version.c:733: Test failed: Offset 40: Expected 53, got 31 version.c:733: Test failed: Offset 41: Expected 65, got 2e version.c:733: Test failed: Offset 42: Expected 61, got 31 version.c:733: Test failed: Offset 43: Expected 42, got 30 version.c:733: Test failed: Offset 44: Expected 49, got 2e version.c:733: Test failed: Offset 45: Expected 4f, got 32 version.c:733: Test failed: Offset 46: Expected 53, got 2d version.c:733: Test failed: Offset 47: Expected 00, got 31 version.c:733: Test failed: Offset 48: Expected 31, got 00 version.c:733: Test failed: Offset 49: Expected 2e, got 30 version.c:733: Test failed: Offset 50: Expected 31, got 34 version.c:733: Test failed: Offset 51: Expected 30, got 2f version.c:733: Test failed: Offset 52: Expected 2e, got 30 version.c:733: Test failed: Offset 53: Expected 32, got 31 version.c:733: Test failed: Offset 54: Expected 2d, got 2f version.c:733: Test failed: Offset 55: Expected 31, got 32 version.c:733: Test failed: Offset 56: Expected 00, got 30 version.c:733: Test failed: Offset 57: Expected 30, got 31 version.c:733: Test failed: Offset 59: Expected 2f, got 00 version.c:733: Test failed: Offset 60: Expected 30, got 00 version.c:733: Test failed: Offset 61: Expected 31, got 01 version.c:733: Test failed: Offset 62: Expected 2f, got 1b version.c:733: Test failed: Offset 63: Expected 32, got 00 version.c:733: Test failed: Offset 64: Expected 30, got 01 version.c:733: Test failed: Offset 65: Expected 31, got 01 version.c:733: Test failed: Offset 66: Expected 34, got 02 version.c:733: Test failed: Offset 67: Expected 00, got 03 version.c:733: Test failed: Offset 69: Expected 01, got b7 version.c:733: Test failed: Offset 70: Expected 1b, got ff version.c:733: Test failed: Offset 71: Expected 00, got 4f version.c:733: Test failed: Offset 72: Expected 01, got 2a version.c:733: Test failed: Offset 73: Expected 01, got c5 version.c:733: Test failed: Offset 74: Expected 02, got 53 version.c:733: Test failed: Offset 75: Expected 03, got 46 version.c:733: Test failed: Offset 76: Expected 00, got 9e version.c:733: Test failed: Offset 77: Expected b7, got 8f version.c:733: Test failed: Offset 78: Expected ff, got db version.c:733: Test failed: Offset 79: Expected 4f, got 72 version.c:733: Test failed: Offset 80: Expected 2a, got e5 version.c:733: Test failed: Offset 81: Expected c5, got aa version.c:733: Test failed: Offset 82: Expected 53, got 9a version.c:733: Test failed: Offset 83: Expected 46, got b9 version.c:733: Test failed: Offset 84: Expected 9e, got de version.c:733: Test failed: Offset 85: Expected 8f, got 06 version.c:733: Test failed: Offset 86: Expected db, got 00 version.c:733: Test failed: Offset 87: Expected 72, got 00 version.c:733: Test failed: Offset 88: Expected e5, got 51 version.c:733: Test failed: Offset 89: Expected aa, got 45 version.c:733: Test failed: Offset 90: Expected 9a, got 4d version.c:733: Test failed: Offset 91: Expected b9, got 55 version.c:733: Test failed: Offset 92: Expected de, got 00 version.c:733: Test failed: Offset 93: Expected 06, got 53 version.c:733: Test failed: Offset 94: Expected 00, got 74 version.c:733: Test failed: Offset 95: Expected 00, got 61 version.c:733: Test failed: Offset 96: Expected 51, got 6e version.c:733: Test failed: Offset 97: Expected 45, got 64 version.c:733: Test failed: Offset 98: Expected 4d, got 61 version.c:733: Test failed: Offset 99: Expected 55, got 72 version.c:733: Test failed: Offset 100: Expected 00, got 64 version.c:733: Test failed: Offset 101: Expected 53, got 20 version.c:733: Test failed: Offset 102: Expected 74, got 50 version.c:733: Test failed: Offset 103: Expected 61, got 43 version.c:733: Test failed: Offset 104: Expected 6e, got 20 version.c:733: Test failed: Offset 105: Expected 64, got 28 version.c:733: Test failed: Offset 106: Expected 61, got 69 version.c:733: Test failed: Offset 107: Expected 72, got 34 version.c:733: Test failed: Offset 108: Expected 64, got 34 version.c:733: Test failed: Offset 109: Expected 20, got 30 version.c:733: Test failed: Offset 110: Expected 50, got 46 version.c:733: Test failed: Offset 111: Expected 43, got 58 version.c:733: Test failed: Offset 113: Expected 28, got 2b version.c:733: Test failed: Offset 114: Expected 69, got 20 version.c:733: Test failed: Offset 115: Expected 34, got 50 version.c:733: Test failed: Offset 116: Expected 34, got 49 version.c:733: Test failed: Offset 117: Expected 30, got 49 version.c:733: Test failed: Offset 118: Expected 46, got 58 version.c:733: Test failed: Offset 119: Expected 58, got 2c version.c:733: Test failed: Offset 121: Expected 2b, got 31 version.c:733: Test failed: Offset 122: Expected 20, got 39 version.c:733: Test failed: Offset 123: Expected 50, got 39 version.c:733: Test failed: Offset 124: Expected 49, got 36 version.c:733: Test failed: Offset 125: Expected 49, got 29 version.c:733: Test failed: Offset 126: Expected 58, got 00 version.c:733: Test failed: Offset 127: Expected 2c, got 70 version.c:733: Test failed: Offset 128: Expected 20, got 63 version.c:733: Test failed: Offset 129: Expected 31, got 2d version.c:733: Test failed: Offset 130: Expected 39, got 69 version.c:733: Test failed: Offset 131: Expected 39, got 34 version.c:733: Test failed: Offset 132: Expected 36, got 34 version.c:733: Test failed: Offset 133: Expected 29, got 30 version.c:733: Test failed: Offset 134: Expected 00, got 66 version.c:733: Test failed: Offset 135: Expected 70, got 78 version.c:733: Test failed: Offset 136: Expected 63, got 2d version.c:733: Test failed: Offset 137: Expected 2d, got 32 version.c:733: Test failed: Offset 138: Expected 69, got 2e version.c:733: Test failed: Offset 139: Expected 34, got 31 version.c:733: Test failed: Offset 140: Expected 34, got 00 version.c:733: Test failed: Offset 141: Expected 30, got 00 version.c:733: Test failed: Offset 142: Expected 66, got 03 version.c:733: Test failed: Offset 143: Expected 78, got 15 version.c:733: Test failed: Offset 144: Expected 2d, got 00 version.c:733: Test failed: Offset 145: Expected 32, got 03 version.c:733: Test failed: Offset 146: Expected 2e, got 01 version.c:733: Test failed: Offset 147: Expected 31, got 01 version.c:733: Test failed: Offset 148: Expected 00, got 02 version.c:733: Test failed: Offset 150: Expected 03, got 00 version.c:733: Test failed: Offset 151: Expected 15, got 03 version.c:733: Test failed: Offset 152: Expected 00, got 03 version.c:733: Test failed: Offset 154: Expected 01, got 02 version.c:733: Test failed: Offset 155: Expected 01, got 00 version.c:733: Test failed: Offset 156: Expected 02, got 00 version.c:733: Test failed: Offset 159: Expected 03, got 00 version.c:733: Test failed: Offset 160: Expected 03, got 00 version.c:733: Test failed: Offset 161: Expected 03, got 00 version.c:733: Test failed: Offset 162: Expected 02, got 00 version.c:733: Test failed: Offset 163: Expected 00, got 51 version.c:733: Test failed: Offset 164: Expected 00, got 45 version.c:733: Test failed: Offset 165: Expected 00, got 4d version.c:733: Test failed: Offset 166: Expected 00, got 55 version.c:733: Test failed: Offset 168: Expected 00, got 70 version.c:733: Test failed: Offset 169: Expected 00, got 63 version.c:733: Test failed: Offset 170: Expected 00, got 2d version.c:733: Test failed: Offset 171: Expected 51, got 69 version.c:733: Test failed: Offset 172: Expected 45, got 34 version.c:733: Test failed: Offset 173: Expected 4d, got 34 version.c:733: Test failed: Offset 174: Expected 55, got 30 version.c:733: Test failed: Offset 175: Expected 00, got 66 version.c:733: Test failed: Offset 176: Expected 70, got 78 version.c:733: Test failed: Offset 177: Expected 63, got 2d version.c:733: Test failed: Offset 178: Expected 2d, got 32 version.c:733: Test failed: Offset 179: Expected 69, got 2e version.c:733: Test failed: Offset 180: Expected 34, got 31 version.c:733: Test failed: Offset 181: Expected 34, got 00 version.c:733: Test failed: Offset 182: Expected 30, got 00 version.c:733: Test failed: Offset 183: Expected 66, got 04 version.c:733: Test failed: Offset 184: Expected 78, got 2a version.c:733: Test failed: Offset 185: Expected 2d, got 00 version.c:733: Test failed: Offset 186: Expected 32, got 04 version.c:733: Test failed: Offset 187: Expected 2e, got 01 version.c:733: Test failed: Offset 188: Expected 31, got 03 version.c:733: Test failed: Offset 189: Expected 00, got 01 version.c:733: Test failed: Offset 190: Expected 00, got 02 version.c:733: Test failed: Offset 191: Expected 04, got 61 version.c:733: Test failed: Offset 192: Expected 2a, got 0f version.c:733: Test failed: Offset 194: Expected 04, got 00 version.c:733: Test failed: Offset 195: Expected 01, got fd version.c:733: Test failed: Offset 196: Expected 03, got fb version.c:733: Test failed: Offset 197: Expected 01, got 8b version.c:733: Test failed: Offset 198: Expected 02, got 07 version.c:733: Test failed: Offset 199: Expected 61, got 03 version.c:733: Test failed: Offset 200: Expected 0f, got 00 version.c:733: Test failed: Offset 203: Expected fd, got d0 version.c:733: Test failed: Offset 204: Expected fb, got 07 version.c:733: Test failed: Offset 205: Expected 8b, got d0 version.c:733: Test failed: Offset 207: Expected 03, got 41 version.c:733: Test failed: Offset 208: Expected 00, got 01 version.c:733: Test failed: Offset 209: Expected 00, got ff version.c:733: Test failed: Offset 210: Expected 00, got ff version.c:733: Test failed: Offset 211: Expected d0, got ff version.c:733: Test failed: Offset 212: Expected 07, got ff version.c:733: Test failed: Offset 213: Expected d0, got ff version.c:733: Test failed: Offset 214: Expected 07, got ff version.c:733: Test failed: Offset 215: Expected 41, got 00 version.c:733: Test failed: Offset 216: Expected 01, got 00 version.c:733: Test failed: Offset 217: Expected ff, got 00 version.c:733: Test failed: Offset 218: Expected ff, got 01 version.c:733: Test failed: Offset 219: Expected ff, got 01 version.c:733: Test failed: Offset 220: Expected ff, got 01 version.c:733: Test failed: Offset 221: Expected ff, got 02 version.c:733: Test failed: Offset 222: Expected ff, got 00 version.c:733: Test failed: Offset 223: Expected 00, got 01 version.c:733: Test failed: Offset 225: Expected 00, got 43 version.c:733: Test failed: Offset 226: Expected 01, got 50 version.c:733: Test failed: Offset 227: Expected 01, got 55 version.c:733: Test failed: Offset 228: Expected 01, got 20 version.c:733: Test failed: Offset 229: Expected 02, got 30 version.c:733: Test failed: Offset 231: Expected 01, got 51 version.c:733: Test failed: Offset 232: Expected 00, got 45 version.c:733: Test failed: Offset 233: Expected 43, got 4d version.c:733: Test failed: Offset 234: Expected 50, got 55 version.c:733: Test failed: Offset 235: Expected 55, got 00 version.c:733: Test failed: Offset 236: Expected 20, got 70 version.c:733: Test failed: Offset 237: Expected 30, got 63 version.c:733: Test failed: Offset 238: Expected 00, got 2d version.c:733: Test failed: Offset 239: Expected 51, got 69 version.c:733: Test failed: Offset 240: Expected 45, got 34 version.c:733: Test failed: Offset 241: Expected 4d, got 34 version.c:733: Test failed: Offset 242: Expected 55, got 30 version.c:733: Test failed: Offset 243: Expected 00, got 66 version.c:733: Test failed: Offset 244: Expected 70, got 78 version.c:733: Test failed: Offset 245: Expected 63, got 2d version.c:733: Test failed: Offset 246: Expected 2d, got 32 version.c:733: Test failed: Offset 247: Expected 69, got 2e version.c:733: Test failed: Offset 248: Expected 34, got 31 version.c:733: Test failed: Offset 249: Expected 34, got 00 version.c:733: Test failed: Offset 250: Expected 30, got 00 version.c:733: Test failed: Offset 251: Expected 66, got 04 version.c:733: Test failed: Offset 252: Expected 78, got 2a version.c:733: Test failed: Offset 253: Expected 2d, got 01 version.c:733: Test failed: Offset 254: Expected 32, got 04 version.c:733: Test failed: Offset 255: Expected 2e, got 01 version.c:733: Test failed: Offset 256: Expected 31, got 03 version.c:733: Test failed: Offset 257: Expected 00, got 01 version.c:733: Test failed: Offset 258: Expected 00, got 02 version.c:733: Test failed: Offset 259: Expected 04, got 61 version.c:733: Test failed: Offset 260: Expected 2a, got 0f version.c:733: Test failed: Offset 261: Expected 01, got 00 version.c:733: Test failed: Offset 262: Expected 04, got 00 version.c:733: Test failed: Offset 263: Expected 01, got fd version.c:733: Test failed: Offset 264: Expected 03, got fb version.c:733: Test failed: Offset 265: Expected 01, got 8b version.c:733: Test failed: Offset 266: Expected 02, got 07 version.c:733: Test failed: Offset 267: Expected 61, got 03 version.c:733: Test failed: Offset 268: Expected 0f, got 00 version.c:733: Test failed: Offset 271: Expected fd, got d0 version.c:733: Test failed: Offset 272: Expected fb, got 07 version.c:733: Test failed: Offset 273: Expected 8b, got d0 version.c:733: Test failed: Offset 275: Expected 03, got 41 version.c:733: Test failed: Offset 276: Expected 00, got 01 version.c:733: Test failed: Offset 277: Expected 00, got ff version.c:733: Test failed: Offset 278: Expected 00, got ff version.c:733: Test failed: Offset 279: Expected d0, got ff version.c:733: Test failed: Offset 280: Expected 07, got ff version.c:733: Test failed: Offset 281: Expected d0, got ff version.c:733: Test failed: Offset 282: Expected 07, got ff version.c:733: Test failed: Offset 283: Expected 41, got 00 version.c:733: Test failed: Offset 284: Expected 01, got 00 version.c:733: Test failed: Offset 285: Expected ff, got 00 version.c:733: Test failed: Offset 286: Expected ff, got 01 version.c:733: Test failed: Offset 287: Expected ff, got 01 version.c:733: Test failed: Offset 288: Expected ff, got 01 version.c:733: Test failed: Offset 289: Expected ff, got 02 version.c:733: Test failed: Offset 290: Expected ff, got 00 version.c:733: Test failed: Offset 291: Expected 00, got 01 version.c:733: Test failed: Offset 293: Expected 00, got 43 version.c:733: Test failed: Offset 294: Expected 01, got 50 version.c:733: Test failed: Offset 295: Expected 01, got 55 version.c:733: Test failed: Offset 296: Expected 01, got 20 version.c:733: Test failed: Offset 297: Expected 02, got 31 version.c:733: Test failed: Offset 299: Expected 01, got 51 version.c:733: Test failed: Offset 300: Expected 00, got 45 version.c:733: Test failed: Offset 301: Expected 43, got 4d version.c:733: Test failed: Offset 302: Expected 50, got 55 version.c:733: Test failed: Offset 303: Expected 55, got 00 version.c:733: Test failed: Offset 304: Expected 20, got 70 version.c:733: Test failed: Offset 305: Expected 31, got 63 version.c:733: Test failed: Offset 306: Expected 00, got 2d version.c:733: Test failed: Offset 307: Expected 51, got 69 version.c:733: Test failed: Offset 308: Expected 45, got 34 version.c:733: Test failed: Offset 309: Expected 4d, got 34 version.c:733: Test failed: Offset 310: Expected 55, got 30 version.c:733: Test failed: Offset 311: Expected 00, got 66 version.c:733: Test failed: Offset 312: Expected 70, got 78 version.c:733: Test failed: Offset 313: Expected 63, got 2d version.c:733: Test failed: Offset 314: Expected 2d, got 32 version.c:733: Test failed: Offset 315: Expected 69, got 2e version.c:733: Test failed: Offset 316: Expected 34, got 31 version.c:733: Test failed: Offset 317: Expected 34, got 00 version.c:733: Test failed: Offset 318: Expected 30, got 00 version.c:733: Test failed: Offset 319: Expected 66, got 10 version.c:733: Test failed: Offset 320: Expected 78, got 17 version.c:733: Test failed: Offset 321: Expected 2d, got 00 version.c:733: Test failed: Offset 322: Expected 32, got 10 version.c:733: Test failed: Offset 323: Expected 2e, got 01 version.c:733: Test failed: Offset 324: Expected 31, got 03 version.c:733: Test failed: Offset 325: Expected 00, got 06 version.c:733: Test failed: Offset 327: Expected 10, got 00 version.c:733: Test failed: Offset 328: Expected 17, got 10 version.c:733: Test failed: Offset 330: Expected 10, got fe version.c:733: Test failed: Offset 331: Expected 01, got ff version.c:733: Test failed: Offset 332: Expected 03, got 01 version.c:733: Test failed: Offset 333: Expected 06, got 00 version.c:733: Test failed: Offset 336: Expected 10, got 00 version.c:733: Test failed: Offset 338: Expected fe, got 00 version.c:733: Test failed: Offset 339: Expected ff, got 00 version.c:733: Test failed: Offset 340: Expected 01, got 00 version.c:733: Test failed: Offset 344: Expected 00, got 11 version.c:733: Test failed: Offset 345: Expected 00, got 28 version.c:733: Test failed: Offset 347: Expected 00, got 11 version.c:733: Test failed: Offset 349: Expected 00, got 10 version.c:733: Test failed: Offset 350: Expected 00, got fe version.c:733: Test failed: Offset 351: Expected 00, got ff version.c:733: Test failed: Offset 352: Expected 11, got ff version.c:733: Test failed: Offset 353: Expected 28, got ff version.c:733: Test failed: Offset 354: Expected 00, got ff version.c:733: Test failed: Offset 355: Expected 11, got ff version.c:733: Test failed: Offset 357: Expected 10, got 04 version.c:733: Test failed: Offset 358: Expected fe, got 09 version.c:733: Test failed: Offset 359: Expected ff, got 00 version.c:733: Test failed: Offset 360: Expected ff, got 01 version.c:733: Test failed: Offset 361: Expected ff, got 00 version.c:733: Test failed: Offset 362: Expected ff, got 07 version.c:733: Test failed: Offset 363: Expected ff, got 02 version.c:733: Test failed: Offset 365: Expected 04, got 00 version.c:733: Test failed: Offset 366: Expected 09, got 00 version.c:733: Test failed: Offset 367: Expected 00, got 02 version.c:733: Test failed: Offset 368: Expected 01, got 00 version.c:733: Test failed: Offset 370: Expected 07, got 00 version.c:733: Test failed: Offset 371: Expected 02, got 00 version.c:733: Test failed: Offset 375: Expected 02, got 00 version.c:733: Test failed: Offset 384: Expected 00, got 44 version.c:733: Test failed: Offset 385: Expected 00, got 49 version.c:733: Test failed: Offset 386: Expected 00, got 4d version.c:733: Test failed: Offset 387: Expected 00, got 4d version.c:733: Test failed: Offset 388: Expected 00, got 20 version.c:733: Test failed: Offset 389: Expected 00, got 30 version.c:733: Test failed: Offset 391: Expected 00, got 51 version.c:733: Test failed: Offset 392: Expected 44, got 45 version.c:733: Test failed: Offset 393: Expected 49, got 4d version.c:733: Test failed: Offset 394: Expected 4d, got 55 version.c:733: Test failed: Offset 395: Expected 4d, got 00 version.c:733: Test failed: Offset 396: Expected 20, got 00 version.c:733: Test failed: Offset 397: Expected 30, got 13 version.c:733: Test failed: Offset 398: Expected 00, got 1f version.c:733: Test failed: Offset 399: Expected 51, got 00 version.c:733: Test failed: Offset 400: Expected 45, got 13 version.c:733: Test failed: Offset 401: Expected 4d, got 00 version.c:733: Test failed: Offset 402: Expected 55, got 00 version.c:733: Test failed: Offset 405: Expected 13, got ff version.c:733: Test failed: Offset 406: Expected 1f, got ff version.c:733: Test failed: Offset 407: Expected 00, got 0f version.c:733: Test failed: Offset 408: Expected 13, got 00 version.c:733: Test failed: Offset 410: Expected 00, got 10 version.c:733: Test failed: Offset 411: Expected 00, got 01 version.c:733: Test failed: Offset 413: Expected ff, got 00 version.c:733: Test failed: Offset 414: Expected ff, got 00 version.c:733: Test failed: Offset 415: Expected 0f, got 00 version.c:733: Test failed: Offset 418: Expected 10, got 00 version.c:733: Test failed: Offset 419: Expected 01, got 00 version.c:733: Test failed: Offset 430: Expected 00, got 20 version.c:733: Test failed: Offset 431: Expected 00, got 0b version.c:733: Test failed: Offset 433: Expected 00, got 20 version.c:733: Test failed: Offset 438: Expected 20, got 00 version.c:733: Test failed: Offset 439: Expected 0b, got 00 version.c:733: Test failed: Offset 441: Expected 20, got 00 version.c:733: Test failed: Offset 443: Expected 00, got 7f version.c:733: Test failed: Offset 444: Expected 00, got 04 version.c:733: Test failed: Offset 446: Expected 00, got 7f
On Fri, Jun 15, 2018 at 12:59:09AM -0600, Alex Henrie wrote:
Signed-off-by: Alex Henrie alexhenrie24@gmail.com
dlls/kernel32/tests/version.c | 42 +++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+)
diff --git a/dlls/kernel32/tests/version.c b/dlls/kernel32/tests/version.c index eb78a383d2..6ca45f0b2e 100644 --- a/dlls/kernel32/tests/version.c +++ b/dlls/kernel32/tests/version.c @@ -26,11 +26,17 @@ #include "winternl.h"
static BOOL (WINAPI * pGetProductInfo)(DWORD, DWORD, DWORD, DWORD, DWORD *); +static NTSTATUS (WINAPI * pNtQuerySystemInformation)(SYSTEM_INFORMATION_CLASS, void *, ULONG, ULONG *); static NTSTATUS (WINAPI * pRtlGetVersion)(RTL_OSVERSIONINFOEXW *);
#define GET_PROC(func) \ p##func = (void *)GetProcAddress(hmod, #func);
+/* Firmware table providers */ +#define ACPI 0x41435049 +#define FIRM 0x4649524D +#define RSMB 0x52534D42
static void init_function_pointers(void) { HMODULE hmod; @@ -41,6 +47,7 @@ static void init_function_pointers(void)
hmod = GetModuleHandleA("ntdll.dll");
- GET_PROC(NtQuerySystemInformation); GET_PROC(RtlGetVersion);
}
@@ -697,6 +704,40 @@ static void test_VerifyVersionInfo(void) ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); }
+void test_GetSystemFirmwareTable(void) +{
- ULONG expected_len, i;
- UINT len;
- SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti = HeapAlloc(GetProcessHeap(), 0, 16);
- UCHAR *smbios_table = NULL;
- ok(!!sfti, "Failed to allocate memory\n");
- sfti->ProviderSignature = RSMB;
- sfti->Action = SystemFirmwareTable_Get;
You need to initialize TableID.
- pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 16, &expected_len);
- sfti = HeapReAlloc(GetProcessHeap(), 0, sfti, expected_len);
- ok(!!sfti, "Failed to allocate memory\n");
- pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, expected_len, &expected_len);
- expected_len -= 16;
- len = GetSystemFirmwareTable(RSMB, 0, smbios_table, 0);
+todo_wine
- ok(len == expected_len, "Expected length %u, got %u\n", expected_len, len);
- smbios_table = HeapAlloc(GetProcessHeap(), 0, len);
- len = GetSystemFirmwareTable(RSMB, 0, smbios_table, len);
+todo_wine
- ok(len == expected_len, "Expected length %u, got %u\n", expected_len, len);
- for (i = 0; i < len; i++)
- {
ok(smbios_table[i] == sfti->TableBuffer[i],
"Offset %u: Expected %02x, got %02x\n", i, sfti->TableBuffer[i], smbios_table[i]);
- }
- HeapFree(GetProcessHeap(), 0, sfti);
- HeapFree(GetProcessHeap(), 0, smbios_table);
+}
START_TEST(version) { init_function_pointers(); @@ -704,4 +745,5 @@ START_TEST(version) test_GetProductInfo(); test_GetVersionEx(); test_VerifyVersionInfo();
- test_GetSystemFirmwareTable();
}
2.17.1
On Fri, Jun 15, 2018 at 2:37 AM Huw Davies huw@codeweavers.com wrote:
On Fri, Jun 15, 2018 at 12:59:09AM -0600, Alex Henrie wrote:
- sfti->ProviderSignature = RSMB;
- sfti->Action = SystemFirmwareTable_Get;
You need to initialize TableID.
When querying the RSMB table, TableID is ignored. You get the same results no matter what the table ID is. I'm adding a test that demonstrates this.
I did, however, notice that some of the RSMB table values change over time. So, I'm going to omit the test for NtQuerySystemInformation and GetSystemFirmwareTable returning exactly the same data, and instead just check that they both return the same amount of data.
If you'd like to look over my latest work before Monday, you can see it at https://github.com/alexhenrie/wine/commits/master
Thanks for the help!
-Alex
Signed-off-by: Alex Henrie alexhenrie24@gmail.com --- dlls/ntdll/nt.c | 174 ++++++++++++++++++++++++++++++++++++++++ dlls/ntdll/tests/info.c | 14 ++-- 2 files changed, 182 insertions(+), 6 deletions(-)
diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c index dc0ce04f42..658970b051 100644 --- a/dlls/ntdll/nt.c +++ b/dlls/ntdll/nt.c @@ -66,6 +66,35 @@
WINE_DEFAULT_DEBUG_CHANNEL(ntdll);
+#include "pshpack1.h" + +struct smbios_prologue { + BYTE calling_method; + BYTE major_version; + BYTE minor_version; + BYTE revision; + DWORD length; +}; + +struct smbios_bios { + BYTE type; + BYTE length; + WORD handle; + BYTE vendor; + BYTE version; + WORD start; + BYTE date; + BYTE size; + UINT64 characteristics; +}; + +#include "poppack.h" + +/* Firmware table providers */ +#define ACPI 0x41435049 +#define FIRM 0x4649524D +#define RSMB 0x52534D42 + /* * Token */ @@ -1850,6 +1879,129 @@ static NTSTATUS create_logical_proc_info(SYSTEM_LOGICAL_PROCESSOR_INFORMATION ** } #endif
+static inline void copy_smbios_string(char **buffer, char *string, size_t string_size) +{ + if (!string) return; + strcpy(*buffer, string); + *buffer += string_size; +} + +#ifdef linux + +static char* get_smbios_string(const char *path, size_t *string_size) +{ + FILE *file = fopen(path, "r"); + char *ret = NULL; + *string_size = 0; + if (file) + { + *string_size = getline(&ret, string_size, file) + 1; + fclose(file); + if (*string_size >= 2 && ret[*string_size - 2] == '\n') + { + ret[*string_size - 2] = 0; + (*string_size)--; + } + if (*string_size == 1) + { + free(ret); + ret = NULL; + *string_size = 0; + } + } + return ret; +} + +static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti, + ULONG available_len, ULONG *required_len) +{ + switch (sfti->ProviderSignature) + { + case RSMB: + { + char *bios_vendor, *bios_version, *bios_date; + size_t bios_vendor_size, bios_version_size, bios_date_size; + char *buffer = (char*)sfti->TableBuffer; + BYTE string_count; + struct smbios_prologue *prologue; + struct smbios_bios *bios; + + bios_vendor = get_smbios_string("/sys/class/dmi/id/bios_vendor", &bios_vendor_size); + bios_version = get_smbios_string("/sys/class/dmi/id/bios_version", &bios_version_size); + bios_date = get_smbios_string("/sys/class/dmi/id/bios_date", &bios_date_size); + + *required_len = FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer); + + *required_len += sizeof(struct smbios_prologue); + + *required_len += sizeof(struct smbios_bios); + *required_len += max(bios_vendor_size + bios_version_size + bios_date_size + 1, 2); + + if (available_len < *required_len) + { + return STATUS_BUFFER_TOO_SMALL; + } + + sfti->TableBufferLength = *required_len - FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer); + + prologue = (struct smbios_prologue*)buffer; + prologue->calling_method = 0; + prologue->major_version = 2; + prologue->minor_version = 0; + prologue->revision = 0; + prologue->length = sfti->TableBufferLength - sizeof(struct smbios_prologue); + buffer += sizeof(struct smbios_prologue); + + string_count = 0; + bios = (struct smbios_bios*)buffer; + bios->type = 0; + bios->length = sizeof(struct smbios_bios); + bios->handle = 0; + bios->vendor = bios_vendor ? ++string_count : 0; + bios->version = bios_version ? ++string_count : 0; + bios->start = 0; + bios->date = bios_date ? ++string_count : 0; + bios->size = 0; + bios->characteristics = 0x4; /* not supported */ + buffer += sizeof(struct smbios_bios); + + if (string_count) + { + copy_smbios_string(&buffer, bios_vendor, bios_vendor_size); + copy_smbios_string(&buffer, bios_version, bios_version_size); + copy_smbios_string(&buffer, bios_date, bios_date_size); + memset(buffer, 0, 1); + } + else + { + memset(buffer, 0, 2); + } + + free(bios_vendor); + free(bios_version); + free(bios_date); + + return STATUS_SUCCESS; + } + default: + { + return STATUS_NOT_IMPLEMENTED; + FIXME("info_class SYSTEM_FIRMWARE_TABLE_INFORMATION\n"); + } + } +} + +#else + +static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti, + ULONG available_len, ULONG *required_len) +{ + return STATUS_NOT_IMPLEMENTED; + FIXME("info_class SYSTEM_FIRMWARE_TABLE_INFORMATION\n"); +} + +#endif + /****************************************************************************** * NtQuerySystemInformation [NTDLL.@] * ZwQuerySystemInformation [NTDLL.@] @@ -2359,6 +2511,28 @@ NTSTATUS WINAPI NtQuerySystemInformation( else ret = STATUS_INFO_LENGTH_MISMATCH; } break; + case SystemFirmwareTableInformation: + { + SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti = (SYSTEM_FIRMWARE_TABLE_INFORMATION*)SystemInformation; + len = FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer); + if (Length < len) + { + ret = STATUS_INFO_LENGTH_MISMATCH; + break; + } + + switch (sfti->Action) + { + case SystemFirmwareTable_Get: + ret = get_firmware_info(sfti, Length, &len); + break; + default: + len = 0; + ret = STATUS_NOT_IMPLEMENTED; + FIXME("info_class SYSTEM_FIRMWARE_TABLE_INFORMATION\n"); + } + } + break; default: FIXME("(0x%08x,%p,0x%08x,%p) stub\n", SystemInformationClass,SystemInformation,Length,ResultLength); diff --git a/dlls/ntdll/tests/info.c b/dlls/ntdll/tests/info.c index cdb91e1b73..b8feebd474 100644 --- a/dlls/ntdll/tests/info.c +++ b/dlls/ntdll/tests/info.c @@ -59,6 +59,12 @@ static DWORD one_before_last_pid = 0; #define FIRM 0x4649524D #define RSMB 0x52534D42
+#ifdef linux +static const int firmware_todo = 0; +#else +static const int firmware_todo = 1; +#endif + static BOOL InitFunctionPtrs(void) { /* All needed functions are NT based, so using GetModuleHandle is a good check */ @@ -840,13 +846,10 @@ static void test_query_firmware(void) ok(!!sfti, "Failed to allocate memory\n");
status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 15, &len1); -todo_wine ok(status == STATUS_INFO_LENGTH_MISMATCH, "Expected STATUS_INFO_LENGTH_MISMATCH, got %08x\n", status); -todo_wine ok(len1 == 16, "Expected length 16, got %u\n", len1);
status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 16, &len1); -todo_wine ok(status == STATUS_NOT_IMPLEMENTED, "Expected STATUS_NOT_IMPLEMENTED, got %08x\n", status); ok(len1 == 0, "Expected length 0, got %u\n", len1);
@@ -854,16 +857,15 @@ todo_wine sfti->Action = SystemFirmwareTable_Get;
status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 16, &len1); -todo_wine +todo_wine_if(firmware_todo) ok(status == STATUS_BUFFER_TOO_SMALL, "Expected STATUS_BUFFER_TOO_SMALL, got %08x\n", status); -todo_wine ok(len1 >= 16, "Expected length >= 16, got %u\n", len1);
sfti = HeapReAlloc(GetProcessHeap(), 0, sfti, len1); ok(!!sfti, "Failed to allocate memory\n");
status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, len1, &len2); -todo_wine +todo_wine_if(firmware_todo) ok(status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %08x\n", status); ok(len2 == len1, "Expected length %u, got %u\n", len1, len2);
Hi,
While running your changed tests on Windows, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check? Full results can be found at https://testbot.winehq.org/JobDetails.pl?Key=39155
Your paranoid android.
=== wxppro (32 bit info) === info.c:849: Test failed: Expected STATUS_INFO_LENGTH_MISMATCH, got c0000003 info.c:850: Test failed: Expected length 16, got 0 info.c:853: Test failed: Expected STATUS_NOT_IMPLEMENTED, got c0000003 info.c:861: Test failed: Expected STATUS_BUFFER_TOO_SMALL, got c0000003 info.c:862: Test failed: Expected length >= 16, got 0 info.c:869: Test failed: Expected STATUS_SUCCESS, got c0000003
=== w2003std (32 bit info) === info.c:850: Test failed: Expected length 16, got 0 info.c:853: Test failed: Expected STATUS_NOT_IMPLEMENTED, got c0000004 info.c:861: Test failed: Expected STATUS_BUFFER_TOO_SMALL, got c0000004 info.c:862: Test failed: Expected length >= 16, got 0 info.c:869: Test failed: Expected STATUS_SUCCESS, got c0000004
=== wvistau64 (32 bit info) === info.c:1838: Test failed: Expected STATUS_SUCCESS, got c0000022 0890:info: unhandled exception c0000005 at 002C0000
=== wvistau64_zh_CN (32 bit info) === info.c:1838: Test failed: Expected STATUS_SUCCESS, got c0000022 0bb8:info: unhandled exception c0000005 at 003E0000
=== wvistau64_fr (32 bit info) === info.c:1838: Test failed: Expected STATUS_SUCCESS, got c0000022 06a8:info: unhandled exception c0000005 at 002C0000
=== wvistau64_he (32 bit info) === info.c:1838: Test failed: Expected STATUS_SUCCESS, got c0000022 0bd8:info: unhandled exception c0000005 at 003D0000
=== w2008s64 (32 bit info) === info.c:1838: Test failed: Expected STATUS_SUCCESS, got c0000022 086c:info: unhandled exception c0000005 at 003D0000
=== w7u (32 bit info) === info.c:1838: Test failed: Expected STATUS_SUCCESS, got c0000022
=== w7pro64 (32 bit info) === info.c:1838: Test failed: Expected STATUS_SUCCESS, got c0000022 0ab8:info: unhandled exception c0000005 at 00340000
=== w8 (32 bit info) === info.c:1838: Test failed: Expected STATUS_SUCCESS, got c0000022 0f30:info: unhandled exception c0000005 at 003E0000
=== w864 (32 bit info) === info.c:1838: Test failed: Expected STATUS_SUCCESS, got c0000022 0a18:info: unhandled exception c0000005 at 00350000
=== w1064 (32 bit info) === info.c:1838: Test failed: Expected STATUS_SUCCESS, got c0000022 0b54:info: unhandled exception c0000005 at 00390000
On Fri, Jun 15, 2018 at 12:59:10AM -0600, Alex Henrie wrote:
Signed-off-by: Alex Henrie alexhenrie24@gmail.com
dlls/ntdll/nt.c | 174 ++++++++++++++++++++++++++++++++++++++++ dlls/ntdll/tests/info.c | 14 ++-- 2 files changed, 182 insertions(+), 6 deletions(-)
diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c index dc0ce04f42..658970b051 100644 --- a/dlls/ntdll/nt.c +++ b/dlls/ntdll/nt.c @@ -66,6 +66,35 @@
WINE_DEFAULT_DEBUG_CHANNEL(ntdll);
+#include "pshpack1.h"
+struct smbios_prologue {
- BYTE calling_method;
- BYTE major_version;
- BYTE minor_version;
- BYTE revision;
- DWORD length;
+};
+struct smbios_bios {
- BYTE type;
- BYTE length;
- WORD handle;
- BYTE vendor;
- BYTE version;
- WORD start;
- BYTE date;
- BYTE size;
- UINT64 characteristics;
+};
+#include "poppack.h"
+/* Firmware table providers */ +#define ACPI 0x41435049 +#define FIRM 0x4649524D +#define RSMB 0x52534D42
/*
- Token
*/ @@ -1850,6 +1879,129 @@ static NTSTATUS create_logical_proc_info(SYSTEM_LOGICAL_PROCESSOR_INFORMATION ** } #endif
+static inline void copy_smbios_string(char **buffer, char *string, size_t string_size) +{
- if (!string) return;
- strcpy(*buffer, string);
- *buffer += string_size;
+}
+#ifdef linux
+static char* get_smbios_string(const char *path, size_t *string_size) +{
- FILE *file = fopen(path, "r");
- char *ret = NULL;
- *string_size = 0;
- if (file)
- {
*string_size = getline(&ret, string_size, file) + 1;
I'm not sure we want to use malloc based functions here. fgets() using a fixed-size buffer with a sensibly chosen size should be fine.
fclose(file);
if (*string_size >= 2 && ret[*string_size - 2] == '\n')
{
ret[*string_size - 2] = 0;
(*string_size)--;
}
if (*string_size == 1)
{
free(ret);
ret = NULL;
*string_size = 0;
}
- }
- return ret;
+}
+static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti,
ULONG available_len, ULONG *required_len)
+{
- switch (sfti->ProviderSignature)
- {
- case RSMB:
{
char *bios_vendor, *bios_version, *bios_date;
size_t bios_vendor_size, bios_version_size, bios_date_size;
char *buffer = (char*)sfti->TableBuffer;
BYTE string_count;
struct smbios_prologue *prologue;
struct smbios_bios *bios;
bios_vendor = get_smbios_string("/sys/class/dmi/id/bios_vendor", &bios_vendor_size);
bios_version = get_smbios_string("/sys/class/dmi/id/bios_version", &bios_version_size);
bios_date = get_smbios_string("/sys/class/dmi/id/bios_date", &bios_date_size);
*required_len = FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer);
*required_len += sizeof(struct smbios_prologue);
*required_len += sizeof(struct smbios_bios);
*required_len += max(bios_vendor_size + bios_version_size + bios_date_size + 1, 2);
if (available_len < *required_len)
{
return STATUS_BUFFER_TOO_SMALL;
}
sfti->TableBufferLength = *required_len - FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer);
prologue = (struct smbios_prologue*)buffer;
prologue->calling_method = 0;
prologue->major_version = 2;
prologue->minor_version = 0;
prologue->revision = 0;
prologue->length = sfti->TableBufferLength - sizeof(struct smbios_prologue);
buffer += sizeof(struct smbios_prologue);
string_count = 0;
bios = (struct smbios_bios*)buffer;
bios->type = 0;
bios->length = sizeof(struct smbios_bios);
bios->handle = 0;
bios->vendor = bios_vendor ? ++string_count : 0;
bios->version = bios_version ? ++string_count : 0;
bios->start = 0;
bios->date = bios_date ? ++string_count : 0;
bios->size = 0;
bios->characteristics = 0x4; /* not supported */
buffer += sizeof(struct smbios_bios);
if (string_count)
{
copy_smbios_string(&buffer, bios_vendor, bios_vendor_size);
copy_smbios_string(&buffer, bios_version, bios_version_size);
copy_smbios_string(&buffer, bios_date, bios_date_size);
memset(buffer, 0, 1);
}
else
{
memset(buffer, 0, 2);
}
free(bios_vendor);
free(bios_version);
free(bios_date);
return STATUS_SUCCESS;
}
- default:
{
return STATUS_NOT_IMPLEMENTED;
FIXME("info_class SYSTEM_FIRMWARE_TABLE_INFORMATION\n");
}
- }
+}
+#else
+static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti,
ULONG available_len, ULONG *required_len)
+{
- return STATUS_NOT_IMPLEMENTED;
- FIXME("info_class SYSTEM_FIRMWARE_TABLE_INFORMATION\n");
+}
+#endif
/******************************************************************************
- NtQuerySystemInformation [NTDLL.@]
- ZwQuerySystemInformation [NTDLL.@]
@@ -2359,6 +2511,28 @@ NTSTATUS WINAPI NtQuerySystemInformation( else ret = STATUS_INFO_LENGTH_MISMATCH; } break;
- case SystemFirmwareTableInformation:
{
SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti = (SYSTEM_FIRMWARE_TABLE_INFORMATION*)SystemInformation;
len = FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer);
if (Length < len)
{
ret = STATUS_INFO_LENGTH_MISMATCH;
break;
}
switch (sfti->Action)
{
case SystemFirmwareTable_Get:
ret = get_firmware_info(sfti, Length, &len);
break;
default:
len = 0;
ret = STATUS_NOT_IMPLEMENTED;
FIXME("info_class SYSTEM_FIRMWARE_TABLE_INFORMATION\n");
}
}
default: FIXME("(0x%08x,%p,0x%08x,%p) stub\n", SystemInformationClass,SystemInformation,Length,ResultLength);break;
diff --git a/dlls/ntdll/tests/info.c b/dlls/ntdll/tests/info.c index cdb91e1b73..b8feebd474 100644 --- a/dlls/ntdll/tests/info.c +++ b/dlls/ntdll/tests/info.c @@ -59,6 +59,12 @@ static DWORD one_before_last_pid = 0; #define FIRM 0x4649524D #define RSMB 0x52534D42
+#ifdef linux +static const int firmware_todo = 0; +#else +static const int firmware_todo = 1; +#endif
static BOOL InitFunctionPtrs(void) { /* All needed functions are NT based, so using GetModuleHandle is a good check */ @@ -840,13 +846,10 @@ static void test_query_firmware(void) ok(!!sfti, "Failed to allocate memory\n");
status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 15, &len1);
-todo_wine ok(status == STATUS_INFO_LENGTH_MISMATCH, "Expected STATUS_INFO_LENGTH_MISMATCH, got %08x\n", status); -todo_wine ok(len1 == 16, "Expected length 16, got %u\n", len1);
status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 16, &len1);
-todo_wine ok(status == STATUS_NOT_IMPLEMENTED, "Expected STATUS_NOT_IMPLEMENTED, got %08x\n", status); ok(len1 == 0, "Expected length 0, got %u\n", len1);
@@ -854,16 +857,15 @@ todo_wine sfti->Action = SystemFirmwareTable_Get;
status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, 16, &len1);
-todo_wine +todo_wine_if(firmware_todo) ok(status == STATUS_BUFFER_TOO_SMALL, "Expected STATUS_BUFFER_TOO_SMALL, got %08x\n", status); -todo_wine ok(len1 >= 16, "Expected length >= 16, got %u\n", len1);
sfti = HeapReAlloc(GetProcessHeap(), 0, sfti, len1); ok(!!sfti, "Failed to allocate memory\n"); status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, len1, &len2);
-todo_wine +todo_wine_if(firmware_todo) ok(status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %08x\n", status); ok(len2 == len1, "Expected length %u, got %u\n", len1, len2);
-- 2.17.1
Signed-off-by: Alex Henrie alexhenrie24@gmail.com --- dlls/kernel32/cpu.c | 29 +++++++++++++++++++++++++++++ dlls/kernel32/process.c | 10 ---------- dlls/kernel32/tests/version.c | 2 -- 3 files changed, 29 insertions(+), 12 deletions(-)
diff --git a/dlls/kernel32/cpu.c b/dlls/kernel32/cpu.c index ec1fd0f90d..8397fbe729 100644 --- a/dlls/kernel32/cpu.c +++ b/dlls/kernel32/cpu.c @@ -336,3 +336,32 @@ DWORD64 WINAPI GetEnabledXStateFeatures(void) FIXME("\n"); return 0; } + +/*********************************************************************** + * GetSystemFirmwareTable (KERNEL32.@) + */ +UINT WINAPI GetSystemFirmwareTable(DWORD provider, DWORD id, void *buffer, DWORD size) +{ + ULONG buffer_size = FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer) + size; + SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti = HeapAlloc(GetProcessHeap(), 0, buffer_size); + NTSTATUS status; + + if (!sfti) + { + SetLastError(ERROR_OUTOFMEMORY); + return 0; + } + + sfti->ProviderSignature = provider; + sfti->Action = SystemFirmwareTable_Get; + sfti->TableID = id; + + status = NtQuerySystemInformation(SystemFirmwareTableInformation, sfti, buffer_size, &buffer_size); + buffer_size -= FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer); + if (buffer_size <= size) + memcpy(buffer, sfti->TableBuffer, buffer_size); + + if (status) SetLastError(RtlNtStatusToDosError(status)); + HeapFree(GetProcessHeap(), 0, sfti); + return buffer_size; +} diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c index ff56e9a692..6adf08d257 100644 --- a/dlls/kernel32/process.c +++ b/dlls/kernel32/process.c @@ -4126,16 +4126,6 @@ HRESULT WINAPI UnregisterApplicationRestart(void) return S_OK; }
-/*********************************************************************** - * GetSystemFirmwareTable (KERNEL32.@) - */ -UINT WINAPI GetSystemFirmwareTable(DWORD provider, DWORD id, PVOID buffer, DWORD size) -{ - FIXME("(%d %d %p %d):stub\n", provider, id, buffer, size); - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - struct proc_thread_attr { DWORD_PTR attr; diff --git a/dlls/kernel32/tests/version.c b/dlls/kernel32/tests/version.c index 6ca45f0b2e..90d63c2794 100644 --- a/dlls/kernel32/tests/version.c +++ b/dlls/kernel32/tests/version.c @@ -721,12 +721,10 @@ void test_GetSystemFirmwareTable(void)
expected_len -= 16; len = GetSystemFirmwareTable(RSMB, 0, smbios_table, 0); -todo_wine ok(len == expected_len, "Expected length %u, got %u\n", expected_len, len);
smbios_table = HeapAlloc(GetProcessHeap(), 0, len); len = GetSystemFirmwareTable(RSMB, 0, smbios_table, len); -todo_wine ok(len == expected_len, "Expected length %u, got %u\n", expected_len, len); for (i = 0; i < len; i++) {
Hi,
While running your changed tests on Windows, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check? Full results can be found at https://testbot.winehq.org/JobDetails.pl?Key=39156
Your paranoid android.
=== w2003std (32 bit version) === version.c:724: Test failed: Expected length 4294967280, got 449 version.c:728: Test failed: Expected length 4294967280, got 449 version.c:731: Test failed: Offset 0: Expected 3a, got 00 version.c:731: Test failed: Offset 1: Expected 00, got 02 version.c:731: Test failed: Offset 2: Expected 03, got 08 version.c:731: Test failed: Offset 3: Expected 00, got 28 version.c:731: Test failed: Offset 4: Expected 00, got b9 version.c:731: Test failed: Offset 6: Expected 0f, got 00 version.c:731: Test failed: Offset 9: Expected 02, got 18 version.c:731: Test failed: Offset 10: Expected 08, got 00 version.c:731: Test failed: Offset 11: Expected 28, got 00 version.c:731: Test failed: Offset 12: Expected b9, got 01 version.c:731: Test failed: Offset 13: Expected 01, got 02 version.c:731: Test failed: Offset 15: Expected 00, got e8 version.c:731: Test failed: Offset 16: Expected 00, got 03 version.c:731: Test failed: Offset 17: Expected 18, got 00 version.c:731: Test failed: Offset 18: Expected 00, got 08 version.c:731: Test failed: Offset 20: Expected 01, got 00 version.c:731: Test failed: Offset 21: Expected 02, got 00 version.c:731: Test failed: Offset 23: Expected e8, got 00 version.c:731: Test failed: Offset 24: Expected 03, got 00 version.c:731: Test failed: Offset 26: Expected 08, got 00 version.c:731: Test failed: Offset 27: Expected 00, got 04 version.c:731: Test failed: Offset 30: Expected 00, got ff version.c:731: Test failed: Offset 31: Expected 00, got ff version.c:731: Test failed: Offset 32: Expected 00, got 53 version.c:731: Test failed: Offset 33: Expected 00, got 65 version.c:731: Test failed: Offset 34: Expected 00, got 61 version.c:731: Test failed: Offset 35: Expected 04, got 42 version.c:731: Test failed: Offset 36: Expected 00, got 49 version.c:731: Test failed: Offset 37: Expected 00, got 4f version.c:731: Test failed: Offset 38: Expected ff, got 53 version.c:731: Test failed: Offset 39: Expected ff, got 00 version.c:731: Test failed: Offset 40: Expected 53, got 31 version.c:731: Test failed: Offset 41: Expected 65, got 2e version.c:731: Test failed: Offset 42: Expected 61, got 31 version.c:731: Test failed: Offset 43: Expected 42, got 30 version.c:731: Test failed: Offset 44: Expected 49, got 2e version.c:731: Test failed: Offset 45: Expected 4f, got 32 version.c:731: Test failed: Offset 46: Expected 53, got 2d version.c:731: Test failed: Offset 47: Expected 00, got 31 version.c:731: Test failed: Offset 48: Expected 31, got 00 version.c:731: Test failed: Offset 49: Expected 2e, got 30 version.c:731: Test failed: Offset 50: Expected 31, got 34 version.c:731: Test failed: Offset 51: Expected 30, got 2f version.c:731: Test failed: Offset 52: Expected 2e, got 30 version.c:731: Test failed: Offset 53: Expected 32, got 31 version.c:731: Test failed: Offset 54: Expected 2d, got 2f version.c:731: Test failed: Offset 55: Expected 31, got 32 version.c:731: Test failed: Offset 56: Expected 00, got 30 version.c:731: Test failed: Offset 57: Expected 30, got 31 version.c:731: Test failed: Offset 59: Expected 2f, got 00 version.c:731: Test failed: Offset 60: Expected 30, got 00 version.c:731: Test failed: Offset 61: Expected 31, got 01 version.c:731: Test failed: Offset 62: Expected 2f, got 1b version.c:731: Test failed: Offset 63: Expected 32, got 00 version.c:731: Test failed: Offset 64: Expected 30, got 01 version.c:731: Test failed: Offset 65: Expected 31, got 01 version.c:731: Test failed: Offset 66: Expected 34, got 02 version.c:731: Test failed: Offset 67: Expected 00, got 03 version.c:731: Test failed: Offset 69: Expected 01, got b7 version.c:731: Test failed: Offset 70: Expected 1b, got ff version.c:731: Test failed: Offset 71: Expected 00, got 4f version.c:731: Test failed: Offset 72: Expected 01, got 2a version.c:731: Test failed: Offset 73: Expected 01, got c5 version.c:731: Test failed: Offset 74: Expected 02, got 53 version.c:731: Test failed: Offset 75: Expected 03, got 46 version.c:731: Test failed: Offset 76: Expected 00, got 9e version.c:731: Test failed: Offset 77: Expected b7, got 8f version.c:731: Test failed: Offset 78: Expected ff, got db version.c:731: Test failed: Offset 79: Expected 4f, got 72 version.c:731: Test failed: Offset 80: Expected 2a, got e5 version.c:731: Test failed: Offset 81: Expected c5, got aa version.c:731: Test failed: Offset 82: Expected 53, got 9a version.c:731: Test failed: Offset 83: Expected 46, got b9 version.c:731: Test failed: Offset 84: Expected 9e, got de version.c:731: Test failed: Offset 85: Expected 8f, got 06 version.c:731: Test failed: Offset 86: Expected db, got 00 version.c:731: Test failed: Offset 87: Expected 72, got 00 version.c:731: Test failed: Offset 88: Expected e5, got 51 version.c:731: Test failed: Offset 89: Expected aa, got 45 version.c:731: Test failed: Offset 90: Expected 9a, got 4d version.c:731: Test failed: Offset 91: Expected b9, got 55 version.c:731: Test failed: Offset 92: Expected de, got 00 version.c:731: Test failed: Offset 93: Expected 06, got 53 version.c:731: Test failed: Offset 94: Expected 00, got 74 version.c:731: Test failed: Offset 95: Expected 00, got 61 version.c:731: Test failed: Offset 96: Expected 51, got 6e version.c:731: Test failed: Offset 97: Expected 45, got 64 version.c:731: Test failed: Offset 98: Expected 4d, got 61 version.c:731: Test failed: Offset 99: Expected 55, got 72 version.c:731: Test failed: Offset 100: Expected 00, got 64 version.c:731: Test failed: Offset 101: Expected 53, got 20 version.c:731: Test failed: Offset 102: Expected 74, got 50 version.c:731: Test failed: Offset 103: Expected 61, got 43 version.c:731: Test failed: Offset 104: Expected 6e, got 20 version.c:731: Test failed: Offset 105: Expected 64, got 28 version.c:731: Test failed: Offset 106: Expected 61, got 69 version.c:731: Test failed: Offset 107: Expected 72, got 34 version.c:731: Test failed: Offset 108: Expected 64, got 34 version.c:731: Test failed: Offset 109: Expected 20, got 30 version.c:731: Test failed: Offset 110: Expected 50, got 46 version.c:731: Test failed: Offset 111: Expected 43, got 58 version.c:731: Test failed: Offset 113: Expected 28, got 2b version.c:731: Test failed: Offset 114: Expected 69, got 20 version.c:731: Test failed: Offset 115: Expected 34, got 50 version.c:731: Test failed: Offset 116: Expected 34, got 49 version.c:731: Test failed: Offset 117: Expected 30, got 49 version.c:731: Test failed: Offset 118: Expected 46, got 58 version.c:731: Test failed: Offset 119: Expected 58, got 2c version.c:731: Test failed: Offset 121: Expected 2b, got 31 version.c:731: Test failed: Offset 122: Expected 20, got 39 version.c:731: Test failed: Offset 123: Expected 50, got 39 version.c:731: Test failed: Offset 124: Expected 49, got 36 version.c:731: Test failed: Offset 125: Expected 49, got 29 version.c:731: Test failed: Offset 126: Expected 58, got 00 version.c:731: Test failed: Offset 127: Expected 2c, got 70 version.c:731: Test failed: Offset 128: Expected 20, got 63 version.c:731: Test failed: Offset 129: Expected 31, got 2d version.c:731: Test failed: Offset 130: Expected 39, got 69 version.c:731: Test failed: Offset 131: Expected 39, got 34 version.c:731: Test failed: Offset 132: Expected 36, got 34 version.c:731: Test failed: Offset 133: Expected 29, got 30 version.c:731: Test failed: Offset 134: Expected 00, got 66 version.c:731: Test failed: Offset 135: Expected 70, got 78 version.c:731: Test failed: Offset 136: Expected 63, got 2d version.c:731: Test failed: Offset 137: Expected 2d, got 32 version.c:731: Test failed: Offset 138: Expected 69, got 2e version.c:731: Test failed: Offset 139: Expected 34, got 31 version.c:731: Test failed: Offset 140: Expected 34, got 00 version.c:731: Test failed: Offset 141: Expected 30, got 00 version.c:731: Test failed: Offset 142: Expected 66, got 03 version.c:731: Test failed: Offset 143: Expected 78, got 15 version.c:731: Test failed: Offset 144: Expected 2d, got 00 version.c:731: Test failed: Offset 145: Expected 32, got 03 version.c:731: Test failed: Offset 146: Expected 2e, got 01 version.c:731: Test failed: Offset 147: Expected 31, got 01 version.c:731: Test failed: Offset 148: Expected 00, got 02 version.c:731: Test failed: Offset 150: Expected 03, got 00 version.c:731: Test failed: Offset 151: Expected 15, got 03 version.c:731: Test failed: Offset 152: Expected 00, got 03 version.c:731: Test failed: Offset 154: Expected 01, got 02 version.c:731: Test failed: Offset 155: Expected 01, got 00 version.c:731: Test failed: Offset 156: Expected 02, got 00 version.c:731: Test failed: Offset 159: Expected 03, got 00 version.c:731: Test failed: Offset 160: Expected 03, got 00 version.c:731: Test failed: Offset 161: Expected 03, got 00 version.c:731: Test failed: Offset 162: Expected 02, got 00 version.c:731: Test failed: Offset 163: Expected 00, got 51 version.c:731: Test failed: Offset 164: Expected 00, got 45 version.c:731: Test failed: Offset 165: Expected 00, got 4d version.c:731: Test failed: Offset 166: Expected 00, got 55 version.c:731: Test failed: Offset 168: Expected 00, got 70 version.c:731: Test failed: Offset 169: Expected 00, got 63 version.c:731: Test failed: Offset 170: Expected 00, got 2d version.c:731: Test failed: Offset 171: Expected 51, got 69 version.c:731: Test failed: Offset 172: Expected 45, got 34 version.c:731: Test failed: Offset 173: Expected 4d, got 34 version.c:731: Test failed: Offset 174: Expected 55, got 30 version.c:731: Test failed: Offset 175: Expected 00, got 66 version.c:731: Test failed: Offset 176: Expected 70, got 78 version.c:731: Test failed: Offset 177: Expected 63, got 2d version.c:731: Test failed: Offset 178: Expected 2d, got 32 version.c:731: Test failed: Offset 179: Expected 69, got 2e version.c:731: Test failed: Offset 180: Expected 34, got 31 version.c:731: Test failed: Offset 181: Expected 34, got 00 version.c:731: Test failed: Offset 182: Expected 30, got 00 version.c:731: Test failed: Offset 183: Expected 66, got 04 version.c:731: Test failed: Offset 184: Expected 78, got 2a version.c:731: Test failed: Offset 185: Expected 2d, got 00 version.c:731: Test failed: Offset 186: Expected 32, got 04 version.c:731: Test failed: Offset 187: Expected 2e, got 01 version.c:731: Test failed: Offset 188: Expected 31, got 03 version.c:731: Test failed: Offset 189: Expected 00, got 01 version.c:731: Test failed: Offset 190: Expected 00, got 02 version.c:731: Test failed: Offset 191: Expected 04, got 61 version.c:731: Test failed: Offset 192: Expected 2a, got 0f version.c:731: Test failed: Offset 194: Expected 04, got 00 version.c:731: Test failed: Offset 195: Expected 01, got fd version.c:731: Test failed: Offset 196: Expected 03, got fb version.c:731: Test failed: Offset 197: Expected 01, got 8b version.c:731: Test failed: Offset 198: Expected 02, got 07 version.c:731: Test failed: Offset 199: Expected 61, got 03 version.c:731: Test failed: Offset 200: Expected 0f, got 00 version.c:731: Test failed: Offset 203: Expected fd, got d0 version.c:731: Test failed: Offset 204: Expected fb, got 07 version.c:731: Test failed: Offset 205: Expected 8b, got d0 version.c:731: Test failed: Offset 207: Expected 03, got 41 version.c:731: Test failed: Offset 208: Expected 00, got 01 version.c:731: Test failed: Offset 209: Expected 00, got ff version.c:731: Test failed: Offset 210: Expected 00, got ff version.c:731: Test failed: Offset 211: Expected d0, got ff version.c:731: Test failed: Offset 212: Expected 07, got ff version.c:731: Test failed: Offset 213: Expected d0, got ff version.c:731: Test failed: Offset 214: Expected 07, got ff version.c:731: Test failed: Offset 215: Expected 41, got 00 version.c:731: Test failed: Offset 216: Expected 01, got 00 version.c:731: Test failed: Offset 217: Expected ff, got 00 version.c:731: Test failed: Offset 218: Expected ff, got 01 version.c:731: Test failed: Offset 219: Expected ff, got 01 version.c:731: Test failed: Offset 220: Expected ff, got 01 version.c:731: Test failed: Offset 221: Expected ff, got 02 version.c:731: Test failed: Offset 222: Expected ff, got 00 version.c:731: Test failed: Offset 223: Expected 00, got 01 version.c:731: Test failed: Offset 225: Expected 00, got 43 version.c:731: Test failed: Offset 226: Expected 01, got 50 version.c:731: Test failed: Offset 227: Expected 01, got 55 version.c:731: Test failed: Offset 228: Expected 01, got 20 version.c:731: Test failed: Offset 229: Expected 02, got 30 version.c:731: Test failed: Offset 231: Expected 01, got 51 version.c:731: Test failed: Offset 232: Expected 00, got 45 version.c:731: Test failed: Offset 233: Expected 43, got 4d version.c:731: Test failed: Offset 234: Expected 50, got 55 version.c:731: Test failed: Offset 235: Expected 55, got 00 version.c:731: Test failed: Offset 236: Expected 20, got 70 version.c:731: Test failed: Offset 237: Expected 30, got 63 version.c:731: Test failed: Offset 238: Expected 00, got 2d version.c:731: Test failed: Offset 239: Expected 51, got 69 version.c:731: Test failed: Offset 240: Expected 45, got 34 version.c:731: Test failed: Offset 241: Expected 4d, got 34 version.c:731: Test failed: Offset 242: Expected 55, got 30 version.c:731: Test failed: Offset 243: Expected 00, got 66 version.c:731: Test failed: Offset 244: Expected 70, got 78 version.c:731: Test failed: Offset 245: Expected 63, got 2d version.c:731: Test failed: Offset 246: Expected 2d, got 32 version.c:731: Test failed: Offset 247: Expected 69, got 2e version.c:731: Test failed: Offset 248: Expected 34, got 31 version.c:731: Test failed: Offset 249: Expected 34, got 00 version.c:731: Test failed: Offset 250: Expected 30, got 00 version.c:731: Test failed: Offset 251: Expected 66, got 04 version.c:731: Test failed: Offset 252: Expected 78, got 2a version.c:731: Test failed: Offset 253: Expected 2d, got 01 version.c:731: Test failed: Offset 254: Expected 32, got 04 version.c:731: Test failed: Offset 255: Expected 2e, got 01 version.c:731: Test failed: Offset 256: Expected 31, got 03 version.c:731: Test failed: Offset 257: Expected 00, got 01 version.c:731: Test failed: Offset 258: Expected 00, got 02 version.c:731: Test failed: Offset 259: Expected 04, got 61 version.c:731: Test failed: Offset 260: Expected 2a, got 0f version.c:731: Test failed: Offset 261: Expected 01, got 00 version.c:731: Test failed: Offset 262: Expected 04, got 00 version.c:731: Test failed: Offset 263: Expected 01, got fd version.c:731: Test failed: Offset 264: Expected 03, got fb version.c:731: Test failed: Offset 265: Expected 01, got 8b version.c:731: Test failed: Offset 266: Expected 02, got 07 version.c:731: Test failed: Offset 267: Expected 61, got 03 version.c:731: Test failed: Offset 268: Expected 0f, got 00 version.c:731: Test failed: Offset 271: Expected fd, got d0 version.c:731: Test failed: Offset 272: Expected fb, got 07 version.c:731: Test failed: Offset 273: Expected 8b, got d0 version.c:731: Test failed: Offset 275: Expected 03, got 41 version.c:731: Test failed: Offset 276: Expected 00, got 01 version.c:731: Test failed: Offset 277: Expected 00, got ff version.c:731: Test failed: Offset 278: Expected 00, got ff version.c:731: Test failed: Offset 279: Expected d0, got ff version.c:731: Test failed: Offset 280: Expected 07, got ff version.c:731: Test failed: Offset 281: Expected d0, got ff version.c:731: Test failed: Offset 282: Expected 07, got ff version.c:731: Test failed: Offset 283: Expected 41, got 00 version.c:731: Test failed: Offset 284: Expected 01, got 00 version.c:731: Test failed: Offset 285: Expected ff, got 00 version.c:731: Test failed: Offset 286: Expected ff, got 01 version.c:731: Test failed: Offset 287: Expected ff, got 01 version.c:731: Test failed: Offset 288: Expected ff, got 01 version.c:731: Test failed: Offset 289: Expected ff, got 02 version.c:731: Test failed: Offset 290: Expected ff, got 00 version.c:731: Test failed: Offset 291: Expected 00, got 01 version.c:731: Test failed: Offset 293: Expected 00, got 43 version.c:731: Test failed: Offset 294: Expected 01, got 50 version.c:731: Test failed: Offset 295: Expected 01, got 55 version.c:731: Test failed: Offset 296: Expected 01, got 20 version.c:731: Test failed: Offset 297: Expected 02, got 31 version.c:731: Test failed: Offset 299: Expected 01, got 51 version.c:731: Test failed: Offset 300: Expected 00, got 45 version.c:731: Test failed: Offset 301: Expected 43, got 4d version.c:731: Test failed: Offset 302: Expected 50, got 55 version.c:731: Test failed: Offset 303: Expected 55, got 00 version.c:731: Test failed: Offset 304: Expected 20, got 70 version.c:731: Test failed: Offset 305: Expected 31, got 63 version.c:731: Test failed: Offset 306: Expected 00, got 2d version.c:731: Test failed: Offset 307: Expected 51, got 69 version.c:731: Test failed: Offset 308: Expected 45, got 34 version.c:731: Test failed: Offset 309: Expected 4d, got 34 version.c:731: Test failed: Offset 310: Expected 55, got 30 version.c:731: Test failed: Offset 311: Expected 00, got 66 version.c:731: Test failed: Offset 312: Expected 70, got 78 version.c:731: Test failed: Offset 313: Expected 63, got 2d version.c:731: Test failed: Offset 314: Expected 2d, got 32 version.c:731: Test failed: Offset 315: Expected 69, got 2e version.c:731: Test failed: Offset 316: Expected 34, got 31 version.c:731: Test failed: Offset 317: Expected 34, got 00 version.c:731: Test failed: Offset 318: Expected 30, got 00 version.c:731: Test failed: Offset 319: Expected 66, got 10 version.c:731: Test failed: Offset 320: Expected 78, got 17 version.c:731: Test failed: Offset 321: Expected 2d, got 00 version.c:731: Test failed: Offset 322: Expected 32, got 10 version.c:731: Test failed: Offset 323: Expected 2e, got 01 version.c:731: Test failed: Offset 324: Expected 31, got 03 version.c:731: Test failed: Offset 325: Expected 00, got 06 version.c:731: Test failed: Offset 327: Expected 10, got 00 version.c:731: Test failed: Offset 328: Expected 17, got 10 version.c:731: Test failed: Offset 330: Expected 10, got fe version.c:731: Test failed: Offset 331: Expected 01, got ff version.c:731: Test failed: Offset 332: Expected 03, got 01 version.c:731: Test failed: Offset 333: Expected 06, got 00 version.c:731: Test failed: Offset 336: Expected 10, got 00 version.c:731: Test failed: Offset 338: Expected fe, got 00 version.c:731: Test failed: Offset 339: Expected ff, got 00 version.c:731: Test failed: Offset 340: Expected 01, got 00 version.c:731: Test failed: Offset 344: Expected 00, got 11 version.c:731: Test failed: Offset 345: Expected 00, got 28 version.c:731: Test failed: Offset 347: Expected 00, got 11 version.c:731: Test failed: Offset 349: Expected 00, got 10 version.c:731: Test failed: Offset 350: Expected 00, got fe version.c:731: Test failed: Offset 351: Expected 00, got ff version.c:731: Test failed: Offset 352: Expected 11, got ff version.c:731: Test failed: Offset 353: Expected 28, got ff version.c:731: Test failed: Offset 354: Expected 00, got ff version.c:731: Test failed: Offset 355: Expected 11, got ff version.c:731: Test failed: Offset 357: Expected 10, got 04 version.c:731: Test failed: Offset 358: Expected fe, got 09 version.c:731: Test failed: Offset 359: Expected ff, got 00 version.c:731: Test failed: Offset 360: Expected ff, got 01 version.c:731: Test failed: Offset 361: Expected ff, got 00 version.c:731: Test failed: Offset 362: Expected ff, got 07 version.c:731: Test failed: Offset 363: Expected ff, got 02 version.c:731: Test failed: Offset 365: Expected 04, got 00 version.c:731: Test failed: Offset 366: Expected 09, got 00 version.c:731: Test failed: Offset 367: Expected 00, got 02 version.c:731: Test failed: Offset 368: Expected 01, got 00 version.c:731: Test failed: Offset 370: Expected 07, got 00 version.c:731: Test failed: Offset 371: Expected 02, got 00 version.c:731: Test failed: Offset 375: Expected 02, got 00 version.c:731: Test failed: Offset 384: Expected 00, got 44 version.c:731: Test failed: Offset 385: Expected 00, got 49 version.c:731: Test failed: Offset 386: Expected 00, got 4d version.c:731: Test failed: Offset 387: Expected 00, got 4d version.c:731: Test failed: Offset 388: Expected 00, got 20 version.c:731: Test failed: Offset 389: Expected 00, got 30 version.c:731: Test failed: Offset 391: Expected 00, got 51 version.c:731: Test failed: Offset 392: Expected 44, got 45 version.c:731: Test failed: Offset 393: Expected 49, got 4d version.c:731: Test failed: Offset 394: Expected 4d, got 55 version.c:731: Test failed: Offset 395: Expected 4d, got 00 version.c:731: Test failed: Offset 396: Expected 20, got 00 version.c:731: Test failed: Offset 397: Expected 30, got 13 version.c:731: Test failed: Offset 398: Expected 00, got 1f version.c:731: Test failed: Offset 399: Expected 51, got 00 version.c:731: Test failed: Offset 400: Expected 45, got 13 version.c:731: Test failed: Offset 401: Expected 4d, got 00 version.c:731: Test failed: Offset 402: Expected 55, got 00 version.c:731: Test failed: Offset 405: Expected 13, got ff version.c:731: Test failed: Offset 406: Expected 1f, got ff version.c:731: Test failed: Offset 407: Expected 00, got 0f version.c:731: Test failed: Offset 408: Expected 13, got 00 version.c:731: Test failed: Offset 410: Expected 00, got 10 version.c:731: Test failed: Offset 411: Expected 00, got 01 version.c:731: Test failed: Offset 413: Expected ff, got 00 version.c:731: Test failed: Offset 414: Expected ff, got 00 version.c:731: Test failed: Offset 415: Expected 0f, got 00 version.c:731: Test failed: Offset 418: Expected 10, got 00 version.c:731: Test failed: Offset 419: Expected 01, got 00 version.c:731: Test failed: Offset 430: Expected 00, got 20 version.c:731: Test failed: Offset 431: Expected 00, got 0b version.c:731: Test failed: Offset 433: Expected 00, got 20 version.c:731: Test failed: Offset 438: Expected 20, got 00 version.c:731: Test failed: Offset 439: Expected 0b, got 00 version.c:731: Test failed: Offset 441: Expected 20, got 00 version.c:731: Test failed: Offset 443: Expected 00, got 7f version.c:731: Test failed: Offset 444: Expected 00, got 04 version.c:731: Test failed: Offset 446: Expected 00, got 7f
Signed-off-by: Alex Henrie alexhenrie24@gmail.com --- dlls/ntdll/nt.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+)
diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c index 658970b051..560cb747bf 100644 --- a/dlls/ntdll/nt.c +++ b/dlls/ntdll/nt.c @@ -88,6 +88,16 @@ struct smbios_bios { UINT64 characteristics; };
+struct smbios_system { + BYTE type; + BYTE length; + WORD handle; + BYTE vendor; + BYTE product; + BYTE version; + BYTE serial; +}; + #include "poppack.h"
/* Firmware table providers */ @@ -1921,14 +1931,21 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti { char *bios_vendor, *bios_version, *bios_date; size_t bios_vendor_size, bios_version_size, bios_date_size; + char *system_vendor, *system_product, *system_version, *system_serial; + size_t system_vendor_size, system_product_size, system_version_size, system_serial_size; char *buffer = (char*)sfti->TableBuffer; BYTE string_count; struct smbios_prologue *prologue; struct smbios_bios *bios; + struct smbios_system *system;
bios_vendor = get_smbios_string("/sys/class/dmi/id/bios_vendor", &bios_vendor_size); bios_version = get_smbios_string("/sys/class/dmi/id/bios_version", &bios_version_size); bios_date = get_smbios_string("/sys/class/dmi/id/bios_date", &bios_date_size); + system_vendor = get_smbios_string("/sys/class/dmi/id/sys_vendor", &system_vendor_size); + system_product = get_smbios_string("/sys/class/dmi/id/product", &system_product_size); + system_version = get_smbios_string("/sys/class/dmi/id/product_version", &system_version_size); + system_serial = get_smbios_string("/sys/class/dmi/id/product_serial", &system_serial_size);
*required_len = FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer);
@@ -1937,6 +1954,10 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti *required_len += sizeof(struct smbios_bios); *required_len += max(bios_vendor_size + bios_version_size + bios_date_size + 1, 2);
+ *required_len += sizeof(struct smbios_system); + *required_len += max(system_vendor_size + system_product_size + system_version_size + + system_serial_size + 1, 2); + if (available_len < *required_len) { return STATUS_BUFFER_TOO_SMALL; @@ -1971,6 +1992,32 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti copy_smbios_string(&buffer, bios_version, bios_version_size); copy_smbios_string(&buffer, bios_date, bios_date_size); memset(buffer, 0, 1); + buffer++; + } + else + { + memset(buffer, 0, 2); + buffer += 2; + } + + string_count = 0; + system = (struct smbios_system*)buffer; + system->type = 1; + system->length = sizeof(struct smbios_system); + system->handle = 0; + system->vendor = system_vendor ? ++string_count : 0; + system->product = system_product ? ++string_count : 0; + system->version = system_version ? ++string_count : 0; + system->serial = system_serial ? ++string_count : 0; + buffer += sizeof(struct smbios_system); + + if (string_count) + { + copy_smbios_string(&buffer, system_vendor, system_vendor_size); + copy_smbios_string(&buffer, system_product, system_product_size); + copy_smbios_string(&buffer, system_version, system_version_size); + copy_smbios_string(&buffer, system_serial, system_serial_size); + memset(buffer, 0, 1); } else { @@ -1980,6 +2027,10 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti free(bios_vendor); free(bios_version); free(bios_date); + free(system_vendor); + free(system_product); + free(system_version); + free(system_serial);
return STATUS_SUCCESS; }
Signed-off-by: Alex Henrie alexhenrie24@gmail.com --- dlls/ntdll/nt.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+)
diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c index 560cb747bf..e79059b224 100644 --- a/dlls/ntdll/nt.c +++ b/dlls/ntdll/nt.c @@ -98,6 +98,16 @@ struct smbios_system { BYTE serial; };
+struct smbios_board { + BYTE type; + BYTE length; + WORD handle; + BYTE vendor; + BYTE product; + BYTE version; + BYTE serial; +}; + #include "poppack.h"
/* Firmware table providers */ @@ -1933,11 +1943,14 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti size_t bios_vendor_size, bios_version_size, bios_date_size; char *system_vendor, *system_product, *system_version, *system_serial; size_t system_vendor_size, system_product_size, system_version_size, system_serial_size; + char *board_vendor, *board_product, *board_version, *board_serial; + size_t board_vendor_size, board_product_size, board_version_size, board_serial_size; char *buffer = (char*)sfti->TableBuffer; BYTE string_count; struct smbios_prologue *prologue; struct smbios_bios *bios; struct smbios_system *system; + struct smbios_board *board;
bios_vendor = get_smbios_string("/sys/class/dmi/id/bios_vendor", &bios_vendor_size); bios_version = get_smbios_string("/sys/class/dmi/id/bios_version", &bios_version_size); @@ -1946,6 +1959,10 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti system_product = get_smbios_string("/sys/class/dmi/id/product", &system_product_size); system_version = get_smbios_string("/sys/class/dmi/id/product_version", &system_version_size); system_serial = get_smbios_string("/sys/class/dmi/id/product_serial", &system_serial_size); + board_vendor = get_smbios_string("/sys/class/dmi/id/board_vendor", &board_vendor_size); + board_product = get_smbios_string("/sys/class/dmi/id/board_name", &board_product_size); + board_version = get_smbios_string("/sys/class/dmi/id/board_version", &board_version_size); + board_serial = get_smbios_string("/sys/class/dmi/id/board_serial", &board_serial_size);
*required_len = FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer);
@@ -1955,9 +1972,14 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti *required_len += max(bios_vendor_size + bios_version_size + bios_date_size + 1, 2);
*required_len += sizeof(struct smbios_system); + *required_len += max(system_vendor_size + system_product_size + system_version_size + system_serial_size + 1, 2);
+ *required_len += sizeof(struct smbios_board); + *required_len += max(board_vendor_size + board_product_size + board_version_size + + board_serial_size + 1, 2); + if (available_len < *required_len) { return STATUS_BUFFER_TOO_SMALL; @@ -2018,6 +2040,32 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti copy_smbios_string(&buffer, system_version, system_version_size); copy_smbios_string(&buffer, system_serial, system_serial_size); memset(buffer, 0, 1); + buffer++; + } + else + { + memset(buffer, 0, 2); + buffer += 2; + } + + string_count = 0; + board = (struct smbios_board*)buffer; + board->type = 2; + board->length = sizeof(struct smbios_board); + board->handle = 0; + board->vendor = board_vendor ? ++string_count : 0; + board->product = board_product ? ++string_count : 0; + board->version = board_version ? ++string_count : 0; + board->serial = board_serial ? ++string_count : 0; + buffer += sizeof(struct smbios_board); + + if (string_count) + { + copy_smbios_string(&buffer, board_vendor, board_vendor_size); + copy_smbios_string(&buffer, board_product, board_product_size); + copy_smbios_string(&buffer, board_version, board_version_size); + copy_smbios_string(&buffer, board_serial, board_serial_size); + memset(buffer, 0, 1); } else { @@ -2031,6 +2079,10 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti free(system_product); free(system_version); free(system_serial); + free(board_vendor); + free(board_product); + free(board_version); + free(board_serial);
return STATUS_SUCCESS; }
Signed-off-by: Alex Henrie alexhenrie24@gmail.com --- dlls/ntdll/nt.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+)
diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c index e79059b224..7380b236b1 100644 --- a/dlls/ntdll/nt.c +++ b/dlls/ntdll/nt.c @@ -108,6 +108,17 @@ struct smbios_board { BYTE serial; };
+struct smbios_chassis { + BYTE type; + BYTE length; + WORD handle; + BYTE vendor; + BYTE shape; + BYTE version; + BYTE serial; + BYTE asset_tag; +}; + #include "poppack.h"
/* Firmware table providers */ @@ -1945,12 +1956,15 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti size_t system_vendor_size, system_product_size, system_version_size, system_serial_size; char *board_vendor, *board_product, *board_version, *board_serial; size_t board_vendor_size, board_product_size, board_version_size, board_serial_size; + char *chassis_vendor, *chassis_version, *chassis_serial, *chassis_asset_tag; + size_t chassis_vendor_size, chassis_version_size, chassis_serial_size, chassis_asset_tag_size; char *buffer = (char*)sfti->TableBuffer; BYTE string_count; struct smbios_prologue *prologue; struct smbios_bios *bios; struct smbios_system *system; struct smbios_board *board; + struct smbios_chassis *chassis;
bios_vendor = get_smbios_string("/sys/class/dmi/id/bios_vendor", &bios_vendor_size); bios_version = get_smbios_string("/sys/class/dmi/id/bios_version", &bios_version_size); @@ -1963,6 +1977,10 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti board_product = get_smbios_string("/sys/class/dmi/id/board_name", &board_product_size); board_version = get_smbios_string("/sys/class/dmi/id/board_version", &board_version_size); board_serial = get_smbios_string("/sys/class/dmi/id/board_serial", &board_serial_size); + chassis_vendor = get_smbios_string("/sys/class/dmi/id/chassis_vendor", &chassis_vendor_size); + chassis_version = get_smbios_string("/sys/class/dmi/id/chassis_version", &chassis_version_size); + chassis_serial = get_smbios_string("/sys/class/dmi/id/chassis_serial", &chassis_serial_size); + chassis_asset_tag = get_smbios_string("/sys/class/dmi/id/chassis_tag", &chassis_asset_tag_size);
*required_len = FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer);
@@ -1980,6 +1998,10 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti *required_len += max(board_vendor_size + board_product_size + board_version_size + board_serial_size + 1, 2);
+ *required_len += sizeof(struct smbios_chassis); + *required_len += max(chassis_vendor_size + chassis_version_size + chassis_serial_size + + chassis_asset_tag_size + 1, 2); + if (available_len < *required_len) { return STATUS_BUFFER_TOO_SMALL; @@ -2048,6 +2070,33 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti buffer += 2; }
+ string_count = 0; + chassis = (struct smbios_chassis*)buffer; + chassis->type = 3; + chassis->length = sizeof(struct smbios_chassis); + chassis->handle = 0; + chassis->vendor = chassis_vendor ? ++string_count : 0; + chassis->shape = 0x2; /* unknown */ + chassis->version = chassis_version ? ++string_count : 0; + chassis->serial = chassis_serial ? ++string_count : 0; + chassis->asset_tag = chassis_asset_tag ? ++string_count : 0; + buffer += sizeof(struct smbios_chassis); + + if (string_count) + { + copy_smbios_string(&buffer, chassis_vendor, chassis_vendor_size); + copy_smbios_string(&buffer, chassis_version, chassis_version_size); + copy_smbios_string(&buffer, chassis_serial, chassis_serial_size); + copy_smbios_string(&buffer, chassis_asset_tag, chassis_asset_tag_size); + memset(buffer, 0, 1); + buffer++; + } + else + { + memset(buffer, 0, 2); + buffer += 2; + } + string_count = 0; board = (struct smbios_board*)buffer; board->type = 2; @@ -2083,6 +2132,10 @@ static inline NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti free(board_product); free(board_version); free(board_serial); + free(chassis_vendor); + free(chassis_version); + free(chassis_serial); + free(chassis_asset_tag);
return STATUS_SUCCESS; }