amei
驱动牛犊
驱动牛犊
  • 注册日期2002-03-21
  • 最后登录2006-11-10
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
阅读:1052回复:5

请教《windows设备驱动程序(vxd与wdm)》一书中的程序VIOPort类的编程

楼主#
更多 发布于:2002-06-03 08:29
在这本书的第十章,有关VIOProt类的编程的实例中用的handler:
DWORD MyPort::handler(VMHANDLE hVM,DWORD port,
CLIENT_STRUCT*pRegs, DWORD iotype,DWORD outdata)
这个函数中的参数是由谁传过来的呢?它在整个实例中都没有给
port,iotype,outdata赋值或传参。请指教。我的email:
13904111284@vip.163.com
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-06-03 11:59
这个函数中的参数是由谁传过来的呢?
--------------------------------------------------------------------
of cource the os
see the callback function of Install_IO_Handler
amei
驱动牛犊
驱动牛犊
  • 注册日期2002-03-21
  • 最后登录2006-11-10
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-06-04 10:29
我这样理解对吗
当我调用DWORD VIOPort::handler(VMHANDLE hVM,
                               DWORD port,
                               CLIENT_STRUCT* pRegs,
                               DWORD iotype,
                               DWORD outdata);
时,操作系统自动调用BOOL __stdcall Install_IO_Handler
                             (DWORD PortNum,
                              PIO_HANDLER IOCallback,
                              PIO_THUNK pThunk);
其中的PortNum是由VIOPort的派生类的构造函数指定;回调函数
IOCallback(VMHANDLE hVM,
           DWORD IOType,
           DWORD Port,
           PCLIENT_STRUCT pcrs,
           DWORD Data);
负责将参数传给handler函数。
那么参数IOType是由谁来确定的,也是由操作系统吗?
比如我要捕获0x378端口的I/O操作,当这个端口进行字的IN操作时
IOType的值就是WORD_INPUT了吗?我可以设置IOType的值吗?
当端口进行字操作而我的vxd程序中我设置IOType为双字的操作?







pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-06-04 10:52
我这样理解对吗
当我调用DWORD VIOPort::handler(VMHANDLE hVM,
DWORD port,
CLIENT_STRUCT* pRegs,
DWORD iotype,
DWORD outdata);
时,操作系统自动调用BOOL __stdcall Install_IO_Handler
(DWORD PortNum,
PIO_HANDLER IOCallback,
PIO_THUNK pThunk);
其中的PortNum是由VIOPort的派生类的构造函数指定;回调函数
IOCallback(VMHANDLE hVM,
DWORD IOType,
DWORD Port,
PCLIENT_STRUCT pcrs,
DWORD Data);
负责将参数传给handler函数。
----------------------------------------------------------------------
No,hook是在你调VIOPort::hook()是钩挂的:
BOOL VIOPort::hook()
{
PVOID pFunc = createPortThunk(this, m_thunk, &VIOPort::handler);
#ifdef DEBUG
BOOL bStatus = Install_IO_Handler(m_port, (PIO_HANDLER) pFunc, NULL);
if (!bStatus)
DEBUGEVENT(DBG_WARNING, \"Failed to hook port\");
return bStatus;
#else
return Install_IO_Handler(m_port, (PIO_HANDLER) pFunc, NULL);
#endif
}

可见vtoolsd在提供的hook成员函数中调了Install_IO_Handler(not the os),操作系统会回调callback function(这里就是pFunc),而实际上经vtoolsd类库处理回掉转到了VIOPort::handler函数(这才是os调用的),9x系统以寄存器传过来参数,vtoolsd做转换处理,表现为(VMHANDLE hVM,DWORD port,CLIENT_STRUCT* pRegs,DWORD iotype,DWORD outdata)这些参数。

吃完饭接着说
amei
驱动牛犊
驱动牛犊
  • 注册日期2002-03-21
  • 最后登录2006-11-10
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-06-04 11:23
可以问一问这些你是怎么知道的吗?有什么资料或书籍推荐吗?
关于VIOPort::hook()竟有那么多的东西,书上怎么没有写呢?
期待你吃饭回来!!!!祝你胃口好
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-06-04 12:34
〉〉可以问一问这些你是怎么知道的吗?有什么资料或书籍推荐吗?
------------------------------------------------------------------------
vtoolsd的东西很简单,有几本相关的书都不怎样,你自己研究是最好的了。最好的资料就是vtoolsd自己的封装类库,你去研究完这些源码自然明白(应是最简单的C++类库了)。当然一些准备知识最好要有:用汇编/C开发Vxd的经验,不是说应该用汇编/C开发,但由它才更能明白系统机理(不用急,循需渐进)。
------------------------------------------------------------------------
〉〉参数IOType是由谁来确定的
------------------------------------------------------------------------
VIOPort是监控的Ring3的IO,Ring3用了in **,al等指令自然IOType就是BYTE_INPUT,以此类推。它由访问端口的应用决定,由OS传给你的回调函数handler。顺便说一下vtoolsd中的handler一般为回调函数,无需你去调用,需要的是你去重载这个虚函数。
------------------------------------------------------------------------
很久前就不写Vxd了,谁知9x体系还能存活多久呢?你先学学也好,以后转到WDM。
游客

返回顶部