8

Windows API を使用して、接続された仮想ハー​​ド ディスクを初期化し、パーティション分割しようとしています。私はDeviceIoControl()を使用してこれを行うことに成功しましたが、目的のドライブ レイアウトを適用するたびに、Windows は自動的にドライブ文字をパーティションに割り当て、煩わしい「フォーマットしますか?」というポップアップを表示します。ダイアログ。

私の意図は、プログラムの後半でこのパーティションのフォーマットとマウントを処理することですが、この動作を停止する方法がわかりません。RecognizedPartitionFALSE に設定してみましたが、これは効果がないようです。

関連コード:

Layout.PartitionStyle = PARTITION_STYLE_MBR;
Layout.PartitionCount = 4;
Layout.Mbr.Signature = MY_DISK_MBR_SIGNATURE;
Layout.PartitionEntry[0].PartitionStyle = PARTITION_STYLE_MBR;
Layout.PartitionEntry[0].PartitionNumber = 1;
Layout.PartitionEntry[0].StartingOffset.QuadPart = MY_DISK_OFFSET;
Layout.PartitionEntry[0].PartitionLength.QuadPart =
   (Geom.DiskSize.QuadPart - MY_DISK_OFFSET);
Layout.PartitionEntry[0].Mbr.PartitionType = PARTITION_IFS;
Layout.PartitionEntry[0].Mbr.BootIndicator = FALSE;
Layout.PartitionEntry[0].Mbr.RecognizedPartition = FALSE;
Layout.PartitionEntry[0].Mbr.HiddenSectors =
   (MY_DISK_OFFSET / Geom.Geometry.BytesPerSector);

for (int i = 0; i < 4; i++)
{
    Layout.PartitionEntry[i].RewritePartition = TRUE;
}

if (!DeviceIoControl(hDisk, IOCTL_DISK_SET_DRIVE_LAYOUT_EX,
                     Layout, dwLayoutSz, NULL, 0, &dwReturn, NULL))
{
    // Handle error
}
DeviceIoControl(hDisk, IOCTL_DISK_UPDATE_PROPERTIES,
                NULL, 0, NULL, 0, &dwReturn, NULL);

ドライブ文字の自動割り当てを防ぐにはどうすればよいですか?

4

4 に答える 4

2

この問題を回避する唯一の確実な方法は、ボリュームの作成とフォーマット中に「シェル ハードウェア検出」サービスを停止することでした。ただし、このアプローチは非常にばかげているため、コードに入れることを拒否しました。

別の「ハック」オプションは、サービスを起動しCreateProcess()CREATE_NO_WINDOWフラグを使用して非表示のウィンドウにサービス自体 (または「ワーカー」実行可能ファイル) をすぐに生成することです。

このソフトウェアはシステム サービスとして実行され、システムの存続期間中に 1 回か 2 回しか発生しないコードを複雑にしたくないので、対話型サービス検出ウィンドウが時折表示されることを受け入れる必要がありました。パーティションの作成中にしばらくポップアップします。

プログラムでドライブを作成およびフォーマットしているときに、フォーマット プロンプトを回避するための良い方法を誰かが発見した場合は、受け入れられた回答を喜んで変更します (そしてビールを借ります)。

于 2012-08-08T14:42:50.663 に答える
0

この API を使用してからしばらく経ちましたが、記憶からでは使用できません。しかし、事後にドライブ文字の割り当てを削除することを止めるものではありません。

フォーマットプロンプトが停止するかどうかはわかりませんが、これを行ったときは常に、ディスクレイアウトの更新を行う前にパーティションが正しくフォーマットされています。

于 2012-05-04T23:37:48.607 に答える