我需要从我的驱动程序访问ACPI表,因此AuxKlibEnumerateSystemFirmwareTables和AuxKlibGetSystemFirmwareTable显然是我需要的功能。
我打电话给AuxKlibInitialize开始初始化辅助内核模式库。
我真正想要的是“MCFG”表,所以我开始尝试这个。
NTSTATUS ntStatus = AuxKlibInitialize();
const char kMcfgHeaderSignature[] = "MCFG";
// Table name is passed little-endian order
ULONG headerSignature = 0;
headerSignature += kMcfgHeaderSignature[3] << 24;
headerSignature += kMcfgHeaderSignature[2] << 16;
headerSignature += kMcfgHeaderSignature[1] << 8;
headerSignature += kMcfgHeaderSignature[0];
ULONG tableSize = 0;
ntStatus = AuxKlibGetSystemFirmwareTable(
'ACPI',
headerSignature,
NULL, // No buffer, just get the size for now.
0, // (No buffer size)
&tableSize
);
unsigned char * table = new unsigned char[tableSize];
ntStatus = AuxKlibGetSystemFirmwareTable(
'ACPI',
headerSignature,
table,
tableSize,
NULL // Don't need the size back.
);
delete[] table;
遍历调试器中的代码,AuxKlibInitialize成功但两次调用AuxKlibGetSystemFirmwareTable都返回0xC0000002,这是STATUS_NOT_IMPLEMENTED。
我认为我需要的特定表可能存在问题,因此我尝试获取表格列表。
NTSTATUS ntStatus = AuxKlibInitialize();
const char kMcfgHeaderSignature[] = "MCFG";
// Table name is passed little-endian order
ULONG headerSignature = 0;
headerSignature += kMcfgHeaderSignature[3] << 24;
headerSignature += kMcfgHeaderSignature[2] << 16;
headerSignature += kMcfgHeaderSignature[1] << 8;
headerSignature += kMcfgHeaderSignature[0];
ULONG sigListSize = 0;
ntStatus = AuxKlibEnumerateSystemFirmwareTables(
'ACPI',
NULL,
0,
&sigListSize
);
uint32_t * sigList = new uint32_t[sigListSize/4];
ntStatus = AuxKlibEnumerateSystemFirmwareTables(
'ACPI',
reinterpret_cast<void*>(sigList),
sigListSize,
NULL
);
delete[] sigList;
这次我从AuxKlibEnumerateSystemFirmwareTables调用中得到了STATUS_NOT_IMPLEMENTED。
我环顾四周,弄清楚为什么我可以从Windows获得一个未实现的错误,但在任何地方都没有发现这些错误引用此错误。它似乎在8.0 DDK及更高版本中实现,并得到Windows Vista及更高版本的支持。我正在使用Win 10 DDK并在Win 10系统上进行测试。
为什么辅助内核模式库在获取ACPI信息时返回未实现的错误?
UPDATE 当我重新配置硬件时,这变得更加奇怪。现在它似乎只在特定PCIe卡在系统中时返回错误。不知道为什么Windows会说这个功能没有实现,具体取决于系统中的硬件。
更新2 现在看来这是一个时间问题。即使我有卡暴露系统中的故障,如果我强制代码在系统完全启动后运行它也可以工作。因此,似乎在某些硬件配置中,我最终在启动时过早地调用了辅助内核模式库。这真是令人沮丧,因为MS没有关于何时可以安全地开始调用辅助内核模式库的信息。