从 WriteFile 到物理磁盘的访问被拒绝错误,win7

2023-12-12

我正在尝试将一些数据从特定的物理扇区写入 SD 卡。我从一家公司收到了执行此操作的代码,他们说它在 windows-xp 上工作正常。这与以下情况相同Win Vista/7 下的 WriteFile 错误 #5“拒绝访问”
这是将数据写入 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;
}

我几天前解决了这个问题,忘记在这里检查我的问题。 这是我使用的代码。创建文件时(对于分区磁盘),块设备也需要 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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 WriteFile 到物理磁盘的访问被拒绝错误,win7 的相关文章

随机推荐

  • 条件变量 - 为什么在调用 pthread_cond_wait() 之前调用 pthread_cond_signal() 是逻辑错误?

    它是用 POSIX 线程教程编写的https computing llnl gov tutorials pthreads 这是一个逻辑错误 我的问题是为什么这是一个逻辑错误 在我的程序中 我需要使用这些信号 但是我不能保证会有一个线程处于
  • 去除不在安全列表中的 HTML 标签的方法

    有没有一种方法可以去除所有不在安全标签列表中的 HTML 标签 如果没有 正则表达式 实现它的方法是什么 我正在寻找类似 PHP 的东西strip tags函数 做 不是 使用 正则表达式 到 解析 HTML 使用 XML 解析器 MSDN
  • 用于文件上传的 JWT 令牌和 Multer(节点)

    我需要一些帮助来弄清楚如何让它工作 我已经测试过并在我的 user 路由上使用了有效的 JWT 身份验证和 SSL 我试图安全地允许用户上传音频文件 也使用 JWT 和 SSL 路由 身份验证中间件可以工作 当我注释掉身份验证中间件时 mu
  • 使用不受信任的证书进行 WP7 HttpWebRequest POST?

    我正在开发一个进行 REST 服务调用的 Windows Phone 7 应用程序 托管 Web 服务的第三方在当前环境中具有无效证书 当我在 Firefox 中点击 URL 时 我收到有关证书的警告 并询问我是否要继续 我还使用 Post
  • Python Tkinter 应用程序无法正确退出

    from TKinter import class Ui Frame def init self Frame init self None self grid bquit Button self text Quit command self
  • Python镜像字符串函数

    我正在尝试开发一个功能mirror 它接受一个字符串并返回其镜像字符串 但前提是镜像字符串可以使用给定字符串中的 镜像 字母表示 例如 gt gt gt mirror vow wov gt gt gt mirror wood boow gt
  • 避免 MS Access 中的 SQL 注入 [重复]

    这个问题在这里已经有答案了 我试图更好地理解参数化 sql 作为 SQL 注入的解决方案 可以说我有一个tblCustomer与田野CustName Phone and Address 还可以说我有一个输入表单供新客户输入他们的数据 其中的
  • 使用 Kabsch 算法实现 3D 最佳旋转

    问题 我正在尝试使用卡布什算法找到两组 4 点之间的最佳旋转 但我得到的错误大得令人无法接受 我想绘制红点 P 到蓝点 Q 如图所示here 我尝试过的 这是我对 Kabsch 算法的实现 给定 numpy 数组mapping points
  • 如何可靠地检查对象是否是 EcmaScript 6 Map/Set?

    我只想检查一个对象是否是Map or Set而不是一个Array 检查我正在使用 lodash 的数组 isArray function myFunc arg if isArray arg doSomethingWithArray arg
  • 如何将 R 脚本与 R 中的 Shiny 应用程序连接?

    我已经开发了一个 R 脚本 现在我想将此 R 脚本与 Shiny 应用程序连接起来 即 我正在 Shiny 中开发 GUI 但在连接 RScript 和 Shiny 时遇到问题 我想使用 Shiny 应用程序调用 RScript 的输出 我
  • 从PhoneGap(Android)访问外部URL(Google.com)

    我是 PhoneGap 和 Android 的新手 我无法像 PhoneGap 中的 google 那样访问外部 URL 我尝试了 Iframe 和 Window Location Href 但不确定为什么它不起作用
  • Python Tkinter:将函数绑定到 for 循环中的变量列表

    我正在构建一个包含很多按钮的应用程序 因此我使用它们的列表和 for 循环将一个函数绑定到每个按钮 在单击时打印按钮的文本 当我将它单独绑定到每个按钮时 一切正常 但是当我使用 for 循环时 每个按钮仅打印按钮列表中最后一项的文本 在本例
  • 计算阶跃函数的总和

    我有相当多 大约 1000 个 的阶跃函数 每个阶跃函数只有两个间隔 我想将它们相加 然后找到最大值 做这个的最好方式是什么 我尝试过sympy 代码如下 from sympy import Piecewise piecewise fold
  • Gmail API - 值“= 获取标签 google-api-dotnet-client/1.25.0.0 (gzip)”的格式无效

    我开始探索 Gmail API 我按照教程显示标签列表 https developers google com gmail api quickstart dotnet 并且工作得很好 高度赞赏帮助 当我修改程序流程时 它给了我错误 我无法追
  • 如何在惰性列表中使图像更大(高度)

    我正在使用 Lazy list 项目开发一个图书阅读器这是链接 问题 我看到了惰性列表的外观页面高度小 图像模糊 很难阅读 我要这个 它应该看起来清晰 不是模糊 并且整页的高度像这样 I know 惰性列表加载位图的样本大小 我怎样才能获得
  • 使用可变数量的 IN (p1, p2, p3) 参数的动态查询

    我有以下内容 Dim strdepToDelete As String Dim strOtherToDelete As String strdepToDelete String Join depToDelete strOtherToDele
  • 使用“attr()”时选择之间的差异

    我有一段在单击按钮时调用的代码 const lines svg select lines selectAll line data arr lines enter append line lines attr x1 d gt d attr y
  • 将图像添加到多边形

    我一直在四处寻求帮助 但没有运气 所以我想我会问 我正在创建一系列菱形多边形 并想在它们上添加图像 但尝试在它们上绘图 但没有成功 关于如何做到这一点的任何建议 Thanks graphics setClip Shape graphics
  • 使用 ant 迭代 int xml 文件

    我有一个包含以下结构的 Xml 文件 我想按节点读取点头并使用不带公共分隔符的值调用特定任务 在 Ant 中这可能吗
  • 从 WriteFile 到物理磁盘的访问被拒绝错误,win7

    我正在尝试将一些数据从特定的物理扇区写入 SD 卡 我从一家公司收到了执行此操作的代码 他们说它在 windows xp 上工作正常 这与以下情况相同Win Vista 7 下的 WriteFile 错误 5 拒绝访问 这是将数据写入 SD