NtStartProfile

NTSTATUS __stdcall NtStartProfile(PVOID ProfileHandle){
  KPROCESSOR_MODE v1; 
  NTSTATUS result; 
  PADAPTER_OBJECT v3; 
  NTSTATUS v4; 
  UINT64 v5; 
  char *PoolWithTag; 
  void *v7; 
  _MDL *v8; 
  __int64 v9; 
  _DMA_OPERATIONS *DmaOperations; 
  PVOID v11; 
  INT64 Priority; 
  INT64 v13; 
  PADAPTER_OBJECT DmaAdapter; 
  PVOID P; 
  v1 = *((_BYTE *)KeGetCurrentThread() + 562);
  DmaAdapter = 0i64;
  result = ObReferenceObjectByHandle(ProfileHandle, 1u, ExProfileObjectType, v1, (PVOID *)&DmaAdapter, 0i64);
  if( result >= 0 )
  {
    KeWaitForSingleObject(&ExpProfileStateMutex, Executive, 0, 0, 0i64);
    v3 = DmaAdapter;
    if( *(_QWORD *)&DmaAdapter[3].Version )
    {
      v4 = -1073741640;
LABEL_8:
      KeReleaseMutex(&ExpProfileStateMutex, 0);
      HalPutDmaAdapter(v3);
      return v4;
    }
    if( ExpCurrentProfileUsage == (unsigned int)KeQueryActiveProcessorCountEx(0xFFFFu) << 13 )
    {
      v4 = -1073741613;
      goto LABEL_8;
    }
    v5 = MmSizeOfMdl(v3[1].DmaOperations, *(unsigned int *)&v3[2].Version);
    PoolWithTag = (char *)ExAllocatePoolWithTag(NonPagedPoolNx, v5 + 248, 0x666F7250ui64);
    v7 = PoolWithTag;
    P = PoolWithTag;
    if( !PoolWithTag )
    {
      v4 = -1073741670;
      goto LABEL_8;
    }
    v8 = (_MDL *)(PoolWithTag + 248);
    v3[3].DmaOperations = (_DMA_OPERATIONS *)(PoolWithTag + 248);
    v3[2].DmaOperations = (_DMA_OPERATIONS *)PoolWithTag;
    v9 = *(unsigned int *)&v3[2].Version;
    DmaOperations = v3[1].DmaOperations;
    *((_QWORD *)PoolWithTag + 31) = 0i64;
    *((_WORD *)PoolWithTag + 128) = 8
                                  * ((((unsigned __int64)((unsigned __int16)DmaOperations & 0xFFF) + v9 + 4095) >> 12)
                                   + 6);
    *((_WORD *)PoolWithTag + 129) = 0;
    *((_QWORD *)PoolWithTag + 35) = (unsigned __int64)DmaOperations & 0xFFFFFFFFFFFFF000ui64;
    *((_DWORD *)PoolWithTag + 73) = (unsigned __int16)DmaOperations & 0xFFF;
    *((_DWORD *)PoolWithTag + 72) = v9;
    MmProbeAndLockPages((_MDL *)(PoolWithTag + 248), v1, IoWriteAccess);
    v11 = MmMapLockedPagesSpecifyCache((PMDL)v3[3].DmaOperations, 0, MmCached, 0i64, 0, 0x40000010u);
    if( v11 )
    {
      LODWORD(v13) = *(_DWORD *)&v3[4].Version;
      LODWORD(Priority) = *(_DWORD *)(&v3[2].Size + 1);
      KeInitializeProfile(
        (INT64)v7,
        *(_QWORD *)&v3->Version,
        (INT64)v11,
        (INT64)v3->DmaOperations,
        *(_QWORD *)&v3[1].Version,
        Priority,
        v13,
        *(_DWORD *)(&v3[4].Size + 1),
        (UINT16 *)&v3[4].DmaOperations);
      KeStartProfile((ULONG_PTR)v7);
      *(_QWORD *)&v3[3].Version = v11;
      ++ExpCurrentProfileUsage;
      KeReleaseMutex(&ExpProfileStateMutex, 0);
      HalPutDmaAdapter(v3);
      return 0;
    }
    else
    {
      KeReleaseMutex(&ExpProfileStateMutex, 0);
      MmUnlockPages(v8);
      ExFreePoolWithTag(v7, 0);
      HalPutDmaAdapter(v3);
      return -1073741670;
    }
  }
  return result;
}

Referenced by:

No references.