CmGetDeviceSiblings

NTSTATUS __stdcall CmGetDeviceSiblings(
        HPNPCTX *hPnpCtx,
        WCHAR *DeviceInstanceId,
        WCHAR *SiblingInstanceIdList,
        UINT64 *SiblingInstanceIdListLen){
  WCHAR *v5; 
  unsigned int v8; 
  int DeviceParent; 
  VOID **v10; 
  WCHAR *i; 
  VOID **PoolWithTag; 
  unsigned int Len; 
  UINT64 ParentDeviceInstanceIdLength[2]; 
  WCHAR ParentDeviceInstanceId[200]; 

  v5 = SiblingInstanceIdList;
  if( !SiblingInstanceIdList )
    goto LABEL_4;
  if( !*(_DWORD *)SiblingInstanceIdListLen )
  {
    v5 = 0i64;
LABEL_4:
    v8 = 0;
    goto LABEL_6;
  }
  *SiblingInstanceIdList = 0;
  v8 = *(_DWORD *)SiblingInstanceIdListLen;
LABEL_6:
  *(_DWORD *)SiblingInstanceIdListLen = 0;
  LODWORD(ParentDeviceInstanceIdLength[0]) = 200;
  DeviceParent = CmGetDeviceParent(hPnpCtx, DeviceInstanceId, ParentDeviceInstanceId, ParentDeviceInstanceIdLength);
  if( DeviceParent >= 0 )
  {
    v10 = 0i64;
    LODWORD(ParentDeviceInstanceIdLength[0]) = 0;
    for( i = 0i64; ; i = (WCHAR *)PoolWithTag )
    {
      DeviceParent = CmGetDeviceChildren(hPnpCtx, ParentDeviceInstanceId, i, ParentDeviceInstanceIdLength);
      if( !DeviceParent || DeviceParent != -1073741789 )
        break;
      if( v10 )
        ExFreePoolWithTag(v10, 0);
      PoolWithTag = ExAllocatePoolWithTag(1ui64, 2i64 * LODWORD(ParentDeviceInstanceIdLength[0]), 1380994640i64);
      v10 = PoolWithTag;
      if( !PoolWithTag )
      {
        DeviceParent = -1073741801;
        break;
      }
    }
    if( DeviceParent >= 0 )
    {
      if( !v10 )
        return -1073741275;
      if( PnpMultiSzDeleteString((UINT8 *)v10, DeviceInstanceId) )
      {
        Len = PnpMultiSzGetLen((const WCHAR *)v10);
        if( Len > 1 )
        {
          *(_DWORD *)SiblingInstanceIdListLen = Len;
          if( v8 >= Len )
            memmove(v5, v10, 2 * Len);
          else
            DeviceParent = -1073741789;
        }
        else
        {
          DeviceParent = -1073741275;
        }
      }
      else
      {
        DeviceParent = -1073741595;
      }
    }
    if( v10 )
      ExFreePoolWithTag(v10, 0);
  }
  return DeviceParent;
}

Referenced by:

CmGetDeviceMappedPropertyFromComposite