windows驅動程式設計(一) 先寫個NTDDK例子

2021-06-18 21:16:26 字數 2753 閱讀 4860

參考張帆的windows驅動開發技術詳解,自學中。。。
#pragma once

#ifndef __helloddk__hh

#define __helloddk__hh

//包含ntddk.h檔案,使用c標準的方式編譯

#ifdef __cplusplus

extern "c"

;#endif

//定義分頁標記,非分頁標記和初始化記憶體塊,

//在windows驅動程式的開發中,所有程式的函式和變數都有指明被載入到分頁記憶體還是非分頁記憶體

//driverentry函式需要放在init標誌的記憶體中

//關於區別後續解釋

#define pagedcode code_seg("page")

#define lockedcode code_seg()

#define initcode code_seg("init")

#define pageddata data_seg("page")

#define lockeddata data_seg()

#define initdata data_seg("init")

#define arraysize(p) (sizeof(p)/sizeof((p)[0])) //得到陣列的元素個數

//裝置擴充套件結構體,根據個人需要可以新增所需資訊

typedef struct _device_extension

device_extension,*pdevice_extension;

ntstatus createdevice(in pdriver_object pdriverobject); //建立裝置

void helloddkunload(in pdriver_object pdriverobject);//解除安裝裝置

ntstatus helloddkdispatchroutine(in pdriver_object pdriverobject,in pirp pirp);//通用的裝置例程函式

#endif

#include "myddkhello.h"

/*driverentry:驅動程式的入口函式

功能:初始化驅動程式,申請硬體資源,建立核心物件

引數:in pdriverobject 從i/o管理器中傳進來的驅動物件

in pregisterpath 驅動程式在登錄檔中的路徑

返回:返回初始化驅動的狀態

*///#include #pragma initcode

extern "c" ntstatus driverentry(in pdriver_object pdriverobject,in punicode_string pregisterpath)

/*createdevice:初始化裝置物件

引數:pdriverobject 從i/o管理器傳進來的驅動物件

返回:返回建立裝置的初始化狀態

*/#pragma initcode

ntstatus createdevice(pdriver_object pdriverobject)

pdeviceobject->flags |= do_buffered_io; //裝置對記憶體的操作分類:do_buffered_io do_direct_io ,詳解後說明

pdevext = (pdevice_extension)pdeviceobject->deviceextension;

pdevext->pdevice = pdeviceobject;

pdevext->usdevicename = usdevname;

//建立符號連線

unicode_string ussymlinkname;

rtlinitunicodestring(&ussymlinkname,l"\\??\\mysymblinknamehelloddk");

pdevext->ussymlinkname = ussymlinkname;

//對於應用程式,裝置名稱是不可見的,只能使用符號連線名稱,該連線指向真正的裝置名稱

status = iocreatesymboliclink(&ussymlinkname,&usdevname);

if (!nt_success(status))

return status_success;}/*

helloddkunload:負責驅動程式的解除安裝操作

引數: pdriverobject :驅動程式物件

*//*

此歷程遍歷系統中所有的此類裝置物件。第乙個裝置物件的位址存在於驅動物件的deviceobject域中,

解除安裝驅動函式的主要目的就是遍歷此鍊錶,獲得裝置名稱和符號鏈結名稱,並執行刪除操作。

*/#pragma pagedcode

void helloddkunload(in pdriver_object pdriverobject)}/*

helloddkdispatchroutine:預設派遣函式

引數:pdriverobject:功能裝置物件

pirp:從i/o請求包

返回值:返回處理的狀態

*/#pragma pagedcode

ntstatus helloddkdispatchroutine(in pdriver_object pdriverobject,in pirp pirp)

windows驅動程式設計學習順序

windows驅動程式設計學習順序?2010年11月19日 核心驅動程式設計並不是什麼高深的知識,無非也是按照系統的api,框架去做 罷了,只是這些東西,提供了更接近於底層的功能,在某些情況下對程式的構架更加有利效率更高而已。沒有創新性的東西是無所謂難度不難度的,照葫蘆畫瓢而已。從 學起,基本路線 ...

Windows驅動開發(一)

筆者學習驅動程式設計是從兩本書入門的。它們分別是 寒江獨釣 核心安全程式設計 和 windows驅動開發技術詳解 兩本書分別從不同的角度介紹了驅動程式的製作方法。在我理解,驅動程式可分為兩類三種 第一類 傳統型驅動 傳統型驅動的特點就是所有的irp都需要自己去處理,自己實現針對不同irp的派發函式。...

Windows驅動開發 (一)序言

筆者學習驅動程式設計是從兩本書入門的。它們分別是 寒江獨釣 核心安全程式設計 和 windows驅動開發技術詳解 兩本書分別從不同的角度介紹了驅動程式的製作方法。在我理解,驅動程式可分為兩類三種 第一類 傳統型驅動 傳統型驅動的特點就是所有的irp都需要自己去處理,自己實現針對不同irp的派發函式。...