Можно ли получить доступ к необработанным устройствам с помощью python с окнами?

Это своего рода продолжение этого вопроса . Я хочу знать, можете ли вы получить доступ к необработанным устройствам (например, \\.\PhysicalDriveN ) в режиме записи, и, если это так, как это сделать.

Используя Linux, доступ к записи может быть просто достигнут, используя, например, open("/dev/sdd", "w+") (при условии, что скрипт работает с правами root). Я предполагаю, что Mac OS ведет себя аналогично (с /dev/diskN качестве входного файла).

При попытке использовать ту же команду под Windows (с соответствующим путем), она терпит неудачу со следующей ошибкой:

 IOError: [Errno 22] invalid mode ('w+') or filename: '\\\\.\\PhysicalDrive3' 

Однако при попытке чтения из PhysicalDrive он работает (даже правильные данные считываются). Оболочка работает с правами администратора в Windows 7.

Есть ли другой способ выполнить эту задачу с помощью python, сохраняя при этом скрипт как независимый от платформы?

Редактировать:

Я немного посмотрел на то, какие методы python предоставляет для обработки файлов и наткнулся на os.open . Открытие PhysicalDrive с использованием os.open(drive_string, os.O_WRONLY|os.O_BINARY) возвращает ошибки. Все идет нормально. Теперь у меня есть либо возможность написать прямо в этот файловый дескриптор, используя 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 

  • GetWindowRect слишком мал для Windows 7
  • как я могу обновить scipy в winpython на окнах?
  • Не удается запустить PhantomJS с Python в Windows 7
  • Python исполняемые файлы: py2exe или PyInstaller?
  • Установка lxml, libxml2, libxslt в Windows 8.1
  • Как найти общую папку данных приложения Windows с помощью Python?
  • nltk StanfordNERTagger: NoClassDefFoundError: org / slf4j / LoggerFactory (в Windows)
  • установить python и сделать в cygwin
  • 2 Solutions collect form web for “Можно ли получить доступ к необработанным устройствам с помощью python с окнами?”

    Как отметили eryksun и agf в комментариях (но на самом деле я их не понял ), решение довольно просто: вам нужно открыть устройство в режиме rb+ , который открывает устройство для обновления (как я нашел теперь …), не пытаясь заменить его новым файлом (который не будет работать, потому что файл на самом деле является физическим диском).

    Когда вы пишете, вы должны всегда писать целые сектора за раз (т. Е. Кратные 512 байт), иначе он терпит неудачу.

    Кроме того, команда .seek() также может переходить только по сектору. Если вы попытаетесь найти позицию внутри сектора (например, позиция 621 ), файл-объект перейдет в начало сектора, в котором находится запрошенная позиция (т.е. к началу второго сектора, байт 512 ).

    Возможно, в Win 7 вам нужно сделать что-то более экстремальное, например, заранее заблокировать том (ы) для диска с помощью DeviceIoControl (hVol, FSCTL_LOCK_VOLUME, …)

    В Win 7 вам не обязательно это делать; открытие и запись с режимом «rb +» отлично работают.

    Python - лучший язык программирования в мире.