问题描述
我有内核模式驱动程序,它异步处理用户模式请求。队列中的最大请求数,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 (将#修改为@)