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