ViAllocateMapRegistersFromFile
__int64 __fastcall ViAllocateMapRegistersFromFile(__int64 a1, ULONG_PTR a2, unsigned int a3, char a4, _DWORD *a5){
UINT64 *v5;
__int64 v6;
unsigned int v7;
ULONG_PTR v8;
ULONG_PTR v9;
int v10;
unsigned int v11;
unsigned __int8 v12;
unsigned __int8 v13;
unsigned int v14;
UINT64 *v15;
UINT64 v16;
UINT64 *v17;
UINT64 Param3;
ULONG_PTR v19;
unsigned int v20;
ULONG_PTR *v21;
char v22;
int v23;
unsigned int v24;
int v25;
UINT64 Param4;
UINT64 *SpinLock;
v5 = (UINT64 *)(a1 + 88);
v6 = a1;
v7 = 0;
v8 = ((a2 & 0xFFF) + a3 + 4095i64) >> 12;
SpinLock = (UINT64 *)(a1 + 80);
v9 = a2;
v10 = 0;
v11 = 0;
KeAcquireSpinLockRaiseToDpc((UINT64 *)(a1 + 80), a2);
v13 = v12;
LOBYTE(Param4) = v12;
if( !*(_DWORD *)(v6 + 32) )
{
LABEL_10:
v14 = a3;
goto LABEL_11;
}
v14 = a3;
v15 = &v5[4 * *(unsigned int *)(v6 + 28)];
v16 = v9 + a3;
v17 = v5;
if( v5 < v15 )
{
Param3 = v16;
do
{
v19 = *v17;
if( *v17 && v19 >= a2 && v19 < Param3 )
{
ViHalPreprocessOptions(
&byte_140C12CE8,
(PSTR)"Driver is trying to map an address range(%p-%p) that is already mapped at %p",
0x1Dui64,
a2,
Param3,
*v17,
Param4);
VfReportIssueWithOptions(0xE6ui64, 0x1Dui64, a2, Param3, *v17, &byte_140C12CE8);
}
v17 += 4;
}
while( v17 < v15 );
v13 = Param4;
v10 = 0;
v9 = a2;
v11 = 0;
v6 = a1;
goto LABEL_10;
}
v9 = a2;
v6 = a1;
LABEL_11:
if( (_DWORD)v8 )
{
while( v10 != *(_DWORD *)(v6 + 28) )
{
v20 = v11 + 1;
v11 = 0;
if( !*v5 )
v11 = v20;
v5 += 4;
++v10;
if( v11 >= (unsigned int)v8 )
goto LABEL_16;
}
ViHalPreprocessOptions(
&byte_140C12CF0,
(PSTR)"Map registers needed: %x available: %x",
0x10000000ui64,
2ui64,
(unsigned int)v8,
v11,
Param4);
VfReportIssueWithOptions(0xE6ui64, 0i64, 2ui64, (unsigned int)v8, v11, &byte_140C12CF0);
KxReleaseSpinLock(SpinLock);
}
else
{
LABEL_16:
v21 = &v5[-4 * (unsigned int)v8];
*a5 = v10 - v8;
if( (_DWORD)v8 )
{
v22 = a4;
v23 = 4095;
do
{
*v21 = v9;
v21[3] = v9;
v24 = 4096 - (v23 & v9);
if( v24 >= v14 )
v24 = v14;
*((_DWORD *)v21 + 2) = v24;
*((_DWORD *)v21 + 3) = 2 - (v22 != 0);
_InterlockedIncrement((volatile signed __int32 *)(v6 + 32));
ViTagBuffer((VOID *)((v23 & (unsigned int)v9) + v21[2] + 4096), *((unsigned int *)v21 + 2), 3u);
v14 = v25 - *((_DWORD *)v21 + 2);
v21 += 4;
v9 = (v9 + 4096) & 0xFFFFFFFFFFFFF000ui64;
LODWORD(v8) = v8 - 1;
}
while( (_DWORD)v8 );
}
KxReleaseSpinLock(SpinLock);
v7 = 1;
}
__writecr8(v13);
return v7;
}Referenced by:
ViMapDoubleBuffer