NtStartProfile

NTSTATUS __stdcall NtStartProfile(VOID *ProfileHandle){
  char PreviousMode; 
  NTSTATUS result; 
  PADAPTER_OBJECT v3; 
  NTSTATUS v4; 
  __int64 v5; 
  VOID **PoolWithTag; 
  _KPROFILE *v7; 
  INT64 v8; 
  __int64 NumberOfFreeScatterBuffers; 
  _HALP_DMA_TRANSLATION_ENTRY *ScatterBufferListHead; 
  _KPROCESSOR_MODE v11; 
  UINT64 *v12; 
  INT64 v13; 
  INT64 v14; 
  PLARGE_INTEGER Timeout; 
  UINT64 Priority; 
  UINT64 Prioritya; 
  UINT64 Segment; 
  PADAPTER_OBJECT DmaAdapter; 
  PVOID P; 

  PreviousMode = KeGetCurrentThread()->PreviousMode;
  DmaAdapter = 0i64;
  result = ObReferenceObjectByHandle(
             ProfileHandle,
             1ui64,
             ExProfileObjectType,
             PreviousMode,
             (VOID **)&DmaAdapter,
             0i64);
  if( result >= 0 )
  {
    KeWaitForSingleObject((UINT64)&WheapDeferredInternalLogsEventLock + 608, 0, 0, 0, 0i64);
    v3 = DmaAdapter;
    if( DmaAdapter->AdapterObject.ScatterTranslations )
    {
      v4 = -1073741640;
LABEL_8:
      KeReleaseMutex((_KMUTANT *)((char *)&WheapDeferredInternalLogsEventLock + 608), 0);
      HalPutDmaAdapter(v3);
      return v4;
    }
    if( ExpCurrentProfileUsage == (unsigned int)KeQueryActiveProcessorCountEx(0xFFFFu) << 13 )
    {
      v4 = -1073741613;
      goto LABEL_8;
    }
    LODWORD(v5) = MmSizeOfMdl(v3->AdapterObject.ScatterBufferListHead, v3->AdapterObject.NumberOfFreeScatterBuffers);
    PoolWithTag = ExAllocatePoolWithTag(0x200ui64, v5 + 248, 1718579792i64);
    v7 = (_KPROFILE *)PoolWithTag;
    P = PoolWithTag;
    if( !PoolWithTag )
    {
      v4 = -1073741670;
      goto LABEL_8;
    }
    v8 = (INT64)(PoolWithTag + 31);
    v3->AdapterObject.ContiguousTranslationEnd.Buffer = (_HALP_DMA_TRANSLATION_BUFFER *)(PoolWithTag + 31);
    v3->AdapterObject.ContiguousTranslations = (_HALP_DMA_TRANSLATION_BUFFER *)PoolWithTag;
    NumberOfFreeScatterBuffers = v3->AdapterObject.NumberOfFreeScatterBuffers;
    ScatterBufferListHead = v3->AdapterObject.ScatterBufferListHead;
    PoolWithTag[31] = 0i64;
    v11 = 4095;
    *((_WORD *)PoolWithTag + 128) = 8
                                  * ((((unsigned __int64)((unsigned __int16)ScatterBufferListHead & 0xFFF)
                                     + NumberOfFreeScatterBuffers
                                     + 4095) >> 12)
                                   + 6);
    *((_WORD *)PoolWithTag + 129) = 0;
    PoolWithTag[35] = (VOID *)((unsigned __int64)ScatterBufferListHead & 0xFFFFFFFFFFFFF000ui64);
    *((_DWORD *)PoolWithTag + 73) = (unsigned __int16)ScatterBufferListHead & 0xFFF;
    *((_DWORD *)PoolWithTag + 72) = NumberOfFreeScatterBuffers;
    LOBYTE(v11) = PreviousMode;
    MmProbeAndLockPages((PMDL)(PoolWithTag + 31), v11, IoWriteAccess);
    LODWORD(Priority) = 1073741840;
    LODWORD(Timeout) = 0;
    v12 = (UINT64 *)MmMapLockedPagesSpecifyCache(
                      (_MDL *)v3->AdapterObject.ContiguousTranslationEnd.Buffer,
                      0,
                      MmCached,
                      0i64,
                      (UINT64)Timeout,
                      Priority);
    if( v12 )
    {
      LODWORD(Segment) = v3->AdapterObject.ContiguousTranslationEnd.Offset;
      LODWORD(Prioritya) = *(&v3->AdapterObject.NumberOfFreeScatterBuffers + 1);
      KeInitializeProfile(
        v7,
        *(_KPROCESS **)&v3->AdapterObject.DmaHeader.Version,
        v12,
        v3->AdapterObject.DmaHeader.DmaOperations,
        (UINT64)v3->AdapterObject.ContiguousMapRegisters,
        Prioritya,
        Segment,
        *((_KPROFILE_SOURCE *)&v3->AdapterObject.ContiguousTranslationEnd.Offset + 1),
        (_KAFFINITY_EX *)&v3->AdapterObject.ScatterTranslationEnd);
      KeStartProfile(v7);
      v3->AdapterObject.ScatterTranslations = (_HALP_DMA_TRANSLATION_BUFFER *)v12;
      ++ExpCurrentProfileUsage;
      KeReleaseMutex((_KMUTANT *)((char *)&WheapDeferredInternalLogsEventLock + 608), 0);
      HalPutDmaAdapter(v3);
      return 0;
    }
    else
    {
      KeReleaseMutex((_KMUTANT *)((char *)&WheapDeferredInternalLogsEventLock + 608), 0);
      MmUnlockPages(v8, v13, v14);
      ExFreePoolWithTag(v7, 0);
      HalPutDmaAdapter(v3);
      return -1073741670;
    }
  }
  return result;
}

Referenced by:

No references.