从盘符获取 NTFS 卷 GUID
Getting NTFS volume GUID from drive letter
我以为我有这个工作,但显然没有。我发现,使用 mountvol.exe 命令,我的 C:\ 驱动器的挂载点是:
\?\Volume{f993747a-5d7a-4de1-a97a-c20c1af1ba02}\
此卷 ID 与此代码给我的输出相矛盾:
#include "stdafx.h"
#include <stdio.h>
#include <tchar.h>
#include <ole2.h>
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE h = CreateFile(L"C:", 0,
FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
FILE_OBJECTID_BUFFER buf;
DWORD cbOut;
DeviceIoControl(h, FSCTL_CREATE_OR_GET_OBJECT_ID, NULL, 0, &buf, sizeof(buf), &cbOut, NULL);
GUID guid;
CopyMemory(&guid, &buf.ObjectId, sizeof(GUID));
WCHAR szGuid[39];
StringFromGUID2(guid, szGuid, 39);
_tprintf(_T("GUID is %ws\n"), szGuid);
CloseHandle(h);
getchar();
}
这类似于我在网上找到的一些代码。它正在打印 "GUID is {5FC6F114-D10D-11E4-8278-E8B1FC697FA2}",这似乎不正确。
有什么想法吗?
在你的例子中,FSCTL_CREATE_OR_GET_OBJECT_ID
returns C: 安装点根目录的对象 ID,这不是你想要的。
获取卷的 GUID 路径的正确方法是通过 GetVolumeNameForVolumeMountPoint() 函数。
来自 MSDN 的示例代码打印驱动器 c-z 的卷 GUID 路径:
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#define BUFSIZE MAX_PATH
void main(void)
{
BOOL bFlag;
TCHAR Buf[BUFSIZE]; // temporary buffer for volume name
TCHAR Drive[] = TEXT("c:\"); // template drive specifier
TCHAR I; // generic loop counter
// Walk through legal drive letters, skipping floppies.
for (I = TEXT('c'); I < TEXT('z'); I++ )
{
// Stamp the drive for the appropriate letter.
Drive[0] = I;
bFlag = GetVolumeNameForVolumeMountPoint(
Drive, // input volume mount point or directory
Buf, // output volume name buffer
BUFSIZE ); // size of volume name buffer
if (bFlag)
{
_tprintf (TEXT("The ID of drive \"%s\" is \"%s\"\n"), Drive, Buf);
}
}
}
我以为我有这个工作,但显然没有。我发现,使用 mountvol.exe 命令,我的 C:\ 驱动器的挂载点是:
\?\Volume{f993747a-5d7a-4de1-a97a-c20c1af1ba02}\
此卷 ID 与此代码给我的输出相矛盾:
#include "stdafx.h"
#include <stdio.h>
#include <tchar.h>
#include <ole2.h>
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE h = CreateFile(L"C:", 0,
FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
FILE_OBJECTID_BUFFER buf;
DWORD cbOut;
DeviceIoControl(h, FSCTL_CREATE_OR_GET_OBJECT_ID, NULL, 0, &buf, sizeof(buf), &cbOut, NULL);
GUID guid;
CopyMemory(&guid, &buf.ObjectId, sizeof(GUID));
WCHAR szGuid[39];
StringFromGUID2(guid, szGuid, 39);
_tprintf(_T("GUID is %ws\n"), szGuid);
CloseHandle(h);
getchar();
}
这类似于我在网上找到的一些代码。它正在打印 "GUID is {5FC6F114-D10D-11E4-8278-E8B1FC697FA2}",这似乎不正确。
有什么想法吗?
在你的例子中,FSCTL_CREATE_OR_GET_OBJECT_ID
returns C: 安装点根目录的对象 ID,这不是你想要的。
获取卷的 GUID 路径的正确方法是通过 GetVolumeNameForVolumeMountPoint() 函数。
来自 MSDN 的示例代码打印驱动器 c-z 的卷 GUID 路径:
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#define BUFSIZE MAX_PATH
void main(void)
{
BOOL bFlag;
TCHAR Buf[BUFSIZE]; // temporary buffer for volume name
TCHAR Drive[] = TEXT("c:\"); // template drive specifier
TCHAR I; // generic loop counter
// Walk through legal drive letters, skipping floppies.
for (I = TEXT('c'); I < TEXT('z'); I++ )
{
// Stamp the drive for the appropriate letter.
Drive[0] = I;
bFlag = GetVolumeNameForVolumeMountPoint(
Drive, // input volume mount point or directory
Buf, // output volume name buffer
BUFSIZE ); // size of volume name buffer
if (bFlag)
{
_tprintf (TEXT("The ID of drive \"%s\" is \"%s\"\n"), Drive, Buf);
}
}
}