阅读:5178回复:2
应用层跟驱动异步通信的问题,irp该如何处理?
我写了一个驱动,测试异步处理irp,然后写了一个应用层的测试程序,通过
DeviceIOControl与驱动通信。 我的问题: 1,我在应用层打开设备时,是否需要异步打开?即: 2,打开设备文件后,我通过发送自己定义的IOCTL码与驱动通信,驱动里面进行响应。 3,应用层将IO_TEST_PENDING发送到驱动后,驱动将此irp设置为pending 状态,按理讲我在应用层应该获取到ERROR_IO_PENDING错误码,但我却根本得不到! 我的本意是:采用异步方式通信,ioctol码发送出去后,DeviceIoControl可以立刻返回。 要想实现这种功能,我应该在驱动层和应用层怎么做呢? 请各位大侠帮帮小弟弟。 //这是应用层的代码 OVERLAPPED ov; DWORD dwReads = 0; BOOL bRes = FALSE; ZeroMemory(&ov, sizeof(ov)); HANDLE dioevent = CreateEvent(NULL, FALSE, FALSE, NULL); ov.hEvent = dioevent; bRes = DeviceIoControl(hFile, IO_TEST_PENDING, NULL, 0, NULL, 0, &dwReads, &ov); if (!bRes) { //得到异步处理的条件 if (ERROR_IO_PENDING == GetLastError()) { AfxMessageBox("OK, Pending return..."); } else { AfxMessageBox("failed!..."); } } //IOCtrolDispatch例程里面的代码 //获取irp状态 pIrp->IoStatus.Information = 0; pIrp->IoStatus.Status = STATUS_SUCCESS; pIrpStack = IoGetCurrentIrpStackLocation(pIrp); IoCode = pIrpStack->Parameters.DeviceIoControl.IoControlCode; switch (IoCode) { case IO_TEST_PENDING: status = PsCreateSystemThread(&hthread, (ACCESS_MASK)0L, NULL, (HANDLE)0, NULL, ThreadPending, NULL); if (!NT_SUCCESS(status)) { return status; } KdPrint(("Pending thread ok...")); //直接设置为pending 返回给应用层。 status = STATUS_PENDING; IoMarkIrpPending(pIrp); pIrp->IoStatus.Status = status; return status; break; } |
|
沙发#
发布于:2008-09-18 16:49
DeviceIoControl
If hDevice was opened without specifying FILE_FLAG_OVERLAPPED, lpOverlapped is ignored. |
|
板凳#
发布于:2008-09-19 10:26
基本搞定了。
多谢。 |
|