[PATCH] ntdll: Add system family and SKU to generated SMBIOS tables.
Brendan Shanks
bshanks at codeweavers.com
Thu Feb 20 16:37:28 CST 2020
Signed-off-by: Brendan Shanks <bshanks at codeweavers.com>
---
dlls/ntdll/nt.c | 35 +++++++++++++++++++++++++++++++++--
1 file changed, 33 insertions(+), 2 deletions(-)
diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c
index b89602cee8..f88ded34c1 100644
--- a/dlls/ntdll/nt.c
+++ b/dlls/ntdll/nt.c
@@ -111,6 +111,11 @@ struct smbios_bios {
BYTE date;
BYTE size;
UINT64 characteristics;
+ BYTE characteristics_ext[2];
+ BYTE system_bios_major_release;
+ BYTE system_bios_minor_release;
+ BYTE ec_firmware_major_release;
+ BYTE ec_firmware_minor_release;
};
struct smbios_system {
@@ -120,6 +125,9 @@ struct smbios_system {
BYTE version;
BYTE serial;
BYTE uuid[16];
+ BYTE wake_up_type;
+ BYTE sku_number;
+ BYTE family;
};
struct smbios_board {
@@ -137,6 +145,10 @@ struct smbios_chassis {
BYTE version;
BYTE serial;
BYTE asset_tag;
+ BYTE boot_state;
+ BYTE power_supply_state;
+ BYTE thermal_state;
+ BYTE security_status;
};
#include "poppack.h"
@@ -2142,6 +2154,8 @@ static NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti, ULONG
size_t bios_vendor_len, bios_version_len, bios_date_len;
char system_vendor[128], system_product[128], system_version[128], system_serial[128];
size_t system_vendor_len, system_product_len, system_version_len, system_serial_len;
+ char system_sku[128], system_family[128];
+ size_t system_sku_len, system_family_len;
char board_vendor[128], board_product[128], board_version[128], board_serial[128];
size_t board_vendor_len, board_product_len, board_version_len, board_serial_len;
char chassis_vendor[128], chassis_version[128], chassis_serial[128], chassis_asset_tag[128];
@@ -2163,6 +2177,8 @@ static NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti, ULONG
system_product_len = get_smbios_string("/sys/class/dmi/id/product_name", S(system_product));
system_version_len = get_smbios_string("/sys/class/dmi/id/product_version", S(system_version));
system_serial_len = get_smbios_string("/sys/class/dmi/id/product_serial", S(system_serial));
+ system_sku_len = get_smbios_string("/sys/class/dmi/id/product_sku", S(system_sku));
+ system_family_len = get_smbios_string("/sys/class/dmi/id/product_family", S(system_family));
board_vendor_len = get_smbios_string("/sys/class/dmi/id/board_vendor", S(board_vendor));
board_product_len = get_smbios_string("/sys/class/dmi/id/board_name", S(board_product));
board_version_len = get_smbios_string("/sys/class/dmi/id/board_version", S(board_version));
@@ -2181,7 +2197,7 @@ static NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti, ULONG
*required_len += sizeof(struct smbios_system);
*required_len += max(system_vendor_len + system_product_len + system_version_len +
- system_serial_len + 5, 2);
+ system_serial_len + system_sku_len + system_family_len + 7, 2);
*required_len += sizeof(struct smbios_board);
*required_len += max(board_vendor_len + board_product_len + board_version_len + board_serial_len + 5, 2);
@@ -2200,7 +2216,7 @@ static NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti, ULONG
prologue = (struct smbios_prologue*)buffer;
prologue->calling_method = 0;
prologue->major_version = 2;
- prologue->minor_version = 0;
+ prologue->minor_version = 4;
prologue->revision = 0;
prologue->length = sfti->TableBufferLength - sizeof(struct smbios_prologue);
buffer += sizeof(struct smbios_prologue);
@@ -2216,6 +2232,12 @@ static NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti, ULONG
bios->date = bios_date_len ? ++string_count : 0;
bios->size = 0;
bios->characteristics = 0x4; /* not supported */
+ bios->characteristics_ext[0] = 0;
+ bios->characteristics_ext[1] = 0;
+ bios->system_bios_major_release = 0xFF; /* not supported */
+ bios->system_bios_minor_release = 0xFF; /* not supported */
+ bios->ec_firmware_major_release = 0xFF; /* not supported */
+ bios->ec_firmware_minor_release = 0xFF; /* not supported */
buffer += sizeof(struct smbios_bios);
copy_smbios_string(&buffer, bios_vendor, bios_vendor_len);
@@ -2234,12 +2256,17 @@ static NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti, ULONG
system->version = system_version_len ? ++string_count : 0;
system->serial = system_serial_len ? ++string_count : 0;
get_system_uuid( (GUID *)system->uuid );
+ system->wake_up_type = 0x02; /* unknown */
+ system->sku_number = system_sku_len ? ++string_count : 0;
+ system->family = system_family_len ? ++string_count : 0;
buffer += sizeof(struct smbios_system);
copy_smbios_string(&buffer, system_vendor, system_vendor_len);
copy_smbios_string(&buffer, system_product, system_product_len);
copy_smbios_string(&buffer, system_version, system_version_len);
copy_smbios_string(&buffer, system_serial, system_serial_len);
+ copy_smbios_string(&buffer, system_sku, system_sku_len);
+ copy_smbios_string(&buffer, system_family, system_family_len);
if (!string_count) *buffer++ = 0;
*buffer++ = 0;
@@ -2271,6 +2298,10 @@ static NTSTATUS get_firmware_info(SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti, ULONG
chassis->version = chassis_version_len ? ++string_count : 0;
chassis->serial = chassis_serial_len ? ++string_count : 0;
chassis->asset_tag = chassis_asset_tag_len ? ++string_count : 0;
+ chassis->boot_state = 0x02; /* unknown */
+ chassis->power_supply_state = 0x02; /* unknown */
+ chassis->thermal_state = 0x02; /* unknown */
+ chassis->security_status = 0x02; /* unknown */
buffer += sizeof(struct smbios_chassis);
copy_smbios_string(&buffer, chassis_vendor, chassis_vendor_len);
--
2.24.1
More information about the wine-devel
mailing list