access denied error from WriteFile to physical disk, win7

前端 未结 1 1347
半阙折子戏
半阙折子戏 2021-01-23 08:18

I am trying to write some data to an SD card from a specific physical sector. I received a code to do this from a company and they say it works ok on windows-xp. This is the sam

相关标签:
1条回答
  • I solved this problem several days ago and forgot to check my question here. This is the code I used. We need GENERIC_READ also for block device when creating the file (for partitioned disk). and the key was dismount first and then lock.

    u32 HDD_write(u8 drv, u32 SecAddr, u32 blocks, u8 *buf) {
      u32 ret = 0;
      u32 ldistanceLow, ldistanceHigh, dwpointer, bytestoread, numread;
      char cur_drv[100];
      HANDLE g_hDevice;
      DWORD status;
    
      //sprintf(cur_drv, "\\\\.\\PhysicalDrive%d", drv);
      sprintf(cur_drv, "\\\\.\\%c:",drv);
      g_hDevice = CreateFile(cur_drv, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    
      if(g_hDevice == INVALID_HANDLE_VALUE)
        return 0;
    
    // dismout and lock added by ckim
    
      if (!DeviceIoControl(g_hDevice, FSCTL_DISMOUNT_VOLUME,
          NULL, 0, NULL, 0, &status, NULL))
      {
          DWORD err = GetLastError();
          printf("Error %d attempting to dismount volume, error code\n",err);
      }
    
      // lock volume
      if (!DeviceIoControl(g_hDevice, FSCTL_LOCK_VOLUME,
          NULL, 0, NULL, 0, &status, NULL))
      {
          printf("Error %d attempting to lock device\n", GetLastError());
      }
    
      ldistanceLow = SecAddr << 9;
      ldistanceHigh = SecAddr >> (32-9);
      dwpointer = SetFilePointer(g_hDevice, ldistanceLow, (long *)&ldistanceHigh, FILE_BEGIN);
    
      if(dwpointer != 0xFFFFFFFF) {
        bytestoread = blocks * 512;
        ret = WriteFile(g_hDevice, buf, bytestoread, (unsigned long *)&numread, NULL);
        if(ret)   ret = 1;
        else      {
            ret = 0;
            printf("error = %d", GetLastError());
        }
      }
    
      CloseHandle(g_hDevice);
      return ret;
    }
    
    0 讨论(0)
提交回复
热议问题