摘要: 这只是一篇读书笔记。1. 中断请求级 中断请求(IRQ)可以分为软件中断和硬件中断,这些中断都映射成不同级别的中断请求级(IRQL).同步处理机制很大程度上依赖于中断请求级。 传统PC中,一般可以产出16个中断信号,每一个中断信号对应于一个中断号。硬件中断可以分为不可屏蔽和可屏蔽,分别由CPU得两根引脚NMI和INTR来接收。 X86机器基本上涌高级可编程控制器(APIC)来代替NMI和INTR。APIC把IRQ的数量增加到了24个。 我们可以看下图: 图一 windows 将中断的概念进行了扩展,提出中断请求级(IRQL)的概念。规定一共有32个中断请求级,其中0~2为软件中断,3~31为硬 阅读全文
posted @ 2011-01-16 15:24 sld666666 阅读(560) 评论(0) 推荐(0) 编辑
摘要: 这只是一篇读书笔记。 派遣函数(Dispathc Funtion)是windows驱动中的重要概念。驱动程序的主要功能是负责处理I/O请求,其中大部分I/O请求是在派遣函数中处理的。用户模式下所有对驱动程序的I/O请求。全部由操作系统转化为一个叫做IRP的数据结构,不同的IRP数据会派遣到不同的派遣函数中。 IRP(I/O Request Package) 和windows应用程序的消息处理机制相似。 IRP中一个MajorFunction, 其保存派遣的函数。如:[代码]处理这些IRP最简单的方法是在相应的派遣函数中将IRP的状态设置为成功, 结束IRP请求(IoCompleteReques 阅读全文
posted @ 2011-01-15 21:43 sld666666 阅读(1583) 评论(0) 推荐(0) 编辑
摘要: 这只是一篇读书笔记。1. 对文件的操作 驱动程序开发中,经常会用到对文件的操作。DDK提供了一整套对文件的操作函数。其实现是:用ZwCreateFile 打开(ZwOpenFile)或者创建一个文件。通过OBJECT_ATTRIBUTES指定文件名,这个结构体通过InitializeObjectAttributes设置。这里需要注意的一点就是符号链接的概念。比如我们要写“c:\1.log”, 则必须写成“\??\c:”,windows 内核会把它替换成设备名”\Device\HarddiskVolume1”利用ZwSetInformationFile 获取或者修改文件属性。用ZwWriteFi 阅读全文
posted @ 2011-01-15 20:57 sld666666 阅读(610) 评论(0) 推荐(0) 编辑
摘要: 本文只是一篇读书笔记。1. 内存类型分页内存: 虚拟内存可以交换到文件中的。非分页内存:虚拟内存不可以交换到文件中。当程序中断请求级别在DISPATCH_LEVEL之上是,只能使用非分页内存。如:把函数放入分页或者非分页内存:#define PAGEDCODE code_seg(“PAGE”)#LOCKEDCODE code_seg()将一个函数载入到分页内存中:[代码]PAGED_CODE(); 是DDK 提供的宏。2. 分配内核内存windows 内核的栈空间不像应用程序这么大, 所以驱动程序不适合递归调用或者局部变量时大型的结构体。如果需要, 则需要在堆中申请。堆中申请的函数有以下几个: 阅读全文
posted @ 2011-01-15 20:18 sld666666 阅读(626) 评论(0) 推荐(0) 编辑
摘要: 这边文章参考至《windows驱动开发技术详解》一书。其中代码90%是摘抄的。 我们以hello world 来开始windows内核的旅程吧。 要输出一个hello world, ddk 中需要如下几个步骤 1. 打开一个创建一个设备对象 这个驱动对象是我们一系列操作的载体(IoCreateDevice) 2. 实现分发函数(MajorFunction), 在分发函数中, 做输出“hello world ”的功能。 3. 删除创建的设备对象。 1. 入口函数 当编写一个应用程序时候,windows 直接从main 函数开始执行生成一个进程。但是内核模块并不生成一个进程,只是填写了一组回调函 阅读全文
posted @ 2011-01-09 20:48 sld666666 阅读(748) 评论(1) 推荐(0) 编辑
摘要: windows 内核编程有自己的特点,下面是初涉其中的总结。文章的内容摘自《寒江独钓---windows内核安全编程》1. 基本数据类型 为了消除平台和编译器的差异,WDK定义了一套自己的数据类型。ULONG, UCHAR,UNIT VOID……2. 函数返回值 绝大部分内核API 都有一个返回值, 我在自己写的时候也需要:[代码]3. 字符串 WDK 中用UNICODE_STRING 表示字符串[代码]如:[代码]其中 RTL_CONSTANT_STRING 宏是用来创建一个字符串的。%wZ 是用来格式化输出字符串的, 和int 用%d, char用%c 同理。4. 重要的数据结构 wind 阅读全文
posted @ 2011-01-06 22:42 sld666666 阅读(662) 评论(0) 推荐(0) 编辑
摘要: 首先是几个内存分配的函数Ex_系列函数功能简述ExAllocatePool内存分配ExFreePool释放内存ExAcquireFastMutex获取一个互斥体ExRekeaseFastMutex释放一个互斥体ExRasiseStatus抛出一个异常下面是一组文件操作的函数Zw-系列函数功能简述ZwCreateFile打开文件(设备)ZwWriteFile写文件ZwReadFile读ZwQueryDirectoryFile目录查询ZwDeviceloControFile发出设备控制请求ZwCreateKey打开一个注册表键ZwQueryValueKey提取一个注册表的值在进行字符串操作时,要用 阅读全文
posted @ 2011-01-06 22:39 sld666666 阅读(1527) 评论(0) 推荐(0) 编辑
摘要: 用python实现了一个小型的自动发版本的工具。这个“自动发版本”有点虚, 只是简单地把debug 目录下的配置文件复制到指定目录,把Release下的生成文件复制到同一指定,过滤掉不需要的文件夹(.svn),然后再往这个指定目录添加几个特定的文件。 这个是我的第一个python小程序。 下面就来看其代码的实现。首先插入必要的库:[代码]然后就是一大堆功能函数。第一个就是把某一目录下的所有文件复制到指定目录中:[代码]删除一级目录下的所有文件:[代码]复制一级目录下的所有文件到指定目录:[代码]复制指定文件到目录:[代码]往指定目录写文本文件:[代码]返回当前的日期,以便在创建指定目录的时候用 阅读全文
posted @ 2011-01-05 14:08 sld666666 阅读(172448) 评论(2) 推荐(2) 编辑
摘要: 这篇文章主要介绍Qt 中多线程.。多线程是一个很大的课题, 这里我介绍QThread 和QFuture的实现方式。1. QThread 用QThread创建线程非常简单, 只需要从QThread派生,然后重载 run成员函数即可。[代码]在主函数中我们可以这样调用:[代码]2. 线程同步 Qt 提供了QMute, QReadWriteLock, QSemaphore 和QWaitCondition来同步线程。 QMutex提供了一种保护一个变量或一段代码的方法。 使用互斥量的一个问题就是每次只有一个线程可以访问一个变量, 如果我们要尝试多个线程访问某一个变量的话就用QReadWriteLock 阅读全文
posted @ 2010-12-26 19:02 sld666666 阅读(4434) 评论(2) 推荐(0) 编辑
摘要: 这篇文章主要介绍 boost中的智能指针的使用。 内存管理是一个比较繁琐的问题,C++中有两个实现方案: 垃圾回收机制和智能指针。垃圾回收机制因为性能等原因不被C++的大佬们推崇, 而智能指针被认为是解决C++内存问题的最优方案。1. 定义 一个智能指针就是一个C++的对象, 这对象的行为像一个指针,但是它却可以在其不需要的时候自动删除。注意这个“其不需要的时候”, 这可不是一个精确的定义。这个不需要的时候可以指好多方面:局部变量退出函数作用域、类的对象被析构……。所以boost定义了多个不同的智能指针来管理不同的场景。shared_ptrT内部维护一个引用计数器来判断此指针是不是需要被释 阅读全文
posted @ 2010-12-16 15:19 sld666666 阅读(10611) 评论(3) 推荐(3) 编辑