当前位置:编程学习 > C/C++ >>

删除驱动符号链接出错-变量作用域和RtlInitUnicodeString的问题

摘要:NT式驱动中,在DriverUnload()中尝试删除之前创建的符号链接失败,最后发现原因是变量作用域和RtlInitUnicodeString的问题


原始存在问题的简化代码如下:

[cpp] 
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()的时候得要注意了。

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,