2016-10-25 5 views
2

Windowsの物理ドライブとしてUSBフラッシュドライブに直接データの読み書きを実行しようとしています)。私はそれを行うためにPythonを使用しています。物理ディスク(フラッシュドライブ)にrawデータを書き込むことができません - Python

私は、以下の議論を踏襲しています

get writing access to raw devices using python with windows

私はkcstromはその質問に持っていた同じ問題に遭遇しました。私は得る

Traceback (most recent call last): 
    File "C:\script.py", line 49, in <module> 
    disk.write(data) 
    IOError: [Errno 9] Bad file descriptor 

読んで、読んでいるデータが正しいです。私はこれまで知っている何

:ドライブの取り扱い

  1. がセクターで行われるべきなサイズは/シーク/読み書き。
  2. ディスクは 'rb +'モードで開く必要があります。
  3. \\。\ L:と\\。\ PhysicalDriveNの両方を使用すると、同じ結果が得られます。
  4. スクリプトは管理者権限で実行する必要があります。
  5. ドライブをアンマウントし、\\。\ PhysicalDriveNファイルにアクセスしようとしています - 管理者として実行していても "アクセス権が拒否されました"。

エラーを再現するには:(警告:このコードが破損PHYSICAL、ドライブCAN、あなたは何をしているかがわかっている場合のみ実行)

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) 

これはパーミッションの問題であるならば、私は把握することはできませんまたはドライブを開けたときの問題。

+1

基本的な 'WriteFile'は' ERROR_ACCESS_DENIED'で失敗します。マウントされたボリュームに直接書き込むことはできません。それを書き込む前に、ボリュームをロックしたりマウント解除したりするには、これ以上掘り下げなければなりません。 – eryksun

+0

@eryksun私はそうするために必要な情報を教えてください。ありがとう! – MiaoHatola

+1

['CreateFile'](https://msdn.microsoft。)で開かれたボリュームハンドルで[' DeviceIoControl'](https://msdn.microsoft.com/en-us/library/aa363216)と呼ぶことになります。 com/ja-us/library/aa363858)をご覧ください。ボリュームをロック、ディスマウント、ロック解除するための[ボリュームコントロールコード](https://msdn.microsoft.com/en-us/library/aa365729) Pythonでは、ctypesまたはPyWin32の['win32file'](http://docs.activestate.com/activepython/2.7/pywin32/win32file.html)モジュールを使用できます。 – eryksun

答えて

1

は、MSDNテクニカルノート"Blocking Direct Write Operations to Volumes and Disks"によると:

Write operations on a DASD volume handle will succeed if the file system is not mounted, or if:

  • The sectors being written to are the boot sectors.
  • The sectors being written to reside outside file system space.
  • The file system has been locked implicitly by requesting exclusive write access.
  • The file system has been locked explicitly by sending down a lock/dismount request.

....

Write operations on a disk handle will succeed if:

  • The sectors being written to do not fall within a file system.
  • The sectors being written to fall within a mounted file system that is locked explicitly.
  • The sectors being written to fall within a file system that is not mounted or the volume has no file system.

ここでボリュームをロックするための簡単なコンテキストマネージャです。 PyWin32のwin32filewinoctlconモジュールを使用しています。

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') 
関連する問題