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);
}
}
}
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. –
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
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. –