RtlFreeUnicodeString误用引起驱动程序错误

这几天一直在调一个驱动程序,今天终于调出来了,发现原来是RtlFreeUnicodeString函数引起的。先写一段小程序来做一个测试:

#include <ntddk.h> VOID OnUnload(IN PDRIVER_OBJECT pDriverObj) { KdPrint(("Enter OnUnload!/n")); KdPrint(("Unload Successfully!/n")); } NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath) { NTSTATUS status = 0; UNICODE_STRING uniLogFile = RTL_CONSTANT_STRING(L"//??//C://Keylogger.log"); pDriverObject->DriverUnload = OnUnload; RtlFreeUnicodeString(&uniLogFile); return status; }

编译这个驱动程序是没有错误的,加载之后就立即蓝屏,问题就出在RtlFreeUnicodeString这个函数的使用上。

去DDK的文档中我们就可以看到这个函数的用法:RtlFreeUnicodeString函数是用来释放由RtlAnsiStringToUnicodeString和RtlUpcaseUnicodeString申请的内存空间的。而在我的这个测试程序中,我并没有用这个两个函数来申请空间,我用的是宏RTL_CONSTANT_STRING,生成的是一个常量字符串,所以RtlFreeUnicodeString最后释放的时候就会出现问题,从而导致蓝屏。

这个问题虽然很小,但是当程序的长度增加之后极其容易忽略,在平时写程序时一定要谨慎!

你可能感兴趣的:(String,object,测试,文档,DDK)