私はIOKitで遊んでいて、次のコードを持っています。一般的な考え方は、platformExpertキーをこの小さなコアFoundationコマンドラインアプリケーションに渡して、デコードされた文字列を出力させることです。テストケースは「シリアル番号」です。次のように実行した場合の以下のコード:
./コンパイルされたシリアル番号
ほとんど機能しますが、文字列の先頭にあるシリアル番号の最後の4文字を返します。つまり、C12D2JMPDDQXなどのシリアルの例では、
DDQXC12D2JMPDDQX
何か案は?
#include <CoreFoundation/CoreFoundation.h>
#include <IOKit/IOKitLib.h>
int main (int argc, const char * argv[]) {
CFStringRef parameter = CFSTR("serial-number");
if (argv[1]) {
parameter = CFStringCreateWithCString(
NULL,
argv[1],
kCFStringEncodingUTF8);
}
CFDataRef data;
io_service_t platformExpert = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("IOPlatformExpertDevice"));
if (platformExpert)
{
data = IORegistryEntryCreateCFProperty(platformExpert,
parameter,
kCFAllocatorDefault, 0);
}
IOObjectRelease(platformExpert);
CFIndex bufferLength = CFDataGetLength(data);
UInt8 *buffer = malloc(bufferLength);
CFDataGetBytes(data, CFRangeMake(0,bufferLength), (UInt8*) buffer);
CFStringRef string = CFStringCreateWithBytes(kCFAllocatorDefault,
buffer,
bufferLength,
kCFStringEncodingUTF8,
TRUE);
CFShow(string);
return 0;
}