2014-07-08 39 views
6

我想通过使用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,...)?感谢您的帮助。如何异步调用DeviceIOControl代码?

#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); 
     } 
    } 
} 
+0

如果驱动程序不支持异步I/O一般或有一定的要求,它处理I/O请求同步,忽略重叠参数。不过,我不知道这个驱动程序是否支持异步I/O模式下的这个特定请求。 –

+0

感谢您的回复。根据微软的FSCTL_ENUM_USN_DATA可以调用async:http://msdn.microsoft.com/en-us/library/windows/desktop/aa364563%28v=vs.85%29.aspx – user3816574

+0

那么,再看看你的代码,我没有看到你填写'lOverlapped'变量的'hEvent'成员。这可能是同步执行此请求的一个很好的理由。 –

回答

0
HEVENT hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); 
OVERLAPPED lOverlapped = { 0 }; 
lOverlapped.hEvent = hEvent; 

... 

BOOL result = DeviceIoControl(hDevice, FSCTL_ENUM_USN_DATA, &lInputMftData, sizeof(lInputMftData), &lOutputMftData, sizeof(lOutputMftData), &lOutBytesReturned, &lOverlapped); 

// If operation is asynchronous, wait for hEvent here or somewhere else 
+0

谢谢。但仍然不起作用。没有异步。重叠结构和设备手柄应该是正确的:如果我打电话给'readfile'函数具有相同的重叠结构和相同的hdevice句柄,它立即返回GetalstError()= 997(ERROR_IO_PENDING:重叠的I/O操作正在进行中),这表明'readfile'被异步调用。但它不适用于deviceio。 – user3816574