设为首页 加入收藏

TOP

删除驱动符号链接出错的问题
2013-01-13 10:30:31 来源: 作者: 【 】 浏览:263
Tags:删除 驱动 符号 链接 出错 问题

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

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇富翁和陌生人换钱游戏 下一篇海量用户积分排名算法探讨

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: