Index: trunk/ChameleonPrefPane/Sources/smbios/smbios_decode.cpp =================================================================== --- trunk/ChameleonPrefPane/Sources/smbios/smbios_decode.cpp (revision 381) +++ trunk/ChameleonPrefPane/Sources/smbios/smbios_decode.cpp (revision 382) @@ -106,11 +106,12 @@ DBG("\tmaximumClock: %dMHz\n", structHeader->maximumClock); DBG("\tcurrentClock: %dMHz\n", structHeader->currentClock); - if (minorVersion < 3 || structHeader->header.length < 35) - return; - DBG("\tserialNumber: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->serialNumber)); - DBG("\tassetTag: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->assetTag)); - DBG("\tpartNumber: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->partNumber)); + if (minorVersion >= 3 && structHeader->header.length >= 35) + { + DBG("\tserialNumber: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->serialNumber)); + DBG("\tassetTag: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->assetTag)); + DBG("\tpartNumber: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->partNumber)); + } DBG("\n"); } @@ -162,8 +163,7 @@ DBG("\n"); for (SMBStructHeader *structHeader = (SMBStructHeader*)ptr; structHeader < (SMBStructHeader*)end ;) { - DBG("Type: %d, Length: %d, Handle: 0x%x\n", - structHeader->type, structHeader->length, structHeader->handle); + // DBG("Type: %d, Length: %d, Handle: 0x%x\n", structHeader->type, structHeader->length, structHeader->handle); switch (structHeader->type) { @@ -191,11 +191,6 @@ decodeMemoryDevice((SMBMemoryDevice *)structHeader); break; - /* Skip all Apple Specific Structures */ - case kSMBTypeFirmwareVolume: - case kSMBTypeMemorySPD: - break; - case kSMBTypeOemProcessorType: decodeOemProcessorType((SMBOemProcessorType *)structHeader); break; @@ -204,10 +199,10 @@ decodeOemProcessorBusSpeed((SMBOemProcessorBusSpeed *)structHeader); break; - case kSMBTypeEndOfTable: - /* Skip, to be added at the end */ - break; - + case kSMBTypeEndOfTable: /* Skip, to be added at the end */ + /* Skip all Apple Specific Structures */ + case kSMBTypeFirmwareVolume: + case kSMBTypeMemorySPD: default: break; } Index: trunk/ChameleonPrefPane/Sources/smbios/smbios.h =================================================================== --- trunk/ChameleonPrefPane/Sources/smbios/smbios.h (revision 381) +++ trunk/ChameleonPrefPane/Sources/smbios/smbios.h (revision 382) @@ -471,8 +471,4 @@ #define SMBIOS_ORIGINAL 0 #define SMBIOS_PATCHED 1 - -extern void decodeSMBIOSTable(uint8_t *start, uint8_t * end); - - #endif /* !__LIBSAIO_SMBIOS_H */ Index: trunk/ChameleonPrefPane/Sources/smbios/smbios.cpp =================================================================== --- trunk/ChameleonPrefPane/Sources/smbios/smbios.cpp (revision 381) +++ trunk/ChameleonPrefPane/Sources/smbios/smbios.cpp (revision 382) @@ -276,75 +276,12 @@ SMBEntryPoint *origeps = 0; SMBEntryPoint *neweps = 0; -static uint8_t stringIndex; // increament when a string is added and set the field value accordingly -static uint8_t stringsSize; // add string size - /* + static uint8_t stringIndex; // increament when a string is added and set the field value accordingly + static uint8_t stringsSize; // add string size + static SMBWord tableLength = 0; static SMBWord handle = 0; static SMBWord maxStructSize = 0; static SMBWord structureCount = 0; */ - -/* Rewrite this function */ -void setDefaultSMBData(void) -{ - defaultBIOSInfo.vendor = kDefaultVendorManufacturer; - defaultBIOSInfo.releaseDate = kDefaultBIOSReleaseDate; - - defaultSystemInfo.manufacturer = kDefaultVendorManufacturer; - defaultSystemInfo.version = kDefaultSystemVersion; - defaultSystemInfo.serialNumber = kDefaultSerialNumber; - - defaultBaseBoard.manufacturer = kDefaultVendorManufacturer; - defaultBaseBoard.product = kDefaultBoardProduct; - defaultBIOSInfo.version = kDefaultMacProNehalemBIOSVersion; - defaultSystemInfo.productName = kDefaultMacProNehalem; - defaultSystemInfo.family = kDefaultMacProFamily; - -} - -char *getSMBStringForField(SMBStructHeader *structHeader, uint8_t field) -{ - uint8_t *stringPtr = ((uint8_t *)structHeader) + structHeader->length; - - if (!field) - return NULL; - - for (field--; field != 0 && strlen((char *)stringPtr) > 0; - field--, stringPtr = (uint8_t *)((unsigned long )stringPtr + strlen((char *)stringPtr) + 1)); - - return (char *)stringPtr; -} - -void setSMBStringForField(SMBStructHeader *structHeader, const char *string, uint8_t *field) -{ - int strSize; - - if (!field) - return; - if (!string) - { - *field = 0; - return; - } - - strSize = strlen(string); - - // remove any spaces found at the end - while ((strSize != 0) && (string[strSize - 1] == ' ')) - strSize--; - - if (strSize == 0) - { - *field = 0; - return; - } - - memcpy((uint8_t *)structHeader + structHeader->length + stringsSize, string, strSize); - *field = stringIndex; - - stringIndex++; - stringsSize += strSize + 1; -} - Index: trunk/ChameleonPrefPane/Sources/SmbiosExtractor.mm =================================================================== --- trunk/ChameleonPrefPane/Sources/SmbiosExtractor.mm (revision 381) +++ trunk/ChameleonPrefPane/Sources/SmbiosExtractor.mm (revision 382) @@ -9,9 +9,50 @@ #include "ShellProcess.h" #include "string_util.h" #include "smbios.h" +#include "PropertyList.h" +#include "smbios.h" +#include +#ifndef DEBUG_SMBIOS +#define DEBUG_SMBIOS 0 +#endif +#if 0 +#define DBG(x...) printf(x) +#else +#define DBG(x...) +#endif +static SMBWord minorVersion; +static char* getSMBStringForField(SMBStructHeader *structHeader, uint8_t field) +{ + uint8_t *stringPtr = ((uint8_t *)structHeader) + structHeader->length; + static char empty[2] = ""; + if (!field) + return empty; + + for (field--; field != 0 && strlen((char *)stringPtr) > 0; + field--, stringPtr = (uint8_t *)((unsigned long )stringPtr + strlen((char *)stringPtr) + 1)); + + return ( char*) (stringPtr ? (char*) stringPtr : empty); +} + +#define SHVAL(field) [NSString stringWithUTF8String: getSMBStringForField((SMBStructHeader *)structHeader, structHeader->field)] +#define SHVAL2(f,g) SHVAL(f),SHVAL(g) +#define SHVAL3(f,g,h) SHVAL2(f,g),SHVAL(h) +#define SHVAL4(f,g,h,i) SHVAL2(f,g),SHVAL2(h,i) +#define SHVAL5(f,g,h,i,j) SHVAL4(f,g,h,i),SHVAL(j) +#define SHVAL6(f,g,h,i,j,k) SHVAL5(f,g,h,i,j),SHVAL(k) +#define SHVAL7(f,g,h,i,j,k,l) SHVAL6(f,g,h,i,j,k),SHVAL(l) + +#define MHZ(f) [NSString stringWithFormat:@"%d MHZ", (int)structHeader->f] +#define DEC(f) [NSString stringWithFormat:@"%d", (int)structHeader->f] +#define LLX(f) [NSString stringWithFormat:@"%llX", structHeader->f] +#define HEX32(f) [NSString stringWithFormat:@"0x%08X", (int)structHeader->f] +#define HEX16(f) [NSString stringWithFormat:@"0x%04X", (int)structHeader->f] +#define HEX8(f) [NSString stringWithFormat:@"%0x02X", (int)structHeader->f] + @implementation SmbiosExtractor +@synthesize dict; @synthesize smString; @synthesize bufSize; -(id) init @@ -19,8 +60,6 @@ self = [super init]; if (self!=nil) { - buffer = nil; - bufSize=0; [ self extractSmBios]; } @@ -42,7 +81,12 @@ [smString release]; smString = nil; } - + + if (dict!=nil) + { + [dict release]; + dict = nil; + } } -(void) dealloc @@ -53,7 +97,7 @@ -(NSString*) description { - return smString; + return [dict description]; } -(NSUInteger) extractSmBios @@ -70,17 +114,23 @@ const char * p = strstr(line, SmbiosTag)+ tagLen; std::string s = trim(p, " \t\r\n>"); NSLog(@"Found SMBIOS (%d) [%s]", s.length(), s.c_str() ); + [self cleanup]; + + self.dict = [NSMutableDictionary dictionaryWithCapacity:32]; + self.smString = [NSString stringWithUTF8String:s.c_str()]; bufSize = s.length()/2; buffer = new UInt8[bufSize]; + for(size_t pos =0; pos < bufSize; pos++) { buffer[pos] = (HexToDec(s[pos*2])*16 + HexToDec(s[pos*2+1])); } - decodeSMBIOSTable(buffer, buffer+bufSize); + [self decodeSMBIOSTableFrom:buffer to: buffer+bufSize]; } + return 0; } @@ -94,4 +144,292 @@ return position < bufSize ? buffer[position]: 0; } +-(BOOL) save:(NSString*) path +{ + NSString * error; + id plist = [NSPropertyListSerialization dataFromPropertyList:(id)dict + format:NSPropertyListXMLFormat_v1_0 errorDescription:&error]; + + [plist writeToFile:path atomically:YES]; + + return YES; +} +#define ADD_HANDLE(text) [dict setValue:innerDict forKey: [NSString stringWithFormat:@"%@ (0x%02x)", text, (int) structHeader->header.handle] ] +//------------------------------------------------------------------------------------------------------------------------- +// BIOSInformation +//------------------------------------------------------------------------------------------------------------------------- +-(void) decodeBIOSInformation:(SMBBIOSInformation *)structHeader +{ + NSDictionary* innerDict = [NSDictionary dictionaryWithObjects: + [NSArray arrayWithObjects: SHVAL3(vendor, version, releaseDate), nil ] + forKeys: [NSArray arrayWithObjects:@"Vendor", @"Version", @"Release Date", nil]]; + + ADD_HANDLE(@"BIOS Information"); + + DBG("BIOSInformation:\n"); + DBG("\tvendor: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->vendor)); + DBG("\tversion: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->version)); + DBG("\treleaseDate: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->releaseDate)); + DBG("\n"); +} + +//------------------------------------------------------------------------------------------------------------------------- +// SystemInformation +//------------------------------------------------------------------------------------------------------------------------- +-(void) decodeSystemInformation:(SMBSystemInformation *)structHeader +{ + NSDictionary* innerDict = + [NSDictionary dictionaryWithObjects: + [NSArray arrayWithObjects: SHVAL4(manufacturer, productName, version, serialNumber), nil ] + forKeys: [NSArray arrayWithObjects:@"Manufacturer", @"Product Name", @"Version", @"Serial Number", nil]]; + + ADD_HANDLE(@"System Information"); + + DBG("SystemInformation:\n"); + DBG("\tmanufacturer: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->manufacturer)); + DBG("\tproductName: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->productName)); + DBG("\tversion: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->version)); + DBG("\tserialNumber: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->serialNumber)); + + if (minorVersion < 1 || structHeader->header.length < 25) + { + DBG("\n"); + return; + } + uint8_t *uuid = structHeader->uuid; + DBG("\tuuid: %02X%02X%02X%02X-%02X%02X-%02X%02X-%02x%02X-%02X%02X%02X%02X%02X%02X\n", + uuid[0], uuid[1], uuid[2], uuid[3], + uuid[4], uuid[5], + uuid[6], uuid[7], + uuid[8], uuid[9], + uuid[10], uuid[11], uuid[12], uuid[13], uuid[14], uuid[15]); + DBG("\twakeupReason: 0x%x\n", structHeader->wakeupReason); + + if (minorVersion < 4 || structHeader->header.length < 27) + { + DBG("\n"); + return; + } + DBG("\tskuNumber: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->skuNumber)); + DBG("\tfamily: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->family)); + DBG("\n"); +} + +//------------------------------------------------------------------------------------------------------------------------- +// BaseBoard +//------------------------------------------------------------------------------------------------------------------------- +-(void) decodeBaseBoard:(SMBBaseBoard *) structHeader +{ + NSDictionary* innerDict = + [NSDictionary dictionaryWithObjects: + [NSArray arrayWithObjects: SHVAL7(manufacturer, product, version, serialNumber, assetTagNumber, locationInChassis, boardType), nil ] + forKeys: [NSArray arrayWithObjects:@"Manufacturer", @"Product", @"Version", @"Serial Number", + @"Asset Tag Number", @"Location In Chassis", @"Board Type", nil]]; + + ADD_HANDLE(@"Base Board"); + + DBG("BaseBoard:\n"); + DBG("\tmanufacturer: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->manufacturer)); + DBG("\tproduct: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->product)); + DBG("\tversion: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->version)); + DBG("\tserialNumber: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->serialNumber)); + DBG("\tassetTagNumber: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->assetTagNumber)); + DBG("\tlocationInChassis: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->locationInChassis)); + DBG("\tboardType: 0x%X\n", structHeader->boardType); + DBG("\n"); +} + +//------------------------------------------------------------------------------------------------------------------------- +// SystemEnclosure +//------------------------------------------------------------------------------------------------------------------------- +-(void) decodeSystemEnclosure:(SMBSystemEnclosure *) structHeader +{ + NSDictionary* innerDict = + [NSDictionary dictionaryWithObjects: + [NSArray arrayWithObjects: SHVAL5(manufacturer, type, version, serialNumber, assetTagNumber), nil ] + forKeys: [NSArray arrayWithObjects:@"Manufacturer", @"Type", @"Version", @"Serial Number", @"Asset Tag Number", nil]]; + + ADD_HANDLE(@"System Enclosure"); + + DBG("SystemEnclosure:\n"); + DBG("\tmanufacturer: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->manufacturer)); + DBG("\ttype: %d\n", structHeader->type); + DBG("\tversion: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->version)); + DBG("\tserialNumber: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->serialNumber)); + DBG("\tassetTagNumber: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->assetTagNumber)); + DBG("\n"); +} + +//------------------------------------------------------------------------------------------------------------------------- +// ProcessorInformation +//------------------------------------------------------------------------------------------------------------------------- +-(void) decodeProcessorInformation:(SMBProcessorInformation *) structHeader +{ + NSDictionary* clockDict = [NSDictionary dictionaryWithObjects: + [NSArray arrayWithObjects: MHZ(externalClock), MHZ(maximumClock), MHZ(currentClock), nil ] + forKeys: [NSArray arrayWithObjects:@"External", @"Maximum", @"Current", nil]]; + + NSDictionary* procDict = [NSDictionary dictionaryWithObjects: + [NSArray arrayWithObjects: SHVAL(socketDesignation), DEC(processorType), HEX16(processorFamily), SHVAL(manufacturer), + LLX(processorID), SHVAL(processorVersion), nil ] + forKeys: [NSArray arrayWithObjects:@"Socket", @"Type", @"Family", @"Manufacturer", @"ID", @"Version", nil]]; + + NSDictionary* innerDict = [NSDictionary dictionaryWithObjects: + [NSArray arrayWithObjects: procDict, clockDict, nil ] + forKeys: [NSArray arrayWithObjects:@"Processor", @"Clock", nil]]; + + ADD_HANDLE(@"Processor Information"); + + DBG("ProcessorInformation:\n"); + DBG("\tsocketDesignation: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->socketDesignation)); + DBG("\tprocessorType: %d\n", structHeader->processorType); + DBG("\tprocessorFamily: 0x%X\n", structHeader->processorFamily); + DBG("\tmanufacturer: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->manufacturer)); + DBG("\tprocessorID: 0x%llX\n", structHeader->processorID); + DBG("\tprocessorVersion: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->processorVersion)); + DBG("\texternalClock: %dMHz\n", structHeader->externalClock); + DBG("\tmaximumClock: %dMHz\n", structHeader->maximumClock); + DBG("\tcurrentClock: %dMHz\n", structHeader->currentClock); + + if (minorVersion >= 3 && structHeader->header.length >= 35) + { + DBG("\tserialNumber: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->serialNumber)); + DBG("\tassetTag: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->assetTag)); + DBG("\tpartNumber: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->partNumber)); + } + DBG("\n"); +} + +//------------------------------------------------------------------------------------------------------------------------- +// MemoryDevice +//------------------------------------------------------------------------------------------------------------------------- +-(void) decodeMemoryDevice:(SMBMemoryDevice *) structHeader +{ + NSDictionary* memDict = [NSDictionary dictionaryWithObjects: + [NSArray arrayWithObjects: SHVAL2(deviceLocator, bankLocator), + [NSString stringWithUTF8String: SMBMemoryDeviceTypes[structHeader->memoryType]], nil ] + forKeys: [NSArray arrayWithObjects:@"Device Locator", @"Bank Locator", @"Memory Type", nil]]; + + NSDictionary* extmemDict = (structHeader->header.length < 27) ? nil : + [NSDictionary dictionaryWithObjects: + [NSArray arrayWithObjects: MHZ(memorySpeed), SHVAL4(manufacturer, serialNumber, assetTag, partNumber), nil ] + forKeys: [NSArray arrayWithObjects:@"Memory Speed", @"Manufacturer", @"Serial Number", @"Asset Tag", @"Part Number", nil]]; + + NSDictionary* innerDict = [NSDictionary dictionaryWithObjects: + [NSArray arrayWithObjects: memDict, extmemDict, nil ] + forKeys: [NSArray arrayWithObjects:@"Information", @"More Information", nil]]; + ADD_HANDLE(@"Memory Device"); + + DBG("MemoryDevice:\n"); + DBG("\tdeviceLocator: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->deviceLocator)); + DBG("\tbankLocator: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->bankLocator)); + DBG("\tmemoryType: %s\n", SMBMemoryDeviceTypes[structHeader->memoryType]); + + if (structHeader->header.length < 27) + { + DBG("\n"); + return; + } + + DBG("\tmemorySpeed: %dMHz\n", structHeader->memorySpeed); + DBG("\tmanufacturer: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->manufacturer)); + DBG("\tserialNumber: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->serialNumber)); + DBG("\tassetTag: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->assetTag)); + DBG("\tpartNumber: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->partNumber)); + DBG("\n"); +} + +//------------------------------------------------------------------------------------------------------------------------- +// Apple Specific +//------------------------------------------------------------------------------------------------------------------------- +-(void) decodeOemProcessorType:(SMBOemProcessorType *)structHeader +{ + NSDictionary* innerDict = [NSDictionary dictionaryWithObjects: [NSArray arrayWithObjects: SHVAL(ProcessorType), nil ] + forKeys: [NSArray arrayWithObjects:@"Processor Type", nil]]; + ADD_HANDLE(@"Apple Processor Type"); + + DBG("AppleProcessorType:\n"); + DBG("\tProcessorType: 0x%x\n", ((SMBOemProcessorType *)structHeader)->ProcessorType); + DBG("\n"); +} + +-(void) decodeOemProcessorBusSpeed:(SMBOemProcessorBusSpeed *)structHeader +{ + NSString * qpi = [NSString stringWithFormat:@"%d.%d GT/s", + ((SMBOemProcessorBusSpeed *)structHeader)->ProcessorBusSpeed / 1000, + (((SMBOemProcessorBusSpeed *)structHeader)->ProcessorBusSpeed / 100) % 10]; + NSDictionary* innerDict = [NSDictionary dictionaryWithObjects: + [NSArray arrayWithObjects: qpi, nil ] forKeys: [NSArray arrayWithObjects:@"Bus Speed (QPI)", nil]]; + ADD_HANDLE(@"Apple Processor Bus Speed"); + + DBG("AppleProcessorBusSpeed:\n"); + DBG("\tProcessorBusSpeed (QPI): %d.%dGT/s\n", + ((SMBOemProcessorBusSpeed *)structHeader)->ProcessorBusSpeed / 1000, + (((SMBOemProcessorBusSpeed *)structHeader)->ProcessorBusSpeed / 100) % 10); + DBG("\n"); +} +//------------------------------------------------------------------------------------------------------------------------- + + +-(void) decodeSMBIOSTableFrom:(uint8_t *) ptr to: (uint8_t*) end +{ + DBG("\n"); + for (SMBStructHeader *structHeader = (SMBStructHeader*)ptr; structHeader < (SMBStructHeader*)end ;) + { + // DBG("Type: %d, Length: %d, Handle: 0x%x\n", structHeader->type, structHeader->length, structHeader->handle); + switch (structHeader->type) + { + case kSMBTypeBIOSInformation: + [self decodeBIOSInformation: (SMBBIOSInformation *) structHeader]; + break; + + case kSMBTypeSystemInformation: + [self decodeSystemInformation: (SMBSystemInformation *)structHeader]; + break; + + case kSMBTypeBaseBoard: + [self decodeBaseBoard: (SMBBaseBoard *)structHeader]; + break; + + case kSMBTypeSystemEnclosure: + [self decodeSystemEnclosure:(SMBSystemEnclosure *)structHeader]; + break; + + case kSMBTypeProcessorInformation: + [self decodeProcessorInformation:(SMBProcessorInformation *)structHeader]; + break; + + case kSMBTypeMemoryDevice: + [self decodeMemoryDevice:(SMBMemoryDevice *)structHeader]; + break; + + case kSMBTypeOemProcessorType: + [self decodeOemProcessorType:(SMBOemProcessorType *)structHeader]; + break; + + case kSMBTypeOemProcessorBusSpeed: + [self decodeOemProcessorBusSpeed:(SMBOemProcessorBusSpeed *)structHeader]; + break; + + case kSMBTypeEndOfTable: /* Skip, to be added at the end */ + /* Skip all Apple Specific Structures */ + case kSMBTypeFirmwareVolume: + case kSMBTypeMemorySPD: + default: + break; + } + + ptr = (uint8_t*) (((unsigned long)structHeader) + structHeader->length); + for (; ((uint16_t *)ptr)[0] != 0; ptr++); + + if (((uint16_t *)ptr)[0] == 0) + ptr += 2; + + structHeader = (SMBStructHeader *)ptr; + } + DBG("\n"); +} + + + @end Index: trunk/ChameleonPrefPane/Sources/PropertyList.cpp =================================================================== --- trunk/ChameleonPrefPane/Sources/PropertyList.cpp (revision 381) +++ trunk/ChameleonPrefPane/Sources/PropertyList.cpp (revision 382) @@ -251,9 +251,6 @@ bool ret = false; if (!path || !*path) return false; - struct stat st; - if(stat(path,&st) != 0) return false; // file does not exist; - _propFilePath = path; CFStringRef cfPath = CFStringCreateWithCString (kCFAllocatorDefault, path, kCFStringEncodingUTF8); Index: trunk/ChameleonPrefPane/Sources/SmbiosExtractor.h =================================================================== --- trunk/ChameleonPrefPane/Sources/SmbiosExtractor.h (revision 381) +++ trunk/ChameleonPrefPane/Sources/SmbiosExtractor.h (revision 382) @@ -8,17 +8,21 @@ #import -@interface SmbiosExtractor : NSMutableDictionary { +@interface SmbiosExtractor : NSObject { UInt8* buffer; NSUInteger bufSize; NSString* smString; + NSMutableDictionary* dict; } +@property (retain) NSMutableDictionary* dict; @property (retain) NSString* smString; @property NSUInteger bufSize; -(NSUInteger) extractSmBios; +-(void) decodeSMBIOSTableFrom:(uint8_t *) ptr to: (uint8_t*) end; + -(NSString*) stringFrom:(NSUInteger) start withLen:(NSUInteger) len; -(UInt8) ByteFrom:(NSUInteger) position; - +-(BOOL) save:(NSString*) path; @end Index: trunk/ChameleonPrefPane/test_util/test_util.mm =================================================================== --- trunk/ChameleonPrefPane/test_util/test_util.mm (revision 381) +++ trunk/ChameleonPrefPane/test_util/test_util.mm (revision 382) @@ -50,9 +50,9 @@ NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; SmbiosExtractor* smbe = [[SmbiosExtractor alloc] init]; + [smbe save:@"/tmp/chmIOreg.plist"]; + NSLog(@"SMBIOS = \n%@", smbe); - - #if 1 NSArray* arr = [PartitionInfoElement createBSDPartitionList]; NSLog(@"List of existing bsd disk partitions:\n %@", arr); Index: trunk/ChameleonPrefPane/test_util/test_util.xcodeproj/project.pbxproj =================================================================== --- trunk/ChameleonPrefPane/test_util/test_util.xcodeproj/project.pbxproj (revision 381) +++ trunk/ChameleonPrefPane/test_util/test_util.xcodeproj/project.pbxproj (revision 382) @@ -21,7 +21,6 @@ 01B45A7D146F72F0002C3699 /* DiskArbitration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 01B45A7C146F72F0002C3699 /* DiskArbitration.framework */; }; 8485BA071482F662005DF2E4 /* SmbiosExtractor.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8485BA061482F662005DF2E4 /* SmbiosExtractor.mm */; }; 84DDA1371483527000A7C8FF /* smbios.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84DDA1321483527000A7C8FF /* smbios.cpp */; }; - 84DDA1381483527000A7C8FF /* smbios_decode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84DDA1341483527000A7C8FF /* smbios_decode.cpp */; }; 8DD76F9A0486AA7600D96B5E /* test_util.mm in Sources */ = {isa = PBXBuildFile; fileRef = 08FB7796FE84155DC02AAC07 /* test_util.mm */; settings = {ATTRIBUTES = (); }; }; 8DD76F9C0486AA7600D96B5E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08FB779EFE84155DC02AAC07 /* Foundation.framework */; }; 8DD76F9F0486AA7600D96B5E /* test_util.1 in CopyFiles */ = {isa = PBXBuildFile; fileRef = C6859EA3029092ED04C91782 /* test_util.1 */; }; @@ -68,7 +67,6 @@ 8485BA061482F662005DF2E4 /* SmbiosExtractor.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = SmbiosExtractor.mm; path = ../Sources/SmbiosExtractor.mm; sourceTree = SOURCE_ROOT; }; 84DDA1321483527000A7C8FF /* smbios.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = smbios.cpp; sourceTree = ""; }; 84DDA1331483527000A7C8FF /* smbios.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = smbios.h; sourceTree = ""; }; - 84DDA1341483527000A7C8FF /* smbios_decode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = smbios_decode.cpp; sourceTree = ""; }; 8DD76FA10486AA7600D96B5E /* test_util */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = test_util; sourceTree = BUILT_PRODUCTS_DIR; }; C6859EA3029092ED04C91782 /* test_util.1 */ = {isa = PBXFileReference; lastKnownFileType = text.man; path = test_util.1; sourceTree = ""; }; /* End PBXFileReference section */ @@ -162,7 +160,6 @@ children = ( 84DDA1321483527000A7C8FF /* smbios.cpp */, 84DDA1331483527000A7C8FF /* smbios.h */, - 84DDA1341483527000A7C8FF /* smbios_decode.cpp */, ); name = smbios; path = ../Sources/smbios; @@ -236,7 +233,6 @@ 015403AE1470705C008E088A /* PartitionInfoManager.mm in Sources */, 8485BA071482F662005DF2E4 /* SmbiosExtractor.mm in Sources */, 84DDA1371483527000A7C8FF /* smbios.cpp in Sources */, - 84DDA1381483527000A7C8FF /* smbios_decode.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; };