【问题标题】:access denied error from WriteFile to physical disk, win7从WriteFile到物理磁盘的访问被拒绝错误,win7
【发布时间】:2015-01-23 03:54:11
【问题描述】:

我正在尝试从特定物理扇区将一些数据写入 SD 卡。我从一家公司收到了执行此操作的代码,他们说它在 windows-xp 上运行良好。这与WriteFile error #5 "denied access" under win Vista/seven的情况相同
这是将数据写入 SD 卡的部分(在我的 cae drv 值是“F”)。从其他人那里阅读,我添加了锁定和拆卸,但锁定失败(也拆卸)。我对windows编程不是很熟悉。谁能告诉我这段代码有什么问题?谢谢你的帮助。 (顺便说一句,我正在锁定 3GiB)

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;

  sprintf(cur_drv, "\\\\.\\%c:",drv); // , (u32)drv);
  g_hDevice = CreateFile(cur_drv, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

  if(g_hDevice == INVALID_HANDLE_VALUE)
    return 0;

  // lock and dismount
  ret = LockFile(g_hDevice, 0, 0, 3 * 1023 * 1023 * 1023, 0);
  printf("ret = %d", ret);
  DeviceIoControl(g_hDevice, FSCTL_DISMOUNT_VOLUME, NULL, 0, NULL, 0, NULL, NULL);
  printf("error = %d", 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;
}

【问题讨论】:

  • GetLastError()LockFile() 失败时返回什么?
  • 您是否尝试过使用DeviceIoControl(g_hDevice, FSCTL_LOCK_VOLUME, NULL, 0, NULL, 0, &amp;dwBytesReturned, NULL);锁定卷?
  • @Krister Andersson,对不起,我没有看到你的问题。可能设备忙于锁定,而 WriteFile 的访问被拒绝。我后来也使用了 FSCTL_LOCK_VOLUME。谢谢!

标签: winapi sd-card


【解决方案1】:

我几天前解决了这个问题,忘了在这里检查我的问题。 这是我使用的代码。在创建文件(用于分区磁盘)时,我们还需要 GENERIC_READ 用于块设备。并且钥匙是先卸后锁的。

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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-31
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 2010-10-24
    • 2012-12-21
    相关资源
    最近更新 更多