IoBuildPartialMdl
VOID __stdcall IoBuildPartialMdl(_MDL *SourceMdl, _MDL *TargetMdl, VOID *VirtualAddress, UINT64 Length){
__int64 ByteOffset;
_BYTE *StartVa;
unsigned __int64 BugCheckParameter4;
int v8;
unsigned int v10;
__int16 v11;
unsigned int v12;
void *v13;
char *v14;
unsigned __int64 v15;
signed __int64 v16;
ByteOffset = SourceMdl->ByteOffset;
StartVa = SourceMdl->StartVa;
BugCheckParameter4 = (unsigned int)Length;
v8 = (int)VirtualAddress;
v10 = v8 - ByteOffset - (_DWORD)StartVa;
v11 = (__int16)VirtualAddress;
if( (_DWORD)BugCheckParameter4 )
v12 = BugCheckParameter4;
else
v12 = SourceMdl->ByteCount - v10;
if( VirtualAddress < StartVa
|| (char *)VirtualAddress - ByteOffset - StartVa > (unsigned __int64)SourceMdl->ByteCount )
{
KeBugCheckEx(0x12Eu, SourceMdl, TargetMdl, VirtualAddress, (PVOID)BugCheckParameter4);
}
v13 = (void *)((unsigned __int64)VirtualAddress & 0xFFFFFFFFFFFFF000ui64);
TargetMdl->Process = SourceMdl->Process;
TargetMdl->StartVa = v13;
LODWORD(v13) = (_DWORD)v13 - LODWORD(SourceMdl->StartVa);
TargetMdl->MdlFlags &= 8u;
TargetMdl->ByteOffset = v11 & 0xFFF;
TargetMdl->ByteCount = v12;
TargetMdl->MdlFlags |= SourceMdl->MdlFlags & 0x48C5 | 0x10;
TargetMdl->MappedSystemVa = (char *)SourceMdl->MappedSystemVa + v10;
v14 = (char *)(&SourceMdl[1].Next + ((unsigned int)v13 >> 12));
v15 = ((v11 & 0xFFF) + 4095i64 + (unsigned __int64)v12) >> 12;
if( (_DWORD)v15 )
{
v16 = (char *)TargetMdl - v14;
do
{
*(_QWORD *)&v14[v16 + 48] = *(_QWORD *)v14;
v14 += 8;
LODWORD(v15) = v15 - 1;
}
while( (_DWORD)v15 );
}
}Referenced by:
HalpDmaCheckMdlAccessibility
HalpDmaFlushBuffer
SMKM_STORE_MGR::SmCompressCtxProcessEntry