- 博客(51)
- 收藏
- 关注
原创 C++实现机制(二)——编译器实现对象模型的方法
没错哦,从题目可以看出本章是讲述编译器构建Class的方法。 作为C++核心基础之一的class,了解编译器背后为其做了哪些,是认识C++底层实现机制的关键,同时我看到,很多人在各类文章的只言片语中,对其进行了大量的充满迷信和传说的诠释。 要讲class,就不得不说说struct,因为编译器在构建它们的数据成员的方法上是相似的。这也是我最想让你知道的,即“通过类封装数据和操作本身是绝对没有额外成本的,效率和空间的牺牲大部分在于虚表的维护” 回到正题,我们实际上可以认
2010-08-04 11:40:00
1403
2
原创 C++底层机制(一)——开篇
很少有人质疑C语言生成代码的高效和精悍,然而C++究竟能多么接近C语言的水平呢? 相信长期以来存在这样的共识,核心算法为了效率常常抛弃C++而使用C,他们认为C++庞大又迟缓,比如他们拒绝使用C++编写数据库引擎,他们说:“继承和重载降低效率,并且C++背着你做很多事情” 我相信通过之后的一系列文章,会帮助您破除围绕在C++周围的迷信和传说。 除此之外,了解C++底层机制还能帮助您调试代码,同时避免将C语言的技巧移植到C++时,陷入险境。 另外,对于一些某些只提供C语言接口的平台,比如
2010-08-03 22:30:00
2291
原创 (六)NT驱动基础——驱动程序分层结构及其拓展
<br />一、垂直结构<br /> 从前文中我们得知“设备链”(也有译为设备栈)这个名称,它是指驱动对象pDriverObject->DeviceObject含有PDEVICE_OBJECT类型的NextDevice成员,显然这是一个由链表构成的设备链。<br /> 这样就形成了驱动程序的单向垂直结构,由于这样的结构可以通过设备依附不同的派遣函数,将单个驱动程序分成多层完成一个任务,同时,设备链并不要求其上设备对象属于同一驱动对象,这样又可以形成多个驱动程序的垂直结构。<br /> <
2010-07-31 09:28:00
984
原创 (五)NT驱动基础——分发函数的三种读写方式
要知道内核模式地址和用户模式地址是不可以直接互相读写的,那么它们之间的数据传递,是通过请求作为载体。这样产生了三种读写方式:1.缓冲区设备读写 2.直接设备读写 3.其他方式设备读写一、缓冲区设备读写1.原理: 缓冲区设备读写是应用程序将数据传通过请求递给内核缓冲区,它的优点是,比较简单的解决了用户地址传入的问题,缺点是应用程序与内核之间相互复制数据,效率较差
2010-07-29 21:34:00
1791
原创 (四)NT驱动基础——分发函数
一、分发函数的功能 学过用WinMain写窗口框架的人,一定了解窗口消息循环的原理。那么驱动程序又是如何相应的呢?答案是“请求分发” 先来看看“请求”是什么样的,它是应用程序通过API函数的接口发出的,发送给对应的驱动程序,但是又有一个问题,请求是有各种各样的类型,有的要求读,有的要求写,那么它们就要被分类后,分发到对应的自己编写的处理函数,这些函数叫做“分发函数”,也有翻译为“派遣函数”二、分发函数的基本形态//关于创建的分发函数,以IRP_MJ_CREATE请求为例NTSTTUS Creat
2010-07-29 20:23:00
3304
原创 (三)NT驱动基础——创建驱动设备 并 实现驱动与应用程序的通信
NT驱动需要至少在入口函数创建一个设备对,这个对象可以与物理设备建立映射,来操控物理设备;也可以独立存在,作为软件驱动设备一、设备对象的功能1.作为物理设备的虚拟映射,即作为物理设备与应用程序的中间层2.接收处理应用程序请求的实体二、设备对象的结构typedef struct _DEVICE_OBJECT{ CSHORT Type; CSHORT Size; ULONG ReferenceCount;//引用计数器 st
2010-07-29 17:05:00
1436
原创 (二)NT驱动基础——可动态卸载驱动编写 和 其安装卸载
上一篇文章我们编写了NT驱动的Hello World,但是编译好的驱动如何安装和卸载呢?事实上,上篇的hello World代码可以安装,不能动态卸载。所以我们来改造以下原来的代码,在驱动程序上添加卸载函数一、代码改造//Hello World.cVOID UnloadDriver(PDRIVER_OBJECT pDriver){ DbgPrint("Unload Driver of Hello World");}NTSTATUS DriverEntry( PDRIVER_OBJECT pDriver,P
2010-07-29 14:51:00
2104
原创 (一)NT驱动基础——Hello World
我习惯使用C++写驱动,好处很多,但是代码会复杂一点,所以以下代码都用C来写Hello World作为所有编程语言的起始阶段,不要轻视它,回避它。一、示例代码//Hello World.cNTSTATUS DriverEntry( PDRIVER_OBJECT pDriver,PUNICODE_STRING pRegistryPath){ DbgPrint("DriverEnter end/n"); return STATUS_SUCCESS;}二、分析1.DbgPrint是在内核模式下printf,并
2010-07-29 13:59:00
1202
原创 (零)预备,跑
一、安装驱动编译器——WDK下载地址:https://www.microsoft.com/china/whdc/resources/downloads.mspx选择你的平台选择32位还是64位勾选全部,下一步至最后二、安装虚拟机,并在其上安装windows 不论是使用VMware还是Virual PC都不难,唯一注意的是不要使用ghost版的windows,下一个安装版的。三、下载srvinstw,安装到虚拟机上四、下载DbgView,安装到虚拟机上五、下载IRPTrace,安装到虚拟机上六、下载WinDb
2010-07-29 13:02:00
909
原创 better C/C++ code(二)——谨慎使用goto
标准c/c++建议废弃使用goto,其对于goto的支持仅是对于旧代码的兼容然而我们在微软的新代码中仍然看到goto的存在,这是为什么?其实若是把goto当做汇编中的LOOP使用,的确是应该废弃的例如: int n=0; printf("input a string/n"); loop: if(getchar()!='/n') { n++; goto loop; } printf("%d",n); 我们看这
2010-07-29 12:19:00
1445
原创 better C/C++ code(一)——注释
前辈们总说代码要详细注释、给后人创造好的再利用和维护条件。然而事实是,再编写和调试所谓“艰难代码时”,程序员也很痛苦,让他们同时兼顾添加详细注释也实在是不堪重负。一则,代码能否需要再次修改并不确定;二则,项目完成后,公司基本不会给时间recode,一般都是聚餐、旅游...等等其实代码注释也可以这样写:a.代码注释尽量写在.h文件里,仅需写出作者、时间、功能、注意事项b.实现代码尽量依靠变量名和函数名等的含有完成“自注释”c.严禁变量一语多用d.函数只能有一个出口g.不使用类的继承,而利用类的多态性重新包装,
2010-07-29 11:38:00
899
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人