驱动开发文章

来源:互联网 发布:php网站源码带数据库 编辑:程序博客网 时间:2024/06/05 22:41

本系列教程采用VMware+本机进行双机调试,本机是Win10,虚拟机使用XP SP3进行运行调试


一. 虚拟机端配置


1.1 安装VMware并安装XP SP3系统

这个网上教程很多,就不详述了这里找了一篇百度的教程

http://jingyan.baidu.com/article/7f41ececd3be66593d095ca2.html


1.2 配置虚拟机XP系统

这里写图片描述 
需要用到的软件: 
SRVINSTW.exe : 驱动安装软件 
Dbgview.exe : 驱动输出查看程序 
VMwareTool : 方便在本机和虚拟机之间移动文件,直接在VMware的菜单栏虚拟机->安装VMwareTool便可以自动安装

其他配置: 
1. 在C盘下建立一个Driver文件夹,用于存放测试的驱动,并建立一个快捷方式在桌面 
2. 添加一个命令行启动的快捷方式,用于手动启动/关闭服务 
3. 去掉系统隐藏文件隐藏的功能,编辑c:\boot.ini文件,添加系统调试启动项

multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect /debug /debugport=com1 /baudrate=115200
  • 1
  • 1

资源管理器->工具->文件夹选项->查看->显示所有文件和文件夹 
这里写图片描述


1.3 测试驱动安装与卸载(可以搭建好后面的环境后再测试)

  1. 复制测试驱动到c:\Driver文件夹下
  2. 安装服务. 
    打开SRVINSTW.exe,选择安装服务 
    这里写图片描述

选择本地机器 
这里写图片描述

填写服务名,用于后面启动/关闭服务 
这里写图片描述

填写驱动路径,这里要手动输入 
这里写图片描述

选择设备驱动 
这里写图片描述

驱动器目标名可为空 
这里写图片描述

设置启动方式为手动,如果设置为自动的话,驱动出现问题蓝屏,开启自启动后又蓝屏 
这里写图片描述

  1. 启动服务 
    打开DebugView.exe,勾选Capture->Capture Kernel 
    这里写图片描述

打开命令行,启动服务,可以看到DebugView中获取到了驱动的输出 
这里写图片描述

  1. 关闭服务 
    命令行关闭服务,DebugView中获取到服务被卸载 
    这里写图片描述

  2. 卸载驱动 
    打开SRVINSTW.exe,选择移除服务 
    这里写图片描述

选择本地机器 
这里写图片描述

勾选包括设备驱动器,选择我们要卸载的服务 
这里写图片描述

  1. 添加虚拟机输出命名管道 
    1). VMware菜单->编辑->首选项->设备->启动虚拟打印服务 
    2). 编辑虚拟机设置->移除打印机 
    3). 编辑虚拟机设置->添加->串行端口->输出到命名管道->一端是服务器,一端是应用程序 
    这里写图片描述

二. 配置主机


需要用到的软件: 
这里写图片描述 
WDK 
WDK程序下载链接 : 
https://developer.microsoft.com/zh-cn/windows/hardware/windows-driver-kit

WinDbg : 调试工具

其他配置: 
1. 如上图,添加x86 Checked Build Environment快捷方式到桌面 
2. 添加WinDbg快捷方式,右键快捷方式->属性->目标.修改启动属性 
3. 这里写图片描述

"C:\Program Files (x86)\Debugging Tools for Windows (x86)\windbg.exe" -b -k com:port=\\.\pipe\com_1,pipe
  • 1
  • 1

三. 调试虚拟机

打开虚拟机,选择第二个启动项,启动调试程序 
这里写图片描述

打开WinDbg,可以看到虚拟机中断了,在命令输入窗口输入g,让系统正常运行 
这里写图片描述

自此环境搭建好了……

转载请注明来源: 
enjoy5512的博客 : http://blog.csdn.net/enjoy5512 
GitHub : https://github.com/whu-enjoy

为了整理方便,可以在一个合适的路径下建立一个专门的文件夹用于保存源代码.打开桌面的x86 Checked Build Enviroment快捷方式,进到源代码所在文件夹下,可以看到每个程序至少有三个文件,一个源代码文件,一个是makefile,一个sources,头文件是可选的 
这里写图片描述


头文件

