摘要:
一、基本概念1、磁盘分区(Partitions) 磁盘是装到计算机上的存储设备,比如常见的硬盘。磁盘分区是为了便于管理和使用物理硬盘,而在一个物理硬盘上划分可以各自独立工作的一些逻辑磁盘。比如一块80GB的硬盘可以划分为4个20GB的分区来使用,对操作系统来说这4个20GB的分区是4块独立的逻辑磁盘。2、卷(Volumes) 卷,也称为逻辑驱动器,是NTFS、FAT32等文件系统组织结构的最高层。卷是存储设备(如硬盘)上由文件系统管理的一块区域,是在逻辑上相互隔离的存储单元。一个磁盘分区至少含有一个卷,卷也可以存在于多个磁盘分区上,仅存在于一个磁盘分区上的卷称为“简单卷”,仅存在于多个磁盘分区 阅读全文
摘要:
一、编译选项 用nmake批量构造程序;makefile是nmake的配置文件。VC编译过程如下: 更多关于编译选项的介绍,可以参见[1],[2,27~38]。 VC\bin目录下 二、环境变量 set 常用环境变量 如下引用环境变量 %环境变量% 通过Set PATH="C:\";%PATH% 就可以添加变量 在makefile中如下引用 $(环境变量) 在寻找可执行文件的路径时顺序: 1)... 阅读全文
摘要:
一、Windows API 的功能分类1、系统基本服务文件系统:对文件的操作等;磁盘分卷的管理等。内存管理:内存分配等,分页机制。进程、线程和模块设备IO、驱动程序控制调试与错误处理Windows系统信息:包括注册表操作,及其它基本信息。进程间通信:共享文件,消息,邮槽,管道,网络共享定时器与消息机制2、系统管理管理控制台接口,程序安装,系统恢复,任务调度等。3、用户界面包括两方面:Windows Shell和Windows图形用户界面4、图像和多媒体包括GDI,OpenGL,DircetX等.5、网络TCP/UDP Socket,HTTP等。6、系统安全系统的授权与认证,登录,权限管理,加密 阅读全文
摘要:
3、派遣例程的职责 •派遣函数立即完成该IRP。 •把该IRP传递到处于同一堆栈的下层驱动程序。 •排队该IRP以便由这个驱动程序中的其它例程来处理。 每个设备对象都自带一个请求队列对象,下面是使用这个队列的标准方法: NTSTATUS DispatchXxx(...) { ... IoMarkIrpPending(Irp); IoStartPacket(device, Irp, NULL, ... 阅读全文
摘要:
一、IRP MdlAddress(PMDL)域指向一个内存描述符表(MDL),该表描述了一个与该请求关联的用户模式缓冲区。如果顶级设备对象的Flags域为DO_DIRECT_IO,则I/O管理器为IRP_MJ_READ或IRP_MJ_WRITE请求创建这个MDL。如果一个IRP_MJ_DEVICE_CONTROL请求的控制代码指定METHOD_IN_DIRECT或METHOD_OUT_DIRECT... 阅读全文
摘要:
关于同步 执行在某线程上下文中的代码在任何时刻都可能被系统夺去控制权。另外,只有在多处理器的计算机上才能真正实现多线程的并发执行。Windows NT为解决一般的同步问题提供了两种方法,一个是中断请求优先级(IRQL)方案,另一个是在关键代码段周围声明和释放自旋锁。IRQL可以避免在单 CPU上的破坏性抢先,而自旋锁可以防止多CPU间的干扰。 图示. 中断请求级 在DISPATCH_LEVEL... 阅读全文
摘要:
内存管理 1)内核模式与用户模式地址 图示 地址空间中用户模式部分和内核模式部分 每个用户模式进程都有自己的地址上下文,它把用户模式的虚拟地址映射成一组唯一的物理页帧。这意味着,当Windows NT调度器把控制从一个进程的当前线程切换到另一个进程的某个线程时,与进程相对应的虚拟地址空间也被更换。线程切换的一个步骤就是改变处理器当前使用的页表,以便它能引用新线程的进程上下文。 在编写驱动程序... 阅读全文
摘要:
1、Summary of Kernel-Mode Support Routines http://msdn.microsoft.com/en-us/library/ff563889%28VS.85%29.aspx 决不在内核模式服务函数的参数中使用带有侧效的表达式。 2、异常 对用户模式虚拟内存直接引用的代码段应该用结构化异常帧保护起来。这样的引用通常发生在调用MmProbeAndLockPag... 阅读全文
摘要:
4、DriverUnload例程 在WDM驱动程序中,DriverUnload例程的作用就是释放DriverEntry例程在全局初始化过程中申请的任何资源,但它几乎没什么可做。如果你在DriverEntry中备份了RegistryPath串,应该在这里释放备份所占用的内存。VOID DriverUnload(PDRIVER_OBJECT DriverObject){RtlFreeUnicodeString(&servkey);} 如果DriverEntry例程返回一个失败状态代码,系统将不再调用DriverUnload例程。所以,不能让DriverEntry例程出错后产生任何副作用,必须在它返 阅读全文
摘要:
图示 原图2-13 DRIVER_OBJECT数据结构 I/O管理器使用驱动程序对象来代表每个设备驱动程序,见图2-13。就象我们将要讨论的许多数据结构一样,驱动程序对象是部分不透明的。这意味着虽然 DDK头中公开了整个结构,但我们仅能直接访问或修改结构中的某些域。在图中,我把驱动程序对象的不透明域用灰背景表示。这些不透明域类似于C++类中的私有成员或保护成员,而透明域类似于公共成员。 1、DR... 阅读全文