ST_STORE::StMapAndLockRegion

__int64 __fastcall ST_STORE::StMapAndLockRegion(__int64 a1, unsigned int a2, unsigned int a3, __int64 a4){
  int v4; 
  __int64 v5; 
  int v6; 
  __int64 v7; 
  __int64 v9; 
  int VirtualRegion; 
  int v11; 
  __int64 v12; 
  __int64 v13; 
  __int64 v14; 
  __int64 v15; 
  __int64 v16; 
  int v18; 
  __int64 v19; 
  __int64 v20; 
  __int64 v21; 
  unsigned __int64 v22; 
  unsigned __int64 v23; 
  int v24; 
  v4 = 0;
  v5 = a2;
  v6 = a4;
  v7 = a3;
  if( (*(_WORD *)(*(_QWORD *)(a1 + 1032) + 2i64 * a2) & 0x1FFF) == 0 )
  {
    v9 = *(_QWORD *)(a1 + 800);
    if( (*(_BYTE *)(v9 + 6021) & 4) != 0 )
      VirtualRegion = SMKM_STORE::SmStAllocateVirtualRegion(v9, a2);
    else
      VirtualRegion = SMKM_STORE::SmStAllocatePhysicalRegion(v9, a2);
    if( VirtualRegion < 0 )
      return 0i64;
    ++*(_DWORD *)(a1 + 8 * v7 + 1824);
    if( !*(_BYTE *)(a1 + 776) )
      *(_WORD *)(*(_QWORD *)(a1 + 1032) + 2 * v5) = ((_WORD)v7 << 13) | *(_WORD *)(*(_QWORD *)(a1 + 1032) + 2 * v5) & 0x1FFF;
    v4 = 1;
  }
  if( *(_BYTE *)(a1 + 776) )
    v11 = 0;
  else
    v11 = *(unsigned __int16 *)(*(_QWORD *)(a1 + 1032) + 2 * v5) >> 13;
  v12 = SMKM_STORE::SmStMapRegion(*(_QWORD *)(a1 + 800), v5, 0, a4, v6 | (v11 << 7) | 0x10u);
  v14 = v12;
  if( v12 )
  {
    if( ((v12 - 1) & 0xFFFFFFFFFFFFFFFDui64) != 0 )
    {
      if( (*(_DWORD *)(a1 + 776) & 0x40000) == 0 || !SMKM_STORE::SmStIsRegionBusy(*(_QWORD *)(a1 + 800), v5) )
      {
        SMKM_STORE::SmStMapRegion(*(_QWORD *)(a1 + 800), v5, 0, v13, 2u);
        return v14;
      }
      v16 = -1i64;
    }
    else
    {
      ST_STORE::StDmUpdateRegionLazyCleanup(a1, v5, 1);
      v16 = (v14 != 1) - 1i64;
      v14 = 0i64;
    }
    if( v14 )
    {
      if( *(_BYTE *)(a1 + 776) )
        v18 = 0;
      else
        v18 = *(unsigned __int16 *)(*(_QWORD *)(a1 + 1032) + 2 * v5) >> 13;
      v19 = *(_QWORD *)(a1 + 800);
      if( (*(_BYTE *)(v19 + 6021) & 4) != 0 )
      {
        SMKM_STORE::SmStUnmapVirtualRegion(v19, v5, v15, v19, v24, (16 * v18) | 4);
      }
      else
      {
        v20 = *(_QWORD *)(v19 + 6216);
        v21 = *(_QWORD *)(v20 + 8 * v5);
        v22 = v21 & 0xFFFFFFFFFFFFFFFDui64;
        v23 = v21 & 0xFFFFFFFFFFFFFFF8ui64;
        *(_QWORD *)(v20 + 8 * v5) = v22;
        if( (v22 & 3) == 0 )
          SmFpFree(v19 + 6608, 5i64, (INT64)KeGetCurrentThread(), v23);
      }
    }
  }
  else
  {
    v16 = 0i64;
  }
  if( v4 )
    ST_STORE::StReleaseRegion(a1, v5);
  return v16;
}

Referenced by:

No references.