首页
社区
课程
招聘
[旧帖] [求助]天书夜读第9章 C++类与驱动的问题 0.00雪花
发表于: 2011-8-26 08:35 1745

[旧帖] [求助]天书夜读第9章 C++类与驱动的问题 0.00雪花

2011-8-26 08:35
1745
//////////////////////////////////////////////////
// MyDriver.cpp文件


extern "C"
{
  #include <ntddk.h>
}
//new
void * __cdecl operator new(unsigned int size)
{
  void *pt = ExAllocatePool(NonPagedPool,size);
  if (pt != NULL)
    memset(pt,0,size);
  return pt;
}

//MyDriver 定义
class MyDriver
{
public:
  MyDriver(PDRIVER_OBJECT driver);
  virtual NTSTATUS OnDispatch(PDRIVER_OBJECT dev,PIRP irp)
  { return STATUS_UNSUCCESSFUL; };
  static MyDriver *d_my_driver;
private:
  static NTSTATUS sDispatch(PDRIVER_OBJECT dev,PIRP irp);
  PDRIVER_OBJECT d_driver;
};

MyDriver::MyDriver(PDRIVER_OBJECT driver) : d_driver(driver)
{
  size_t i;
  for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
  {
    driver->MajorFunction[i] = (PDRIVER_DISPATCH)sDispatch;
  }
  d_my_driver = this;
}
NTSTATUS MyDriver::sDispatch(PDRIVER_OBJECT dev,PIRP irp)
{
  return d_my_driver->OnDispatch(dev,irp);
}
MyDriver *MyDriver::d_my_driver = NULL;



class MySubDriver : public MyDriver
{
public:
  MySubDriver(PDRIVER_OBJECT driver) : MyDriver(driver){};
  virtual NTSTATUS OnDispatch(PDRIVER_OBJECT dev,PIRP irp)
  {
    DbgPrint("MyDriver\r\n");
    return STATUS_UNSUCCESSFUL;
  }
};

// 驱动程序加载时调用DriverEntry例程
extern "C" NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegistryString)
{
  // 请视情况返回DriverEntry例程执行结果
  //MyDriver::d_my_driver = new MySubDriver(pDriverObj);
  MySubDriver mysub(pDriverObj);
  DbgPrint("hello\r\n");
  return STATUS_UNSUCCESSFUL;
}


上面是完整的代码
我是指虚拟机里用DriverMonitor加载驱动,windbg只能输出下面的hello,而上面的MyDriver不能输出
并且DriverMonitor中提示ERROR(31):连到系统上的设备没有发挥作用。昨天搞了一天了都没找到原因。
求各位大牛帮帮忙

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
这段代码挺奇怪的。从C++的角度来说,我觉得
1. 应该使用new,而不是把对象放在栈上,因为驱动本身有自己的生命周期。DriverEntry之后,对象就析构了。
2. 这个类有static指针,每次对象的构造会修改这个指针,这个设计挺别扭的,有没有可能这个驱动被多次加载?
a. 是不是把类做成单件更好,
b. 或者有没有可能从静态函数的参数中获得对象指针(是不是可以考虑把对象的指针放在DriverObject的某个)

从驱动的角度,我说不出什么,因为我不会。:)
2011-8-26 10:24
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢楼上大哥指点!
我把环境重新配置一下,换个最新版的wdk不知道能不能行,这段程序是在书中找到的,要是实在不行的话还是不用类了
2011-8-26 12:12
0
雪    币: 154
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
先声明一下,我也是个新人
不过楼主写的这个只输出了一次DbgPrint("hello\r\n"); 在我看来没有错啊。
因为这段代码并没有绑定过任何WINDOWS设备,所以没有任何的IRP发往这个设备
所以分发函数中的DbgPrint根本不会执行。
所以就只有输出一个hello了啊。
另外2楼所说的,我认为驱动是一个模块被加载到内核当中,如果不调用UNLOAD的话
就不会被释放掉,所以不存在你所说的那个类被析构掉的情况。
当然,我是这样理解的哈,新人海涵。
2011-8-26 12:30
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
现在看着都算是什么也不懂了,看来我要从基础学起才可以
2011-8-26 12:39
0
雪    币: 962
活跃值: (1686)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
改成 return STATUS_SUCCESSFUL;  应该就可以了
2011-8-26 12:56
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
MySubDriver mysub(pDriverObj);
我说的是这个对象是局部的对象,函数退出时会被析构,不是指DLL被卸载。

另外,我觉得楼上说的有道理。:)
2011-8-26 14:57
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
昨天把设备也添加进去了 不过还是没有输出
不过创建设备什么的都没问题
应该是像楼上大哥说的  还没接收到IRP就mysub就析构了
我在想想咋整 还是挺希望能把C++的特性发挥一下
2011-8-27 15:50
0
雪    币: 110
活跃值: (298)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
你的代码没有问题,本来就只能输出“hello”
2014-1-19 17:51
0
游客
登录 | 注册 方可回帖
返回
//