我正在尝试使用OVERLAPPED结构异步调用DeviceIO函数,如MSDN所述。
我正在使用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);
}
}
}
lOverlapped
变量的hEvent
成员。这可能是同步执行此请求的一个很好的理由。 - Alex F