Код: Выделить всё
#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);
}
Может быть, я пишу по адресу неправильные адреса или неверный размер?
Геометрия устройства, считанная 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);
}
Однако, хотя эта функция не предоставляет в качестве вывода количества фактически записанных байт, если я прочитаю сектор по тому же адресу, я увижу, что содержимое на самом деле не было записано.
Возможно, что-то не так с логикой этого кода или поведением Usbstick. Возможно, она несовместима с геометрией устройства... Как я могу попытаться изменить функцию или адрес/размер, которые я использую при ее вызове?
Подробнее здесь: https://stackoverflow.com/questions/786 ... ash-device