[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