ViGetMdlBufferSa
VOID *__stdcall ViGetMdlBufferSa(ULONG_PTR Mdl, VOID *BufferVA){
UINT64 v2;
__int64 v4;
__int64 v5;
char *v6;
UINT64 Param3;
UINT64 Priority;
UINT64 v10;
v2 = *(_QWORD *)&Mdl;
v4 = *(unsigned int *)(*(_QWORD *)&Mdl + 44i64);
v5 = *(_QWORD *)(v2 + 32);
if( (unsigned __int64)BufferVA < v5 + v4
|| (unsigned __int64)BufferVA >= v4 + v5 + (unsigned __int64)*(unsigned int *)(v2 + 40) )
{
ViHalPreprocessOptions(
&qword_140C12CD0,
(PSTR)"Virtual address %p out of bounds of MDL %p",
0x1Bui64,
(UINT64)BufferVA,
v2,
0i64,
v10);
VfReportIssueWithOptions(0xE6ui64, 0x1Bu, (ULONG_PTR)BufferVA, v2, 0, &qword_140C12CD0);
}
else
{
if( (*(_BYTE *)(v2 + 10) & 5) != 0 )
{
v6 = *(char **)(v2 + 24);
}
else
{
LODWORD(Priority) = 1073741840;
LODWORD(Param3) = 0;
v6 = (char *)MmMapLockedPagesSpecifyCache((_MDL *)v2, 0, MmCached, 0i64, Param3, Priority);
}
if( v6 )
return &v6[-*(unsigned int *)(v2 + 44) - *(_QWORD *)(v2 + 32) + (_QWORD)BufferVA];
ViHalPreprocessOptions(
(UINT64 *)((char *)&qword_140C12CD0 + 4),
(PSTR)"Dma MDL %p not mapped in system VA.",
0x22ui64,
v2,
0i64,
0i64,
v10);
VfReportIssueWithOptions(0xE6ui64, 0x22u, v2, 0, 0, (UINT64 *)((char *)&qword_140C12CD0 + 4));
}
return 0i64;
}Referenced by:
ViCopyBackModifiedBuffer
ViFlushDoubleBuffer
ViSwap