WinAPI DeviceIoControl - 检查重叠的请求结果

问题描述

我有内核模式驱动程序,它异步处理用户模式请求。队列中的最大请求数,lats 说,32。以下所有请求都以 STATUS_INSUFFICIENT_RESOURCE 状态完成。如果请求已在此状态下完成,我需要检查用户模式应用程序。这是我的用户模式应用代码

HANDLE hEvents[40] = { 0 };
OVERLAPPED ovls[40] = { 0 };
int index = 0;
while (true)
{
    hEvents[index] = CreateEvent(NULL,FALSE,NULL);
    ZeroMemory(&ovls[index],sizeof(OVERLAPPED));
    ovls[index].hEvent = hEvents[index];
    BOOL res = DeviceIoControl(hDevice,SEND_REQUEST_CTL,nullptr,&dwBytesRet,&ovls[index]);
    ++index;
    if (res == FALSE)
    {
        DWORD err = GetLastError();
        if (err != ERROR_IO_PENDING)
        {
            WaitForMultipleObjects(index,hEvents,TRUE,INFINITE);
            for (int i = 0; i < index; ++i)
                CloseHandle(hEvents[i]);
        }
    }
}

我有 hEvents 数组和 OVERLAPPED 结构数组,因为我需要等待请求完成。所以我的想法是,当驱动程序返回 STATUS_INSUFFICIENT_RESOURCE 时,我只是在等待所有排队到驱动程序的 IRP 完成。 问题在于即使驱动程序调用

Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCE;
Irp->IoStatus.information = 0;
IoCompleteRequest(Irp,0);

GetLastError() 来自用户模式应用程序返回 ERROR_IO_PENDING 所以我无法处理 STATUS_INSUFFICIENT_BUFFER 驱动程序错误。 所以我的问题是如何检查用户模式应用程序,IRP 已完成,状态为 STATUS_INSUFFICIENT_RESOURCE?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)