NtPssCaptureVaSpaceBulk

NTSTATUS __stdcall NtPssCaptureVaSpaceBulk(INT64 a1){
  unsigned __int64 v1; 
  __int64 v2; 
  unsigned __int64 v3; 
  unsigned int v4; 
  __int128 *v5; 
  int v6; 
  INT64 v7; 
  int v8; 
  INT8 PreviousMode; 
  __int64 v11; 
  _MDL *Mdl; 
  _QWORD *v13; 
  _IRP *Irp; 
  UINT64 Priority; 
  PVOID BaseAddress; 
  __int64 v17; 
  unsigned __int64 Handlea; 
  UINT64 Length; 
  PVOID Object; 
  unsigned __int64 ReturnLength; 
  __int128 v23; 
  INT64 v24; 
  unsigned __int64 v25; 
  __int64 v26; 
  unsigned __int64 v27; 
  _ETHREAD *CurrentThread; 
  _KAPC_STATE ApcState; 
  __int64 *v30; 

  v4 = v3;
  Length = v3;
  v5 = (__int128 *)v2;
  BaseAddress = (PVOID)v1;
  v24 = a1;
  v25 = v1;
  v26 = v2;
  v27 = v3;
  Object = 0i64;
  memset(&ApcState, 0, sizeof(ApcState));
  ReturnLength = 0i64;
  v17 = 0i64;
  v6 = 0;
  v7 = 0i64;
  v8 = 0;
  if( v3 < 0x10 )
    return -1073741820;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  PreviousMode = CurrentThread->Tcb.PreviousMode;
  if( PreviousMode )
  {
    v23 = 0i64;
    ProbeForWrite(v2, v3, 8i64);
    if( v30 )
    {
      v11 = (__int64)v30;
      v2 = 0x7FFFFFFF0000i64;
      if( (unsigned __int64)v30 >= 0x7FFFFFFF0000i64 )
        v11 = 0x7FFFFFFF0000i64;
      *(_QWORD *)v11 = *(_QWORD *)v11;
    }
    v23 = *v5;
    v1 = (unsigned __int64)BaseAddress;
    v4 = Length;
  }
  else
  {
    v23 = *(_OWORD *)v2;
  }
  if( (_DWORD)v23 )
  {
    if( (v23 & 0xFFFFFFFC) != 0 )
    {
      v8 = -1073741637;
    }
    else
    {
      if( v1 <= 0x7FFFFFFEFFFFi64 )
      {
        if( PreviousMode )
        {
          Mdl = IoAllocateMdl(v5, v4, 0, 0, 0i64);
          v7 = (INT64)Mdl;
          if( !Mdl
            || ((MmProbeAndLockPages(Mdl, 0, IoWriteAccess), (*(_BYTE *)(v7 + 10) & 5) == 0) ? (LODWORD(Priority) = 1073741840,
                                                                                                LODWORD(Irp) = 0,
                                                                                                v5 = (__int128 *)MmMapLockedPagesSpecifyCache((_MDL *)v7, 0, MmCached, 0i64, (UINT64)Irp, Priority)) : (v5 = *(__int128 **)(v7 + 24)),
                !v5) )
          {
            v8 = -1073741670;
            goto LABEL_44;
          }
        }
        else
        {
          v7 = 0i64;
        }
        if( a1 != -1 )
        {
          LODWORD(Irp) = 1098085200;
          v8 = ObReferenceObjectByHandleWithTag(
                 (VOID *)a1,
                 0x1000ui64,
                 (_OBJECT_TYPE *)PsProcessType,
                 PreviousMode,
                 (UINT64)Irp,
                 &Object,
                 0i64);
          if( v8 < 0 )
            goto LABEL_44;
          if( (*((_DWORD *)Object + 543) & 0x1000) != 0 )
          {
            ObfDereferenceObjectWithTag(Object, 0x41737350ui64);
            v8 = -1073741790;
            goto LABEL_44;
          }
          KeStackAttachProcess((PRKPROCESS)Object, &ApcState);
          v6 = 1;
        }
        if( PreviousMode )
        {
          v8 = ZwPssCaptureVaSpaceBulk(-1i64);
        }
        else
        {
          *((_DWORD *)v5 + 1) = 0;
          v17 = 16i64;
          Handlea = Length - 16;
          v13 = v5 + 1;
          if( Length - 16 >= 0x30 )
          {
            while( 1 )
            {
              if( (CurrentThread->CrossThreadFlags & 1) != 0 )
              {
                v8 = -1073741749;
                goto LABEL_44;
              }
              v8 = NtQueryVirtualMemory(-1, BaseAddress, MemoryBasicInformation, v13, 48, &ReturnLength);
              if( v8 < 0 )
                break;
              Handlea -= ReturnLength;
              v17 += ReturnLength;
              BaseAddress = (PVOID)(*v13 + v13[3]);
              v13 += 6;
              ++*((_DWORD *)v5 + 1);
              *((_QWORD *)v5 + 1) = BaseAddress;
              if( Handlea < 0x30 )
                goto LABEL_41;
            }
            if( *((_DWORD *)v5 + 1) )
              v8 = 0;
          }
LABEL_41:
          if( v8 >= 0 && *((_QWORD *)v5 + 1) != 0x7FFFFFFF0000i64 )
            v8 = 261;
        }
        goto LABEL_44;
      }
      v8 = -1073741503;
    }
  }
  else
  {
    v8 = -1073741811;
  }
LABEL_44:
  if( v6 )
    KeUnstackDetachProcess(&ApcState);
  if( v7 )
  {
    MmUnlockPages(v7, v1, v2);
    IoFreeMdl((PMDL)v7);
  }
  if( v30 )
    *v30 = v17;
  return v8;
}

Referenced by:

No references.