2014-07-08 19 views
6

Ich versuche, DeviceIO-Funktionen asynchron aufzurufen, indem ich die OVERLAPPED-Struktur verwende, wie in MSDN beschrieben. Ich verwende den Steuercode FSCTL_ENUM_USN_DATA, um die MFT von NTFS-Laufwerken aufzuzählen, aber ich kann sie nicht asynchron ausführen. Das Dateihandle wird mit FILE_FLAG_OVERLAPPED erstellt, aber es gibt keinen Unterschied, ob ich die überlappende Struktur mit FILE_FLAG_OVERLAPPED verwende oder nicht. Die Funktion kehrt nicht sofort zurück. Es scheint in beiden Fällen synchron zu sein. Das folgende Beispiel zeigt die Aufzählung der ersten 100.000 MFT-Einträge auf dem Laufwerk C: \. Da mir die Verwendung von überlappenden Strukturen nicht so vertraut ist, habe ich vielleicht etwas falsch gemacht. Meine Frage: Wie kann ich DeviceIoControl (hDevice, FSCTL_ENUM_USN_DATA, ...) asynchron ausführen? Danke für jede Hilfe.So rufen Sie DeviceIOControl-Code asynchron auf?

#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

Wenn Fahrer nicht asynchrone I nicht unterstützt/O im Allgemeinen oder für eine Anfrage, es Griffe E/A-Anforderung synchron, ignorieren ÜBERLAPPVERBINDUNG Parameter. Ich weiß nicht, ob dieser Treiber diese spezielle Anforderung im asynchronen E/A-Modus unterstützt. –

+0

Danke für die Antwort. Laut Microsoft FSCTL_ENUM_USN_DATA kann async aufgerufen werden: http://msdn.microsoft.com/en-us/library/windows/desktop/aa364563%28v=vs.85%29.aspx – user3816574

+0

Nun, schaut wieder auf Ihren Code, ich Sie sehen nicht, dass Sie das Element 'hEvent' der Variablen'Overlapped' füllen. Dies kann ein guter Grund sein, diese Anfrage synchron auszuführen. –

Antwort

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

Danke. Aber immer noch nicht funktioniert. Kein Async. Die überlappende Struktur und der Gerätegriff sollten korrekt sein: Wenn ich z.B. die 'readfile' -Funktion mit der gleichen überlappenden Struktur und dem gleichen hdevice-Handle, kehrt sie sofort mit GetalstError() = 997 zurück (ERROR_IO_PENDING: Überlappende E/A-Operation wird ausgeführt), was anzeigt, dass 'readfile' asynchron aufgerufen wird. Aber es funktioniert nicht für deviceio. – user3816574