Сбой WriteFile для & gt; 4700 блоков (SD-карта, сырая запись / окно)

Я пишу / читаю необработанные данные на SD-карте. Код для написания работает до ок. 4700 блоков и сбоев после этого лимита. Вот код:

   //Data to be written
uint8_t* sessions;
sessions = (uint8_t *) malloc(2048*sizeof(uint8_t));
unsigned int i;
for(i=0;i<(2048*sizeof(uint8_t));i++) sessions[i]=8;

DWORD dwWrite;

HANDLE hDisk=CreateFileA("\\\\.\\K:",  // drive to open = SD CARD
GENERIC_WRITE,                // access to the drive
FILE_SHARE_READ | // share mode
FILE_SHARE_WRITE,
NULL,             // default security attributes
OPEN_EXISTING,    // disposition
FILE_FLAG_NO_BUFFERING,               // file attributes
NULL);            // do not copy file attributesif(hDisk==INVALID_HANDLE_VALUE)
{
CloseHandle(hDisk);
printf("ERROR opening the file !!! ");
}

DWORD dwPtr = SetFilePointer(hDisk,10000*512,0,FILE_BEGIN); //4700 OK

if (dwPtr == INVALID_SET_FILE_POINTER) // Test for failure
{
printf("CANNOT move the file pointer !!! ");
}

//Try using this structure but same results: CAN BE IGNORED
OVERLAPPED osWrite      = {0,0,0};
memset(&osWrite, 0, sizeof(osWrite));
osWrite.Offset = 10000*512;                //4700 OK
osWrite.hEvent = CreateEvent(FALSE, FALSE, FALSE, FALSE);

if( FALSE ==  WriteFile(hDisk,sessions,2048,&dwWrite,&osWrite) ){
printf("CANNOT write data to the SD card!!! %lu",dwWrite);
}else{
printf("Written %lu on SD card",dwWrite);
}

CloseHandle(hDisk);

Проблема связана с функцией «Writefile» (windows.h). Если номер блока меньше 4700. все в порядке (данные записываются на SD-карту), но если номер блока, скажем, 5000 или 10000, функция завершается ошибкой «Записано 0».

Обратите внимание, что без FILE_FLAG_NO_BUFFERING невозможно открыть диск (SD-карту). «OVERLAPPED» — неудачная попытка заставить его работать, не используя его (WriteFile (hDisk, session, 2048,&dwWrite, NULL)) приводит к тому же поведению. «SetFilePointer» работает также для блоков выше 4700. Протестировали также 2 разных SD-карты. Я на Windows 10.

Любой намек на то, что происходит?

Спасибо за ваш вклад

0

Решение

От документация для WriteFile:

Запись на дескриптор тома будет успешной, если на томе нет смонтированной файловой системы или если выполняется одно из следующих условий:

  • Секторы для записи являются загрузочными секторами.

  • Секторы, которые должны быть записаны, находятся вне пространства файловой системы.

  • Вы явно заблокировали или отключили том с помощью FSCTL_LOCK_VOLUME или же FSCTL_DISMOUNT_VOLUME,

  • Том не имеет фактической файловой системы. (Другими словами, на нем смонтирована файловая система RAW.)

Вы можете записать в первые пару мегабайт, потому что (по историческим причинам) файловая система не использует это пространство. Для записи на оставшуюся часть тома сначала необходимо заблокировать том с помощью FSCTL_LOCK_VOLUME контрольный код.

2

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

Вы должны пройти Null в качестве 3-го параметра SetFilePointer, lpDistanceToMoveHigh, если только вы не используете старшие 32 бита 64-битного адреса. Кроме того, если вы не используете OVERLAPPED структура, обязательно пройти Null в WriteFile для этого параметра.

Также убедитесь, что у вас нет переполнений для типов данных, которые вы используете. И помните об ограничениях адресации системы, над которой вы работаете.

MSDN WriteFile
MSDN SetFilePointer

0

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