Я пытаюсь асинхронно вызывать функции DeviceIO, используя структуру OVERLAPPED, как описано в MSDN. Я использую управляющий код FSCTL_ENUM_USN_DATA для перечисления MFT дисков NTFS, но не могу запустить его асинхронно. Дескриптор файла создается с FILE_FLAG_OVERLAPPED, но нет никакой разницы, использую ли я перекрывающуюся структуру с FILE_FLAG_OVERLAPPED или нет. Функция не возвращается сразу. Кажется, что это синхронно в обоих случаях. В приведенном ниже примере показано перечисление первых 100 000 записей MFT на диске C:\. Поскольку я не так хорошо знаком с использованием перекрывающихся структур, возможно, я сделал что-то не так. Мой вопрос: Как я могу выполнить 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);
}
}
}
hEvent
переменнойlOverlapped
. Это может быть хорошей причиной для синхронного выполнения этого запроса. - person Alex F   schedule 08.07.2014