solarjl
驱动牛犊
驱动牛犊
  • 注册日期2001-12-26
  • 最后登录2002-01-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1258回复:4

DeviceIOControl 的第二个参数该怎样用?跟OnW32DeviceIOControl 的case ...有没有关系

楼主#
更多 发布于:2002-01-25 10:24
比如:
switch (p->dwIOControlCode)
case :
DIOC_OPEN // 这是要填到DeviceIOControl中的参数?
。。。。
我欲乘风而去
flyfox
驱动中牛
驱动中牛
  • 注册日期2001-04-05
  • 最后登录2012-08-03
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望22点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-01-25 10:27
是一个值
一剑西来,天外飞仙
solarjl
驱动牛犊
驱动牛犊
  • 注册日期2001-12-26
  • 最后登录2002-01-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-01-25 10:31
这么说 我要发许多参数值了
我欲乘风而去
flyfox
驱动中牛
驱动中牛
  • 注册日期2001-04-05
  • 最后登录2012-08-03
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望22点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-01-25 10:34
看看IPMAN!
我现在没有平台和工具,所以记不太清楚!
一剑西来,天外飞仙
solarjl
驱动牛犊
驱动牛犊
  • 注册日期2001-12-26
  • 最后登录2002-01-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-01-25 10:34
请参见:

             VxD技术的实现

             ----VxD的操作基于寄存器,所以一般用汇编语言编写,它的关键部分是一个和普通窗口的消息处理过程WndProc相类似的控制过程,不同之处在于它的处理对象是系统发来的控制消息。这些消息共51种,在VxD自加载至卸出整个生命周期内,操作系统不断向它发送各种控制消息,VxD根据自己的需要选择处理,其余的忽略。系统向VxD发送控制消息时将消息代号放在EAX寄存器中并在EBX寄存器中放系统虚拟机(VM)句柄。

             ----对动态VxD来说,最重要的消息有三个:SYS_DYNAMIC_DEVICE_INIT、SYS_DYNAMIC_DEVICE_EXIT以及W32_DEVICEIOCONTROL,消息代号分别是1Bh、1Ch、23h。当VxD被动态加载至内存时。
              系统向其发送SYS_DYNAMIC_DEVICE_INIT消息,VxD应在此时完成初始化设置并建立必要的数据结构;当VxD将被卸出内存时,系统向其发送SYS_DYNAMIC_DEVICE_EXIT消息VxD在收到后应清除所作设置并释放相关数据结构;当应用程序调用API函数DeviceIoControl与VxD进行通信时,系统向VxD发送W32_DEVICEIOCONTROL消息,它是应用程序和VxD联系的重要手段,此时ESI寄存器指向一个DIOCParams结构,VxD从输入缓冲区获取应用程序传来数据,相应处理后将结果放在输出缓冲区回送应用程序,达到相互传递数据的目的。

             ----应用程序向VxD发出DeviceIoControl调用时,第2个参数用于指定进行何种控制,控制过程从DIOCParams结构+0Ch处取得此控制码再进行相应处理控制码的代号和含义由应用程序和VxD自行约定,系统预定义了DIOC_GETVERSION(0)和DIOC_CLOSEHANDLE(-1)两个控制码,当应用程序调用API函数CreateFile(“.VxDName“,...)动态加载一VxD时,系统首先向该VxD的控制过程发送SYS_DYNAMIC_DEVICE_INIT控制消息,若VxD返回成功,系统将再次向VxD发送带有控制码DIOC_OPEN(即DIOC_GETVERSION,值为0)的W32_DEVICEIOCONTROL消息以决定此VxD是否能够支持设备IOCTL接口,VxD必须清零EAX寄存器以表明支持IOCTL接口,这时CreateFile将返回一个设备句柄hDevice,通过它应用程序才能使用DeviceIoControl函数对VxD进行控制。同一个VxD可用CreateFile打开多次,每次打开时都会返回此VxD的一个唯一句柄,但是系统内存中只保留一份VxD,系统为每个VxD维护一个引用计数,每打开一次计数值加1。当应用程序调用API函数CloseHandle(hDevice)关闭VxD句柄时,VxD将收到系统发来的带控制码DIOC_CLOSEHANDLEW32_DEVICEIOCONTROL消息,同时该VxD的引用计数减1,当最终引用计数为0时,系统向VxD发送控制消息SYS_DYNAMIC_DEVICE_EXIT,然后将其从内存中清除。在极少数情况下应用程序也可调用API函数DeleteFile(“.VxDName“)忽略引用计数的值直接将VxD卸出内存,这将给使用同一VxD的其他应用程序造成毁灭性影响,应避免使用。

             --一个典型的VxD控制过程代码如下:

             BeginProcVXD_Control
             cmpeax,1Bh
             ;SYS_DYNAMIC_DEVICE_INIT消息
             jzvxd_dynamic_init_handle
             cmpeax,1Ch
            ;SYS_DYNAMIC_DEVICE_EXIT消息
            jzvxd_dynamic_exit_handle
            cmpeax,23h
            ;W32_DEVICEIOCONTROL消息
            jnzexit_control_proc
            movecx,[esi+0Ch]
            ;从DIOCParams+0Ch处取控制码
            ....
            ;处理控制码
            EndProcVXD_Control

          
我欲乘风而去
游客

返回顶部