内核第三讲,进入ring0,以及编写第一个内核驱动程序.

一丶进入ring0之前的简介

进入0环之前,我们要明白操作系统的设计,操作系统允许驱动程序使用In out等等特权指令来操作高2G的内存.那么必然会有接口.

图示如下.

那么我们可以模拟一个驱动程序来进入0环.

而操作系统提供的接口的,有专门的名称. 叫做DDK, 现在改名为WDK了.

DDK: Driver Development Kit  驱动程序开发包,例如我们写的3环系统下,用到的SDK,也可以成为是API.只不过现在叫做内核方法(内核函数)了.

WDK:Windows Driver Kit

WDK是DDK升级而来的.操作系统为了支持热插拔,所以对DDK升级了.热插拔就是U盘插入系统.不用安装驱动了.和U盘绑定在一起了.

我自己用的是WDK7.1.7600,会上传到课堂资料中.有兴趣的可以下载.

注意: 如果编写驱动程序,请下载对应系统的WDK,因为驱动程序不兼容.只会跟着系统走.

二丶WDK的安装.

下载之后直接下一步,下一步即可. 如果不会建议百度.

三丶进入0环,编写第一个内核驱动程序

在进入ring0之前,我们要知道,不管是驱动程序,或者是应用程序,都会有一个入口点.

比如控制台的入口点是 main,窗口的是winmain.那么看下驱动程序的入口点是什么.

PS:安装好WDK之后,会有帮助文档.可以参考帮助文档.

如果我们要编写内核驱动,则要看内核驱动的入口点,也就是kerner mode,内核模型.

如果是编写硬件驱动,则寻找WDM即可.

NTSTATUS

DriverEntry(         //驱动的入口点

__instruct _DRIVER_OBJECT *DriverObject,

__in PUNICODE_STRING RegistryPath

)

{...}

返回值: STATUS_SUCCESS

内核输出的API

ULONG

DbgPrint(

IN PCHAR Format,

. . . . [arguments]

);

利用入口我们可以简单编写一个内核驱动了.

驱动我们可以用C语言去写.也可以是C++

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

NTSTATUS DriverEntry(__instruct _DRIVER_OBJECT *DriverObject,

__in PUNICODE_STRING RegistryPath)

{int i = 0;

DbgPrint("HelloWorld, %p\r\n",&i);returnSTATUS_SUCCESS;

}

在编译驱动程序的是否,我们需要一个sources  文件

格式:

TARGETNAME=MyFirstDrive       //指明编译的文件名

TARGETTYPE=DRIVER        //指明编译的类型

SOURCES= MyFirstDrive.c     //指明编译的文件

图示:

编译的时候找我们的开发包.

通过开始程序,找到我们的开发包中的编译XP命令框.点开.

输入编译命令 build 文件名

回车就可以编译我们的驱动程序了.

成功会生成一个sys后缀的文件.那么我们就可使用了.

四丶双机调试,加载我们的驱动.

我们以调试系统启动.然后使用加载驱动的工具,加载我们的驱动,那么就可以在调试器中看到我们的驱动代码了.

当我们启动之后,我们可以查看下调试器,可以调试我们的代码.

请注意我们打印的地址,地址是高2G的空间.所以我们就进入了0环空间了.

五丶编写驱动卸载功能.

我们的驱动现在可以加载.启动.停止.但是不能卸载.原因就是我们没有写卸载的函数.

比如我们的DLL,  DLL来的是否还分为4中情况.

很简单.只需要把我们的驱动代码改变一下即可.

#include //编写内核驱动需要包含NTddk头文件.//卸载回调函数

VOID Unload(__in struct _DRIVER_OBJECT *DriverObject)

{

DbgPrint("Unload MyDrive\n");

}

NTSTATUS DriverEntry(__instruct _DRIVER_OBJECT *DriverObject,

__in PUNICODE_STRING RegistryPath)

{int i = 0;

DbgPrint("HelloWorld, %p\r\n",&i);//注册一下驱动卸载的函数

DriverObject->DriverUnload =Unload;returnSTATUS_SUCCESS;

}

给个卸载的函数指针即可.注意启动入口点的参数是一个结构体.启动你想要支持卸载驱动.那么就写上卸载驱动的函数指针即可.

六丶蓝屏的出现.

编写驱动代码,不像我们编写ring3下的应用程序,崩溃了就是崩溃了. 我们写驱动程序恨不得写一行,检查500行.

看下蓝屏的实现.只要我们的程序异常,那么就会蓝屏.

代码:

#include //编写内核驱动需要包含NTddk头文件.//卸载回调函数

VOID Unload(__in struct _DRIVER_OBJECT *DriverObject)

{

DbgPrint("Unload MyDrive\n");

}

NTSTATUS DriverEntry(__instruct _DRIVER_OBJECT *DriverObject,

__in PUNICODE_STRING RegistryPath)

{int i = 0;int *p = NULL; //异常代码.会造成C05访问异常.

DbgPrint("HelloWorld, %p\r\n",&i);*p = 1;       //代码会产生异常,系统会蓝屏.//注册一下驱动卸载的函数

DriverObject->DriverUnload =Unload;returnSTATUS_SUCCESS;

}

