阅读:1052回复:5
请教《windows设备驱动程序(vxd与wdm)》一书中的程序VIOPort类的编程
在这本书的第十章,有关VIOProt类的编程的实例中用的handler:
DWORD MyPort::handler(VMHANDLE hVM,DWORD port, CLIENT_STRUCT*pRegs, DWORD iotype,DWORD outdata) 这个函数中的参数是由谁传过来的呢?它在整个实例中都没有给 port,iotype,outdata赋值或传参。请指教。我的email: 13904111284@vip.163.com |
|
沙发#
发布于:2002-06-03 11:59
这个函数中的参数是由谁传过来的呢?
-------------------------------------------------------------------- of cource the os see the callback function of Install_IO_Handler |
|
板凳#
发布于: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为双字的操作? |
|
地板#
发布于: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)这些参数。 吃完饭接着说 |
|
地下室#
发布于:2002-06-04 11:23
可以问一问这些你是怎么知道的吗?有什么资料或书籍推荐吗?
关于VIOPort::hook()竟有那么多的东西,书上怎么没有写呢? 期待你吃饭回来!!!!祝你胃口好 |
|
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。 |
|