KiInsertNewDpcRuntime
CHAR *__stdcall KiInsertNewDpcRuntime(INT64 a1, INT64 a2, INT64 a3){
__int64 v3;
char *v7;
char v8;
unsigned __int64 v9;
unsigned int v10;
__int64 v11;
__int64 v12;
_QWORD *v13;
__int64 v14;
_PRIVILEGE_SET *v15;
int v16;
CHAR *result;
CHAR *v18;
unsigned int v19;
__int64 v20;
__int64 v21;
__int64 v22;
INT64 v23;
v3 = (unsigned int)(2 * (*(_DWORD *)(a1 + 4) >> 5));
if( *(_DWORD *)a1 >= (unsigned int)v3 )
{
if( (unsigned int)v3 < 4 )
v3 = 4i64;
LODWORD(v7) = KiDpcRuntimeHistoryHashTableAllocate(8 * v3);
if( v7 )
{
if( (((_DWORD)v3 - 1) & (unsigned int)v3) != 0 )
{
v8 = -1;
do
{
++v8;
LODWORD(v3) = (unsigned int)v3 >> 1;
}
while( (_DWORD)v3 );
v3 = (unsigned int)(1 << v8);
}
if( (unsigned int)v3 > 0x4000000 )
v3 = 0x4000000i64;
v9 = (unsigned int)v3;
if( v7 > &v7[8 * v3] )
v9 = 0i64;
if( v9 )
memset64(v7, a1 | 1, v9);
v10 = 0;
v11 = -1i64 << (*(_BYTE *)(a1 + 4) & 0x1F);
if( (*(_DWORD *)(a1 + 4) & 0xFFFFFFE0) != 0 )
{
do
{
v12 = *(_QWORD *)(a1 + 8);
while( 1 )
{
v13 = *(_QWORD **)(v12 + 8i64 * v10);
if( ((unsigned __int8)v13 & 1) != 0 )
break;
*(_QWORD *)(v12 + 8i64 * v10) = *v13;
v22 = v11 & v13[1];
v14 = (37
* (BYTE6(v22)
+ 37
* (BYTE5(v22)
+ 37
* (BYTE4(v22)
+ 37 * (BYTE3(v22) + 37 * (BYTE2(v22) + 37 * (BYTE1(v22) + 37 * ((unsigned __int8)v22 + 11623883)))))))
+ HIBYTE(v22)) & (unsigned int)(v3 - 1);
*v13 = *(_QWORD *)&v7[8 * v14];
*(_QWORD *)&v7[8 * v14] = v13;
}
++v10;
}
while( v10 < *(_DWORD *)(a1 + 4) >> 5 );
}
v15 = *(_PRIVILEGE_SET **)(a1 + 8);
v16 = *(_DWORD *)(a1 + 4) & 0x1F | (32 * v3);
*(_QWORD *)(a1 + 8) = v7;
*(_DWORD *)(a1 + 4) = v16;
if( v15 )
CmSiFreeMemory(v15);
}
}
result = (CHAR *)ExAllocatePoolWithTag(0x200ui64, 0x20ui64, 1953002052i64);
v18 = result;
if( result )
{
*((_QWORD *)result + 1) = a2;
*((_QWORD *)result + 2) = a3;
result[24] = 1;
v19 = *(_DWORD *)(a1 + 4);
v23 = a2 & (-1i64 << (v19 & 0x1F));
v20 = *(_QWORD *)(a1 + 8);
v21 = (37
* (BYTE6(v23)
+ 37
* (BYTE5(v23)
+ 37
* (BYTE4(v23)
+ 37 * (BYTE3(v23) + 37 * (BYTE2(v23) + 37 * (BYTE1(v23) + 37 * ((unsigned __int8)v23 + 11623883)))))))
+ HIBYTE(v23)) & ((v19 >> 5) - 1);
result = *(CHAR **)(v20 + 8 * v21);
*(_QWORD *)v18 = result;
*(_QWORD *)(v20 + 8 * v21) = v18;
++*(_DWORD *)a1;
}
return result;
}Referenced by:
KiExecuteAllDpcs