2011-07-07 34 views
7

フォーマット済みのUSBドライブのすべてのセクタにテストパターンを書き込もうとしています。 1つの論理ドライブ(例:h :)があります。このボリュームはFATフォーマットであり、上書きされるデータを含んでいます。また、物理ドライブ全体を上書きしたい。プログラムは、高い権限で実行されています。ERROR_ACCESS_DENIEDを取得せずに物理ドライブに書き込む方法(Windows 7)

まず私は、次のことをやった:

// from the drive letter "h:" I get the physical disk number using 
// IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS => "\\.\PhysicalDrive2" 

hDevice = ::CreateFile("\\.\PhysicalDrive2", GENERIC_READ|GENERIC_WRITE, 
    FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); 

// get the number of available sectors with IOCTL_DISK_GET_DRIVE_GEOMETRY_EX 
// => ulNumberOfSectors 

// now I try to write some sectors, e.g. 2 (I want to use a higher value): 
WriteFile(hDevice, abBuffer, 2*512, &byteswritten, NULL); 

WriteFileへの呼び出しがERROR_ACCESS_DENIEDで失敗します。

1つのセクタを書き込むと動作します。

最初のセクタを上書きしてデバイスを接続しなおすと、Windowsはフォーマットします。この状況では、2048セクターのコードはすぐにERROR_ACCESS_DENIEDなしで動作します。

また、CodeProject: WriteFile on Physical Drives with Windows 7に記載されているように音量をアンマウントしましたが、これは何も変わりませんでした。明らかに、ボリュームはWindowsエクスプローラで表示されなくなっているため、アンマウントされています。

パフォーマンスの理由から、1つ以上のセクタを書きたいと思っています。私はまた、問題を完全に理解していないため、この分野の他の問題が発生する可能性があることを恐れています。

提案がありますか?

+0

あなたは管理者として実行していますか? –

+0

@David:はい、私は上昇しています。 –

答えて

3

私は別のWriteFile()サイズの問題を持っていなかったが、私は)

のWriteFileを(解決しました:アクセスが\」 に<ERROR_ACCESS_DENIED/5>を拒否され、通常は\ PhysicalDriveXを

デバイス(。以下のように管理者(昇格された権利)として実行されているWindows 7のUSB HDD/SSD(USB HDD/SSD)を使用してください:

コンピュータ管理 - >ディスク管理:

  • ボリューム(H:あなたの場合) - >右クリック - > [ボリューム(あなたのケースでは、ディスク2)
  • ディスクの削除 - >右クリック - >オフライン
  • ディスク(ディスク2あなたの場合) - >右クリック - >オンライン

その後、問題なく「\。\ physicaldriveX」に書き込むことができます。

一貫性の問題を避けるためにデバイス上にファイルシステムがある限り、Win7は(以前のWindowsリリースとは異なり)物理デバイスをロックすると思います。

+0

私はこれを見て、ありがとう。 –

1

もう一つの方法は、ディスク上のすべてのパーティションを削除するためにcleanを使用することです:

C:\> diskpart 
Diskpart> list disk 

Diskpart> select disk N (where N is your disk number) 

Diskpart> clean 

Diskpart> exit 
+1

投稿の前に、これが何をしているのかに関する警告を付ける必要があります。これを行う経験の浅いユーザーは、このコマンドの完全な影響を知らなくても、ドライブからデータを簡単に消去することができます。 – ScottN

2

あなたが直接マウントされたファイルシステムによって所有されているドライブのセクタをアクセスすることはできません。

  1. オープンボリュ​​ーム:

    は、ファイルシステムを上書きするために、以下の手順を説明しFSCTL_DISMOUNT_VOLUMEためChanges to the file system and to the storage stack to restrict direct disk access and direct volume access

    マニュアルを参照してください。

  2. ボリュームをロックします。
  3. ボリュームをフォーマットします。
  4. ボリュームをマウント解除します。
  5. ボリュームをロック解除します。
  6. ボリュームハンドルを閉じます。

パターン書込み操作は、書式設定ではなく手順3で行います。

関連する問題