April 03

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

}