之前介绍了部分内核模式下操作注册表的函数,使用方法都比较繁琐,往往一个操作需要若干个函数的共同配合。
为了简化注册表操作,DDK还提供了一些列以Rtl开头的运行时函数,这些函数把前面介绍的函数进行了封装。往往一条函数就能实现前面介绍的若干条函数的功能。
表Rtl**关于注册表的操作
分类 | 描述 |
RtlCreateRegistryKey | 创建注册表 |
RtlCheckRegistryKey | 查看某注册表项是否存在 |
RtlCreateRegistryValue | 写注册表 |
RtlDeleteRegistryValue | 删除注册表的子键 |
从上表中可以看出,Rtl**系列函数对注册表的相关操作。下面的代码演示了再驱动程序中如何使用这些函数。从代码中可以看出,其操作比Zw**系列函数的操作要简单得多。
NTSTATUS ntStatus = RtlCreateRegistryKey(RTL_REGISTRY_SERVICES, L"HelloDDK\\XH");
if (NT_SUCCESS(ntStatus))
{
KdPrint(("Create the item successfully!\n"));
}
// 检查某项是否存在
ntStatus = RtlCheckRegistryKey(RTL_REGISTRY_SERVICES, L"HelloDDK\\XH");
if (NT_SUCCESS(ntStatus))
{
KdPrint(("The item is exist!\n"));
}
// 写入REG_DWORD数据
ULONG value1 = 100;
// 写注册表
ntStatus = RtlWriteRegistryValue(RTL_REGISTRY_SERVICES, L"HelloDDK\\XH", L"DWORD_Value", REG_DWORD, &value1, sizeof(value1));
if (NT_SUCCESS(ntStatus))
{
KdPrint(("Write the DWORD value successfully!\n"));
}
PWCHAR szString = L"Hello DDK";
// 写注册表
ntStatus = RtlWriteRegistryValue(RTL_REGISTRY_SERVICES, L"HelloDDK\\XH", L"SZ_Value", REG_SZ, &szString, sizeof(szString)*2+2);
if (NT_SUCCESS(ntStatus))
{
KdPrint(("Write the REG_SZ value successfully!\n"));
}
// 初始化变量
PRTL_QUERY_REGISTRY_TABLE paramTable[2];
RtlZeroMemory(paramTable, sizeof(paramTable));
ULONG defaultData = 0;
ULONG uQueryValue = 0;
paramTable[0]->Flags = RTL_QUERY_REGISTRY_DIRECT;
paramTable[0]->Name = L"DWORD_Value";
paramTable[0]->EntryContext = &uQueryValue;
paramTable[0]->DefaultType = REG_DWORD;
paramTable[0]->DefaultData = &defaultData;
paramTable[0]->DefaultLength = sizeof(ULONG);
// 查询REG_DWORD的数据
ntStatus = RtlQueryRegistryValues(RTL_REGISTRY_SERVICES, L"HelloDDK\\XH", paramTable[0], NULL, NULL);
if (NT_SUCCESS(ntStatus))
{
KdPrint(("Query the item successfully.\n"));
KdPrint(("The item is: %d\n", uQueryValue));
}
// 删除子键
ntStatus = RtlDeleteRegistryValue(RTL_REGISTRY_SERVICES, L"HelloDDK\\XH", L"DWORD_Value");
if (NT_SUCCESS(ntStatus))
{
KdPrint(("Delete the value successfully.\n"));
}
本章介绍了Windows内核模式下的一些常用内核函数,这些函数在驱动程序的开发中将会经常用到。对这些函数的熟练掌握是十分必要的。本章介绍了字符串相关的一些内核函数。这些函数包括操作标准C语言字符串的,也包括操作UNICODE字符串的。另外,内核函数这块还介绍了与文件及注册表相关的内核函数。这些内核函数在后面的章节会经常用到。