在windows下使用python可以对原始设备进行写访问吗?

2024-04-28 03:42:36 发布

您现在位置:Python中文网/ 问答频道 /正文

这是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

Tags: 文件dev脚本权限oswindows错误open
2条回答

正如eryksunagf在评论中指出的(但我一开始并没有真正得到它),解决方案相当简单:您必须以rb+模式打开设备,这将为updating打开设备(我现在已经发现了…),而不尝试用新文件替换它(因为文件实际上是物理驱动器,所以无法工作)。

写入时,必须每次写入整个扇区(即512字节的倍数),否则将失败。

此外,.seek()命令也只能按扇区跳转。如果您试图在扇区内寻找一个位置(例如位置621),文件对象将跳到您请求的位置所在的扇区的开头(即,跳到第二个扇区的开头,字节512)。

Possibly in Win 7 you have to do something more extreme, such as locking the volume(s) for the disk beforehand with DeviceIoControl(hVol, FSCTL_LOCK_VOLUME, ...)

在Win 7中,你不必这么做;用“rb+”模式打开和编写可以。

相关问题 更多 >