MDL(内存描述符表) 详解
- 格式:doc
- 大小:31.00 KB
- 文档页数:4
基于PCI总线的IP仿真验证平台的WDM驱动程序设计
陈国辉郑学仁
(华南理工大学微电子研究所,广州510641)
基金项目:广东省科技厅重点攻关计划项目(123B29630)
kornecor@
摘要:本文以介绍了在Windows 2000/XP下,开发基于PCI总线的IP仿真验证平台的WDM设备驱动程序和应用程序的基本方法,以DCT/IDCT(逆离散余弦变换)的IP为例子给出平台的实际应用。并指出广泛使用的开发工具DriverStudio2.7的一些严重漏洞。
关键词:WDM;DriverStudio;I/O读写;IP仿真验证
中图分类号:TP311.52 文献标识码:A
WDM Device Driver Design of the IP Emulation-Verification platform based
on the PCI bus
Chen Guohui Zheng Xueren
(Microelectronics Institute, South China University of Technology, Guangzhou, 510641) Abstract:This paper discusses the WDM Device Driver and application Design of the IP Emulation-Verification platform based on the PCI bus in a Windows2000/XP operating system. It analyses the application of the platform in an IP application example named DCT/IDCT and points out some serious bugs of DriverStudio2.7 which is a wide using development tool.
MDL(内存描述符表)详解
MDL(内存描述符表)详解
分类:初学驱动2013-01-25 18:07 308人阅读评论(0) 收藏举报mdl
以下的虚拟内存可以理解成逻辑内存,因为我觉得只有这样才能讲通下面所有的东西。以下的“未分页”指没有为页进行编码。
以下为MDL结构体(我很郁闷,我在MSDN上没有找到这个结构体)
typedef struct _MDL {
struct _MDL *Next; //下一个MDL
CSHORT Size; //大小
CSHORT MdlFlags; //标志,保护属性等
struct _EPROCESS *Process;//
PVOID MappedSystemVa;
PVOID StartVa;
ULONG ByteCount;
ULONG ByteOffset;
} MDL, *PMDL;
如何使用MDL:
一个连续的虚拟内存地址范围可能是由多个分布(spread over)在不相邻的物理页所组成的。系统使用MDL(内存描述符表)结构体来表明虚拟内存缓冲区的物理页面布局。我们应该避免直接访问MDL。我们可以使用MS-Windows提供的宏,他们提供了对这个结构体基本的访问。
·MmGetMdlVirtualAddress 获取缓冲区的虚拟内存地址
·MmGetMdlByteCount 获取缓冲区的大小(字节数)
·MmGetMdlByteOffset 获取缓冲区开端的物理页的大小(字节数)·MmGetMdlPfnArray 获取记录物理页码的一个数组指针。
我们可以用IoAllocateMdl函数来分配一个MDL。如果要取消分
内存详解⼤全
⼀. 内存概述
内存是计算机中重要的部件之⼀,它是与CPU进⾏沟通的桥梁。计算机中所有程序的运⾏都是在内存中进⾏的,因此内存的性能对计算机的影响⾮常⼤。内存(Memory)也被称为内存储器,其作⽤是⽤于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。只要计算机在运⾏中,CPU就会把需要运算的数据调到内存中进⾏运算,当运算完成后CPU再将结果传送出来,内存的运⾏也决定了计算机的稳定运⾏。内存的特点是存取速率快。
内存是电脑中的主要部件,它是相对于外存⽽⾔的。我们平常使⽤的程序,如Windows操作系统、打字软件、游戏软件等,⼀般都是安装在硬盘等外存上的,但仅此是不能使⽤其功能的,必须把它们调⼊内存中运⾏,才能真正使⽤其功能,我们平时输⼊⼀段⽂字,或玩⼀个游戏,其实都是在内存中进⾏的。通常我们把要永久保存的、⼤量的数据存储在外存上,⽽把⼀些临时的或少量的数据和程序放在内存上,当然内存的好坏会直接影响电脑的运⾏速度。
⼆. 内存分类
内存可以根据存储能⼒与电源的关系可以分为以下两类:易失性存储器,⾮易失性存储器。
⾮易失性存储器(Non-volatile memory)是指即使电源供应中断,存储器所存储的数据并不会消失,重新供电后,就能够读取内存数据的存储器。主要为RAM(Random access memory,随机访问存储器),存储单元的内容可按需随意取出或存⼊,且存取的速度与存储单元的位置⽆关的存储器。这种存储器在断电时将丢失其存储内容,故主要⽤于存储短时间使⽤的程序。
(转)MDL及MDL宏MDL函数
⼀. MDL是什么
在MSDN中有这样的定义
内存描述符列表 (MDL) 是⼀个系统定义的结构,通过⼀系列物理地址描述缓冲区。执⾏直接 I/O 的驱动程序从 I/O 管理器接收⼀个 MDL 的指针,并通过 MDL 读写数据。⼀些驱动程序在执⾏直接 I/O 来满⾜设备 I/O 控制请求时也使⽤ MDL。
因此通俗的解释⼀下,MDL仅仅运⽤于内核中,在应⽤层并不会涉及这个结构,由于内核中的驱动有跟应⽤层程序通信的需要,因此可能会接收到来⾃进程空间的虚拟地址,⽽在windows的分页机制下,进程空间中的任何⼀个虚拟地址所属的页⾯都有可能被内存管理器从RAW置换到页⽂件中,或者,进程被释放或是取消地址的映射。这些都会导致严重的错误发⽣。因此内核创建⼀个MDL,并将其与来⾃进程空间的虚拟地址相关联,当需要对这些虚拟地址进⾏读写的时候调⽤相关的内核函数,锁定这些虚拟地址对应的物理页⾯和逻辑页⾯,防⽌物理页⾯被置换,逻辑页⾯被修改或者释放。
另外⼀种情况下⼀个驱动程序在执⾏纯内核任务中也可以使⽤MDL,特别的仅仅调⽤⾮分页内存的话,这些页⾯是不会置换到页⽂件中的,因此不需要考虑锁定页⾯的问题。
⼆. MDL的内容
先看看wdm.h中MDL的定义:
typedef __struct_bcount(Size) struct _MDL
{
struct _MDL *Next;
CSHORT Size;
CSHORT MdlFlags;
struct _EPROCESS *Process;
IDL⽂件详解[转]
IDL详解 - Alex_ - 博客园
Question:
什么是IDL和MIDL?
Answer:
IDL是接⼝定义语⾔。
MIDL是Microsoft的IDL编译器。
在⽤IDL对接⼝和组件进⾏了描述后,可以⽤MIDL进⾏编译,⽣成相应的代理和存根DLL的C代码。
⼀个例⼦:
import “unknown.idl” ///⽤于将其他IDL⽂件中的定义包含到当前⽂件中
///Interface IX
[ ///注意是[ ]不是 {}
object, ///所定义的接⼝是⼀个COM接⼝
uuid(32bb8323-b41b-11cf-a6bb-0080c7b2d682), ///相应的接⼝IID
helpstring(“IX Interface”), ///将帮助串放⼊类型库
pointer_default(unique) ///这类指针可以为空,函数内可以修改它们的值,但不能指定别名
]
interface IX:IUnknown
{
///in关键字告诉MIDL需要将此参数值从客户传递给组件,存根代码不需要送回任何值。
HRESULT FxStringIn([in,string]wchar_t* szIn);
///out关键字告诉MIDL参数仅被⽤来从组件向客户传回有关的数据,
///代理不需要对输出参数进⾏列集,也不需要将参数传给组件。
HRESULT FxStringOut([out,string]wchar_t* szout);
///COM对字符串的标准约定是Unicode字符(即wchar_t)
内存名称详解
PC-66
这种内存使用66MHz的频率,而这也是第一代的SDR SDRAM内存。
PC-100
同样的,这种内存只是将工作频率提升到了100MHz,工作在CAS3模式下。
PC-133
这次改变还是只是将频率提升到133MHz,同样工作在CAS3模式下。
PC-150
这种内存并非官方发布的一个版本,而PC-150实际上就是一个超频版的内存。通常这种内存可以运行在150MHz频率CAS3模式或者是133MHz频率CAS2模式下,但是据说Corsair 的PC-150内存可以在150MHz 的频率下以CAS2的模式工作。
PC-166
另外一类超频内存,只是单纯的超频使得频率达到了一个新高点而已,仍然运行在CAS3之下。
PC-180
可以算作是另类的超频内存了,它简单的将频率提升到了180MHz,但是我个人认为这种内存没有实际使用的意义,因为毕竟现在DDR内存的价格已经是非常便宜了。
DDR SDRAM
DDR内存按照速度分类就可以用两种方法来进行分类了。第一种就是以DDRXXX这种方式命名。后边的“XXX”就表示了这个内存是以两倍于XXX的速度运行的内存。另外一种就是以PCXXXX进行命名。后边的“XXXX”就是内存的带宽。
PC1600
此类DDR内存就是最早的一代DDR内存了。它的工作频率为200MH(由于是DDR内存,所以频率增加一倍,就是100MHz x2所以实际上这类内存是工作在200MHz的频率下的),而工作模式为CAS2.5。
DDR266/PC2100
现在最普遍见到的DDR内存,工作频率为266MHz,工作模式为CAS2.5。
Mysql中DDL,DML,DCL,TCL是什么意思?
在⼀些公司中提交给测试团队的SQL脚本会划分为DDL、DML等,但这些概念到底是如何定义的呢?
SQL(Structure Query Language)是数据库操作的的核⼼语⾔,接下来我们通过⼀张图来进⾏分析:
DDL(Data Definition Languages)语句:即数据库定义语句,⽤来创建数据库中的表、索引、视图、存储过程、触发器等,常⽤的语句关键字有:CREATE,ALTER,DROP,TRUNCATE,COMMENT,RENAME。
DML(Data Manipulation Language)语句:即数据操纵语句,⽤来查询、添加、更新、删除等,常⽤的语句关键字有:
SELECT,INSERT,UPDATE,DELETE,MERGE,CALL,EXPLAIN PLAN,LOCK TABLE,包括通⽤性的增删改查。
DCL(Data Control Language)语句:即数据控制语句,⽤于授权/撤销数据库及其字段的权限(DCL is short name of Data Control Language which includes commands such as GRANT and mostly concerned with rights, permissions and other controls of the database system.)。常⽤的语句关键字有:GRANT,REVOKE。
TCL(Transaction Control Language)语句:事务控制语句,⽤于控制事务,常⽤的语句关键字有:
32位程序段描述符表
(原创版)
目录
1.32 位程序概述
2.段描述符表的概念和作用
3.段描述符表的结构
4.段描述符表的实例分析
5.32 位程序与段描述符表的关系
正文
【32 位程序概述】
32 位程序是指使用 32 位地址空间来寻址内存的程序。相较于 16 位或 64 位程序,32 位程序具有更大的内存空间,可以更高效地处理数据。在 32 位程序中,内存被划分为多个段(segment),每个段都有其独立的属性,如代码段、数据段、堆等。
【段描述符表的概念和作用】
段描述符表(Segment Descriptor Table,简称 SDT)是一个重要的数据结构,用于描述 32 位程序中的各个段。它包含了每个段的基地址(base address)、界限(limit)以及访问权限(permission)等信息。通过段描述符表,操作系统和程序员可以对内存进行有效的管理和访问控制。
【段描述符表的结构】
段描述符表是一个数组,通常位于内存的某个固定位置。数组的每个元素称为一个段描述符(segment descriptor),它包含以下三个字段:
1.段类型(Type):表示段的类型,如代码段、数据段等。
2.段基地址(Base Address):表示段在内存中的起始地址。
3.段界限(Limit):表示段在内存中的最大地址。
【段描述符表的实例分析】
以一个简单的 32 位程序为例,它可能包含两个段:代码段和数据段。代码段用于存储程序的指令,数据段用于存储程序运行过程中产生的数据。段描述符表可能如下所示:
```
代码段:
一 MDL介绍
MDL = MicroStation Development Language(Libraary),即MicroStation 开发语言库,它是一种基于C/C++的开发语言,用于开发专业级的MicroStation应用程序。
MDL分PureMDL和NativeCode两种开发方式:
PureMDL C(用Bentley提供的编译器生成伪代码执行),MA
NativeCode C++(用微软的编译器生成DLL),MA+DLL
使用特定的资源定义用户界面(GUI),也可以用MFC对话框来做界面,
开发NativeCode程序,需要安装微软公司的Visual Studio软件包。
二为什么从PureMDL过渡到NativeCode
1.可以方便调用所有操作系统的功能,如COM、ADO、Activex等;
2.除仍然可以用原来的.R资源建立界面外更可以用MFC对话框;
3.对于复杂的计算量大的程序,在性能上会有较大的提升;
4.可以利用提供的直观而强大的调试功能对程序进行调试。
三 MDLProject向导的安装及使用
1.需要安装的软件:VS2005,V8i或V8iSS1,V8iSDK;
2.设置系统环境变量MSV8i指向MicroStation或MSV8iSS1的安装目录;
3.将MDLProjectWizard2005.rar减压到VS2005对应的VC目录下;
4.启动VS2005,选择New菜单下的Project,在Visual C++分类右侧选择
MDLProjectWizard,然后依提示建立项目。
什么是SSDT ?
SSDT (System Service Dispatch Table )系统服务描述符表系统服务描述符表,,它用来查询处理系统调用的特定函数的特定函数。。也就是说也就是说,,
这个表把ring3下UserMode 的Win32 API 同ring0下Kernel API 相联系相联系。。
SSDT HOOK 有什么用有什么用??
通过修改SSDT 中的函数入口地址来HOOK SSDT 中的函数中的函数,,
你可以过滤掉你所关心的特定结果特定结果,,从而欺骗操作系统从而欺骗操作系统。。比如比如,,你可以隐藏特定的进程你可以隐藏特定的进程,,隐藏文件隐藏文件,,隐藏端口等等隐藏端口等等。。
下面让我们正式进入到SSDT HOOK 的探索旅程中吧!
我首先会阐述一些关于SSDT 的基本概念的基本概念,,然后介绍了SSDT 工作的原理工作的原理,,再次介绍如何绕过内存的写保护来修改SSDT ,最后通过一个简单的例子来介绍如何使用SSDT HOOK 来隐藏进程来隐藏进程。。
SSDT 的基本概念
SSDT 通过索引系统调用号来查找在内存中的函数地址通过索引系统调用号来查找在内存中的函数地址。。
而另一个被称为SSPT (System Service Parameter Table )系统服务参数表系统服务参数表,,它则指定了每一个系统服务的函数参数的字节数。
KeServiceDescriptorTable 是一个内核的是一个内核的导出表导出表导出表,,这个表中包含一个指向部分SSDT 的指针指针。。而SSDT 中则包含着内核的主要部分中则包含着内核的主要部分,,Ntoskrnl.exe 中的核心系统服务的实现中的核心系统服务的实现。。KeServiceDescriptorTable 当然也包含一个指向SSPT 的指针的指针。。
自从电脑问世以来,内存一直是计算机硬件中的一个重要组成部分。
它直接影响着计算机的运行速度和性能。而在计算机内存的管理和监
控中,dmidecode命令是一个非常有用的工具。本文将深入探讨dmidecode memory参数,帮助读者更好地理解这一主题。
dmidecode是一个基于DMI(Desktop Management Interface)
标准的命令行工具,可以用来获取有关系统硬件的信息。在使用dmidecode时,使用dmidecode -t memory命令可以获得系统内
存的详细信息。这些信息包括内存插槽的数量、已安装内存条的容量
和速度等内容。
1. 内存插槽的数量
dmidecode memory参数中的一个重要信息是内存插槽的数量。通过这个参数,我们可以了解到系统中有多少个内存插槽可用,以及每
个插槽中是否已经安装了内存条。这对于后续升级内存或者查找故障
时非常重要。
2. 已安装内存条的容量和速度
另一个需要重点关注的信息是已安装内存条的容量和速度。容量决
定了系统可以同时运行的程序数量和数据处理能力,而速度则直接影
响了内存的读写效率。通过dmidecode命令获取这些参数,我们可
以更好地了解系统的内存配置,从而有针对性地进行内存升级或调整。
在使用dmidecode memory参数时,我们不仅可以得到硬件规格的信息,还可以了解系统内存的工作状态和使用情况。这些信息有助于我们更好地优化系统的性能,提高计算机的运行效率。
个人观点和理解:
通过对dmidecode memory参数的深入了解,我认为这个命令对于管理和监控计算机内存非常重要。它提供了大量关于内存硬件的详细信息,帮助我们更好地理解和把握系统的内存使用情况。在进行内存升级或故障排查时,这些信息能够为我们提供有力的支持,让我们的操作更加高效和准确。
驱动使⽤MDL⽅式读写内存
背景
通常,我们在内核中修改内存的时候,都是通过修改 CR0 寄存器,关闭内存写保护属性,然后再写⼊内存的⽅式来修改内存。我个⼈不喜欢这种⽅式,因为总感觉我们使⽤没有线程接⼝函数的⽅法,总感觉不太稳定,⽽且,在 64 位程序下,CR0 ⽅式不再适⽤了。
所以,我强烈推荐在内核下使⽤ MDL ⽅式来修改内存,在 32 位内核和 64 位内核下同样有效。
内存描述符列表 (MDL) 是⼀个系统定义的结构,通过⼀系列物理地址描述缓冲区。MDL的全称是 Memory Descriptor List,即内存描述符表。可以通过MDL描述⼀块内存区域,在MDL中包含了该内存区域的起始地址、拥有者进程、字节数量、标记等信息。
MDL 是⽤来建⽴⼀块虚拟地址空间与物理页⾯之间的映射。对这句话的理解是使⽤ MDL 来修改内核内存的关键。当我们要对⼀块内核内存进⾏修改的时候,我们先为这块内存创建 MDL,那么就会建⽴⼀块新的虚拟内存空间,与将要修改内存对应的物理空间相映射。也就是说,同⼀块物理空间,映射了两块不同的虚拟内存地址。我们可以通过这两个虚拟内存地址,来操作这块物理内存,这便是 MDL 修改内存的实现思路。
那么,使⽤ MDL ⽅式修改内存具体的实现流程如下:
⾸先,给定缓冲区的起始地址和长度,调⽤ MmCreateMdl 函数分配⼀个⾜够⼤的 MDL 结构来映射给定的缓冲区
然后,调⽤ MmBuildMdlForNonPagedPool 函数来更新 MDL 对物理内存的描述。
最后,调⽤ MmMapLockedPages 函数将 MDL 中描述的物理页⾯映射到虚拟内存中,并返回映射的虚拟内存地址,这样我们就可以通过新映射的虚拟内存地址,操作同⼀块物理页⾯了,以此实现修改指定内存的数据。
硬盘MDL号解析
希捷硬盘各型号数字代表的意思:
此款硬盘的编号为ST3120026AS。
前两位字母“ST”表示希捷。“ST”后面的每一位数字“3”表示硬盘的外现,希捷硬盘的外型主要有以下几种,分别用数字“1、3、4、5、9”来表示:
1 -代表3.5英寸全高硬盘,厚度:41mm
3 -代表3.5英寸半高硬盘,厚度:25mm
4 -代表现在已被淘汰的5.25英寸硬盘。厚度:82mm
5 -代表3.5英寸硬盘,厚度:19mm
9 -代表2.5英寸半高硬盘。
这款产品的第一位数字为“3”,也就代表是采用了3.5英寸半高硬盘,厚度:25mm的盘体。
从第2位数字开始,至第5位结束,也就是2-3-4-5位,代表硬盘容量,单位为100M。当然百GB以下的硬盘就是2-3-4位。
1200表示:1200 × 100M=120G
800表示:800 × 100M=80G
第6位和第7位数字,也就是6-7位,代表硬盘标志,由主标志和副标志组成。第一位表示在普通IDE硬盘中的盘片数,如这里为“2” ,表示此盘由两张盘片组成;
第二位只在在主标志相同或无效时才有用,表示硬盘的代数,数字越大,代数越高,即此硬盘越新。而在Seagate的SCSI硬盘中,其主标识则是指硬盘的转速了。
8位:由1到3个字母组成,代表硬盘接口类型。
A -代表:Ultra ATA,即普通IDE/EIDE接口,这是大多数桌面硬盘所采用的接口类型;
AS -代表:Serial ATA,即 SATA 硬盘接口。
AG -代表:笔记本电脑专用的ATA的接口(以下都是不常用的:)