Windows内核编程基础篇之常见内核数据结构

本文介绍了Windows内核编程中的关键数据结构,包括驱动对象(DRIVER_OBJECT)、设备对象(DEVICE_OBJECT)及其作用。此外,还概述了进程和线程相关的数据结构,如EXPROCESS、KPROCESS、ETHREAD和KTHREAD,以及存储系统中的VPB和File_Object。通过这些数据结构的理解,有助于深入掌握Windows内核操作。
摘要由CSDN通过智能技术生成

    1,驱动框架常见数据结构有 驱动对象结构,  设备对象结构等。

        A)驱动对象结构  (DRIVER_OBJECT)

            每个驱动对象代表一个已加载的内核驱动程序,指向驱动对象结构的指针常常作为DriverEntryAddDeviceUnload等函数的参数。驱动对象结构式半透明的。其中公开的域包括DeviceObject,DriverExtension,HardwareDatabase ,FastIoDispath,DriverInit,DriverStartIo,DriverUnload以及MajorFunction

        驱动对象的数据结构如下:

typedef struct _DRIVER_OBJECT {
  CSHORT Type;
  CSHORT Size;
//
  // The following links all of the devices created by a single driver
  // together on a list, and the Flags word provides an extensible flag
  // location for driver objects.
  //
PDEVICE_OBJECT DeviceObject;
  ULONG Flags;
//
  // The following section describes where the driver is loaded. The count
  // field is used to count the number of times the driver has had its
  // registered reinitialization routine invoked.
  //
PVOID DriverStart;
  ULONG DriverSize;
  PVOID DriverSection;
  PDRIVER_EXTENSION DriverExtension;
//
  // The driver name field is used by the error log thread
  // determine the name of the driver that an I/O request is/was bound.
  //
UNICODE_STRING DriverName;
//
  // The following section is for registry support. Thise is a pointer
  // to the path to the hardware information in the registry
  //
PUNICODE_STRING HardwareDatabase;
//
  // The following section contains the optional pointer to an array of
  // alternate entry points to a driver for "fast I/O" support. Fast I/O
  // is performed by invoking the driver routine directly with separate
  // parameters, rather than using the standard IRP call mechanism. Note
  // that these functions may only be used for synchronous I/O, and when
  // the file is cached.
  //
PFAST_IO_DISPATCH FastIoDispatch;
//
  // The following section describes the entry points to this particular
  // driver. Note that the major function dispatch table must be the last
  // field in the object so that it remains extensible.
  //
PDRIVER_INITIALIZE DriverInit;
  PDRIVER_STARTIO DriverStartIo;
  PDRIVER_UNLOAD DriverUnload;
  PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
} DRIVER_OBJECT;
  typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT; // ntndis


      其中DeviceObject域指向由此驱动创建的设备对象:FastIoDispath域指向快速I/O 入口。DriverInit指向驱动入口点地址(DriverEntry):DriverUnload 指向驱动卸载程序:MajorFunction 是一张函数分发表,数组的所引致与IRP_MJ_Xxx相对应。

     自己重新对上面的结构体认识了下,省略了部分,主要了解下面的:

typedef struct _DRIVER_OBJECT{
       //结构的类型和大小
       CSHORT  Type;
       CSHORT  Size;
       //设备对象,这里实际上是一个设备对象的链表的开始。因为 DeviceObject 中有相关链表信息。
       PDEVICE_OBJECT  DeviceObject;
       •••
       //这个内核模块在内核空间中的开始地址和大小
       PVOID  DriverStart;
       ULONG  DriverSize;
       •••
       //驱动的名字
       UNICODE_STRING  DriverName;
       •••
       //快速IO分发函数
       PFAST_IO_DISPATCH  FastIoDispatch;
       •••
       //驱动的卸载函数
       PDRIVER_UNLOAD.DriverUnload;
       //普通分发函数
       PDRIVER_DISPATCH  MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
}DRIVER_OBJECT;
     这样看起来是不是 少了很多呢, 上面做了注释的是 主要需要了解的。


