問題的提出是對于 windows 下沒有分配盤符的磁盤磁區,比如 ESP 區。 想讀出其資訊,比如 檔案格式(FAT32?),大小,卷標等等。
目前我可以通過 FindFirstVolume, FindNextVolume 回圈獲取所有的磁區的資訊(包含沒有分配盤符的磁區,但是沒有 ESP區)。并且用 QueryDosDevice 獲取成為 \Device\HarddiskVolume1 字樣的資料。
但是,問題來了。怎么樣進一步?
通過 GetVolumePathNamesForVolumeName 我可以轉化 \Device\HarddiskVolume1 成盤符,但是只能獲取有盤符的。
本來GetVolumeInformation 可以獲取我想要的 檔案格 和 卷標,但是 GetVolumeInformation 的第一個引數是 “C:\” 字樣的Path.
請大家幫忙開拓思路。 40分送上。
PS: VC6 + Win10 ,好痛苦,很多高級功能都用不上。。。。。。
uj5u.com熱心網友回復:
現在匯報新問題:因為是 GPT 格式硬碟,隱藏的磁區比較多。 于是我搞錯了一個問題: FindFirstVolume, FindNextVolume 回圈 的確找到了沒有分配盤符的區,但是哪個是OEM磁區,而非 ESP區(啟動區)。
也就是說: FindFirstVolume, FindNextVolume列舉根本就沒有能夠正常獲取到 ESP區 。 請教一下:還有其他API可以獲取嗎? 管理員權限我也試了,應該不是權限問題。。。
關于GetVolumeInformation ,我倒是解決了,發現 GetVolumeInformation 的第一個引數可以是 GUID方式的VolumeName。 大汗!。
uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
你說的問題我都沒聽說過,只能過來圍觀了。uj5u.com熱心網友回復:
圍觀也是參與,感謝圍觀。
uj5u.com熱心網友回復:
我的代碼: 來自微軟的概念代碼改造, 只看 TRACE 宏輸出足以。
BOOL CMyDriveListBox::initVolumes()
{
HANDLE FindHandle = INVALID_HANDLE_VALUE;
DWORD Error = ERROR_SUCCESS;
DWORD CharCount = 0;
BOOL Success = true;
ES_VOLUME_INFO VolumeInfo;
CString VolumeName =_T("");
FindHandle = FindFirstVolume((LPTSTR)VolumeName.GetBuffer(MAX_PATH), MAX_PATH);
if (FindHandle == INVALID_HANDLE_VALUE)
{
TRACE1("FindFirstVolume failed with error code %d\n", GetLastError());
return false ;
}
while ( Success )
{
this->ClearVolumeInfo(&VolumeInfo);
TRACE1("VolumeName=%s\n", VolumeName); /* \\?\Volume{4b82a9cd-f62c-4e78-8117-0682014b76b1}\ */
VolumeName.Format(_T("%s"), VolumeName);
int lvo = VolumeName.GetLength();
// TRACE1("path.Right(1): %s\n", VolumeName.Right(1));
if (
(VolumeName.Mid(0,4)).Compare(_T("\\\\?\\")) !=0
|| (VolumeName.Right(1)).Compare(_T("\\")) !=0
)
{
TRACE1("FindFirstVolume/FindNextVolume returned a bad path: %s\n", VolumeName);
//return false ;
break;
}
CString DeviceName =_T("");
CString strNewVolumeName =_T("");
strNewVolumeName = VolumeName.Mid(4,lvo-5);
TRACE1("strNewVolumeName: %s\n", strNewVolumeName);
CharCount =
QueryDosDevice( strNewVolumeName, (LPTSTR) DeviceName.GetBuffer(MAX_PATH), MAX_PATH);
if ( CharCount == 0 )
{
TRACE1("QueryDosDeviceW failed with error code %d\n", GetLastError());
//return false ;
break;
}
TRACE1("\n---Found a device: %s \n", DeviceName);
TRACE1("---Volume name: %s \n", VolumeName);
VolumeInfo.VolumeName = VolumeName; //{GUID}
VolumeInfo.DosDeviceName= DeviceName;
//
DWORD dwReturn = 0 ;
CString strPath= _T("");
BOOL bOK = GetVolumePathNamesForVolumeName(VolumeName, (LPTSTR)strPath.GetBuffer(MAX_PATH), MAX_PATH, &dwReturn);
if (bOK)
{
strPath.Format(_T("%s"), strPath);
TRACE1("---Volume Path: %s \n", strPath);
(VolumeInfo.Path).Format(_T("%s"),strPath);
}
TRACE0("---\n");
m_volue_infos.Add(VolumeInfo);
//
// Move on to the next volume.
Success = FindNextVolume(FindHandle, (LPTSTR)VolumeName.GetBuffer(MAX_PATH), MAX_PATH);
if ( !Success )
{
Error = GetLastError();
if (Error != ERROR_NO_MORE_FILES)
{
TRACE1("FindNextVolumeW failed with error code %d\n", Error);
break;
}
else
{
Error = ERROR_SUCCESS; //是沒有下一個了 //ERROR_NO_MORE_FILES
TRACE1("NO MORE FILES! END ! Error code : %d\n\n", ERROR_NO_MORE_FILES);
break;
}
}
TRACE1("\n---Next----: %s\n", VolumeName);
}
FindVolumeClose(FindHandle);
FindHandle = INVALID_HANDLE_VALUE;
return true;
}
其中結構體定義
typedef struct _STRUCT_VOLUME_INFO
{
CString VolumeName ; /* \\?\Volume{77aaa0d9-1b5d-11e6-9bc7-0015830cbfeb}\ */
CString DosDeviceName ; // \Device\HarddiskVolume8
CString Path ; // c:\ D:\
CString lable ; // 可能存在的卷標。
CString FileType ; // NTFS ? FAT32? 。
} ES_VOLUME_INFO;
。。。。
CArray < ES_VOLUME_INFO, ES_VOLUME_INFO> m_volue_infos ;
uj5u.com熱心網友回復:
TRACE 輸出VolumeName=\\?\Volume{4b82a9cd-f62c-4e78-8117-0682014b76b1}\
strNewVolumeName: Volume{4b82a9cd-f62c-4e78-8117-0682014b76b1}
---Found a device: \Device\HarddiskVolume4
---Volume name: \\?\Volume{4b82a9cd-f62c-4e78-8117-0682014b76b1}\
---Volume Path: C:\
---
---Next----: \\?\Volume{e6a20ef8-8568-44c8-9884-85529888078c}\
VolumeName=\\?\Volume{e6a20ef8-8568-44c8-9884-85529888078c}\
strNewVolumeName: Volume{e6a20ef8-8568-44c8-9884-85529888078c}
---Found a device: \Device\HarddiskVolume5
---Volume name: \\?\Volume{e6a20ef8-8568-44c8-9884-85529888078c}\
---Volume Path: D:\
---
---Next----: \\?\Volume{9c891708-4505-4306-997b-9187a0eefeca}\
VolumeName=\\?\Volume{9c891708-4505-4306-997b-9187a0eefeca}\
strNewVolumeName: Volume{9c891708-4505-4306-997b-9187a0eefeca}
---Found a device: \Device\HarddiskVolume6
---Volume name: \\?\Volume{9c891708-4505-4306-997b-9187a0eefeca}\
---Volume Path: E:\
---
---Next----: \\?\Volume{06425352-b0da-4862-b565-f09c46b4496d}\
VolumeName=\\?\Volume{06425352-b0da-4862-b565-f09c46b4496d}\
strNewVolumeName: Volume{06425352-b0da-4862-b565-f09c46b4496d}
---Found a device: \Device\HarddiskVolume1
---Volume name: \\?\Volume{06425352-b0da-4862-b565-f09c46b4496d}\
---Volume Path:
---
---Next----: \\?\Volume{31bf2ce1-8982-4652-96bc-a641d0f78dfd}\
VolumeName=\\?\Volume{31bf2ce1-8982-4652-96bc-a641d0f78dfd}\
strNewVolumeName: Volume{31bf2ce1-8982-4652-96bc-a641d0f78dfd}
---Found a device: \Device\HarddiskVolume7
---Volume name: \\?\Volume{31bf2ce1-8982-4652-96bc-a641d0f78dfd}\
---Volume Path:
---
NO MORE FILES! END ! Error code : 18缺少 \Device\HarddiskVolume2 -》 EPS 磁區
缺少 \Device\HarddiskVolume3-》 MSR 磁區
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/136553.html
標籤:硬件/系統
