私は使用しています:
DWORD d = GetLogicalDrives();
for (int i = 0; i < 26; i++)
{
if ((1 << i) & d) // drive letter 'A' + i present on computer
{
wstring s = std::wstring(L"\\\\.\\") + wchar_t('A' + i) + L":";
PARTITION_INFORMATION diskInfo;
DWORD dwResult;
HANDLE dev = CreateFile(LPWSTR(s.c_str()), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL);
DeviceIoControl(dev, IOCTL_DISK_GET_PARTITION_INFO, NULL, 0, &diskInfo, sizeof(diskInfo), &dwResult, NULL);
CloseHandle(dev);
if (diskInfo.PartitionType == PARTITION_IFS)
{
...
}
}
}
コンピューターのすべての NTFS パーティションを列挙します。
Windows 7、試用した Windows 8.1、および Windows 10 コンピューターで動作します。
しかし、別の Windows 10 コンピューターでは失敗します。このコンピューターでは、ボリュームC:
の値が( )ではなく にdiskInfo.PartitionType
等しくなります。0x00
0x07
PARTITION_IFS
この値は次のとおりです (こちらのドキュメントを参照してください):
PARTITION_ENTRY_UNUSED : 0x00 : 未使用のエントリ パーティション。
パーティションが実際には NTFS であることを確認できるため、これは奇妙です。
質問:
IOCTL_DISK_GET_PARTITION_INFO
パーティションの種類を取得するのに 100% 信頼できないことはよく知られていますか?すべての NTFS ボリュームを列挙するより信頼性の高い方法は何ですか?
注:IOCTL_DISK_GET_PARTITION_INFO_EX
代わりにの使用も調べましIOCTL_DISK_GET_PARTITION_INFO
たが、構造PARTITION_INFORMATION_EX
は に関する情報を提供していないようですがPartitionType
、構造は へのPARTITION_INFORMATION
アクセスを提供しPartitionType
ます。