删除驱动符号链接出错-变量作用域和RtlInitUnicodeString的问题
生活随笔
收集整理的這篇文章主要介紹了
删除驱动符号链接出错-变量作用域和RtlInitUnicodeString的问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
關鍵詞: windows驅動開發 ?刪除符號鏈接出錯 ?變量作用域問題?RtlInitUnicodeString
摘要:NT式驅動中,在DriverUnload()中嘗試刪除之前創建的符號鏈接失敗,最后發現原因是變量作用域和RtlInitUnicodeString的問題
原始存在問題的簡化代碼如下:
typedef struct _DEVICE_EXTENSION {UINT32 magicNum;PDEVICE_OBJECT pDevice;UNICODE_STRING symLinkName; } DEVICE_EXTENSION, *PDEVICE_EXTENSION;PDEVICE_OBJECT gControlDeviceObject;DriverEntry() {PDEVICE_EXTENSION pDevExt;WCHAR linkNameBuffer[] = L"\\DosDevices\\diskFilter";UNICODE_STRING LinkName;IoCreateDevice(..., &gControlDeviceObject);RtlInitUnicodeString (&LinkName, linkNameBuffer );pDevExt->magicNum = 0x4c44;pDevExt->symLinkName = LinkName;DriverObject->DriverUnload = DiskFilterUnload; }DiskFilterUnload (IN PDRIVER_OBJECT pDriverObject) {NTSTATUS status;PDEVICE_EXTENSION pDevExt;pDevExt = (PDEVICE_EXTENSION)gControlDeviceObject->DeviceExtension;KdPrint((" devObj(0x%x), magicNum(0x%x), SymLinkName(%wZ)\n", gControlDeviceObject, pDevExt->magicNum, &pDevExt->symLinkName));status = IoDeleteSymbolicLink( &pDevExt->ustrSymLinkName ); }上述代碼中,從IoDeleteSymbolicLink返回的status是路徑不正確,但KdPrint中打印的magicNum是正確的,windbg調試里發現在DiskFilterUnload()中的pDevExt->symLinkName沒有包含正確的值,當時真有點百思不得其解啊。
后來看到linkNameBuffer是局部變量,想到了變量作用域的問題,把WCHAR ? ? ? ? ? ? linkNameBuffer[] ?= L"\\DosDevices\\diskFilter";拿到DriverEntry外做全局變量,
問題就消失了。當然,更一般的做法應該是在頭文件中#define SymbolicLinkName L"\\DosDevices\\diskFilter"。
現在來看,要產生這個問題,還有一個原因是RtlInitUnicodeString(),它應該沒有做內存拷貝(它沒有為smLinkName分配內存然后把值拷貝過去,但我認為它這樣做了)
看來下次使用RtlInitUnicodeString()的時候得要注意了。
轉載于:https://www.cnblogs.com/bugchecker/archive/2012/11/06/3041590.html
總結
以上是生活随笔為你收集整理的删除驱动符号链接出错-变量作用域和RtlInitUnicodeString的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tomcat启动时错误:Cannot r
- 下一篇: 浅析IBM i上C/C++应用程序编译调