从Windows GetLogicalProcessorInformationEx函数混淆ReturnLength

我想在Windows中使用(相当新的)GetLogicalProcessorInformationEx函数。 它所提供的ReturnLength是没有意义的。

较旧的GetLogicalProcessorInformation给出合理的结果…

ReturnLength = 0; Result = GetLogicalProcessorInformation(NULL, &ReturnLength); printf("GLPI (%d): %d %d\n", Result, sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION), ReturnLength); 

这是输出(2核心,64位,Win7框):GLPI(0):32 416

换句话说,函数将填充416/32 = 13 SYSTEM_LOGICAL_PROCESSOR_INFORMATION结构传递的缓冲区。

对于GetLogicalProcessorInformationEx,这是我的电话…

 ReturnLength = 0; Result = GetLogicalProcessorInformationEx(RelationProcessorCore, NULL, &ReturnLength); printf("GLPIX (%d): %d %d %d\n", Result, sizeof(PROCESSOR_RELATIONSHIP), sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX), ReturnLength); 

这是输出(2核心,64位,Win7框):GLPIX(0):40 80 96

Microsoft文档(http://msdn.microsoft.com/en-us/library/windows/desktop/dd405488(v=vs.85).aspx)表示函数将返回PROCESSOR_RELATIONSHIP或SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX结构,具体取决于第一个参数的值。 ReturnLength表明它不会返回,虽然 – 96不能被sizeof(PROCESSOR_RELATIONSHIP)或sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX)整除。

我还尝试了RelationAll作为第一个参数,并给出了768的ReturnLength – 也不是一个40或80的倍数。

任何人都可以摆脱任何光?

你需要相信函数返回的是什么。 必然如此,工会的结构有一个不可预测的大小 。 特别是PROCESSOR_RELATIONSHIP的这个成员:

  GROUP_AFFINITY GroupMask[ANYSIZE_ARRAY]; 

ANYSIZE_ARRAY宏是提示,表示GroupMask数组的大小是可变的,取决于GroupCount成员的值。 在结构上使用sizeof永远不会给你正确的大小,它会太低。 请确保使用返回的大小为结构分配存储,如下所示:

 SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX* buf = (SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX*)malloc(ReturnLength); 

这种模式在C和winapi中很常见。