摘要: 驱动程序中字符串操作涉及到ASCII字符串、宽字符串,还有DDK定义的ANSI_STRING数据结构和UNICODE_STRING数据结构。1)ASCII字符串和宽字符串在应用程序中使用两种字符:一是char型字符串,负责记录ANSI字符集,它是指向一个char数组的指针,每个char型变量大小是一个字节,字符串是以0标志字符串结束的;一是wchar_t型的宽字符串,负责描述unicode字符集,它是指向一个wchar_t数组的指针,wchar_t字符大小为两个字节,字符串以0标志字符串结束。ANSI字符构造如下:char*str1 ="ASCE";UNICODE字符构造如 阅读全文
posted @ 2014-03-25 20:21 胡炜 阅读(891) 评论(0) 推荐(0) 编辑
摘要: 调用约定:调用约定指的是函数被调用时,会按照不同规则,翻译成不同的汇编代码。当一个函数被调用时,首先会将返回地址压入堆栈,紧接着会将函数的参数依次压入堆栈。不同的调用约定,会指明不同的参数入栈顺序,还会指明不同的清理堆栈的方法。用C语言或者C++语言编译器编译程序时,会有四种不同的调用约定去编译函数:C语言的调用约定,函数由__cdecl修饰;标准调用约定,函数由__stdcall修饰;快速调用约定,函数由__fastcall修饰;C++类成员函数的调用约定,函数由thiscall修饰。不同的调用约定编译后,会产生不同的汇编代码。下面只介绍C语言调用约定和标准调用约定。C语言调用约定要求在声明 阅读全文
posted @ 2014-03-25 20:20 胡炜 阅读(527) 评论(0) 推荐(0) 编辑
摘要: 内存管理概念:1)物理内存PC上有三条总线:数据总线、地址总线和控制总线。32位CPU的寻址能力是4GB个字节,用户最多可以使用4GB的真实物理内存。PC中很多设备都提供了自己的设备内存,例如显卡就提供了自己的显存。这部分内存会映射到PC的物理内存上,也就是读写这段物理地址,其实会读写的设备内存地址,而不会读写物理内存地址。2)虚拟内存地址Windows所有程序(包括Ring0层和Ring3层的程序)可以操作的都是虚拟内存。之所以称为虚拟内存,是因为对它的所有操作最终都会变成一系列对真实物理内存的操作。CPU中有一个重要的寄存器CR0,它是32位的寄存器,其中的一个位(PG位)是负责告诉系统是 阅读全文
posted @ 2014-03-25 20:01 胡炜 阅读(1088) 评论(0) 推荐(0) 编辑
摘要: WDM驱动的基本结构:WDM驱动模型是建立在NT式驱动程序模型基础之上的。对于WDM驱动程序来说,一般都是基于分层的,即完成一个设备的操作,至少要由两个驱动设备共同完成。1)物理设备对象和功能设备对象物理设备对象(Physical Device Object,PDO)和功能设备对象(Function Device Object,FDO)的关系是“附加”与“被附加”的关系。当PC插入某个设备时,PDO会自动创建。确切的说,是由总线驱动创建的。PDO不能单独操作设备,需要配合FDO一起使用。系统会提示检测到新设备,要求安装驱动程序。需要安装的驱动程序就是WDM程序,此驱动程序负责创建FDO,并且附 阅读全文
posted @ 2014-03-25 18:56 胡炜 阅读(1001) 评论(0) 推荐(0) 编辑
摘要: Windows驱动程序分为两类:一类是不支持即插即用功能的NT式驱动程序;另一类是支持即插即用功能的WDM驱动程序。NT式驱动的基本结构:1)驱动加载过程与驱动入口函数DriverEntry:驱动程序入口点函数通常命名为DriverEntry,也可以指定另外的名字,但最好遵循这个名字:DRIVER_INITIALIZE DriverEntry;NTSTATUS DriverEntry(__instruct_DRIVER_OBJECT *DriverObject,//指向驱动对象的指针__inPUNICODE_STRING RegistryPath//指向设备服务键的键名字符串的指针){ ... 阅读全文
posted @ 2014-03-25 18:55 胡炜 阅读(1075) 评论(0) 推荐(0) 编辑
摘要: 驱动对象:每个驱动程序都会有唯一的驱动对象与之对应,并且这个驱动对象是在驱动加载时被内核中的对象管理程序所创建的。驱动对象用DRIVER_OBJECT数据结构表示,它作为驱动的一个实例被内核加载,并且内核对一个驱动只加载一个实例。确切地说,是由内核中的I/O管理器负责加载的,驱动程序需要在DriverEntry中初始化。驱动对象的结构定义如下(wdm.h):typedefstruct_DRIVER_OBJECT {//结构的类型和大小CSHORT Type;CSHORT Size;//每个驱动程序会有一个或多个设备对象,其中,每个设备对象都有一个指针指向下一个驱动对象//最后一个设备对象指向空 阅读全文
posted @ 2014-03-25 18:54 胡炜 阅读(667) 评论(0) 推荐(0) 编辑
摘要: 1)用VS2010新建Win32 Console Application,工程名为ACECore,工程建立完成后得到打开文件ACECore.cpp,代码如下:#include"stdafx.h"int_tmain(intargc, _TCHAR* argv[]){return0;}2)用VS2010查看汇编代码的方法:1. VC必须处于debug状态才能看到汇编指令窗口。因此在上面代码return 0一句上设置断点。2.按下F5键调试程序,当程序停在断点处时,打开菜单“Debug”下的“Windows”子菜单,选择“Disassembly”。这样就出现反汇编窗口,显示汇编代 阅读全文
posted @ 2014-03-25 18:53 胡炜 阅读(874) 评论(0) 推荐(0) 编辑
摘要: 一、几个基本的概念1.存储器的金字塔结构存储器从下之上依次是磁盘/flash、DRAM(内存)、L2-cache、L1-cache、寄存器,越在上面的存储器访问速度越快,同时价格也越昂贵,每一级都可以看做是下一级的缓存,内存是磁盘的缓存,cache是内存的缓存。2.地址空间地址空间就是一个非负正数的有序集合,如果是连续的即线性地址空间,从硬件的角度看就是处理器所能访问的存储器空间,与地址线的位数相关,物理地址空间就是物理存储器的访问空间(按字节访问)3.页将物理内存和虚拟内存按页来划分,页的大小也有所不同,ARM中支持1M的大页,4k或64k的细页,x86下支持4M的大页,利用页表来表征整个地 阅读全文
posted @ 2014-03-25 18:48 胡炜 阅读(1584) 评论(0) 推荐(0) 编辑