Commit fb675cef authored by Brendan Shanks's avatar Brendan Shanks Committed by Alexandre Julliard

ntdll: Factor out get_smbios_from_iokit().

parent 2868881c
......@@ -1634,72 +1634,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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment