WriteFile因>而失败4700块(SD卡原始写入/窗口)

时间:2017-05-23 15:11:45

标签: c++ windows winapi sd-card writefile

我正在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 attributes


   if(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);

问题在于&#34; Writefile&#34; (WINDOWS.H)。如果块的数量小于4700.一切都很好(数据写在SD卡上),但如果块号是5000或10000,则函数失败&#34;写0&#34;

请注意,如果没有FILE_FLAG_NO_BUFFERING,则无法打开驱动器(SD卡)。 &#34; OVERLAPPED&#34;是一个失败的尝试,使其工作,而不是使用它(WriteFile(hDisk,sessions,2048,&amp; dwWrite,NULL))导致相同的行为。 &#34; SetFilePointer&#34;适用于高于4700的块。还测试了2种不同的SD卡。我在Windows 10上。

有关正在发生的事情的任何提示?

感谢您的输入

2 个答案:

答案 0 :(得分:2)

来自documentation for WriteFile

  

如果卷没有已安装的文件系统,或者满足下列条件之一,则卷句柄上的写入将成功:

     
      
  • 要写入的扇区是引导扇区。

  •   
  • 要写入的扇区驻留在文件系统空间之外。

  •   
  • 您已使用FSCTL_LOCK_VOLUMEFSCTL_DISMOUNT_VOLUME明确锁定或停止了该卷。

  •   
  • 卷没有实际的文件系统。 (换句话说,它安装了RAW文件系统。)

  •   

您可以写入前几兆字节,因为(由于历史原因)文件系统不使用该空间。要写入卷的其余部分,您首先必须使用FSCTL_LOCK_VOLUME control code锁定卷。

答案 1 :(得分:0)

除非使用64位地址的高位32位,否则应将Null作为SetFilePointerlpDistanceToMoveHigh的第3个参数传递。另外,如果您未使用OVERLAPPED结构,请务必将Null传递给WriteFile以获取该参数。

此外,请确保您使用的数据类型没有任何溢出。并且,请注意您正在处理的系统的寻址限制。

MSDN WriteFile
MSDN SetFilePointer