2015-03-27 2 views
1

Je pensais que cela fonctionnait, mais apparemment pas. J'ai découvert que, en utilisant la commande mountvol.exe, le point de montage pour mon lecteur C: \ est:Obtenir le GUID de volume NTFS à partir de la lettre de lecteur

\\?\Volume{f993747a-5d7a-4de1-a97a-c20c1af1ba02}\ 

Cet ID de volume est en contradiction avec la sortie de ce code me donne:

#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(); 
} 

qui est similaire à un code que j'ai trouvé en ligne. Il imprime "GUID is {5FC6F114-D10D-11E4-8278-E8B1FC697FA2}" qui semble être incorrect.

Des idées?

+0

Vérifier les valeurs de retour de '' CreateFile' et DeviceIOControl'. Le GUID que vous imprimez peut simplement être de la mémoire non initialisée. –

Répondre

2

Dans votre cas, FSCTL_CREATE_OR_GET_OBJECT_ID renvoie l'ID d'objet du répertoire racine du point de montage C: ce qui n'est pas ce que vous semblez être après.

La méthode correcte pour obtenir le chemin GUID d'un volume est la fonction GetVolumeNameForVolumeMountPoint().

code d'échantillon à partir de MSDN qui imprime des chemins de GUID du volume pour le lecteur C-z:

#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); 
    } 
    } 
}