[PATCH 2/3] ntdll: Factor out get_smbios_from_iokit().
Brendan Shanks
bshanks at codeweavers.com
Mon Sep 13 17:07:26 CDT 2021
Signed-off-by: Brendan Shanks <bshanks at codeweavers.com>
---
dlls/ntdll/unix/system.c | 118 +++++++++++++++++++++------------------
1 file changed, 63 insertions(+), 55 deletions(-)
diff --git a/dlls/ntdll/unix/system.c b/dlls/ntdll/unix/system.c
index 145cb0810cd..70636020489 100644
--- a/dlls/ntdll/unix/system.c
+++ b/dlls/ntdll/unix/system.c
@@ -1576,72 +1576,80 @@ static NTSTATUS get_firmware_info( SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti, ULON
#elif defined(__APPLE__)
-static NTSTATUS get_firmware_info( SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti, ULONG available_len,
- ULONG *required_len )
+static NTSTATUS get_smbios_from_iokit( SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti, ULONG available_len,
+ ULONG *required_len )
{
- switch (sfti->ProviderSignature)
+ io_service_t service;
+ CFDataRef data;
+ const UInt8 *ptr;
+ CFIndex len;
+ struct smbios_prologue *prologue;
+ BYTE major_version = 2, minor_version = 0;
+
+ if (!(service = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("AppleSMBIOS"))))
{
- case RSMB:
+ WARN("can't find AppleSMBIOS service\n");
+ return STATUS_NO_MEMORY;
+ }
+
+ if (!(data = IORegistryEntryCreateCFProperty(service, CFSTR("SMBIOS-EPS"), kCFAllocatorDefault, 0)))
{
- io_service_t service;
- CFDataRef data;
- const UInt8 *ptr;
- CFIndex len;
- struct smbios_prologue *prologue;
- BYTE major_version = 2, minor_version = 0;
+ WARN("can't find SMBIOS entry point\n");
+ IOObjectRelease(service);
+ return STATUS_NO_MEMORY;
+ }
- if (!(service = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("AppleSMBIOS"))))
- {
- WARN("can't find AppleSMBIOS service\n");
- return STATUS_NO_MEMORY;
- }
+ len = CFDataGetLength(data);
+ ptr = CFDataGetBytePtr(data);
+ if (len >= 8 && !memcmp(ptr, "_SM_", 4))
+ {
+ major_version = ptr[6];
+ minor_version = ptr[7];
+ }
+ CFRelease(data);
- if (!(data = IORegistryEntryCreateCFProperty(service, CFSTR("SMBIOS-EPS"), kCFAllocatorDefault, 0)))
- {
- WARN("can't find SMBIOS entry point\n");
- IOObjectRelease(service);
- return STATUS_NO_MEMORY;
- }
+ if (!(data = IORegistryEntryCreateCFProperty(service, CFSTR("SMBIOS"), kCFAllocatorDefault, 0)))
+ {
+ WARN("can't find SMBIOS table\n");
+ IOObjectRelease(service);
+ return STATUS_NO_MEMORY;
+ }
- len = CFDataGetLength(data);
- ptr = CFDataGetBytePtr(data);
- if (len >= 8 && !memcmp(ptr, "_SM_", 4))
- {
- major_version = ptr[6];
- minor_version = ptr[7];
- }
+ len = CFDataGetLength(data);
+ ptr = CFDataGetBytePtr(data);
+ sfti->TableBufferLength = sizeof(*prologue) + len;
+ *required_len = sfti->TableBufferLength + FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer);
+ if (available_len < *required_len)
+ {
CFRelease(data);
+ IOObjectRelease(service);
+ return STATUS_BUFFER_TOO_SMALL;
+ }
- if (!(data = IORegistryEntryCreateCFProperty(service, CFSTR("SMBIOS"), kCFAllocatorDefault, 0)))
- {
- WARN("can't find SMBIOS table\n");
- IOObjectRelease(service);
- return STATUS_NO_MEMORY;
- }
-
- len = CFDataGetLength(data);
- ptr = CFDataGetBytePtr(data);
- sfti->TableBufferLength = sizeof(*prologue) + len;
- *required_len = sfti->TableBufferLength + FIELD_OFFSET(SYSTEM_FIRMWARE_TABLE_INFORMATION, TableBuffer);
- if (available_len < *required_len)
- {
- CFRelease(data);
- IOObjectRelease(service);
- return STATUS_BUFFER_TOO_SMALL;
- }
+ prologue = (struct smbios_prologue *)sfti->TableBuffer;
+ prologue->calling_method = 0;
+ prologue->major_version = major_version;
+ prologue->minor_version = minor_version;
+ prologue->revision = 0;
+ prologue->length = sfti->TableBufferLength - sizeof(*prologue);
- prologue = (struct smbios_prologue *)sfti->TableBuffer;
- prologue->calling_method = 0;
- prologue->major_version = major_version;
- prologue->minor_version = minor_version;
- prologue->revision = 0;
- prologue->length = sfti->TableBufferLength - sizeof(*prologue);
+ memcpy(sfti->TableBuffer + sizeof(*prologue), ptr, len);
- memcpy(sfti->TableBuffer + sizeof(*prologue), ptr, len);
+ CFRelease(data);
+ IOObjectRelease(service);
+ return STATUS_SUCCESS;
+}
- CFRelease(data);
- IOObjectRelease(service);
- return STATUS_SUCCESS;
+static NTSTATUS get_firmware_info( SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti, ULONG available_len,
+ ULONG *required_len )
+{
+ switch (sfti->ProviderSignature)
+ {
+ case RSMB:
+ {
+ NTSTATUS ret;
+ ret = get_smbios_from_iokit(sfti, available_len, required_len);
+ return ret;
}
default:
FIXME("info_class SYSTEM_FIRMWARE_TABLE_INFORMATION provider %08x\n", sfti->ProviderSignature);
--
2.30.1 (Apple Git-130)
More information about the wine-devel
mailing list