SmHpBufferProtectEx
INT64 __fastcall SmHpBufferProtectEx(INT64 a1, INT64 a2, CHAR a3, UINT64 a4){
int v5;
ULONG_PTR v6;
unsigned int v8;
unsigned __int8 *v10;
INT64 v11;
int v12;
const unsigned __int8 *v13;
int v14;
INT64 v15;
ULONG_PTR BugCheckParameter4;
v15 = a1;
BugCheckParameter4 = 0i64;
v5 = *(_DWORD *)(a2 + 12);
v6 = (unsigned int)a4;
v8 = 1;
if( v5 )
{
if( (a3 & 3) != 0 )
{
v10 = *(unsigned __int8 **)a2;
v15 = 0i64;
MetroHash64::Hash(v10, 0x1000ui64, (unsigned __int8 *const)&v15);
v12 = v15;
if( !(_DWORD)v15 )
v12 = 1;
if( v12 == v5 )
{
if( (a3 & 1) != 0 )
{
ExProtectPoolEx(v10, v10, 0x1000ui64, 4ui64);
*(_DWORD *)(a2 + 12) = 0;
}
}
else
{
if( (a3 & 4) == 0 )
{
SmPrepareForFatalHeapCorruption(v10, v11);
KeBugCheckEx(0x1C7u, v6, *(_QWORD *)a2, *(unsigned int *)(a2 + 12), BugCheckParameter4);
}
return 0;
}
}
}
else if( (a3 & 3) == 0 )
{
ExProtectPoolEx(*(VOID **)a2, *(VOID **)a2, 0x1000ui64, 2ui64);
v13 = *(const unsigned __int8 **)a2;
v15 = 0i64;
MetroHash64::Hash(v13, 0x1000ui64, (unsigned __int8 *const)&v15);
v14 = v15;
*(_DWORD *)(a2 + 12) = v15;
if( !v14 )
*(_DWORD *)(a2 + 12) = 1;
}
return v8;
}Referenced by:
SmHpChunkHeapProtect
SmHpChunkUnprotect
SmHpUnprotectListNeighbors