从驱动器号获取NTFS卷GUID

时间:2015-03-27 22:53:39

标签: c++ c visual-c++ visual-studio-2013 ntfs

我以为我有这个工作,但显然不是。我发现,使用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;这似乎是不正确的。

有什么想法吗?

1 个答案:

答案 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);
     }
   }
 }