WDK中的辅助内核模式库(Auxiliary Kernel-Mode Library)
WDK中增加了一个辅助内核模式库(Auxiliary Kernel-Mode Library),里面的函数可以让内核模式驱动程序访问某些系统功能。里面包含的函数有下面几个:
AuxKlibInitialize
AuxKlibQueryModuleInformation
AuxKlibGetImageExportDirectory
AuxKlibGetBugCheckData
1. AuxKlibInitialize 函数用来初始化 Auxiliary Kernel-Mode Library。Driver 在使用 Auxiliary Kernel-Mode Library 里面的其他函数之前必须先调用 AuxKlibInitialize。函数原型如下:
NTSTATUS
AuxKlibInitialize (
VOID
);
另外,要使用里面的函数必须包含头文件 aux_klib.h,并链接 aux_klib.lib。
2. AuxKlibQueryModuleInformation 是一个文档化的获得加载模块的方法,可以替代 ZwQuerySystemInformation 的部分功能。函数原型如下:
NTSTATUS
AuxKlibQueryModuleInformation (
IN OUT PULONG BufferSize,
IN ULONG ElementSize,
OUT PVOID QueryInfo OPTIONAL
);
下面的示例代码摘录自MSDN:
NTSTATUS status;
ULONG modulesSize;
AUX_MODULE_EXTENDED_INFO* modules;
ULONG numberOfModules;
//
// Get the required array size.
//
status = AuxKlibQueryModuleInformation(
&modulesSize,
sizeof(AUX_MODULE_EXTENDED_INFO),
NULL
);
if (!NT_SUCCESS(status) || modulesSize == 0)
{
break;
}
//
// Calculate the number of modules.
//
numberOfModules = modulesSize / sizeof(AUX_MODULE_EXTENDED_INFO);
//
// Allocate memory to receive data.
//
modules = (AUX_MODULE_EXTENDED_INFO*) ExAllocatePoolWithTag(
PagedPool,
modulesSize,
'3LxF'
);
if (modules == NULL)
{
status = STATUS_INSUFFICIENT_RESOURCES;
break;
}
RtlZeroMemory(modules, modulesSize);
//
// Obtain the module information.
//
status = AuxKlibQueryModuleInformation(
&modulesSize,
sizeof(AUX_MODULE_EXTENDED_INFO),
modules
);
if (!NT_SUCCESS(status))
{
break;
}
3. AuxKlibGetImageExportDirectory 函数可以得到一个模块的导出目录。函数原型如下:
PIMAGE_EXPORT_DIRECTORY
AuxKlibGetImageExportDirectory(
IN PVOID ImageBase
);
4. AuxKlibGetBugCheckData 函数可以获得一个刚发生的 Bug Check 的信息。函数原型如下:
NTSTATUS
AuxKlibGetBugCheckData(
OUT PKBUGCHECK_DATA BugCheckData
);
注:AuxKlibGetBugCheckData 只能在 BugCheckCallback 例程里面调用(如何注册 BugCheckCallback 例程请参考KeRegisterBugCheckCallback 函数)。