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