ViAllocateMapRegistersFromFile
UINT64 __stdcall ViAllocateMapRegistersFromFile(
_MAP_REGISTER_FILE *MapRegisterFile,
VOID *CurrentSa,
UINT64 Length,
UINT8 WriteToDevice,
UINT64 *MapRegisterNumber){
_MAP_REGISTER_FILE *v5;
_MAP_REGISTER_FILE *v6;
unsigned int v7;
unsigned __int64 v8;
unsigned __int64 v9;
int v10;
ULONG_PTR v11;
unsigned __int8 v12;
unsigned int v13;
_MAP_REGISTER_FILE *v14;
UINT64 v15;
UINT64 *v16;
UINT64 Param3;
unsigned __int64 v18;
ULONG_PTR v19;
_MAP_REGISTER_FILE *v20;
UINT8 v21;
int v22;
unsigned int v23;
int v24;
UINT64 a7;
UINT64 *SpinLock;
unsigned int v30;
v30 = Length;
v5 = MapRegisterFile + 22;
v6 = MapRegisterFile;
v7 = 0;
v8 = (((unsigned __int16)CurrentSa & 0xFFF) + (unsigned __int64)(unsigned int)Length + 4095) >> 12;
SpinLock = (UINT64 *)(MapRegisterFile + 20);
v9 = (unsigned __int64)CurrentSa;
v10 = 0;
v11 = 0;
v12 = KeAcquireSpinLockRaiseToDpc((UINT64 *)MapRegisterFile + 10);
LOBYTE(a7) = v12;
if( !v6[8] )
{
LABEL_10:
v13 = v30;
goto LABEL_11;
}
v13 = v30;
v14 = &v5[8 * v6[7]];
v15 = v9 + v30;
v16 = (UINT64 *)v5;
if( v5 < v14 )
{
Param3 = v15;
do
{
v18 = *v16;
if( *v16 && v18 >= (unsigned __int64)CurrentSa && v18 < Param3 )
{
ViHalPreprocessOptions(
&unk_140C12CE8,
(PSTR)"Driver is trying to map an address range(%p-%p) that is already mapped at %p",
0x1Dui64,
(UINT64)CurrentSa,
Param3,
*v16,
a7);
VfReportIssueWithOptions(0xE6ui64, 0x1Du, (ULONG_PTR)CurrentSa, Param3, *v16, &unk_140C12CE8);
}
v16 += 4;
}
while( v16 < (UINT64 *)v14 );
v12 = a7;
v10 = 0;
v9 = (unsigned __int64)CurrentSa;
v11 = 0;
v6 = MapRegisterFile;
goto LABEL_10;
}
v9 = (unsigned __int64)CurrentSa;
v6 = MapRegisterFile;
LABEL_11:
if( (_DWORD)v8 )
{
while( v10 != v6[7] )
{
v19 = v11 + 1;
v11 = 0;
if( !*(_QWORD *)v5 )
v11 = v19;
v5 += 8;
++v10;
if( v11 >= (unsigned int)v8 )
goto LABEL_16;
}
ViHalPreprocessOptions(
(UINT64 *)((char *)&qword_140C12CEC + 4),
(PSTR)"Map registers needed: %x available: %x",
0x10000000ui64,
2ui64,
(unsigned int)v8,
v11,
a7);
VfReportIssueWithOptions(0xE6ui64, 0, 2u, v8, v11, (UINT64 *)((char *)&qword_140C12CEC + 4));
KxReleaseSpinLock(SpinLock);
}
else
{
LABEL_16:
v20 = &v5[-8 * (unsigned int)v8];
*(_DWORD *)MapRegisterNumber = v10 - v8;
if( (_DWORD)v8 )
{
v21 = WriteToDevice;
v22 = 4095;
do
{
*(_QWORD *)v20 = v9;
*((_QWORD *)v20 + 3) = v9;
v23 = 4096 - (v22 & v9);
if( v23 >= v13 )
v23 = v13;
v20[2] = v23;
v20[3] = 2 - (v21 != 0);
_InterlockedIncrement(v6 + 8);
ViTagBuffer((VOID *)((v22 & (unsigned int)v9) + *((_QWORD *)v20 + 2) + 4096i64), (unsigned int)v20[2], 3u);
v13 = v24 - v20[2];
v20 += 8;
v9 = (v9 + 4096) & 0xFFFFFFFFFFFFF000ui64;
LODWORD(v8) = v8 - 1;
}
while( (_DWORD)v8 );
}
KxReleaseSpinLock(SpinLock);
v7 = 1;
}
__writecr8(v12);
return v7;
}Referenced by:
ViMapDoubleBuffer