#include "ShellProcess.h"␊ |
#include "string_util.h"␊ |
#include "smbios.h"␊ |
#include "PropertyList.h"␊ |
#include "smbios.h"␊ |
#include <stdio.h>␊ |
#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␊ |
|
␉self = [super init];␊ |
␉if (self!=nil)␊ |
␉{␊ |
␉␉buffer = nil;␊ |
␉␉bufSize=0;␊ |
␉␉[ self extractSmBios];␊ |
␉}␊ |
␉␊ |
|
␉␉[smString release];␊ |
␉␉smString = nil;␊ |
␉}␊ |
␉␊ |
␊ |
␉if (dict!=nil) ␊ |
␉{␊ |
␉␉[dict release];␊ |
␉␉dict = nil;␊ |
␉}␊ |
}␊ |
␊ |
-(void) dealloc␊ |
|
␊ |
-(NSString*) description␊ |
{␉␊ |
␉return smString;␊ |
␉return [dict description];␊ |
}␊ |
␊ |
-(NSUInteger) extractSmBios␊ |
|
␉␉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;␊ |
}␊ |
␊ |
|
␉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␊ |