HalpDmaZeroMapBuffers
void __fastcall HalpDmaZeroMapBuffers(__int64 a1, _QWORD *a2, unsigned int a3, unsigned int a4){
unsigned int v4;
unsigned __int8 CurrentIrql;
__int64 v7;
char v8;
unsigned __int64 v9;
_QWORD *v10;
unsigned int i;
_QWORD *j;
size_t v13;
INT64 v14[2];
__int128 v15;
__int128 v16;
__int64 v17;
unsigned int v18;
v18 = a3;
v4 = a4;
*(_OWORD *)v14 = 0i64;
v17 = 0i64;
v15 = 0i64;
v16 = 0i64;
CurrentIrql = KeGetCurrentIrql();
v7 = a3 & 0xFFF;
v8 = 0;
v9 = (v7 + (unsigned __int64)a4 + 4095) >> 12;
if( CurrentIrql <= 2u )
{
if( CurrentIrql < 2u )
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
v8 = 1;
}
HalpDmaAcquireBufferMappings(v7, a2, v9, (__int64)v14);
a3 = v18;
}
else
{
v10 = a2;
for( i = 0; i < (unsigned int)v9; ++i )
{
if( (v10[6] & 0xFFFFFFFFFFFFF000ui64) == 0 )
KeBugCheckEx(0xACu, (PVOID)0x1000, (PVOID)0xEF06, 0i64, 0i64);
v10 = (_QWORD *)v10[1];
}
}
for( j = a2; v4; v4 -= v13 )
{
v13 = v4;
if( v4 >= 4096 - a3 )
v13 = 4096 - a3;
memset((VOID *)((j[6] & 0xFFFFFFFFFFFFF000ui64) + a3), 0i64, v13);
j = (_QWORD *)j[1];
a3 = 0;
}
if( CurrentIrql <= 2u )
HalpDmaReleaseBufferMappings((INT64)v10, (INT64)a2, (unsigned int)v9, (INT64)v14);
if( v8 )
__writecr8(CurrentIrql);
}Referenced by:
HalpMapTransferV2
HalpMapTransferV3