我以为我有这个工作,但显然不是。我发现,使用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();
}
这与我在网上找到的一些代码类似。它是打印&#34; GUID是{5FC6F114-D10D-11E4-8278-E8B1FC697FA2}&#34;这似乎是不正确的。
有什么想法吗?
答案 0 :(得分:2)
在你的情况下,FSCTL_CREATE_OR_GET_OBJECT_ID
返回C:mountpoint的根目录的对象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);
}
}
}