EtwpFindUserBufferSpace
NTSTATUS __stdcall EtwpFindUserBufferSpace(
_WMI_LOGGER_CONTEXT *Prc,
_ETW_REALTIME_CONSUMER *BufferSize,
_WMI_BUFFER_HEADER **UserBuffer,
_WMI_BUFFER_HEADER **a4){
NTSTATUS v6;
unsigned int v7;
unsigned int NextAlignedForwardRunClear;
unsigned int v9;
NTSTATUS v11;
UINT64 AllocationType;
UINT64 Protect;
UINT64 RegionSize;
v6 = 0;
*a4 = 0i64;
RegionSize = ((_DWORD)UserBuffer + 4095) & 0xFFFFF000;
v7 = (unsigned int)RegionSize >> 12;
NextAlignedForwardRunClear = RtlFindNextAlignedForwardRunClear(
&BufferSize->ReservedBufferSpaceBitMap,
(UINT64)BufferSize,
(unsigned int)RegionSize >> 12,
(UINT64)a4);
v9 = NextAlignedForwardRunClear;
if( NextAlignedForwardRunClear != -1
&& RtlInterlockedSetClearRun((INT64)&BufferSize->ReservedBufferSpaceBitMap, NextAlignedForwardRunClear, v7) )
{
*a4 = (_WMI_BUFFER_HEADER *)&BufferSize->ReservedBufferSpace[4096 * v9];
}
BufferSize->UserPagesReused += v7;
if( !*a4 )
{
LODWORD(Protect) = 4;
LODWORD(AllocationType) = 4096;
v11 = ZwAllocateVirtualMemory(BufferSize->ProcessHandle, (VOID **)a4, 0i64, &RegionSize, AllocationType, Protect);
v6 = v11;
if( v11 < 0 )
{
if( v11 == -1073741670 || v11 == -1073741523 )
return -1073741764;
}
else
{
BufferSize->UserPagesAllocated += v7;
}
}
return v6;
}Referenced by:
EtwpRealtimeInjectEtwBuffer