HalpAllocateAdapterChannel
INT64 __fastcall HalpAllocateAdapterChannel(INT64 a1, INT64 a2, UINT64 a3, INT64 a4, CHAR a5, INT64 a6){
int v6;
int v10;
unsigned int v11;
int v12;
unsigned int v13;
unsigned int v14;
char v15;
unsigned __int8 CurrentIrql;
v6 = a3;
if( (*(_DWORD *)(a2 + 20) & 2) != 0 )
{
_m_prefetchw((const void *)(a2 - 8));
if( (_InterlockedOr((volatile signed __int32 *)(a2 - 8), 4u) & 2) != 0 )
return 3221225760i64;
}
if( *(_BYTE *)(a1 + 432) && (unsigned int)a3 > *(_DWORD *)(a1 + 224) )
return 3221225626i64;
v10 = *(_DWORD *)(a2 + 20);
if( (a5 & 2) != 0 )
v11 = v10 | 4;
else
v11 = v10 & 0xFFFFFFFB;
*(_DWORD *)(a2 + 20) = v11;
*(_QWORD *)(a2 + 24) = a6;
v12 = ((_DWORD)a4 << 12) | *(_DWORD *)(a2 + 20) & 0xFFF;
*(_DWORD *)(a2 + 40) = a3;
*(_DWORD *)(a2 + 16) = 1;
if( (a5 & 1) != 0 )
v13 = v12 | 1;
else
v13 = v12 & 0xFFFFFFFE;
*(_DWORD *)(a2 + 20) = v13;
v14 = (a5 & 1) != 0 ? 0xC000009A : 0;
if( HalpDmaStartWcb(a1, (_QWORD *)a2, v13 & 1) )
{
*(_QWORD *)(a1 + 344) = a2;
v15 = 0;
CurrentIrql = 0;
*(_DWORD *)(a1 + 240) = v6;
*(_DWORD *)(a1 + 380) = 1;
*(_DWORD *)(a1 + 616) = 0;
if( KeGetCurrentIrql() < 2u )
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
v15 = 1;
}
if( (unsigned __int8)HalpAllocateDmaResourcesInternal((PDMA_ADAPTER)a1) )
v14 = 0;
if( v15 )
__writecr8(CurrentIrql);
}
return v14;
}Referenced by:
HalAllocateAdapterChannel
HalAllocateAdapterChannelEx
HalRealAllocateAdapterChannelV3
HalpBuildScatterGatherList