IopInitializeResourceMap

VOID __stdcall IopInitializeResourceMap(_LOADER_PARAMETER_BLOCK *LoaderBlock){
  WCHAR v1; 
  _LOADER_PARAMETER_BLOCK *v2; 
  WCHAR v3; 
  unsigned int v4; 
  WCHAR v5; 
  unsigned int v6; 
  unsigned __int64 v7; 
  _PHYSICAL_MEMORY_DESCRIPTOR *v8; 
  unsigned int NumberOfRuns; 
  int v10; 
  unsigned __int64 *p_PageCount; 
  __int64 v12; 
  unsigned __int64 v13; 
  unsigned int v14; 
  VOID *PoolWithTag; 
  __int64 v16; 
  unsigned int v17; 
  __int64 v18; 
  UINT64 v19; 
  UINT64 v20; 
  WCHAR v21; 
  unsigned int v22; 
  unsigned __int64 v23; 
  WCHAR v24; 
  unsigned __int64 v25; 
  int v26; 
  bool v27; 
  int v28; 
  unsigned __int64 v29; 
  UINT64 CreateOptions; 
  UINT64 ResourceListSize; 
  unsigned int v32; 
  unsigned int v33; 
  HANDLE Handle; 
  _LOADER_PARAMETER_BLOCK *v35; 
  UNICODE_STRING DeviceName; 
  UNICODE_STRING DriverName; 
  __int64 v38; 
  struct _UNICODE_STRING DestinationString; 
  UINT8 IncludeType[22]; 
  __int16 v41; 
  char v42; 
  char v43; 
  __int16 v44; 
  char v45; 
  __int16 v46; 
  Handle = 0i64;
  v35 = LoaderBlock;
  v2 = LoaderBlock;
  DriverName = 0i64;
  DestinationString = 0i64;
  DeviceName = 0i64;
  RtlInitUnicodeString(&DestinationString, L"System Resources", v1);
  v4 = 0;
  v32 = 0;
  do
  {
    if( v4 )
    {
      if( v4 == 1 )
      {
        RtlInitUnicodeString(&DriverName, L"Reserved", v3);
        RtlInitUnicodeString(&DeviceName, L".Translated", v21);
        v22 = 0;
        v23 = 0i64;
        do
        {
          if( v23 >= 0x29 )
LABEL_34:
            _report_rangecheckfailure();
          IncludeType[v23] = 0;
          ++v22;
          ++v23;
        }
        while( v22 < 0x29 );
        LOBYTE(v41) = 1;
        v42 = 1;
        v8 = MmInitializeMemoryLimits(v2, IncludeType);
        if( !v8 )
          goto LABEL_26;
      }
      else
      {
        RtlInitUnicodeString(&DriverName, L"Loader Reserved", v3);
        RtlInitUnicodeString(&DeviceName, L".Raw", v5);
        v6 = 0;
        v7 = 0i64;
        do
        {
          if( v7 >= 0x29 )
            goto LABEL_34;
          IncludeType[v7] = 0;
          ++v6;
          ++v7;
        }
        while( v6 < 0x29 );
        IncludeType[3] = 1;
        v44 = 257;
        IncludeType[6] = 1;
        v45 = 1;
        v46 = 257;
        v41 = 257;
        v42 = 1;
        v43 = 1;
        v8 = MmInitializeMemoryLimits(v2, IncludeType);
        if( !v8 )
          return;
      }
    }
    else
    {
      RtlInitUnicodeString(&DriverName, L"Physical Memory", v3);
      RtlInitUnicodeString(&DeviceName, L".Translated", v24);
      v8 = (_PHYSICAL_MEMORY_DESCRIPTOR *)MmPhysicalMemoryBlock;
    }
    NumberOfRuns = v8->NumberOfRuns;
    if( !v8->NumberOfRuns )
    {
      if( v4 )
        ExFreePoolWithTag(v8, 0);
      goto LABEL_26;
    }
    v10 = 0;
    if( NumberOfRuns )
    {
      p_PageCount = &v8->Run[0].PageCount;
      v12 = NumberOfRuns;
      do
      {
        v13 = *p_PageCount << 12;
        if( v13 == (unsigned __int64)(unsigned int)(16 * *(_DWORD *)p_PageCount) << 8
          || v13 == (unsigned __int64)(unsigned int)(v13 >> 16) << 16
          || v13 == (v13 & 0xFFFFFFFF00000000ui64)
          || v13 <= 0xFFFFF000 )
        {
          ++v10;
        }
        else
        {
          v25 = (v13 - 4294963201u) / 0xFFFFF000 + 1;
          v26 = v25 + v10;
          v27 = 0xFFFFFFFF00001000ui64 * v25 + v13 == 0;
          v28 = v26 + 1;
          if( v27 )
            v28 = v26;
          v10 = v28;
        }
        p_PageCount += 2;
        --v12;
      }
      while( v12 );
    }
    v14 = 20 * (v10 + 1);
    v33 = v14;
    PoolWithTag = ExAllocatePoolWithTag(PagedPool, v14, 0x20207050ui64);
    v38 = (__int64)PoolWithTag;
    v16 = (__int64)PoolWithTag;
    if( !PoolWithTag )
    {
      if( v4 )
        ExFreePoolWithTag(v8, 0);
      return;
    }
    memset((INT64)PoolWithTag, 0i64);
    v17 = 0;
    *(_DWORD *)v16 = 1;
    *(_DWORD *)(v16 + 16) = v10;
    v18 = v16 + 20;
    if( !v8->NumberOfRuns )
      goto LABEL_21;
    do
    {
      v19 = v8->Run[v17].BasePage << 12;
      v20 = v8->Run[v17].PageCount << 12;
      if( (int)RtlCmEncodeMemIoResource((_CM_PARTIAL_RESOURCE_DESCRIPTOR *)v18, 3u, v20, v19) >= 0 )
      {
        *(_BYTE *)(v18 + 1) = 1;
LABEL_18:
        v18 += 20i64;
        goto LABEL_19;
      }
      if( v20 > 0xFFFFF000 )
      {
        v29 = (v20 - 4294963201u) / 0xFFFFF000 + 1;
        v20 += 0xFFFFFFFF00001000ui64 * v29;
        do
        {
          *(_QWORD *)(v18 + 4) = v19;
          v19 += 4294963200i64;
          *(_WORD *)v18 = 259;
          *(_DWORD *)(v18 + 12) = -4096;
          v18 += 20i64;
          --v29;
        }
        while( v29 );
      }
      if( v20 )
      {
        *(_WORD *)v18 = 259;
        *(_QWORD *)(v18 + 4) = v19;
        *(_DWORD *)(v18 + 12) = v20;
        goto LABEL_18;
      }
LABEL_19:
      ++v17;
    }
    while( v17 < v8->NumberOfRuns );
    v4 = v32;
    v16 = v38;
    v14 = v33;
LABEL_21:
    LODWORD(CreateOptions) = 1;
    if( IopCreateRegistryKeyEx(
           &Handle,
           0i64,
           &CmRegistryMachineHardwareResourceMapName,
           0x2001Fui64,
           CreateOptions,
           0i64) >= 0 )
    {
      LODWORD(ResourceListSize) = v14;
      IopWriteResourceList(
        Handle,
        &DestinationString,
        &DriverName,
        &DeviceName,
        (CM_RESOURCE_LIST *)v16,
        ResourceListSize);
      ZwClose(Handle);
    }
    ExFreePoolWithTag((PVOID)v16, 0);
    if( v4 )
      ExFreePoolWithTag(v8, 0);
    v2 = v35;
LABEL_26:
    v32 = ++v4;
  }
  while( v4 < 3 );
}

Referenced by:

IopInitializePlugPlayServices