首页
社区
课程
招聘
兄弟们看下卸载例程为啥会错
发表于: 2011-1-11 14:04 4569

兄弟们看下卸载例程为啥会错

2011-1-11 14:04
4569
typedef struct _DEVICE_EXTENSION
{
  PDEVICE_OBJECT pDeviceObject;
  UNICODE_STRING DeviceName;
  UNICODE_STRING SymbolicLinkName;
}DEVICE_EXTENSION,*PDEVICE_EXTENSION;

#pragma INITCODE
NTSTATUS CreateMyDevice(PDRIVER_OBJECT pDriverObject)
{

//创建设备
  UNICODE_STRING DevName;
  UNICODE_STRING SymbolicName;
  PDEVICE_OBJECT pDevObj;
  PDEVICE_EXTENSION pDevExt;
  NTSTATUS status;

  RtlInitUnicodeString(&DevName,L"\\Device\\StolenDfu");
  status=IoCreateDevice(pDriverObject,
                              sizeof(DEVICE_EXTENSION),
                                                  &DevName,
                                                  FILE_DEVICE_UNKNOWN,0,
                                                  TRUE,&pDevObj);

  if(!NT_SUCCESS(status))
  {
     DbgPrint("创建设备失败DbgPrint");
     KdPrint(("创建设备失败 KdPrint"));
     return status;
  }
  else{KdPrint(("创建成功"));}
  
  pDevObj->Flags |= DO_BUFFERED_IO;

  pDevExt=(PDEVICE_EXTENSION)pDevObj->DeviceExtension;
  pDevExt->pDeviceObject=pDevObj;
  pDevExt->DeviceName=DevName;

//创建符号连接

  RtlInitUnicodeString(&SymbolicName,L"\\DosDevices\\stolenddk");
  pDevExt->SymbolicLinkName=SymbolicName;
  status=IoCreateSymbolicLink(&SymbolicName,&DevName);
  if(!NT_SUCCESS(status))
  {

     DbgPrint("创建符号连接失败DbgPrint");
      KdPrint(("创建符号连接失败 KdPrint"));
     IoDeleteDevice(pDevObj);
     return status;
  }
  else
   {KdPrint(("创建符号连接成功"));}
return status;
}

VOID UnloadRutine(PDRIVER_OBJECT pDriverObject)
{

  //删除设备
        _asm int 3;
  PDEVICE_OBJECT pNextDev;
  NTSTATUS status;
  PDEVICE_EXTENSION pDevExt;
  pNextDev=pDriverObject->DeviceObject;
//  UNNtCliVirualMemory();
/* if (IsRecover)
  {
          CheckChangeHookedRoutine();
          
  }
  if (IsProtect)
  {
          UnProtect();
  }*/
  while(pNextDev!=NULL)
  {
    pDevExt=(PDEVICE_EXTENSION)pNextDev->DeviceExtension;
     UNICODE_STRING pLinkName = pDevExt->SymbolicLinkName;
        status=IoDeleteSymbolicLink(&pLinkName);  //此处出错 前几天还用得好好的

    if(!NT_SUCCESS(status))
        {
                DbgPrint("删除符号连接失败DbgPrint");
                KdPrint(("删除符号连接失败 KdPrint"));
        }
        else{KdPrint(("删除符号连接成功"));}

    pNextDev=pNextDev->NextDevice;

        IoDeleteDevice(pDevExt->pDeviceObject);
    KdPrint(("删除设备成功"));
  }
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 133
活跃值: (587)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
2
\\DosDevices\\stolenddk
字符串对应的节所在的内存可能被系统释放了
2011-1-11 14:18
0
雪    币: 32
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
那怎么办那怎么办
2011-1-11 14:21
0
雪    币: 32
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
自己再次顶起
2011-1-11 15:14
0
雪    币: 251
活跃值: (77)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
5
老大。我也来顶~~~~~
2011-1-11 18:59
0
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
6
pDevExt->SymbolicLinkName=SymbolicName;
用RtlCopyUnicodeString

不明白那个所谓的“前几天还用得好好的”是什么意思……
2011-1-11 19:16
0
雪    币: 32
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
前几月还可以加载和卸载
2011-1-11 22:50
0
雪    币: 284
活跃值: (106)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
8
这个位置很像张帆那本上的例子,一个隐藏的错误,那个Name时而有效,时而无效,无效时卸载蓝屏,报内存引用错误,我已经遇到多次,建议改成局部变量
UNICODE_STRING Sym=RtlInitUnicodeString(L"XXXXX");
IoDeleteSymbolicLink(&Sym);这样不会错误
我猜测pDevExt->SymbolicLinkName这个里面的Buffer指针可能放在了分页内存,之后IoDeleteSymbolicLink引用错误(可以想象这个函数里面一定会使用提高IRQL之类的操作),当然了具体原因不明
2011-1-11 23:12
0
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
9
竟然在看雪遇到了,问候一下……

没有遇到过这种情况,主要是写的内核程序太少了……

明天考试完了好好测试一下,求交流……
2011-1-11 23:28
0
雪    币: 258
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
原来那么多示例这么搞都是这个用意啊。
2011-1-11 23:28
0
雪    币: 133
活跃值: (587)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
11
将字符串放在设备对象的扩展中     然后在RtlInitUnicodeString
2011-1-12 09:23
0
雪    币: 32
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
不好意思 我加了个设备
2011-1-12 14:16
0
游客
登录 | 注册 方可回帖
返回
//