很简单,就加了一行C05访问异常的代码.

重新编译一下.并且驱动加载.

因为家里电脑系统原因,蓝屏了会紧接着重启.所以来不及截图.请大家自己尝试.

课堂代码资料:

转载请著名出处,谢谢.

java 内核驱动程序_内核第三讲,进入ring0,以及编写第一个内核驱动程序.相关推荐

  1. linux内核源代码_如何从源代码构建和安装最新的Linux内核

    linux内核源代码 by Sreehari 通过Sreehari 如何从源代码构建和安装最新的Linux内核 (How to build and install the latest Linux k ...

  2. 【嵌入式Linux驱动开发】十五、实操Linux开发中的中断,编写第一个按键驱动程序

       慷慨歌燕市,从容作楚囚.   引刀成一快,不负少年头. 文章目录 一.实验目标与原理图分析 二.编写程序 2.1 修改.编译.覆盖设备树文件 2.1.1 添加 pinctrl 节点 2.1.2 ...

  3. Linux系统驱动之分析内核自带的LCD驱动程序_基于IMX6ULL

    百问网技术交流群,百万嵌入式工程师聚集地: https://www.100ask.net/page/2248041 资料下载 coding无法使用浏览器打开,必须用git工具下载: git clone ...

  4. java虚拟机臃肿_同样的内核,为什么linux干净稳定,而android臃肿又乌烟瘴气?...

    原标题:同样的内核,为什么linux干净稳定,而android臃肿又乌烟瘴气? Android是一套开源的手机操作系统,在全球范围内它的使用非常广泛,拥有全球最大的市场占有率.众所周知,Android ...

  5. linux内核3.4 led驱动,JZ2440_V3_内核驱动程序_点亮一个LED灯(示例代码)

    为了用内核驱动程序点亮一个LED灯,真是费尽周折,参考了韦东山的<嵌入式linux驱动开发完全手册>(以下简称<完全手册>)和网上很多人的blog,最终在@Carlos·Wei ...

  6. 用户级别线程的切换切换到内核线程_【修炼内功】[JVM] 细说线程

    自从踏入程序猿这条不归路,便摆脱不了(进程)线程这只粘人的小妖精,尤其在硬件资源"过剩"的今天 不论你在使用c.C++..Net,还是Java.Python.Golang,都免不了 ...

  7. epub 深入linux内核架构_深入分析Linux内核源代码6-Linux 内存管理(2)

    每天十五分钟,熟读一个技术点,水滴石穿,一切只为渴望更优秀的你! ----零声学院 6.3 内存的分配和回收 在内存初始化完成以后,内存中就常驻有内核映像(内核代码和数据).以后,随着用 户程序的执行 ...

  8. Linux内核开发_内核模块

    内核模块是什么? Linux下的内核模块类似于Windows下的DLL动态链接库技术,和我们平常所使用的一些动态链接的SDK库一样,只是调用者是内核而已,不是用户态的程序. 内核模块拥有的的权限是和用 ...

  9. 【Linux】新唐NUC977编译第一个内核驱动程序Hello World

    Hello World内核驱动程序 前言 一.文件的编写 二.内核的编译及烧录 2022-5-20补充控制LED灯 最后 前言    相关简介:   1,增加驱动文件 hello.c 和对应的 Mak ...

最新文章

  1. 网易云音乐消息队列改造之路
  2. Swift开发iOS项目实战视频教程(一)---iOS真简单
  3. NYOJ 99 单词拼接
  4. loadrunner—事务、TPS
  5. flash builder eclipse插件安装
  6. Java实现单词树(trie)
  7. python字符串编码_Python字符串编码答疑
  8. 科研论文绘图:ppt, word,latex,python matplotlib绘图 ,矢量图,高清图,放大不失真
  9. 设计模式--模版方法
  10. 记牌器内存扫描法原理(转)
  11. Laravel5.8调试消息队列RabbitMQ
  12. python3  类中方法的调用
  13. Enterprise Architect安装
  14. 如何用控制台cmd打开你的c++程序
  15. c语言 strcpy作用,c语言中的strcpy什么意思,简单点解释
  16. 2018年EI收录中文期刊目录【转】
  17. 计算机英语输入法怎么,电脑英文输入法不见了怎么处理?
  18. PDF文档如何用关键字精确查找?
  19. DES加解密算法原理详解与实现
  20. Python百行代码轻松爬取了妹子网100G的套图,希望你网盘内存够用

热门文章

  1. C++ STL vector的输出
  2. hibernate保存mysql乱码_hibernate保存数据到mysql时的中文乱码问题
  3. 大学学计算机专业好吗,现在上大学学计算机专业好吗?好找工作吗?听他人说计算机学不了什么?学的人也多,...
  4. 面试题 gety() getTop() TranslationY关系
  5. 51单片机之中断系统
  6. 4-6:TCP协议之滑动窗口
  7. thrift使用小记
  8. std::string::assign 崩溃的问题
  9. recipe for target 'aclocal.m4' failed
  10. linux安装selenium、chromedriver、Chrome浏览器、BrowserMob Proxy(代理)爬虫爬站环境安装及测试实例