内核知识第四讲,简单的认识内核函数.以及调试驱动技巧

iBinary 2018-01-11 原文

内核知识第四讲,简单的认识内核函数.以及调试驱动技巧

        内核知识第四讲,简单的认识内核函数.以及调试驱动技巧

 

一丶驱动调试技巧.

我们写好的内核驱动代码要怎么调试?

1.自己内联汇编 进行调试

2.调用内核驱动调试API.

一丶内联汇编进行调试

内联汇编进行调试.

代码如下.

#include <Ntddk.h> //编写内核驱动需要包含NTddk头文件.


//卸载回调函数
VOID Unload(__in struct _DRIVER_OBJECT  *DriverObject)
{
  DbgPrint("Unload MyDrive\n");
}

NTSTATUS DriverEntry(__in struct _DRIVER_OBJECT  *DriverObject,
                      __in PUNICODE_STRING  RegistryPath)
{
    int i = 0;
     
    DbgPrint("HelloWorld, %p\r\n",&i);
    
    __asm int 3    //内联汇编,让自己的汇编代码在此处暂停.
    //注册一下驱动卸载的函数
    DriverObject->DriverUnload = Unload;

    return STATUS_SUCCESS;
}

int 3则是产生一个断点,请注意,一定要配合WinDbg进行调试,也就是双机调试,否则这条代码则会蓝屏.

2.内核断点API进行调试

VOID   NTAPI  DbgBreakPoint( VOID );

只要在我们的驱动代码中加入这一行则可以进行断点调试的

在WinDbg中,本质还是调用int 3指令.

如果我们要发布Release版本,但是又担心我们的断点没有去掉怎么办?

加上条件宏.

微软也意思到了这个问题,所以提供了一个API. 这个API的本质还是调用 DbgBreakePoint.

只不过加了条件宏.

VOID NTAPI  KdBreakPoint( VOID  );

有兴趣的跟进去可以看,本质还是我们上面的API,只不过用条件宏包了一下.

二丶内核中的内核函数简单介绍.

如果我们编写内核驱动程序.那么内核函数是我们常用的接口.那么我们要熟悉一下内核函数的意义.

图示:

在内核帮助文档中,我们可以看到操作系统提供了很多API,且它们都有一致性.

ob开头的API: 一般是对象使用,操作系统是C和汇编写的,但是用的却是面向对象设计,比如进程.还有引用计数等等.所以需要调用这种API.

Mm开头的API: Mm开头的API,都是内存管理的API,比如锁定一块内存,不让其与磁盘交换数据等等.

Ps开头的API: ps开头的API,一般都是管理进程和线程的API,比如psGetCurrentProcessId,获得当前进程ID.

Io开头的API: Io开头的API一般就是负责IO操作的.如果写硬件驱动则不用管这些.直接使用in 或者out进行操作.

Po开头的API: Po开头的API一般就是管理电源的API.对于写内核驱动的我们,不关心这些.写硬件驱动的则要关心,比如通电了.硬件驱动需要做些初始化什么的.

Cm开头的API: Cm开头的API一般是注册表常用的API.

Zw开头的API: Zw开头的API,一般是内核版本的API,比如三环有CreateFile,那么在内核API中则是ZwCreateFile.

 

Ke开头API: ke开头的API,一般是内核层的API.在内核中,分为内核层还有执行层.

Ex开头的API: Ex开头的API,则是执行层的API.

Rtl开头的API :  Rtl开头的Api和C库函数很像,在驱动中可以使用C库函数,但是微软不建议使用.所以提供了Rtl开头的API,甚至比C库函数还多.

DMA开头的API: 一般是写硬件驱动用的,我们不用.

HAL开头的API: 操作硬件抽象层的API.

ZwXXX系列的API: 这个意思就是参考ring3下的API,一般ring3下是什么,那么对应的加上个Zw开头即可.注意,Zw开头的参数不一定和Ring3下的API参数相同.

 

发表于 2018-01-11 20:48 iBinary 阅读() 评论() 编辑 收藏

 

版权声明:本文为iBinary原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/iBinary/p/8270514.html

内核知识第四讲,简单的认识内核函数.以及调试驱动技巧的更多相关文章

  1. 内核第一讲,内核简介

    内核第一讲,内核简介            内核第一讲,内核简介 一丶了解内核的基本名词和概念. 讲解内核了, […]...

  2. Kernel 内核调试

    本机环境 Win7 + VMware 14 Pro 1.安装Qemu,Ubuntu包管理器中的二进制版本比较老 […]...

  3. 羽夏看Linux内核——启动那些事

    写在前面此系列是本人一个字一个字码出来的,包括示例和实验截图。如有好的建议,欢迎反馈。码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作。如想转载,请把我的转载信息附在文章后面,并声明我的个人信息和本人博客地址即可,但必须事...

  4. 内核知识第九讲,32位下的分页管理,36位下的分页管理.以及64位下的分页管理

    内核知识第九讲,32位下的分页管理,36位下的分页管理.以及64位下的分页管理       内核知识第九讲,3 […]...

  5. 跟厂长学PHP7内核(七):常见变量类型的基本结构

    上篇文章讲述了变量的存储结构zval,今天我们就来学习一下几个常见变量类型的基本结构。 一、类型一览 zval […]...

  6. CentOS 7 下编译Linux kernel 内核

    1. 准备编译环境 yum groupinstall "Development Tools"   2. 下载内 […]...

  7. PHP内核之旅-1.生命周期

    1.SAPI接口 PHP具体应用的编程接口。 2.开始和结束   PHP开始执行以后会经过两个主要的阶段:   […]...

  8. 跟厂长学PHP7内核(六):生命周期之请求初始化阶段

    上篇文章我们分析了生命周期的模块初始化阶段,大部分是初始化全局变量和各种宏的定义,今天我们来学习一下五大生命周 […]...

随机推荐

  1. 第二次团队作业 – 志远行止

    第二次团队作业 这个作业属于哪个课程 班级的链接 这个作业要求在哪里 作业要求的链接 这个作业的目标 1、所有 […]...

  2. django.template.exceptions.TemplateDoesNotExist: index.html

    django.template.exceptions.TemplateDoesNotExist: index. […]...

  3. U盘中病毒,文件消失或不显示

    最近非常流行的一个病毒,将电脑或者U盘里的文件全部用快捷方式替换,真实文件被隐藏起来,下面我们就具体了解下此种 […]...

  4. 一年半前端工作经验试水杭州:我是如何拿下网易、阿里和滴滴 offer 的

    前言 笔者毕业于东北大学,大学毕业社招进入环球网,前端开发工程师一职。技术栈:React+node,Githu […]...

  5. CORS(跨站资源共享)介绍

    起因 有同学在nginx站点配置中加了一行Access-Control-Allow-Origin *,导致微信 […]...

  6. [ASP.NET Core 3框架揭秘] 配置[5]:配置数据与数据源的实时同步

    在《配置模型总体设计》介绍配置模型核心对象的时候,我们刻意回避了与配置同步相关的API,现在我们利用一个独立文 […]...

  7. 读懂UML类图

    读懂UML类图 平时阅读一些远吗分析类文章或是设计应用架构时没少与UML类图打交道。实际上,UML类图中最常用 […]...

  8. Linux整合Apache和SVN

    1、安装APR-1.2.7和APR-util-1.2.7  (下载地址:http://apr.apache.o […]...

展开目录

目录导航