2014-07-08 33 views
6

DeviceIO işlevlerini, zaman zaman MSDN'de anlatıldığı gibi OVERLAPPED yapısını kullanarak eşzamansız olarak çağırmaya çalışıyorum. NTFS sürücülerinin MFT numaralarını numaralandırmak için FSCTL_ENUM_USN_DATA denetim kodunu kullanıyorum ancak eşzamansız olarak çalıştıramıyorum. Dosya tanıtıcısı FILE_FLAG_OVERLAPPED ile oluşturulur, ancak FILE_FLAG_OVERLAPPED ile örtüşen yapının kullanılıp kullanılmadığı fark etmez. Fonksiyon hemen geri dönmez. Her iki durumda da eş zamanlı görünmektedir. Aşağıdaki örnek, C: \ sürücüsündeki ilk 100.000 MFT girişinin numaralandırılmasını gösterir. Üst üste binmiş yapıların kullanımına aşina olmadığım için yanlış bir şey yaptım. Soruma göre: DeviceIoControl (hDevice, FSCTL_ENUM_USN_DATA, ...) eşzamansız olarak nasıl çalıştırabilirim? Yardımlarınız için teşekkürler. Sürücü asenkron I desteklemiyorsaDeviceIOControl kodu eşzamansız olarak nasıl çağırılır?

#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

/O veya genel olarak bir istek için, I/O eş zamanlı istek, üst üste gelen parametre göz ardı yönetir. Bu sürücünün async I/O modunda bu özel isteği destekleyip desteklemediğini bilmiyorum. –

+0

Cevabınız için teşekkür ederiz. Microsoft'a göre FSCTL_ENUM_USN_DATA async olarak adlandırılabilir: http://msdn.microsoft.com/en-us/library/windows/desktop/aa364563%28v=vs.85%29.aspx – user3816574

+0

Yeniden kodunuza tekrar bakıyorum. 'lOverlapped' değişkeninin' hEvent 'üyesini doldurduğunu görmüyorum. Bu istek, senkronize olarak bu isteği yürütmek için iyi bir sebep olabilir. –

cevap

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

Teşekkürler. Ama hala çalışmıyor. Uyuşmazlık yok. Üst üste binen yapı ve aygıt tanıtıcısı doğru olmalıdır: Eğer ör. Aynı örtüşen yapıya ve aynı hdevice tutamacına sahip 'readfile' fonksiyonu, hemen GetalstError() = 997 (ERROR_IO_PENDING: Çakışan G/Ç işlemi devam ediyor) ile döner, bu da 'readfile' kelimesinin eşzamansız olarak adlandırıldığını gösterir. Ama cihaz için çalışmıyor. – user3816574

İlgili konular