///////////////////////////////////////////////////////////////////////////////  文件名 : fitst.h//  工程 : first //  作者 : enjoy5512   修改者 : enjoy5512   最后优化注释者 : enjoy5512//  个人技术博客 : blog.csdn.net/enjoy5512//  个人GitHub   : github.com/whu-enjoy//  描述 : 第一个驱动程序的头文件//  版本 : 最终确定版  完成日期 : 2016年7月5日 09:25:30//  修改 ://  参考文献 ://       <<Windows内核安全与驱动开发>> 谭文 陈铭霖 编著//////////////////////////////////////////////////////////////////////////////#ifndef __FIRST_H__#define __FIRST_H__////////////////////////////////////////////////////////////////////////////////*= = 头文件声明//////////////////////////////////////////////////////////////////////////////#include <ntddk.h>////////////////////////////////////////////////////////////////////////////////*= = 宏与结构体//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////*= = 函数声明//////////////////////////////////////////////////////////////////////////////NTSTATUSDriverEntry(    __in PDRIVER_OBJECT DriverObject,    __in PUNICODE_STRING RegistryPath    );VOIDDriverUnload(    __in PDRIVER_OBJECT DriverObject    );#endif //End of __FIRST_H__
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

源代码

///////////////////////////////////////////////////////////////////////////////  文件名 : fitst.c//  工程 : first //  作者 : enjoy5512   修改者 : enjoy5512   最后优化注释者 : enjoy5512//  个人技术博客 : blog.csdn.net/enjoy5512//  个人GitHub   : github.com/whu-enjoy//  描述 : 第一个驱动程序//  主要函数 ://      VOID DriverUnload(PDRIVER_OBJECT driver) 卸载函数//      NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path) 入口函数//  版本 : 最终确定版  完成日期 : 2016年7月5日 09:36:17//  修改 ://  参考文献 ://       <<Windows内核安全与驱动开发>> 谭文 陈铭霖 编著/////////////////////////////////////////////////////////////////////////////#include "first.h"//程序说明开始//==================================================================================//  功能 : 驱动程序入口函数//  参数 :    __in PDRIVER_OBJECT DriverObject, in PUNICODE_STRING RegistryPath//  (入口)  __in PDRIVER_OBJECT DriverObject  : 驱动对象//          __in PUNICODE_STRING RegistryPath : 驱动在注册表中的键值//  (出口)  无//  返回 :  NTSTATUS//  主要思路 : 先设置一个int3断点,然后输出一句话,设置卸载函数//  调用举例 : //  日期 : 2016年7月5日 09:32:32//==================================================================================//程序说明结束NTSTATUS DriverEntry(    __in PDRIVER_OBJECT DriverObject,     __in PUNICODE_STRING RegistryPath    ){    #if DBG        _asm int 3    #endif    DbgPrint("first : hello ,load server!!\n");    DriverObject->DriverUnload = DriverUnload;    return STATUS_SUCCESS;}//程序说明开始//==================================================================================//  功能 : 驱动程序卸载//  参数 :    __in PDRIVER_OBJECT DriverObject//  (入口)  __in PDRIVER_OBJECT DriverObject  : 驱动对象//  (出口)  无//  返回 :  VOID//  主要思路 : 输出一句话//  调用举例 : //  日期 : 2016年7月5日 09:35:59//==================================================================================//程序说明结束VOID DriverUnload(    __in PDRIVER_OBJECT driver    ){    DbgPrint("firts:Our driver is unloading!!\r\n");}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67

makefile文件

这个文件是固定的,内容不变

!IF 0Copyright (C) Microsoft Corporation, 1999 - 2002Module Name:    makefile.Notes:    DO NOT EDIT THIS FILE!!!  Edit .\sources. if you want to add a new source    file to this component.  This file merely indirects to the real make file    that is shared by all the components of Windows NT (DDK)!ENDIF!INCLUDE $(NTMAKEENV)\makefile.def
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

sources文件

TARGETNAME=firstTARGETTYPE=DRIVERSOURCES=first.c
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

在源代码路径下,使用build命令编译驱动程序 
这里写图片描述

将编译好的first.sys复制到虚拟机中 
将程序符号文件路径加到windbg符号路径中 
这里写图片描述

设置源代码路径 
这里写图片描述

启动服务,可以看到虚拟机卡住了,windbg在int3处中断了,然后便可以开始调试运行了 
这里写图片描述



原创粉丝点击