ST_STORE::StDmpSinglePageRetrieve

__int64 __fastcall ST_STORE::StDmpSinglePageRetrieve(
        __int64 a1,
        __int64 a2,
        __int64 a3,
        __int64 a4,
        __int64 a5){
  unsigned int v5; 
  char *v7; 
  int v8; 
  int v9; 
  __int64 v10; 
  int v11; 
  __int64 v12; 
  __int16 v13; 
  int v14; 
  unsigned int IsCurrentRegion; 
  unsigned int v16; 
  char *v17; 
  char *v18; 
  __int64 v19; 
  __int64 v20; 
  __int64 v22; 
  __int64 v23; 
  unsigned __int64 v24; 
  VOID *v25; 
  int Payload; 
  __int64 v27; 
  VOID *ThreadPtr[10]; 
  unsigned int SystemPagePriority; 

  v27 = 0i64;
  v5 = a4 & 2 | 1;
  ThreadPtr[0] = 0i64;
  SystemPagePriority = 0;
  v7 = 0i64;
  v8 = 0;
  if( (a4 & 2) != 0 )
  {
    v10 = *(_QWORD *)(a3 + 16);
  }
  else
  {
    v9 = ST_STORE::StDmpSinglePageLookup((__int64 *)a1, a2, a3, &v27);
    if( v9 < 0 )
      return(unsigned int)v9;
    v10 = v27;
  }
  v11 = *(_DWORD *)v10 & *(_DWORD *)(a1 + 808);
  v12 = (unsigned int)(*(_DWORD *)v10 >> *(_DWORD *)(a1 + 812));
  if( (*(_DWORD *)(a1 + 776) & 0x40000) != 0 )
  {
    SystemPagePriority = SmSetThreadSystemPagePriority(ThreadPtr, 0i64, 0i64);
    v8 = 1;
  }
  *(_DWORD *)a5 = *(_DWORD *)v10;
  v13 = 4096;
  v14 = *(_DWORD *)(v10 + 4) & 0xFFF;
  if( v14 )
    v13 = v14;
  *(_WORD *)(a5 + 4) = v13;
  *(_WORD *)(a5 + 6) = (unsigned __int8)*(_WORD *)a3;
  if( *(_BYTE *)(a1 + 776) )
  {
    if( *(_DWORD *)(*(_QWORD *)(a1 + 1016) + 24i64) )
    {
      *(_DWORD *)(a5 + 8) = *(_DWORD *)(v10 + 12);
      *(_DWORD *)(a5 + 12) = *(unsigned __int16 *)(v10 + 6);
    }
  }
  else
  {
    *(_DWORD *)(a5 + 8) = *(_DWORD *)(v10 + 8);
  }
  if( (*(_DWORD *)(a1 + 776) & 0x40000) != 0 )
    IsCurrentRegion = 8;
  else
    IsCurrentRegion = ST_STORE::StDmIsCurrentRegion(a1, v12);
  v16 = 16 * v11;
  if( IsCurrentRegion == 8 )
  {
    v17 = SMKM_STORE::SmStMapRegion(*(_QWORD *)(a1 + 800), v12, v16, a4, 1u);
    v7 = v17;
    if( (unsigned __int64)v17 <= 3 )
    {
      v9 = -1073741550;
      if( v17 == (char *)1 )
        v9 = -2147483634;
      goto LABEL_20;
    }
    v18 = v17;
  }
  else
  {
    v18 = (char *)(*(_QWORD *)(a1 + 16i64 * IsCurrentRegion + 1256) + v16);
  }
  *(_QWORD *)(a2 + 56) = a3;
  v9 = ST_STORE::StDmSinglePageTransfer(
         (unsigned int *)a1,
         *(void **)(a2 + 16),
         (unsigned __int64)v18 | v5,
         a4,
         *(VOID **)(a3 + 8),
         a5,
         a2);
  if( v9 >= 0 )
    v9 = 0;
  if( v7 )
  {
    v20 = *(_QWORD *)(a1 + 800);
    if( (*(_BYTE *)(v20 + 6021) & 4) != 0 )
    {
      SMKM_STORE::SmStUnmapVirtualRegion(v20, v12, v19, v20, Payload, 0);
    }
    else
    {
      v22 = *(_QWORD *)(v20 + 6216);
      v23 = *(_QWORD *)(v22 + 8 * v12);
      v24 = v23 & 0xFFFFFFFFFFFFFFFEui64;
      v25 = (VOID *)(v23 & 0xFFFFFFFFFFFFFFF8ui64);
      *(_QWORD *)(v22 + 8 * v12) = v24;
      if( (v24 & 3) == 0 )
        SmFpFree((_SM_FORWARD_PROGRESS_CTX *)(v20 + 6608), SmFpResourceMapping, KeGetCurrentThread(), v25);
    }
  }
LABEL_20:
  if( v8 )
    SmSetThreadSystemPagePriority(ThreadPtr, SystemPagePriority, 1ui64);
  return(unsigned int)v9;
}

Referenced by:

No references.