Кажется, в вашем примере кода есть несколько ошибок. Если бы это было на самом деле скопировано и вставлено из вашей программы, тогда должно было бы быть что-то еще.
Сначала вы вызываете функцию Unicode со строкой MBCS: первый аргумент должен начинаться с L
или заключаться в _T()
.
Во-вторых, и, что еще важнее, "\\\\.\\E"
не является допустимым именем. Вам не хватает конечного двоеточия: для открытия тома он должен иметь форму \\.\X:
, или в вашем случае "\\\\.\\E:"
.
После исправления этих двух ошибок (первая, препятствующая компиляции, вторая требовала получить что-либо, кроме INVALID_HANDLE_VALUE
обратно), все, казалось, работало, как ожидалось. Я использовал GetProcessHandleCount для подсчета количества открытых дескрипторов, и до и после он был одинаковым:
HANDLE m_driveHandle = NULL;
HANDLE m_process = GetCurrentProcess();
DWORD handleCount;
GetProcessHandleCount(m_process, &handleCount);
cout << "Currently held handles: " << handleCount << endl;
for (int i = 0; i < 10; ++i) {
m_driveHandle = CreateFileW(L"\\\\.\\E:",
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if (INVALID_HANDLE_VALUE == m_driveHandle) {
cout << "Invalid handle" << endl;
} else {
CloseHandle(m_driveHandle);
}
GetProcessHandleCount(m_process, &handleCount);
cout << "Currently held handles: " << handleCount << endl;
}
Комментирование вызова CloseHandle приводит к тому, что handleCount также увеличивается, как и ожидалось.