ST_STORE::StUnlockAndUnmapRegion

void __fastcall ST_STORE::StUnlockAndUnmapRegion(__int64 a1, unsigned int a2, __int64 a3){
  __int64 v3; 
  __int64 v5; 
  int v6; 
  __int64 v7; 
  __int64 v8; 
  __int64 v9; 
  unsigned __int64 v10; 
  unsigned __int64 v11; 
  __int64 v12; 
  __int64 v13; 
  unsigned __int64 v14; 
  unsigned __int64 v15; 
  int v16; 
  v3 = *(_QWORD *)(a1 + 800);
  v5 = a2;
  if( (*(_BYTE *)(v3 + 6021) & 4) != 0 )
  {
    SMKM_STORE::SmStUnmapVirtualRegion(v3, a2, a3, v3, v16, 1u);
  }
  else
  {
    v12 = *(_QWORD *)(v3 + 6216);
    v13 = *(_QWORD *)(v12 + 8i64 * a2);
    v14 = v13 & 0xFFFFFFFFFFFFFFFEui64;
    v15 = v13 & 0xFFFFFFFFFFFFFFF8ui64;
    *(_QWORD *)(v12 + 8 * v5) = v14;
    if( (v14 & 3) == 0 )
      SmFpFree(v3 + 6608, 5i64, (INT64)KeGetCurrentThread(), v15);
  }
  v6 = 0;
  if( !*(_BYTE *)(a1 + 776) )
    v6 = *(unsigned __int16 *)(*(_QWORD *)(a1 + 1032) + 2 * v5) >> 13;
  v7 = *(_QWORD *)(a1 + 800);
  if( (*(_BYTE *)(v7 + 6021) & 4) != 0 )
  {
    SMKM_STORE::SmStUnmapVirtualRegion(v7, v5, a3, v7, v16, (16 * v6) | 4);
  }
  else
  {
    v8 = *(_QWORD *)(v7 + 6216);
    v9 = *(_QWORD *)(v8 + 8 * v5);
    v10 = v9 & 0xFFFFFFFFFFFFFFFDui64;
    v11 = v9 & 0xFFFFFFFFFFFFFFF8ui64;
    *(_QWORD *)(v8 + 8 * v5) = v10;
    if( (v10 & 3) == 0 )
      SmFpFree(v7 + 6608, 5i64, (INT64)KeGetCurrentThread(), v11);
  }
}

Referenced by:

No references.