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