Запись сектора во флэш-устройствоC++

Программы на C++. Форум разработчиков
Anonymous
Запись сектора во флэш-устройство

Сообщение Anonymous »

Я написал код C++ с помощью Visual Studio 2022 в Windows 11, который записывает сектор на съемное флэш-устройство (D:)

Код: Выделить всё

#include 
#include 
#include 

void writeSector(size_t position, const uint8_t* buffer, DWORD sectorSize)
{
HANDLE hDevice = CreateFileA(
"\\\\.\\D:",
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL
);

if (hDevice == INVALID_HANDLE_VALUE)
{
throw std::runtime_error("Error opening device: " + GetLastError());
}

DWORD bytesWritten;
LARGE_INTEGER li = { 0 };
li.QuadPart = position;
if (!SetFilePointerEx(hDevice, li, NULL, FILE_BEGIN))
{
CloseHandle(hDevice);
throw std::runtime_error("Impossible to set file pointer: " + GetLastError());
}
BOOL bRet = WriteFile(hDevice, buffer, sectorSize, &bytesWritten, NULL);

if (!bRet)
{
std::string msg = "WriteFile returned 0 " + GetLastError();
CloseHandle(hDevice);
throw std::runtime_error(msg.c_str());
}

if (bytesWritten != sectorSize)
{
std::string msg = "Written bytes different than expected: " + std::to_string(bytesWritten) + " " + GetLastError();
CloseHandle(hDevice);
throw std::runtime_error(msg.c_str());
}

CloseHandle(hDevice);
}

int main()
{
uint8_t buffer[512] = {0};
writeSector(0, buffer, 512);
writeSector(1024*512, buffer, 512);
writeSector(10*1024*512, buffer, 512);
}
Все проверки, содержащиеся в функции writeSector(), проходят успешно, кроме последней, где количество фактически записанных байтов bytesWritten сравнивается с ожидаемым значением SectorSize. На самом деле значение bytesWritten равно 0. GetLastError() возвращает 0: так что теоретически ошибки не было: просто ничего не было записано.
Может быть, я пишу по адресу неправильные адреса или неверный размер?
Геометрия устройства, считанная DeviceIoControl(), следующая: {Cylinders={253689} MediaType=RemovableMedia (11) TracksPerCylinder=255 BytesPerSector = 512 }.

Изменить. Я переписал эту функцию, используя NtWriteFile() из комплекта Windows, и получил тот же результат:

Код: Выделить всё

void writeSectorNt(size_t position, const uint8_t* buffer, DWORD sectorSize)
{
HANDLE hDevice = CreateFileA(
"\\\\.\\D:",
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);

if (hDevice == INVALID_HANDLE_VALUE)
{
throw std::runtime_error("Failed to open device: " + GetLastErrorString());
}

IO_STATUS_BLOCK ioStatusBlock = { 0 };

LARGE_INTEGER li = { 0 };
li.QuadPart = position;
NTSTATUS status = NtWriteFile(
hDevice,
NULL,
NULL,
NULL,
&ioStatusBlock,
(PVOID)buffer,
(ULONG)sectorSize,
&li,
NULL
);

int testErr = GetLastError();
if (status < 0 || testErr)
{
CloseHandle(hDevice);
throw std::runtime_error("NtWriteFile failed with status: " + std::to_string(status));

}

CloseHandle(hDevice);
}
Вызов функции успешен (как возвращаемое значение, так и GetLastError()).
Однако, хотя эта функция не предоставляет в качестве вывода количества фактически записанных байт, если я прочитаю сектор по тому же адресу, я увижу, что содержимое на самом деле не было записано.
Возможно, что-то не так с логикой этого кода или поведением Usbstick. Возможно, она несовместима с геометрией устройства... Как я могу попытаться изменить функцию или адрес/размер, которые я использую при ее вызове?

Подробнее здесь: https://stackoverflow.com/questions/786 ... ash-device

Вернуться в «C++»