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