Mdl内存实现之原理1
来源:互联网 发布:贪吃蛇算法 编辑:程序博客网 时间:2024/06/07 05:04
I/O Buffer需要分连续虚拟内存跨越不同的物理页,物理页可能不连续。 就需要MDL结构了。
功能是分配一个MDL内存,根据VirtualAddress和长度。如果是在IRP相关调用的话(IRP非空),则
连接此MDL到IRP的相关结构。具体见如下代码:
ULONG allocateSize;
USHORT fixedSize;
PMDL mdl;
ULONG size;
PMDL tmpMdlPtr;
ASSERT(Length);
//
// If the requested length is greater than 2Gb, then we're not going
// to be able to map the memory, so fail the request.
//
if (Length & 0x80000000) {
return NULL;
}
// Allocate an MDL from the lookaside list or pool as appropriate.
//
mdl = NULL;
fixedSize = 0;
size = ADDRESS_AND_SIZE_TO_SPAN_PAGES(VirtualAddress, Length);
if (size > IOP_FIXED_SIZE_MDL_PFNS) {
allocateSize = sizeof(MDL) + (sizeof(PFN_NUMBER) * size);
if (allocateSize > MAXUSHORT) {
return NULL;
}
} else {
fixedSize = MDL_ALLOCATED_FIXED_SIZE;
allocateSize = sizeof(MDL) + (sizeof(PFN_NUMBER) * IOP_FIXED_SIZE_MDL_PFNS);
mdl = (PMDL)ExAllocateFromPPLookasideList(LookasideMdlList);
}
if (!mdl) {
mdl = ExAllocatePoolWithTag(NonPagedPool, allocateSize, ' ldM');
if (!mdl) {
return NULL;
}
}
//
// Now fill in the header of the MDL.
MmInitializeMdl(mdl, VirtualAddress, Length);
mdl->MdlFlags |= (fixedSize);
//
// Finally, if an IRP was specified, store the address of the MDL
// based on whether or not this is a secondary buffer.
//
if (Irp) {
if (!SecondaryBuffer) {
Irp->MdlAddress = mdl;
} else {
tmpMdlPtr = Irp->MdlAddress;
while (tmpMdlPtr->Next != NULL) {
tmpMdlPtr = tmpMdlPtr->Next;
}
tmpMdlPtr->Next = mdl;
}
}
return mdl;
- Mdl内存实现之原理1
- Windows MDL原理总结
- MDL内存映射
- ReactOS分析MDL实现
- Windows驱动中通过MDL实现用户态与核心态共享内存
- MDL
- MDL
- MDL
- MDL
- MDL
- MDL(内存描述符表) 详解
- 内存mmap实现原理
- 共享内存实现原理
- 共享内存实现原理
- windows 内存映射文件实现数据共享之原理
- Windows WDM型驱动编程之MDL
- 标准MDL方法修改Page、NonPage内存的属性
- 标准MDL方法修改Page、NonPage内存的属性
- mysql 全备+binlog 自动恢复shell脚本
- C++的类型转换:static_cast、dynamic_cast、reinterpret_cast和const_cast
- Windows 8 Metro开发疑难杂症——导航
- Hadoop分布式环境下的数据抽样
- 图像处理里面调色板(Palette)是什么意思?
- Mdl内存实现之原理1
- c++ stl library 学习(3)
- spring ioc原理 (很经典不错的一篇关于spring的文章)
- 教你怎么教你怎么在word主动创立备份文件
- 六、读取 个体变量 和 数据封装
- 童话 谢幕了。梦也该醒了:伤感日志
- Hibernate 检索方式
- 数据解析
- 毕业设计之路(2)——初识TCP