阅读:1349回复:3
DeviceIoCtrol()怎么老是出错?
用途:等待驱动层发事件。
1。应用程。 IOCTL_FIRST_SEND_EVENT 已定义。 HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); int Length; DeviceIoControl(hDevice, IOCTL_FIRST_SEND_EVENT, &hEvent, sizeof(HANDLE),// input NULL, 0, // output &length,NULL)) 2。驱动层。 KEVENT keWrite; KeInitializeEvent(&keWrite,NotificationEvent,FALSE); switch( ControlCode) { case IOCTL_FIRST_SEND_EVENT: ObReferenceObjectByHandle((HANDLE)(*Buffer), 0x0002, NULL, UserMode, (PVOID *)(&keWrite), NULL); KeClearEvent(&keWrite); break; //................. } 有什么地方不对吗? |
|
|
沙发#
发布于:2002-06-26 10:43
有几个地方值得怀疑,但不一定对。
地方1: 驱动*.VXD是否动态加载。 1。应用程。 IOCTL_FIRST_SEND_EVENT 已定义。 HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); int Length; hDevice=CreateFile(\"\\\\\\\\.\\\\*.VXD\",0,0,NULL,0,FILE_FLA G_DELETE_ON_CLOSE,NULL); //地方2 DeviceIoControl(hDevice, IOCTL_FIRST_SEND_EVENT, &hEvent, sizeof(HANDLE),// input NULL, 0, // output &length,NULL)) 2。驱动层。 KEVENT keWrite; KeInitializeEvent(&keWrite,NotificationEvent,FALSE); switch( ControlCode) { case IOCTL_FIRST_SEND_EVENT: ObReferenceObjectByHandle((HANDLE)(*Buffer), 0x0002, NULL, UserMode, (PVOID *)(&keWrite), NULL); KeClearEvent(&keWrite); break; //................. } 地方3: 不知道你传递的ControlCode是如何从DIOCParams结构中提取的,以下说明也许对你有用: VxD程序必须处理w32_deviceIoControl消息。当VxD收到w32_deviceIoControl消息,它的寄存器是如下值: l ebx 是VM的句柄。 l esi 是指向DIOCParams结构的指针。DIOCParams包含了从win32程序传送的信息。 DIOCParams是按照如下定义的: DIOCParams STRUC Internal1 DD ? VMHandle DD ? Internal2 DD ? dwIoControlCode DD ? lpvInBuffer DD ? cbInBuffer DD ? lpvOutBuffer DD ? cbOutBuffer DD ? lpcbBytesReturned DD ? lpoOverlapped DD ? hDevice DD ? tagProcess DD ? DIOCParams ENDS l Internal1 是指向Win32应用应用程序用户寄存器结构的指针。 l VMHandle 虚拟机句柄 l Internal2 是指向设备描述块(DDB)的句柄。 l dwIoControlCode, lpvInBuffer, cbInBuffer, lpvOutBuffer, cbOutBuffer, lpcbBytesReturned, lpOverlapped是传送到DeviceIoControl API的参数。 l hDevice是 ring-3级设备句柄。 l tagProces 是过程的标签。 在DIOCParams结构中有所有从Win32应用程序传送到你的VxD的信息。 |
|
板凳#
发布于:2002-06-26 10:54
多谢老大提示。问题找到了。
|
|
|
地板#
发布于:2003-07-06 13:56
多谢老大提示。问题找到了。这位老兄,你问题是找到了,可我又碰到你同样的问题了,可以将你的解决方法以及你实现的源代码贴在这里吗?多谢了! |
|
|