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.