我正在使用IOKit,并有以下代码,一般的想法是将一个platformExpert密钥传递给这个小型的核心基础命令行应用程序,并让它打印解码后的字符串。测试用例是“序列号”。下面的代码在运行时如下:
./编译的序列号
几乎可以工作,但会在字符串开头返回序列号的最后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;
}发布于 2012-01-06 13:47:46
您可能误解了序列号参数的值。如果我使用ioreg -f -k serial-number,我会得到这样的结果:
| "serial-number" = | 00000000: 55 51 32 00 00 00 00 00 00 00 00 00 00 XX XX XX XX UQ2..........XXXX | 00000011: XX XX XX XX 55 51 32 00 00 00 00 00 00 00 00 00 00 XXXXUQ2.......... | 00000022: 00 00 00 00 00 00 00 00 00 .........
(我已经把我的Mac电脑的序列号去掉了,除了重复的部分。)
当您显示字符串时,您看不到空字符,因为它们是空字符。我不知道为什么它看起来像是由空字符分隔的多个字段,但它看起来就是这样。
我建议做进一步的调查,以确保没有关于如何解释此数据的规范;如果您没有找到任何东西,我将跳过第一次运行null值,然后获取下一次运行null值之前的所有内容。
发布于 2012-05-29 06:41:41
更简单的解决方案:
#include <CoreFoundation/CoreFoundation.h>
#include <IOKit/IOKitLib.h>
int main()
{
CFMutableDictionaryRef matching = IOServiceMatching("IOPlatformExpertDevice");
io_service_t service = IOServiceGetMatchingService(kIOMasterPortDefault, matching);
CFStringRef serialNumber = IORegistryEntryCreateCFProperty(service,
CFSTR("IOPlatformSerialNumber"), kCFAllocatorDefault, 0);
const char* str = CFStringGetCStringPtr(serialNumber,kCFStringEncodingMacRoman);
printf("%s\n", str); //->stdout
//CFShow(serialNumber); //->stderr
IOObjectRelease(service);
return 0;
}使用以下命令编译:
clang -framework IOKit -framework ApplicationServices cpuid.c -o cpuid
如果您喜欢,可以从github派生;)
https://stackoverflow.com/questions/8753171
复制相似问题