gpt4 book ai didi

asynchronous - 如何异步调用DeviceIOControl代码?

转载 作者:行者123 更新时间:2023-12-04 15:57:46 30 4
gpt4 key购买 nike

我正在尝试使用 MSDN 上描述的 OVERLAPPED 结构异步调用 DeviceIO 函数。
我正在使用 FSCTL_ENUM_USN_DATA 控制代码来枚举 NTFS 驱动器的 MFT,但我无法异步运行它。文件句柄是用 FILE_FLAG_OVERLAPPED 创建的,但我是否使用 FILE_FLAG_OVERLAPPED 的重叠结构没有区别。该函数不会立即返回。在这两种情况下似乎都是同步的。
下面的示例显示了 C:\驱动器上前 100.000 个 MFT 条目的枚举。
由于我对重叠结构的使用不太熟悉,可能我做错了什么。我的问题:如何异步执行 DeviceIoControl(hDevice, FSCTL_ENUM_USN_DATA,...)? 谢谢你的帮助。

#include "stdafx.h"
#include <Windows.h>

typedef struct {
DWORDLONG nextusn;
USN_RECORD FirstUsnRecord;
BYTE Buffer[500];
}TDeviceIoControlOutputBuffer, *PTDeviceIoControlOutputBuffer;

int _tmain(int argc, _TCHAR* argv[])
{
MFT_ENUM_DATA lInputMftData;
lInputMftData.StartFileReferenceNumber = 0;
lInputMftData.MinMajorVersion = 2;
lInputMftData.MaxMajorVersion = 3;
lInputMftData.LowUsn = 0;
lInputMftData.HighUsn = 0;

TDeviceIoControlOutputBuffer lOutputMftData;
DWORD lOutBytesReturned = 0;
HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
OVERLAPPED lOverlapped = { 0 };
lOverlapped.hEvent = hEvent;
LPCWSTR path = L"\\\\.\\C:";
HANDLE hDevice = CreateFile(path, GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
if (hDevice != INVALID_HANDLE_VALUE) {
lOutputMftData.nextusn = 0;
while (lOutputMftData.nextusn < 100000) {
lInputMftData.StartFileReferenceNumber = lOutputMftData.nextusn;
BOOL result = DeviceIoControl(hDevice, FSCTL_ENUM_USN_DATA, &lInputMftData, sizeof(lInputMftData), &lOutputMftData, sizeof(lOutputMftData), &lOutBytesReturned, &lOverlapped);
}
}
}

最佳答案

TL:DR - 如果收到您的请求的驱动程序挂起它,您只会获得异步行为。

当您调用 DeviceIoControl 并传递重叠结构时,并不能保证操作将是异步的。这意味着它可以是异步的。这取决于将接收您的请求的驱动程序的实现方式。
当您运行 DeviceIoControl 时,它会创建一个 irp 并将其发送给驱动程序。 DeviceIoControl 会将您的线程提升到内核模式以创建和分发 irp。将在该线程上调用驱动程序的回调来处理请求。如果驱动程序决定立即处理(并完成)请求,则请求将同步完成。在这个流程中,使用 FILE_FLAG_OVERLAPPED 打开驱动程序没有区别。
如果驱动程序决定挂起请求,那么您将看到真正的异步行为。
DeviceIoControl 将返回 FALSE,GetLastError 将返回 ERROR_IO_PENDING。这意味着 irp 正在等待完成,并且您在 OVERLAPPED 结构中提供的事件将在 irp 完成时发出信号。

关于asynchronous - 如何异步调用DeviceIOControl代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24633898/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com