EtwpRegisterPartitionPages
CHAR __fastcall EtwpRegisterPartitionPages(INT64 a1, INT64 a2, INT64 a3){
char v6;
_QWORD *PoolWithTag;
_QWORD *v8;
unsigned __int64 v9;
__int64 v10;
char *v11;
char v12;
unsigned __int64 v13;
char v14;
unsigned int v15;
__int64 v16;
_QWORD *v17;
_QWORD *v18;
__int64 v19;
VOID *v20;
_QWORD *v21;
__int64 v22;
__int64 v24;
__int64 v25;
v6 = 0;
PoolWithTag = ExAllocatePoolWithTag(NonPagedPoolNx, 0x20ui64, 0x4F777445ui64);
v8 = PoolWithTag;
if( !PoolWithTag )
return(char)PoolWithTag;
PoolWithTag[1] = a3;
PoolWithTag[2] = a2;
PoolWithTag[3] = a1;
v9 = ExAcquireSpinLockExclusive(&dword_140C19690);
if( EtwpMdlTable < 2 * ((unsigned int)dword_140C19684 >> 5) )
goto LABEL_24;
v10 = 2 * ((unsigned int)dword_140C19684 >> 5);
if( (unsigned int)v10 < 4 )
v10 = 4i64;
v11 = (char *)EtwpMdlHashTableAllocator(8i64 * (unsigned int)v10);
if( v11 )
{
if( (((_DWORD)v10 - 1) & (unsigned int)v10) != 0 )
{
v12 = -1;
do
{
++v12;
LODWORD(v10) = (unsigned int)v10 >> 1;
}
while( (_DWORD)v10 );
v10 = (unsigned int)(1 << v12);
}
if( (unsigned int)v10 > 0x4000000 )
v10 = 0x4000000i64;
v13 = (unsigned int)v10;
if( v11 > &v11[8 * v10] )
v13 = 0i64;
if( v13 )
memset64(v11, (unsigned __int64)&EtwpMdlTable + 1, v13);
v14 = dword_140C19684;
v15 = 0;
v16 = -1i64 << (dword_140C19684 & 0x1F);
if( (dword_140C19684 & 0xFFFFFFE0) != 0 )
{
do
{
v17 = qword_140C19688;
while( 1 )
{
v18 = (_QWORD *)v17[v15];
if( ((unsigned __int8)v18 & 1) != 0 )
break;
v17[v15] = *v18;
v25 = v16 & v18[1];
v19 = (37
* (BYTE6(v25)
+ 37
* (BYTE5(v25)
+ 37
* (BYTE4(v25)
+ 37 * (BYTE3(v25) + 37 * (BYTE2(v25) + 37 * (BYTE1(v25) + 37 * ((unsigned __int8)v25 + 11623883)))))))
+ HIBYTE(v25)) & (unsigned int)(v10 - 1);
*v18 = *(_QWORD *)&v11[8 * v19];
*(_QWORD *)&v11[8 * v19] = v18;
}
v14 = dword_140C19684;
++v15;
}
while( v15 < (unsigned int)dword_140C19684 >> 5 );
}
v20 = qword_140C19688;
qword_140C19688 = v11;
dword_140C19684 = (32 * v10) | v14 & 0x1F;
if( v20 )
EtwpMdlHashTableDeallocator(v20);
goto LABEL_24;
}
if( (dword_140C19684 & 0xFFFFFFE0) != 0 )
{
LABEL_24:
v6 = 1;
v24 = v8[1] & (-1i64 << (dword_140C19684 & 0x1F));
v21 = qword_140C19688;
v22 = (37
* (BYTE6(v24)
+ 37
* (BYTE5(v24)
+ 37
* (BYTE4(v24)
+ 37 * (BYTE3(v24) + 37 * (BYTE2(v24) + 37 * (BYTE1(v24) + 37 * ((unsigned __int8)v24 + 11623883)))))))
+ HIBYTE(v24)) & (((unsigned int)dword_140C19684 >> 5) - 1);
*v8 = *((_QWORD *)qword_140C19688 + v22);
v21[v22] = v8;
++EtwpMdlTable;
}
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&dword_140C19690);
__writecr8(v9);
if( !v6 )
ExFreePoolWithTag(v8, 0x4F777445u);
LOBYTE(PoolWithTag) = v6;
return(char)PoolWithTag;
}Referenced by:
EtwpAllocatePartitionMemory