AuxKlibEnumerateSystemFirmwareTables从使用Win 10 DDK构建的驱动程序返回Win 10 x64上的STATUS_NOT_IMPLEMENTED

时间:2016-07-21 21:33:46

标签: c++ windows driver

我需要从我的驱动程序访问ACPI表,因此AuxKlibEnumerateSystemFirmwareTablesAuxKlibGetSystemFirmwareTable显然是我需要的功能。

我打电话给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没有关于何时可以安全地开始调用辅助内核模式库的信息。

0 个答案:

没有答案