Прямая запись на диск приводит к коду ошибки 5 в соответствии с GetLastError

Я пытаюсь напрямую записать USB-диск в Windows. Я использовал CreateFile функция для создания дескриптора диска и использовал WriteFile функция, чтобы попытаться записать файл. Сбой функции WriteFile с кодом состояния 5 (согласно GetLastError). Я попытался заблокировать том диска с помощью FSCTL_DISMOUNT_VOLUME, но объем был скрыт, поэтому я не мог получить его объем письмо.

Код:

    u8 Disk::Init()
{
char fn[24] = { 0 };
sprintf(fn, "\\\\.\\PhysicalDrive%d", (int)m_nDiskNum);
m_hDisk = CreateFileA(fn, GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
OPEN_EXISTING,
FILE_FLAG_WRITE_THROUGH | FILE_FLAG_NO_BUFFERING, 0);

if (INVALID_HANDLE_VALUE == m_hDisk)
{
return (FAIL);
}

//m_DiskInfo.Init();
return Lock();
}

u8 Disk::Lock()
{
STORAGE_DEVICE_NUMBER d1;
DWORD nr;
char dn[8], c;

if (!DeviceIoControl((HANDLE)m_hDisk, IOCTL_STORAGE_GET_DEVICE_NUMBER,
NULL, 0, &d1, sizeof(d1), &nr, 0))
{
return (FAIL);
}

strcpy(dn, "\\\\.\\A:");

// some volume is hided, so I cannot get its letter
for (c = 'C'; c < 'Z'; c++)
{
HANDLE hd;
STORAGE_DEVICE_NUMBER d2;

dn[4] = c;
hd = CreateFileA(dn, GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, 0, 0);

if (hd == INVALID_HANDLE_VALUE)
{
continue;
}

if ((!DeviceIoControl(hd, IOCTL_STORAGE_GET_DEVICE_NUMBER,
NULL, 0, &d2, sizeof(d2), &nr, 0)) ||
(d1.DeviceType != d2.DeviceType) ||
(d1.DeviceNumber != d2.DeviceNumber))
{
CloseHandle(hd);
continue;
}

if (!DeviceIoControl(hd, FSCTL_DISMOUNT_VOLUME, NULL, 0, NULL, 0,
&nr, 0))
{
CloseHandle(hd);
return (FAIL);
}

m_LockedVolums.push_back(hd);
}

return (SUCC);
}

u8 Disk::UnLock()
{
for (auto it : m_LockedVolums)
{
CloseHandle(it);
}

m_LockedVolums.clear();
return (SUCC);
}

u8 Disk::WriteSector(_Out_opt_ u8 * cBuf, int nStartSec, int nSecCont/* = 1*/)
{
if (Seek(nStartSec))
{
return(FAIL);
}

unsigned long nWrited;

if ((!WriteFile((HANDLE)m_hDisk, cBuf, nSecCont * m_nBytePerSec, &nWrited, NULL))
|| (nSecCont * m_nBytePerSec != (int)nWrited))
{
return(FAIL);
}

return(SUCC);
}

1

Решение

Я не думаю, что вы правильно блокируете громкость.

FSCTL_DISMOUNT_VOLUME IO control отключает файловую систему, но я не думаю, что она блокирует ее для записи. использование FSCTL_LOCK_VOLUME впоследствии (или вместо этого, если том не имеет читаемой Windows файловой системы и, следовательно, не смонтирован), чтобы запросить доступ для записи.

Постскриптум Я думаю, что ваше приложение должно работать с повышенными правами, чтобы использовать этот API.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]