Я пишу / читаю необработанные данные на 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.
Любой намек на то, что происходит?
Спасибо за ваш вклад
От документация для WriteFile:
Запись на дескриптор тома будет успешной, если на томе нет смонтированной файловой системы или если выполняется одно из следующих условий:
Секторы для записи являются загрузочными секторами.
Секторы, которые должны быть записаны, находятся вне пространства файловой системы.
Вы явно заблокировали или отключили том с помощью
FSCTL_LOCK_VOLUME
или жеFSCTL_DISMOUNT_VOLUME
,Том не имеет фактической файловой системы. (Другими словами, на нем смонтирована файловая система RAW.)
Вы можете записать в первые пару мегабайт, потому что (по историческим причинам) файловая система не использует это пространство. Для записи на оставшуюся часть тома сначала необходимо заблокировать том с помощью FSCTL_LOCK_VOLUME
контрольный код.
Вы должны пройти Null
в качестве 3-го параметра SetFilePointer
, lpDistanceToMoveHigh
, если только вы не используете старшие 32 бита 64-битного адреса. Кроме того, если вы не используете OVERLAPPED
структура, обязательно пройти Null
в WriteFile
для этого параметра.
Также убедитесь, что у вас нет переполнений для типов данных, которые вы используете. И помните об ограничениях адресации системы, над которой вы работаете.