VslpLockPagesForTransfer

NTSTATUS __stdcall VslpLockPagesForTransfer(INT64 a1, INT64 a2, UINT64 a3, INT64 a4, CHAR a5){
  unsigned int v5; 
  INT64 v6; 
  _MDL *v8; 
  unsigned int v9; 
  _MDL *PoolWithTag; 
  unsigned __int64 v11; 
  _MDL *v12; 
  int v13; 
  _MDL *Next; 
  unsigned __int64 v16; 
  int v17; 

  v17 = a4;
  v5 = a3;
  v6 = a2;
  v8 = 0i64;
  if( (a5 & 3) != 0 && (v11 = ((a2 & 0xFFF) + (unsigned int)a3 + 4095i64) & 0xFFFFFFFFFFFFF000ui64, v11 > 0x1FA000) )
  {
    v13 = -1073741811;
LABEL_16:
    while( v8 )
    {
      Next = v8->Next;
      v8->Next = 0i64;
      if( (v8->MdlFlags & 2) != 0 )
        MmUnlockPages((INT64)v8, v11, a3);
      ExFreePoolWithTag(v8, 0);
      v8 = Next;
    }
    return v13;
  }
  else
  {
    v12 = 0i64;
    do
    {
      v16 = ((v6 & 0xFFF) + (unsigned __int64)v5 + 4095) >> 12;
      v9 = 8 * v16 + 48;
      if( (a5 & 1) != 0 )
        v9 = 4096;
      if( (a5 & 4) != 0 )
        v9 = (v9 + 4095) & 0xFFFFF000;
      PoolWithTag = (_MDL *)ExAllocatePoolWithTag(0x200ui64, v9, 1416850774i64);
      v8 = PoolWithTag;
      if( !PoolWithTag )
      {
        v8 = v12;
        v13 = -1073741670;
        goto LABEL_16;
      }
      PoolWithTag->Next = 0i64;
      PoolWithTag->Size = 8 * (v16 + 6);
      PoolWithTag->MdlFlags = 0;
      PoolWithTag->StartVa = (void *)(v6 & 0xFFFFFFFFFFFFF000ui64);
      PoolWithTag->ByteOffset = v6 & 0xFFF;
      PoolWithTag->ByteCount = v5;
      if( (a5 & 6) != 0 )
      {
        MmBuildMdlForNonPagedPool(PoolWithTag);
      }
      else if( v5 )
      {
        MiProbeAndLockPages((INT64)PoolWithTag, 0, v17 != 0);
      }
      v8->Next = v12;
      v12 = v8;
      v6 = (INT64)v8;
      v5 = v9;
    }
    while( v9 > 0x1000 );
    v13 = VslpLockMdlForTransfer(a1, (INT64)v8, a5);
    if( v13 < 0 )
      goto LABEL_16;
    *(_DWORD *)(a1 + 64) |= 8u;
    return 0;
  }
}

Referenced by:

VslAllocatePool
VslCapturePgoData
VslCaptureSecureImageIat
VslConnectSwInterrupt
VslCreateEnclave
VslCreateSecureImageSection
VslCreateSecureSection
VslDebugReadWriteSecureProcess
VslFillSecureAllocation
VslFinishStartSecureProcessor
VslGetEtwDebugId
VslGetOnDemandDebugChallenge
VslInitializeEnclave
VslInitializeSecureProcess
VslIumEfiRuntimeService
VslObtainHotPatchUndoTable
VslPrepareSecureImageRelocations
VslQuerySecureKernelProfileInformation
VslRegisterLogPages
VslRetrieveMailbox
VslStartSecureProcessor
VslTransferSecureImageVersionResource
VslValidateSecureImagePages
VslpSkMapBuffers