[DllImport("CfgMgr32.dll", CharSet = CharSet.Unicode)]
static extern uint CM_Get_Device_Interface_List(ref Guid interfaceClassGuid, string deviceID, char[] buffer, uint bufferLength, uint flags);
Cannot use StringBuilder for buffer, since the buffer may contain several null terminated strings.
static string[] GetDeviceInterfaces(Guid guid) {
uint size;
var result = CM_Get_Device_Interface_List_Size(out size, ref guid, null, 0);
if (result != 0) throw new Exception("Unable to retrieve device interface list size: " + result);
var buffer = new char[(int)size];
result = CM_Get_Device_Interface_List(ref guid, null, buffer, size, 0);
if (result != 0) throw new Exception("Unable to retrieve device interface list size: " + result);
return new string(buffer).Split(new char[] { '\0' }, StringSplitOptions.RemoveEmptyEntries);
}