windows内核&驱动

来源:互联网 发布:tough cookie.js 编辑:程序博客网 时间:2024/06/07 06:51

内核&驱动基础


WDK(Windows Driver Kit)

内核编程需要使用WDK

WDK 下载

windows xp wdk 下载地址

WDK 安装

勾选所有的安装项,避免错过一些例子

这里写图片描述

  • 默认安装目录: C:\WinDDK

first驱动开发

源码 first.c

#include <ntddk.h>#define DEBUG/* * 卸载函数 */VOID DriverUnload(PDRIVER_OBJECT driver){    DbgPrint("good bye my world...\r\n");}/* * 装载函数 */NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path){/* * 在调试时使用int 3,正常运行时驱动运行int 3 会导致蓝屏 */#ifdef DEBUG    _asm int 3#endif    DbgPrint("despacito world... \r\n");    driver->DriverUnload = DriverUnload;    return STATUS_SUCCESS;}

编译驱动

makefile

驱动编写需要Makefile,放在和源文件同级目录即可

###############################################################################       Copyright (C) Microsoft Corporation 1998, 1999#       All Rights Reserved.################################################################################ 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 driver components of Windows NT### Build using BUILD.EXE (Do not edit this section of this file, edit SOURCES)## Ensure that build environment is at least Windows Vista:# For Reference#     0x500 == Windows 2000#     0x501 == Windows XP#     0x502 == Windows Server 2003#     0x600 == Windows Vista#MINIMUM_NT_TARGET_VERSION=0x501!INCLUDE $(NTMAKEENV)\makefile.def

sources

除了makefile,还需要sources文件来定义模块的编译信息

TARGETNAME=firstTARGETTYPE=DRIVERSOURCES=first.c

这里写图片描述

compile driver

开始->所有程序->Windows Driver Kits->x86 Checked Build Enviroment

这里写图片描述

  • 跳转到源码所在目录,并输入 “build” 命令

这里写图片描述

  • 会在源码目录下产生编译结果文件夹

这里写图片描述

服务安装

使用srvinstw.exe安装驱动程序

这里写图片描述

  • 启动这个服务所使用的的名称,不需要与驱动文件名相同

这里写图片描述

  • 驱动文件路径必须手动设置, 无法浏览选择

这里写图片描述

  • 选择设备驱动

这里写图片描述

  • NT驱动器目标名不设置,直接下一步

这里写图片描述

  • 启动类型设置为手动方便调试

这里写图片描述

装载驱动

net start lxhusternet stop lxhuster

这里写图片描述

驱动打印查看

使用DebugView.exe查看驱动打印的内核输出

  • 注意勾选捕获内核消息

这里写图片描述

这里写图片描述

调试first驱动

win内核调试方法有winDbg、Syser、Softice

  • winDbg: 微软自家免费调试工具,不解释
  • Syser: 国人开发
  • Softice :有了winDbg之后,这个工具就悲剧了。

使用winDbg调试驱动

由于winDbg调试内核为双机模式,所以通过本地机器调试虚拟机中的驱动

设置windows为调试模式
  • xp系统的设置
    1> 显示所有系统保护文件
    这里写图片描述

2> 将虚拟机中打印机删除

  • 如果不删除,新建的串口

这里写图片描述

3> 添加新的串口设备(用来调试内核)

  • 注意串口使用”命名管道”,同时第三个选项修改为”另一端是应用程序”
    这里写图片描述

4> 设置xp启动进入调试模式

  • 修改文件C:\boot.ini,加入如下代码:(设置进入调试,以及波特率)
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional lxhuster debug" /noexecute=optin /fastdetect /debug /debugport=com1 /baudrate=115200

】

  • 重启进入系统

这里写图片描述

5> 使用winDbg调试

  • 重启虚拟机系统后,立即启动winDbg调试内核
windbg.exe -b -k com:port=\\.\pipe\com_1,baud=115200,pipe

-b:初始断点 -k:内核调试 com:port:命名管道 baud:波特率 pipe:管道

这里写图片描述

  • 输入命令: g 继续执行进入系统

6> 设置winDbg符号

File->Symbol File Path

  • 设置windows符号和first驱动pdb地址,地址间使用分号隔开
src*e:\symbols*http://msdl.microsoft.com/download/symbols;F:\windows\driver\first\objchk_wxp_x86\i386
  • net start lxhuster 启动驱动,断点被winDbg捕获

这里写图片描述

附加

  • 装载驱动显示系统错误5,cmd没有管理员权限
    这里写图片描述

  • 装载驱动显示系统错误1275,说明驱动为32位想装载到64位系统上
    这里写图片描述

内核编程环境


共享内核空间

对于32位系统,低2GB是用户空间,高2GB是内核空间

数据类型

基本数据类型

微软重定义了数据类型

  • unsigned long 重定义 ULONG
  • unsigned char 重定义 UCHAR
  • unsigned int 重定义 UINT
  • void 重定义 VOID
  • unsigned long * 重定义 PULONG
  • unsigned char * 重定义 PUCHAR
  • unsigned int * 重定义 PUINT
  • void * 重定义 PVOID

    返回状态