转载请注明来源:
enjoy5512的博客 : http://blog.csdn.net/enjoy5512
GitHub : https://github.com/whu-enjoy
为了整理方便,可以在一个合适的路径下建立一个专门的文件夹用于保存源代码.打开桌面的x86 Checked Build Enviroment快捷方式,进到源代码所在文件夹下,可以看到每个程序至少有三个文件,一个源代码文件,一个是makefile,一个sources,头文件是可选的
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICMxYTO0czM5ATNwcDM2EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
头文件
/////////////////////////////////////////////////////////////////////////////
// 文件名 : 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>
//////////////////////////////////////////////////////////////////////////////
//*= = 宏与结构体
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//*= = 函数声明
//////////////////////////////////////////////////////////////////////////////
NTSTATUS
DriverEntry(
__in PDRIVER_OBJECT DriverObject,
__in PUNICODE_STRING RegistryPath
);
VOID
DriverUnload(
__in PDRIVER_OBJECT DriverObject
);
#endif //End of __FIRST_H__
源代码
/////////////////////////////////////////////////////////////////////////////
// 文件名 : 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
#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");
}
makefile文件
这个文件是固定的,内容不变
!IF
Copyright (C) Microsoft Corporation, -
Module 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
sources文件
TARGETNAME=first
TARGETTYPE=DRIVER
SOURCES=first.c
在源代码路径下,使用build命令编译驱动程序
将编译好的first.sys复制到虚拟机中
将程序符号文件路径加到windbg符号路径中
设置源代码路径
启动服务,可以看到虚拟机卡住了,windbg在int3处中断了,然后便可以开始调试运行了