摘要: tuple元组定义了一个有固定数目元素的容器,其中的每个元素类型都可以不相同,这与其他容器有着本质的区别.是对pair的泛化。首先来介绍元组的创建和元组元素的访问。通过make_tuple()创建元组,通过get<>()来访问元组的元素。通过下面这段程序来认识这两个函数的用法:#include <iostream>#include <tuple>#include <functional>int main(){ auto t1 = std::make_tuple(10, "Test", 3.14); std::cout < 阅读全文
posted @ 2012-04-08 22:50 KingsLanding 阅读(20912) 评论(1) 推荐(4) 编辑
摘要: C++11引入了lambda表达式,使得程序员可以定义匿名函数,该函数是一次性执行的,既方便了编程,又能防止别人的访问。Lambda表达式的语法通过下图来介绍: 这里假设我们定义了一个如上图的lambda表达式。现在来介绍途中标有编号的各个部分是什么意思。Lambda表达式的引入标志,在‘[]’里面可以填入‘=’或‘&’表示该lambda表达式“捕获”(lambda表达式在一定的scope可以访问的数据)的数据时以什么方式捕获的,‘&’表示一引用的方式;‘=’表明以值传递的方式捕获,除非专门指出。Lambda表达式的参数列表Mutable 标识异常标识返回值“函数”体,也就是l 阅读全文
posted @ 2012-04-08 22:44 KingsLanding 阅读(23627) 评论(1) 推荐(2) 编辑
摘要: 老规矩发一篇英语学习笔记词类转换动词转换为名词: 1. 目前我国各地对各种消费品的需求量已大大增加 There is a big increase in number for all kinds of consumer goods in every part of our country. 2. 火箭已经用来探索宇宙 Rockets have found application for exploration of the universe. 3. 他们已经认识到越来越需要使某些经济部分工业化 they also realized the growing need and necessity 阅读全文
posted @ 2012-03-14 21:47 KingsLanding 阅读(1814) 评论(0) 推荐(1) 编辑
摘要: 在Driver_Entry()关联了一个处理IRP_MJ_DEVICE_CONTROL类型IRP的MajorFunction,xxxControl用于处理上层与驱动通信的数据。上层应用程序可以通过DeviceIoContro()与驱动程序进行通信。pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] =xxxControl;xxxControl函数的框架可定义为:NTSTATUS xxxControl(PDEVICE_OBJECT fdo, PIRP pIrp){ PAGED_CODE(); PDEVICE_EXTENSION pdx = 阅读全文
posted @ 2012-03-14 21:43 KingsLanding 阅读(3372) 评论(0) 推荐(0) 编辑
摘要: 首先在获得PCI配置空间资源的时候,就要获得中断资源,根据CM_PARTIAL_RESOURCE_DESCRIPTOR 结构的 Type 域来区分需要获得什么样的中断资源的时候,如果Type类型为:CmResourceTypeInterrupt,此时需要将中断资源从CM_PARTIAL_RESOURCE_DESCRIPTOR中取出:irql = (KIRQL) resource->u.Interrupt.Level; //中断级别 vector = resource->u.Interrupt.Vector; // 中断向量 affinity = resource->u.Int 阅读全文
posted @ 2012-03-14 21:35 KingsLanding 阅读(3313) 评论(0) 推荐(0) 编辑
摘要: 当要移除设备的时候,IO管理器发送IRP_MN_REMOVE_DEVICE 类型的IRP包,这是一个即插即用型的IRP包。通过调用即插即用例程来处理。由于在Driver_Entry()函数中,将即插即用的函数和处理Pnp的MajorFunction进行了绑定,即:pDriverObject->MajorFunction[IRP_MJ_PNP] =xxxPnp;NTSTATUS xxxPnp(IN PDEVICE_OBJECT fdo,IN PIRP Irp){ …}该函数前面都已经提到过,通过调用下面函数来完成:NTSTATUS HandleRemoveDevice(PDEVICE_EX 阅读全文
posted @ 2012-03-14 21:32 KingsLanding 阅读(1131) 评论(0) 推荐(0) 编辑
摘要: 1. ExAllocatePool()函数说明:ExAllocatePool allocates pool memory of the specified type and returns a pointer to the allocatedblock.函数定义:PVOID ExAllocatePool( __in POOL_TYPE PoolType, __in SIZE_T NumberOfBytes);代码中用来分配设备描述DMA adepter设备的特性(DEVICE_DESCRIPTION),作为参数传递给IoGetDmaAdapter()函数。在调用IoGetDmaAdapter( 阅读全文
posted @ 2012-03-14 21:31 KingsLanding 阅读(3323) 评论(0) 推荐(0) 编辑
摘要: PCI有三个相互独立的物理地址空间:设备存储器地址空间、I/O地址空间和配置空间。配置空间是PCI所特有的一个物理空间。由于PCI支持设备即插即用,所以PCI设备不占用固定的内存地址空间或I/O地址空间,而是可以由操作系统决定映射的基址。系统加电时,BIOS检测PCI总线,确定所有连接在PCI总线上的设备以及它们配置要求,并进行系统配置。所以,所有PCI设备必须实现配置空间,从而能实现参数自动配置,实现真正的即插即用。前面简单介绍了一下PCI设备的特性。现在来介绍一种方位PCI设备配置空间的常用方式:通过即插即用IRP获得PCI配置空间。在WDM驱动中,总线驱动会为每个设备提供一个PDO设备, 阅读全文
posted @ 2012-03-14 21:26 KingsLanding 阅读(6209) 评论(0) 推荐(0) 编辑
摘要: 从IRP说起IRP(I/O request package)是操作系统内核的一个数据结构。应用程序与驱动程序进行通信需要通过IRP包。当上层应用程序需要与驱动通信的时候,通过调用一定的API函数,IO管理器针对不同的API产生不同的IRP,IRP被传递到驱动内部不同的分发函数进行处理。对于不会处理的IRP包需要提供一个默认的分发函数来处理。现在我们来看一下IRP的结构:typedef struct _IRP { … PMDL MdlAddress; ULONG Flags; union {struct _IRP *MasterIrp;… PVOID SystemBuffer; } Associ 阅读全文
posted @ 2012-03-14 21:14 KingsLanding 阅读(17569) 评论(0) 推荐(1) 编辑
摘要: 现在来探讨一下比较重要的xxxAddDevice 例程。NTSTATUS xxxAddDevice(IN PDRIVER_OBJECT DriverObject,IN PDEVICE_OBJECT PhysicalDeviceObject)该函数用来创建设和添加新设备对象。其中DriverObject是由I/O管理器传来的驱动对象,也就是是Driver_Entry()函数中的那个驱动程序对象。PhysicalDeviceObject 代表设备堆栈底部的物理设备对象(由总线驱动创建,其实就是操作系统创建,一般被称为PDO)。xxxAddDevice函数的基本职责是创建一个设备对象并把它连接到以P 阅读全文
posted @ 2012-03-14 21:08 KingsLanding 阅读(2079) 评论(0) 推荐(0) 编辑