zoukankan      html  css  js  c++  java
  • 删除驱动符号链接出错变量作用域和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()的时候得要注意了。


  • 相关阅读:
    [原]OS X 10.9 Mavericks
    [原]iOS Makefile Template
    [原]Escape From the iOS Sanbox on Jailbreak Device
    串->串的表示和实现
    队列->队列的应用(银行业务模拟)
    队列->队列的表示和实现
    栈->栈与递归
    栈->栈的应用
    栈->栈的基本定义
    线性表->应用->一元多项式
  • 原文地址:https://www.cnblogs.com/bugchecker/p/3041590.html
Copyright © 2011-2022 走看看