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