Signed-off-by: Brendan Shanks bshanks@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);