我正在尝试将 USB 闪存驱动器作为 Windows 上的物理驱动器(如果重要的话为 10)执行直接数据读取和写入。我正在使用 Python 来做到这一点。
我遵循了以下讨论:
在 Windows 中使用 python 获得对原始设备的写入权限 https://stackoverflow.com/questions/7135398/is-it-possible-to-get-writing-access-to-raw-devices-using-python-with-windows
我遇到了同样的问题kcstrom https://stackoverflow.com/users/855030/kcstrom有这个问题。我得到一个
Traceback (most recent call last):
File "C:\script.py", line 49, in <module>
disk.write(data)
IOError: [Errno 9] Bad file descriptor
读和求工作应有尽有,读到的数据是正确的。
到目前为止我所知道的:
- 处理驱动器应以扇区大小的读取/写入/查找来完成。
- 磁盘必须以“rb+”模式打开。
- 同时使用 \\.\L: 和 \\.\PhysicalDriveN 会产生相同的结果。
- 该脚本必须在管理员权限下运行。
- 卸载驱动器并尝试访问 \\.\PhysicalDriveN 文件 - 即使以管理员身份运行也“权限被拒绝”。
重现错误:(警告:此代码可能会损坏物理驱动器,仅当您知道自己在做什么时才运行)
SOME_OFFSET = 123123
SOME_SIZE = 100
# replace L with the drive letter
disk = open('\\\\.\\L:','r+b')
# or use: (replace N with the drive number)
# disk = open('\\\\.\\PhysicalDriveN','r+b')
disk.seek(SOME_OFFSET*512)
data = disk.read(SOME_SIZE*512)
#modify data...
disk.seek(SOME_OFFSET*512)
disk.write(data)
我无法弄清楚这是权限问题还是我打开驱动器的方式问题。
根据MSDN技术说明“阻止对卷和磁盘的直接写入操作” https://web.archive.org/web/20150118072606/http://msdn.microsoft.com:80/en-us/library/windows/hardware/ff551353(v=vs.85).aspx:
如果文件在 DASD 卷句柄上的写入操作将会成功
系统未安装,或者如果:
- 被写入的扇区是引导扇区。
- 写入的扇区驻留在文件系统空间之外。
- 文件系统已通过请求隐式锁定
独占写访问权限。
- 文件系统已通过发送以下命令显式锁定
锁定/卸载请求。
....
如果出现以下情况,磁盘句柄上的写入操作将成功:
- 写入的扇区不属于文件系统。
- 写入的扇区属于已安装的文件系统
已明确锁定。
- 正在写入的扇区属于文件系统
未安装或该卷没有文件系统。
这是一个用于锁定卷的简单上下文管理器。它使用win32file http://docs.activestate.com/activepython/3.4/pywin32/win32file.html and winoctlcon
来自 PyWin32 的模块。
import msvcrt
import win32file
import winioctlcon
import contextlib
@contextlib.contextmanager
def lock_volume(vol):
hVol = msvcrt.get_osfhandle(vol.fileno())
win32file.DeviceIoControl(hVol, winioctlcon.FSCTL_LOCK_VOLUME,
None, None)
try:
yield vol
finally:
try:
vol.flush()
finally:
win32file.DeviceIoControl(hVol, winioctlcon.FSCTL_UNLOCK_VOLUME,
None, None)
if __name__ == '__main__':
VOLUME_PATH = r'\\.\E:'
OFFSET = 123123
SIZE = 100
with open(VOLUME_PATH, 'r+b') as disk:
with lock_volume(disk):
disk.seek(OFFSET * 512)
data = disk.read(SIZE * 512)
disk.seek(OFFSET * 512)
disk.write(data)
input('press enter to unlock the volume')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)