Windows驅動開發之第一個驅動程序

轉載請註明來源:
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>

//////////////////////////////////////////////////////////////////////////////
//*= = 宏與結構體
//////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////
//*= = 函數聲明
//////////////////////////////////////////////////////////////////////////////
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 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");
}

makefile文件

這個文件是固定的,內容不變

!IF 0

Copyright (C) Microsoft Corporation, 1999 - 2002

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處中斷了,然後便可以開始調試運行了
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章