-------------------------------------------------------------------------------------------------------

       B)设备驱动程序(DEVICE_OBJECT)

        系统使用设备对象来描述一个设备对象,数据结构如下:

typedef struct _DEVICE_OBJECT {
  CSHORT                      Type;
  USHORT                      Size;
  LONG                        ReferenceCount;
  struct _DRIVER_OBJECT  *DriverObject;
  struct _DEVICE_OBJECT  *NextDevice;
  struct _DEVICE_OBJECT  *AttachedDevice;
  struct _IRP  *CurrentIrp;
  PIO_TIMER                   Timer;
  ULONG                       Flags;
  ULONG                       Characteristics;
  __volatile PVPB             Vpb;
  PVOID                       DeviceExtension;
  DEVICE_TYPE                 DeviceType;
  CCHAR                       StackSize;
  union {
    LIST_ENTRY         ListEntry;
    WAIT_CONTEXT_BLOCK Wcb;
  } Queue;
  ULONG                       AlignmentRequirement;
  KDEVICE_QUEUE       
编写Windows内核程序,就意味着这个程序可以执行任意指令,可以访问计算机所有的软件、硬件资源。因此,稍有不慎就有可能将系统变得不稳定。Windows的设计者设计了各种驱动模型或者框架,如NT式内核驱动模型、WDM框架和新推出的WDF框架。在这些模型框架下编程,就使内核编程变得简单,同样也降低了内核程序崩溃的机会。其实,Windows驱动程序员和黑客都在写内核程序,唯一不同的是驱动程序员按照微软设计的模型写程序,而黑客可以不按照这些框架写。Windows设计的这些框架,可以将操作系统的原理隐藏起来,只暴露一些接口,驱动程序员只要把这些接口写好就可以了。从这个角度看,驱动开发并不难,尤其是读完本书后,更会觉得不难了。但是想完成一些特殊的功能,如内核级隐藏进程等,Windows的这些框架就没什么用处了,程序员就需要对Windows内核有全面的了解,通过直接修改Windows内核来实现这些目的。往往黑客对这种技术乐此不疲,通过修改Windows内核,你会发现你的程序几乎无所不能。   编写内核程序是一件很痛苦的事情,回想起这些年学习内核程序开发的经历,真是感慨万千。就如同谭文所说:编写内核程序的人从某种程度讲是孤独的。当一个经验并不丰富的小程序员面对庞大复杂的并且不开源的Windows框架时,那是一种怎样的无助感啊!谭文是我比较钦佩的程序员之一,他对技术非常执着,并且精力充沛。内核程序的知识涉及面非常广,不同类别的内核程序差别也特别大,他几乎都有所涉猎。相信读者在读完这本书后,能对Windows内核开发有比较详细的了解,同时也能结合书中的实例写出很优秀的内核程序了 本书从Windows内核编程出发,全面系统地介绍了串口、键盘、磁盘、文件系统、网络等相关的Windows内核模块的编程技术,以及基于这些技术实现的输入密码保护、防毒引擎、文件加密、网络嗅探、网络防火墙等信息安全软件的核心组件的具体编程。主要知识重点包括:Windows串口与键盘过滤驱动、Windows虚拟存储设备与存储设备过滤驱动、Windows文件系统过滤驱动、文件系统透明加密/解密驱动、Windows各类网络驱动(包括TDI过滤驱动及3类NDIS驱动),以及最新的WDF驱动开发模型。有助于读者熟悉Windows内核驱动的体系结构,并精通信息安全类的内核编程技术。本书的大部分代码具有广泛的兼容性,适合从Windows 2000一直到目前最新的Windows 7 Beta版。  本书则基本上介绍的是正统的内核编程技术,是微软在内核编程中给信息安全软件开发者提供的相关接口的大集合,是名门正派的技术,不沾邪气。一个好的内核程序员,“正邪兼修”是有必要的。   本书既适合于有志于成为软件程序员的学生使用,也适合于希望加强自己的技术实力的Windows程序员阅读,同时更适合于从事信息安全行业的Windows软件的开发者作为手头参考。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值