www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - Any one knows how can I obtain the GUID of a USB?

import std.stdio;
import core.sys.windows.windows;

extern (Windows)
{
     HANDLE SetupDiGetClassDevsW(LPCWSTR, LPCWSTR, HANDLE, DWORD);
     BOOL SetupDiEnumDeviceInfo(HANDLE, DWORD, SP_DEVINFO_DATA*);
     BOOL SetupDiGetDeviceRegistryPropertyW(HANDLE, 
SP_DEVINFO_DATA*, DWORD, PDWORD, PBYTE, DWORD, PDWORD);
     BOOL SetupDiDestroyDeviceInfoList(HANDLE);

     struct SP_DEVINFO_DATA
     {
         DWORD cbSize;
         DWORD_PTR DevInst;
         HANDLE hDevInfo;
         void* Reserved;
     }

     const DWORD DIGCF_PRESENT = 0x00000002;
     const DWORD DIGCF_DEVICEINTERFACE = 0x00000010;
     const DWORD SPDRP_DEVICEGUID = 0x00000010;
}

void main()
{
     // Obtener una lista de dispositivos USB
     auto deviceInfoSet = SetupDiGetClassDevsW(null, "USB", null, 
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);

     if (deviceInfoSet == INVALID_HANDLE_VALUE)
     {
         writeln("Error al obtener la lista de dispositivos USB.");
         return;
     }

     // Estructura de datos para almacenar la información del 
dispositivo
     SP_DEVINFO_DATA deviceInfoData;
     deviceInfoData.cbSize = SP_DEVINFO_DATA.sizeof;

     // Iterar sobre los dispositivos USB y obtener el GUID
     for (DWORD index = 0; SetupDiEnumDeviceInfo(deviceInfoSet, 
index, &deviceInfoData); ++index)
     {
         // Obtener el GUID del dispositivo
         wchar[] guidBuffer = new wchar[256]; // Espacio 
suficiente para almacenar el GUID
         DWORD dataSize;
         if (SetupDiGetDeviceRegistryPropertyW(deviceInfoSet, 
&deviceInfoData, SPDRP_DEVICEGUID, null, 
cast(LPBYTE)guidBuffer.ptr, guidBuffer.length * 2, &dataSize))
         {
             // Convertir el tamaño de los datos a uint
             uint dataSizeUint = cast(uint) dataSize;
             writeln("GUID del dispositivo USB: ", 
guidBuffer[0..(dataSizeUint / 2)]); // Dividir por 2 porque 
dataSize está en bytes y guidBuffer es un array de wchar
         }
     }

     // Liberar la lista de dispositivos
     SetupDiDestroyDeviceInfoList(deviceInfoSet);
}
Apr 03