HalpQueueMapBufferWorker
void __fastcall HalpQueueMapBufferWorker(__int64 a1, int a2){
__int64 v4;
WORK_QUEUE_ITEM *PoolWithTag;
v4 = *(_BYTE *)(a1 + 434) != 0 ? 4 : 0;
if( !_InterlockedCompareExchange((volatile signed __int32 *)((char *)&HalpDmaGrowMapBufferWorkerQueued + v4), 1, 0) )
{
PoolWithTag = (WORK_QUEUE_ITEM *)ExAllocatePoolWithTag(NonPagedPoolNx, 0x38ui64, 0x206C6148ui64);
if( PoolWithTag )
{
PoolWithTag->List.Flink = 0i64;
PoolWithTag->WorkerRoutine = HalpGrowMapBufferWorker;
PoolWithTag->Parameter = PoolWithTag;
PoolWithTag[1].List.Flink = *(_LIST_ENTRY **)(a1 + 152);
HIDWORD(PoolWithTag[1].List.Blink) = a2;
LOBYTE(PoolWithTag[1].List.Blink) = *(_BYTE *)(a1 + 434);
LODWORD(PoolWithTag[1].WorkerRoutine) = *(_DWORD *)(a1 + 148);
ExQueueWorkItem(PoolWithTag, DelayedWorkQueue);
}
else
{
*(_DWORD *)((char *)&HalpDmaGrowMapBufferWorkerQueued + v4) = 0;
}
}
}Referenced by:
HalAllocateAdapterChannelV2
HalpAllocateDmaResourcesInternal
HalpDmaProcessMapRegisterQueueV2
IoFreeAdapterChannelV2