MiQueuePinDriverAddressLog
VOID __fastcall MiQueuePinDriverAddressLog(INT64 a1, UINT64 a2, UINT64 a3){
__int64 v4;
unsigned __int8 CurrentIrql;
unsigned int v6;
unsigned int v7;
unsigned int v8;
unsigned int v9;
int v10;
char *v11;
unsigned int v12;
unsigned int v13;
__int64 *v14;
__int64 i;
int v16;
int v17;
unsigned int v18;
int v19;
int v20;
unsigned __int64 v21;
int v22;
unsigned int SizeOfBitMap;
__int64 *v24;
unsigned __int64 v25;
INT64 v26;
int v27;
v26 = a2;
v4 = (unsigned int)a3;
if( PoAllProcIntrDisabled || (KiBugCheckActive & 3) != 0 || KdEnteredDebugger )
return;
CurrentIrql = KeGetCurrentIrql();
if( CurrentIrql < 2u )
{
KeGetCurrentIrql();
__writecr8(2ui64);
}
v6 = -1;
if( (word_140C2A012 & 1) == 0 )
goto LABEL_59;
do
{
v7 = v6 + 1;
v8 = v7 < stru_140C29EA0.SizeOfBitMap ? v7 : 0;
v9 = stru_140C29EA0.SizeOfBitMap - 1;
v10 = ((__int64)stru_140C29EA0.Buffer & 4) != 0i64 ? 0x20 : 0;
v11 = (char *)stru_140C29EA0.Buffer - (((__int64)stru_140C29EA0.Buffer & 4) != 0i64 ? 4 : 0);
while( 1 )
{
v27 = 0;
v12 = v10 + v9;
v13 = v10 + v8;
if( v9 - v8 != -1 )
break;
v6 = -1;
LABEL_43:
if( !v8 )
goto LABEL_17;
SizeOfBitMap = v7 + 1;
if( v7 + 1 > stru_140C29EA0.SizeOfBitMap )
SizeOfBitMap = stru_140C29EA0.SizeOfBitMap;
v9 = SizeOfBitMap - 1;
v8 = 0;
}
v14 = (__int64 *)&v11[8 * ((unsigned __int64)v13 >> 6)];
for( i = ((1i64 << (v13 & 0x3F)) - 1) | *v14; i == -1; i = *v14 )
{
if( ++v14 > (__int64 *)&v11[8 * ((unsigned __int64)v12 >> 6)] )
goto LABEL_39;
}
_BitScanForward64((unsigned __int64 *)&i, ~i);
v6 = i + ((unsigned int)(((char *)v14 - v11) >> 3) << 6);
v27 = i;
if( v6 > v12 )
{
LABEL_39:
v6 = -1;
goto LABEL_43;
}
if( v6 == -1 )
goto LABEL_43;
v6 -= v10;
LABEL_17:
;
}
while( v6 != -1 && !(unsigned int)RtlInterlockedSetClearRun(&stru_140C29EA0, v6, 1ui64) );
if( v6 >= 0x800 )
{
LABEL_59:
v24 = qword_140C29FB8;
if( !(_BYTE)KdDebuggerEnabled )
v24 = (__int64 *)byte_140C29FB0;
_InterlockedAdd((volatile signed __int32 *)((char *)&v24[4 * v4] + (CurrentIrql > 2u ? 0x10 : 0)), 1u);
goto LABEL_37;
}
v16 = MiFlags;
v25 = a1 & 0xFFFFFFFFFFFFF000ui64;
if( (((unsigned int)MiFlags >> 4) & 3) != 0 )
{
if( (((unsigned int)MiFlags >> 4) & 3) == 1 )
v17 = (v25 ^ (v25 ^ (2 * v4)) & 2) & 0xFFFFFCFE | 0x101;
else
v17 = (v25 ^ (v25 ^ (2 * v4)) & 2) & 0xFFFFFCFE | 0x201;
}
else
{
v17 = (v25 ^ (v25 ^ (2 * v4)) & 2) & 0xFFFFFCFE | 1;
}
if( CurrentIrql >= 2u )
{
if( CurrentIrql == 2 )
v18 = v17 & 0xFFFFFF3F | 0x40;
else
v18 = v17 & 0xFFFFFF3F | 0x80;
}
else
{
v18 = v17 & 0xFFFFFF3F;
}
LODWORD(v25) = v18;
if( (_BYTE)KdDebuggerEnabled )
{
if( (_BYTE)KdDebuggerNotPresent )
v18 = v18 & 0xFFFFF3FF | 0x400;
else
v18 = v18 & 0xFFFFF3FF | 0x800;
LODWORD(v25) = v18;
}
v19 = v18;
if( (v26 & 1) != 0 )
{
if( (((unsigned __int64)v26 >> 11) & 1) != 0 )
{
v18 |= 8u;
LODWORD(v25) = v18;
}
v20 = v19 | 8;
if( (((unsigned __int64)v26 >> 11) & 1) == 0 )
v20 = v19;
if( (v26 & 0x8000000000000000ui64) == 0 )
{
v18 = v20 | 0x10;
LODWORD(v25) = v20 | 0x10;
}
v21 = ((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)&v26) >> 12) & 0xFFFFFFFFFi64;
if( (v16 & 0x8000000) == 0
|| (*((_QWORD *)MmGetPfnDb() + 6 * v21 + 5) & 0x4000000000000i64) == 0
|| *((_WORD *)MmGetPfnDb() + 24 * v21 + 16) <= 1u )
{
goto LABEL_36;
}
v22 = v18 | 0x20;
}
else
{
v22 = v18 | 4;
}
LODWORD(v25) = v22;
LABEL_36:
MiPinDriverAddressLog[v6] = v25;
LABEL_37:
if( CurrentIrql < 2u )
__writecr8(CurrentIrql);
}Referenced by:
MiGetPhysicalAddress
MmBuildMdlForNonPagedPool