1.返回状态

绝大部分的内核api返回值都是一个返回状态,也就是一个错误代码。这个类型为NTSTATUS.我们自己写的函数也大部分这样做。

NTSTATUS MyFunction()

{

NTSTATUS status;

….

return status;

}

如果碰到一个函数返回了奇特的NTSTATUS值,正确的方法是在WDK的头文件比如(NTSTATUS.h)中去寻找答案。

2.字符串

驱动里的字符串一般用这个结构来容纳。

typedef struct _UNICODE_STRING{

USHORT Length;

USHORT MaximumLength;

PWSTR Buffer;

}UNICODE_STRING *PUNICODE_STRING;

这个字符串是宽字符,是双字节。

UNICODE_STRING STR=RTL_CONSTANT_STRING(L”FIRST,HELLO WORLD!”);

DbgPrint(“%wZ”,str);

重要的数据结构

1.驱动对象

windows内核采用OO的编程方式,使用的却是C,windows内核对象是用C对OO的一种模拟。

当windows启动以后,内核对象都在内存中。如果我们在内核中写代码,则可以随意访问他们。每一个种类的内核对象都用一个结构体来表示。

typedef struct _DRIVER_OBJECT {
//结构的类型和大小
    CSHORT Type;
CSHORT Size;
//设备对象 这里实际是一个设备对象链表的开始,
PDEVICE_OBJECT DeviceObject;
ULONG Flags; //这个内核对象在内核空间中的开始地址和大小
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 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;

如果写一个驱动程序或一个内核,要在windows中加载,必须写这样一个结构,来告诉windows提供了哪些功能。

windows内核模块不生成一个进程,只是填写一组回调函数,让windows来调用,而且这些回调函数必须符合windows的规定。

这些回调函数主要包括上面的普通分发函数,快速分发函数。这些函数用来处理发送给这个内核模块的请求。

2.设备对象

设备对象就像WINDOWSGUI编程中的窗口,窗口是唯一可以接收消息的对象。在内核世界,大部分的消息是以请求(IRP)的方式传递,而设备对象是唯一可以接收请求的实体。

任何一个请求都是发送给某个设备对象的。

我们总是在内核程序中生成一个DO,而一个内核程序是用一个驱动对象表示的,所以一个DO总是属于一个驱动对象。

驱动对象生成多个DO,而windows向DO发请求,是被驱动对象的分发函数捕获。

在wdm.h中可以找到DO和IRP的结构定义。

常用的函数:

Zw开头的几个函数,主要用于文件操作。

在进行字符串操作的时候,Rtl-函数将会被大量用到。以Io开头的函数非常重要,因为涉及到IO管理器,IO管理器是将用户调用的API函数翻译成IRP或者将等价请求发送到内核

各个不同设备的关键组件。

ps-系列函数大多是与进程线程信息相关的。

掌握操作系统内核的体系结构,熟悉操作系统中常见的基本知识在windows中的具体体现,以及掌握系统底层的编程和调试技巧,是学习内核编程最重要的事。

windows内核编程之常用数据结构的更多相关文章

  1. 《天书夜读:从汇编语言到windows内核编程》五 WDM驱动开发环境搭建

    (原书)所有内核空间共享,DriverEntery是内核程序入口,在内核程序被加载时,这个函数被调用,加载入的进程为system进程,xp下它的pid是4.内核程序的编写有一定的规则: 不能调用win ...

  2. Windows内核编程时的习惯与注意事项

    Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 一.内核编程注意细节: 在头文件中使用的是 <ntddk.h ...

  3. 《天书夜读:从汇编语言到windows内核编程》八 文件操作与注册表操作

    1)Windows运用程序的文件与注册表操作进入R0层之后,都有对应的内核函数实现.在windows内核中,无论打开的是文件.注册表或者设备,都需要使用InitializeObjectAttribut ...

  4. 《Windows内核编程》---系统线程和同步事件

    系统线程: 在驱动中生成的线程一般是系统线程,系统线程所在的进程名为“System”,用到的内核API函数是: NTSTATUS PsCreateSystemThread( OUT PHANDLE T ...

  5. 《天书夜读:从汇编语言到windows内核编程》六 驱动、设备、与请求

    1)跳入到基础篇的内核编程第7章,驱动入口函数DriverEnter的返回值决定驱动程序是否加载成功,当打算反汇编阅读驱动内核程序时,可寻找该位置. 2)DRIVER_OBJECT下的派遣函数(分发函 ...

  6. windows内核编程基础知识

    /* 1.基本的驱动数据结构 //驱动对象结构体 typedef struct _DRIVER_OBJECT { CSHORT Type; //结构类型 CSHORT Size; //结构大小 PDE ...

  7. 《天书夜读:从汇编语言到windows内核编程》十一 用C++编写内核程序

    ---恢复内容开始--- 1) C++的"高级"特性,是它的优点也是它的缺点,微软对于使用C++写内核程序即不推崇也不排斥,使用C++写驱动需注意: a)New等操作符不能直接使用 ...

  8. 《天书夜读:从汇编语言到windows内核编程》十 线程与事件

    1)驱动中使用到的线程是系统线程,在system进程中.创建线程API函数:PsCreateSystemThread:结束线程(线程内自行调用)API函数:PsTerminateSystemThrea ...

  9. 《天书夜读:从汇编语言到windows内核编程》四 windows内核调试环境搭建

    1) 基础篇是讲理论的,先跳过去,看不到代码运行的效果要去记代码是一个痛苦的事情.这里先跳入探索篇.其实今天的确也很痛苦,这作者对驱动开发的编译与调试环境介绍得太模糊了,我是各种尝试,对这个环境的搭建 ...

随机推荐

  1. Python入门笔记(19):Python函数(2):函数/方法装饰器

    一.装饰器(decorators) 装饰器的语法以@开头,接着是装饰器函数的名字.可选参数. 紧跟装饰器声明的是被装饰的函数和被装饰的函数的可选参数,如下: @decorator(dec_opt_ar ...

  2. 用PHP实现Windows域验证

    系统集成中,可能会有这种需求 Windows 域验证本质上是LDAP验证 但在网上居然找不到详细的技术文档,可见不受待见之极.

  3. Sass学习之路(2)——Sass环境安装(windows版)

    因为本喵目前用的是window10的本子,所以这里就发windows版本的安装流程啦.(希望有朋友可以赞助我一个mac(┳_┳)): 第一步:安装ruby 因为Sass是基于ruby编写的,所以先去官 ...

  4. Underscore学习笔记1

    项目用了很久underscore.每次都是临时查手册,没有系统的研究过,最近有空正好看看 github地址:https://github.com/lily1010/underscore_learn 一 ...

  5. English Training Material - 03

    Cross-cultural understanding (2) 1 The following text is about cultural diversity. Read it through o ...

  6. sublime text 3 安装

    sublime text 3 下载地址 http://www.sublimetext.com/3 下载windows版本,然后解压缩就可以直接使用了,不错不错哦, 为了更加便捷的管理,安装 packa ...

  7. Android--Apache HttpClient

    前言 上一篇文章介绍了使用HttpURLConnection来完成对于HTTP协议的支持.现在介绍一个新的方式来访问Web站点,那就是HttpClient. HttpClient是Apache开源组织 ...

  8. Android NDK

    1.Android之NDK开发 http://www.cnblogs.com/devinzhang/archive/2012/02/29/2373729.html

  9. 【转】Android 语言切换过程分析

    最近在看一个bug,系统切换语言后,本来退到后台的音乐,会在通知栏上显示通知.为了解决这个bug,我学习了下android的语言切换流程,也参考了大量其他人的资料.(主要参考了http://blog. ...

  10. STL--双端队列(deque)和链表(list)

    双端队列(deque容器类): #include<deque>与vector 类似,支持随机访问和快速插入删除,它在容器中某一位置上的操作所花费的是线性时间. 与vector不同的是:de ...