MiPrepareVadDelete
INT64 __fastcall MiPrepareVadDelete(INT64 a1, CHAR *a2, INT64 a3, INT64 a4, INT64 *a5){
unsigned __int64 v7;
unsigned __int64 v8;
__int64 v9;
unsigned __int64 v10;
int v11;
CHAR v12;
int v14;
_ETHREAD *v15;
int v16;
unsigned int v17;
_ETHREAD *CurrentThread;
v7 = *(unsigned int *)(a1 + 24) | ((unsigned __int64)*(unsigned __int8 *)(a1 + 32) << 32);
v8 = (unsigned __int64)*(unsigned __int8 *)(a1 + 33) << 32;
v9 = *(unsigned int *)(a1 + 28);
*(_DWORD *)a5 = 0;
v10 = v9 | v8;
if( a3 != v7 || (v11 = 0, a4 != v10) )
{
v14 = *(_DWORD *)(a1 + 48);
if( (v14 & 0x300000) != 3145728 )
{
if( (v14 & 0x70) != 0 )
{
if( (v14 & 0x70) == 64 )
goto LABEL_12;
}
else if( (v14 & 0x100000) == 0 || (v14 & 0x400000) == 0 && (v14 & 0xC0000u) < 0x80000 )
{
LABEL_12:
if( a3 == v7 )
{
*(_DWORD *)a5 = 1;
v11 = 1;
}
else
{
v11 = 2;
if( a4 != v10 )
v11 = 3;
*(_DWORD *)a5 = v11;
}
goto LABEL_3;
}
}
return 3221225631i64;
}
LABEL_3:
v12 = *a2;
if( !v11 )
{
if( v12 == 1 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
UNLOCK_ADDRESS_SPACE((__int64)CurrentThread, *((_QWORD *)CurrentThread + 23));
*a2 = 0;
}
return 0i64;
}
if( v12 )
return 0i64;
v15 = (_ETHREAD *)KeGetCurrentThread();
*(_DWORD *)a5 = 0;
*a2 = 1;
MiLockAddressSpaceToo(*((_QWORD *)v15 + 23), a1);
v16 = MiVadDeleted(a1);
v17 = -1073741267;
if( v16 == 1 )
return(unsigned int)-1073741664;
return v17;
}Referenced by:
MiFreeVadRange