这是this question的后续。我想知道您是否可以以写模式访问原始设备(即\\.\PhysicalDriveN
),如果是这样,如何访问。
使用Linux,只需使用open("/dev/sdd", "w+")
(只要脚本使用根权限运行)即可实现写访问。我假设Mac OS的行为类似(使用/dev/diskN
作为输入文件)。
在Windows下尝试相同的命令(使用相应的路径)时失败,错误如下:
IOError: [Errno 22] invalid mode ('w+') or filename: '\\\\.\\PhysicalDrive3'
但是,当试图从PhysicalDrive中读取时,它确实可以工作(即使读取了正确的数据)。shell在Windows 7下以管理员权限运行。
在使用python完成此任务的同时,是否还有其他方法可以使脚本尽可能独立于平台?
我进一步研究了python为文件处理提供的方法,无意中发现了os.open。使用os.open(drive_string, os.O_WRONLY|os.O_BINARY)
打开PhysicalDrive不会返回任何错误。到目前为止,还不错。现在我可以选择使用os.write直接写入这个文件描述符,或者使用os.fdopen获取一个文件对象并以常规方式写入它。
不幸的是,这些可能性都不起作用。在第一种情况下(os.write()
),我得到:
>>> os.write(os.open("\\\\.\\PhysicalDrive3", os.O_WRONLY|os.O_BINARY), "test")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 22] Invalid argument
在第二种情况下,我可以用写权限创建一个文件对象,但是写本身失败了(在使用.flush()
强制执行之后):
>>> g = os.fdopen(os.open("\\\\.\\PhysicalDrive3", os.O_WRONLY|os.O_BINARY), "wb")
>>> g.write("test")
>>> g.flush()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 22] Invalid argument
正如eryksun和agf在评论中指出的(但我一开始并没有真正得到它),解决方案相当简单:您必须以
rb+
模式打开设备,这将为updating打开设备(我现在已经发现了…),而不尝试用新文件替换它(因为文件实际上是物理驱动器,所以无法工作)。写入时,必须每次写入整个扇区(即512字节的倍数),否则将失败。
此外,
.seek()
命令也只能按扇区跳转。如果您试图在扇区内寻找一个位置(例如位置621
),文件对象将跳到您请求的位置所在的扇区的开头(即,跳到第二个扇区的开头,字节512
)。在Win 7中,你不必这么做;用“rb+”模式打开和编写可以。
相关问题 更多 >
编程相关推荐