微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 举报,一经查实,本站将立刻删除。