PnpBuildCmResourceList

VOID __stdcall PnpBuildCmResourceList(){
  int v0; 
  __int64 v1; 
  __int64 v2; 
  _DWORD *v3; 
  __int64 v4; 
  int v5; 
  __int64 *v6; 
  __int64 v7; 
  unsigned int v8; 
  __int64 *v9; 
  __int64 v10; 
  __int64 v11; 
  CM_RESOURCE_LIST *PoolWithTag; 
  CM_RESOURCE_LIST *v13; 
  _DWORD *v14; 
  _DWORD *v15; 
  __int64 v16; 
  _DWORD *v17; 
  int v18; 
  char *v19; 
  __int64 v20; 
  __int64 v21; 
  __int64 v22; 
  __int64 v23; 
  __int64 v24; 
  _DEVICE_NODE *v25; 
  _DWORD *v26; 
  int v27; 
  UINT8 *v28; 
  int v29; 
  __int16 v30; 
  VOID *v31; 
  int v32; 
  HANDLE v33; 
  wchar_t *Buffer; 
  int v35; 
  __int64 v36; 
  int v37; 
  int v38; 
  _CM_PARTIAL_RESOURCE_DESCRIPTOR *Source; 
  _CM_PARTIAL_RESOURCE_DESCRIPTOR **Target; 
  _CM_PARTIAL_RESOURCE_DESCRIPTOR **Targeta; 
  int v42; 
  UINT64 ReturnLength; 
  _QWORD Destination[3]; 
  UINT64 ResourceListSize; 
  UNICODE_STRING ClassName; 
  UNICODE_STRING DriverName; 
  PVOID P; 
  HANDLE Handle; 
  OBJECT_NAME_INFORMATION ObjectNameInfo; 
  char v51; 
  v2 = *(_QWORD *)(v1 + 32);
  v3 = 0i64;
  v4 = v1;
  *(_QWORD *)&DriverName.Length = v1;
  LODWORD(ReturnLength) = v0;
  v5 = 0;
  Handle = 0i64;
  v6 = *(__int64 **)(v2 + 16);
  P = 0i64;
  v7 = *v6;
  Destination[0] = v7;
  v8 = *(_DWORD *)(v7 + 20);
  if( !v8 )
    goto LABEL_42;
  v9 = (__int64 *)(v7 + 24);
  v10 = v8;
  do
  {
    v11 = *v9++;
    v5 += *(_DWORD *)(v11 + 276) + 1;
    --v10;
  }
  while( v10 );
  if( !v5 )
  {
LABEL_42:
    *(_DWORD *)(v4 + 56) = -1073741595;
    goto LABEL_43;
  }
  LODWORD(ResourceListSize) = 20 * (v5 + 1);
  PoolWithTag = (CM_RESOURCE_LIST *)ExAllocatePoolWithTag(PagedPool, (unsigned int)ResourceListSize, 0x20207050ui64);
  Destination[1] = PoolWithTag;
  v13 = PoolWithTag;
  if( !PoolWithTag )
  {
LABEL_37:
    *(_DWORD *)(v4 + 56) = -1073741670;
LABEL_43:
    *(_QWORD *)(v4 + 48) = 0i64;
    goto LABEL_21;
  }
  memset((INT64)PoolWithTag, 0i64);
  v14 = ExAllocatePoolWithTag(PagedPool, (unsigned int)(20 * (v5 + 1)), 0x20207050ui64);
  v15 = v14;
  if( !v14 )
  {
    ExFreePoolWithTag(v13, 0);
    goto LABEL_37;
  }
  memset((INT64)v14, 0i64);
  v16 = Destination[0];
  v17 = (_DWORD *)((char *)v13 + 20);
  *(_DWORD *)v13 = 1;
  *((_DWORD *)v13 + 1) = *(_DWORD *)v2;
  *((_DWORD *)v13 + 2) = *(_DWORD *)(v2 + 4);
  *((_DWORD *)v13 + 3) = 65537;
  *((_DWORD *)v13 + 4) = v5;
  *v15 = 1;
  v15[1] = *(_DWORD *)v2;
  v18 = *(_DWORD *)(v2 + 4);
  v19 = (char *)(v15 + 5);
  v15[2] = v18;
  v20 = 0i64;
  v15[3] = 65537;
  v15[4] = v5;
  HIDWORD(ReturnLength) = 0;
  if( !*(_DWORD *)(v16 + 20) )
  {
LABEL_19:
    if( (_DWORD)ReturnLength )
    {
      v31 = *(VOID **)v4;
      LODWORD(Source) = 1;
      if( IopCreateRegistryKeyEx(
             &Handle,
             0i64,
             &CmRegistryMachineHardwareResourceMapName,
             0x2001Fui64,
             (UINT64)Source,
             0i64) >= 0 )
      {
        LODWORD(ReturnLength) = 0;
        ClassName.Buffer = L"PnP Manager";
        *(_QWORD *)&ClassName.Length = 1572886i64;
        DriverName.Buffer = L"PnpManager";
        *(_QWORD *)&DriverName.Length = 1441812i64;
        *(_OWORD *)&Destination[1] = 0i64;
        v32 = ObQueryNameStringMode(v31, &ObjectNameInfo, 0x200ui64, &ReturnLength, 0);
        v33 = Handle;
        if( v32 >= 0 )
        {
          ObjectNameInfo.Name.MaximumLength = 496;
          Buffer = (wchar_t *)&v51;
          if( ObjectNameInfo.Name.Length )
            Buffer = ObjectNameInfo.Name.Buffer;
          ObjectNameInfo.Name.Buffer = Buffer;
          *(OBJECT_NAME_INFORMATION *)&Destination[1] = ObjectNameInfo;
          RtlAppendUnicodeToString((UNICODE_STRING *)&Destination[1], (PWCHAR)L".Raw");
          v35 = ResourceListSize;
          LODWORD(Target) = ResourceListSize;
          if( IopWriteResourceList(
                 v33,
                 &ClassName,
                 &DriverName,
                 (UNICODE_STRING *)&Destination[1],
                 (CM_RESOURCE_LIST *)v15,
                 (UINT64)Target) >= 0 )
          {
            *(OBJECT_NAME_INFORMATION *)&Destination[1] = ObjectNameInfo;
            RtlAppendUnicodeToString((UNICODE_STRING *)&Destination[1], (PWCHAR)L".Translated");
            LODWORD(Targeta) = v35;
            IopWriteResourceList(v33, &ClassName, &DriverName, (UNICODE_STRING *)&Destination[1], v13, (UINT64)Targeta);
          }
        }
        ZwClose(v33);
      }
    }
    *(_QWORD *)(v4 + 48) = v13;
    v3 = v15;
    goto LABEL_21;
  }
  while( 1 )
  {
    v21 = *(_QWORD *)(v16 + 8 * v20 + 24);
    if( !*(_BYTE *)(v21 + 8) )
    {
      *(_OWORD *)v19 = *(_OWORD *)(v21 + 136);
      *((_DWORD *)v19 + 4) = *(_DWORD *)(v21 + 152);
      *(_OWORD *)v17 = *(_OWORD *)(v21 + 136);
      v37 = *(_DWORD *)(v21 + 152);
      goto LABEL_33;
    }
    v22 = *(_QWORD *)(v21 + 32);
    *(_QWORD *)&ClassName.Length = v22;
    if( *(_DWORD *)(v22 + 128) == 2 )
    {
      v23 = *(_QWORD *)(v22 + 112);
    }
    else
    {
      v42 = IopParentToRawTranslation(v22);
      if( v42 < 0 )
        break;
      v23 = *(_QWORD *)(v21 + 112);
      v22 = *(_QWORD *)&ClassName.Length;
    }
    *(_OWORD *)v19 = *(_OWORD *)v23;
    *((_DWORD *)v19 + 4) = *(_DWORD *)(v23 + 16);
    if( *(_DWORD *)(v22 + 128) == 2 )
    {
      v36 = *(_QWORD *)(v22 + 112);
      v16 = Destination[0];
      *(_OWORD *)v17 = *(_OWORD *)v36;
      v37 = *(_DWORD *)(v36 + 16);
LABEL_33:
      v17[4] = v37;
      goto LABEL_17;
    }
    v24 = *(_QWORD *)(v21 + 72);
    v25 = v24 ? *(_DEVICE_NODE **)(*(_QWORD *)(v24 + 312) + 40i64) : 0i64;
    v42 = IopChildToRootTranslation(
            v25,
            (_INTERFACE_TYPE)*(_DWORD *)v21,
            *(unsigned int *)(v21 + 4),
            (_ARBITER_REQUEST_SOURCE)*(_DWORD *)(v21 + 80),
            (_CM_PARTIAL_RESOURCE_DESCRIPTOR *)(v21 + 136),
            (_CM_PARTIAL_RESOURCE_DESCRIPTOR **)&P);
    if( v42 < 0 )
      break;
    v26 = P;
    *(_OWORD *)v17 = *(_OWORD *)P;
    v17[4] = v26[4];
    ExFreePoolWithTag(v26, 0);
    v16 = Destination[0];
LABEL_17:
    v27 = *(_DWORD *)(v21 + 276);
    v19 += 20;
    v17 += 5;
    if( v27 )
    {
      v28 = (UINT8 *)(*(_QWORD *)(v21 + 280) + 8i64);
      v29 = v27;
      do
      {
        *v19 = -127;
        *(_BYTE *)v17 = -127;
        v19[1] = 1;
        *((_BYTE *)v17 + 1) = 1;
        v30 = *((_WORD *)v28 - 2);
        *((_WORD *)v19 + 1) = v30;
        *((_WORD *)v17 + 1) = v30;
        memmove((UINT8 *)v19 + 4, v28, 0xCui64);
        memmove((UINT8 *)v17 + 4, v28, 0xCui64);
        v28 += 32;
        v19 += 20;
        v17 += 5;
        --v29;
      }
      while( v29 );
      v4 = *(_QWORD *)&DriverName.Length;
      v13 = (CM_RESOURCE_LIST *)Destination[1];
      v16 = Destination[0];
    }
    v20 = (unsigned int)(HIDWORD(ReturnLength) + 1);
    HIDWORD(ReturnLength) = v20;
    if( (unsigned int)v20 >= *(_DWORD *)(v16 + 20) )
      goto LABEL_19;
  }
  ExFreePoolWithTag(v13, 0);
  ExFreePoolWithTag(v15, 0);
  v38 = -1073741670;
  if( v42 == -1073741267 )
    v38 = -1073741267;
  *(_DWORD *)(v4 + 56) = v38;
LABEL_21:
  *(_QWORD *)(v4 + 40) = v3;
}

Referenced by:

IopAllocateBootResourcesInternal
PnpBuildCmResourceLists