驅動工具DbgView,DriverMonitor   點擊下載

1.創建設備步驟

     1.RtlInitUnicodeString初始化設備名稱
     2.IoCreateDevice創建設備 創建失敗則返回
     3.IoCreateSymlicLink創建符號鏈接,若創建失敗則調用IoDeleteDevice

1.1 - RtlInitUnicodeString函數原型

     VOID RtlInitUnicodeString
     (
     IN OUT PUNICODE_STRING DestinationString,
     IN PCWSTR SourceString
     );

     DestinationString 參數

     初始化的指针 類型是 PUNICODE_STRING

     SourceString 參數

     用這個字串來初始化 DestinationString

1.2 - IoCreateDevice函數原型

       NTSTATUS IoCreateDevice

       ( 

IN PDRIVER_OBJECT DriverObject,
IN ULONG DeviceExtensionSize,
IN PUNICODE_STRING DeviceName OPTIONAL,
IN DEVICE_TYPE DeviceType,
IN ULONG DeviceCharacteristics,
IN BOOLEAN Exclusive,
OUT PDEVICE_OBJECT *DeviceObject 

);

參數介紹:

DriverObject
調用驅動對象
DeviceExtensionSize //0
給驅動對象指定內存空間大小
DeviceName
設備名稱
DeviceType
設備類型FILE_DEVICE_UNKNOWN
DeviceCharacteristics
設備信息,一般設0
Exclusive
設備指否設定為唯一
DeviceObject
指針接收一個DriverObject結構,用來回傳數據
返回值
調用成功返回STATUS_SUCCESS
若資源不足時,返回STATUS_INSUFFICIENT_RESOURCES
對象名稱以存在,返回STATUS_OBJECT_NAME_EXISTS
對象名稱有衝突,返回STATUS_OBJECT_NAME_COLLISION


1.3 - IoCreateSymlicLink

       IoCreateSymbolicLink

創建符號鏈接,一般驅動創建設備後只能在內核模式下看,在一般的用戶層下是看不到的,

所以需要一個符號鏈接,指向真正的設備名稱

NTSTATUS IoCreateSymbolicLink

IN PUNICODE_STRING SymbolicLinkName,
IN PUNICODE_STRING DeviceName

 );
参数
SymbolicLinkName
Unicode字符串,用戶層下可見的名稱。

DeviceName
Unicode設備對象名稱。

Return Value
符號鏈接創建成功時,返回STATUS_SUCCESS

 


2.開始創建設備 

#pragma INITCODE //代碼運行後 就從內存釋放掉
NTSTATUS CreateMyDevice (IN PDRIVER_OBJECT DriverObject)
{
NTSTATUS status;
PDEVICE_OBJECT DevObj; 返回創建設備


UNICODE_STRING DevName;
UNICODE_STRING symName;

//初始化指針,L是寬字符的意思, 一個\ 是換行的意思,\\ 才等於真正的\
RtlInitUnicodeString(&DevName,L"\\Device\\DDK_HelloWorld");

//創建設備
status = IoCreateDevice( DriverObject,\
0,\
&DevName,\
FILE_DEVICE_UNKNOWN,\
0, TRUE,\
&DevObj);
if (!NT_SUCCESS(status)) /*NT_SUCCESS 跟KdPrint 一樣 都是一個宏,我們用他來檢測status是否返回成功*/

{

if (status==STATUS_INSUFFICIENT_RESOURCES)
{
KdPrint(("資源不足"));
}
if (status==STATUS_OBJECT_NAME_COLLISION )
{
KdPrint(("對象名以存在"));
}
if (status==STATUS_OBJECT_NAME_EXISTS)
{
KdPrint(("對象名有衝突"));
}

KdPrint(("創建設備失敗"));

return status;

}

KdPrint(("創建設備成功"));

DevObj->Flags |= DO_BUFFERED_IO;


//初始化symName

RtlInitUnicodeString(&symName,L"\\??\\HelloWorld");

//創建符號鏈接
status = IoCreateSymbolicLink( &symName,&DevName );
if (!NT_SUCCESS(status)) //status = 0 則執行
{
IoDeleteDevice( DevObj ); //刪除設備
return status;
}
return STATUS_SUCCESS;
}

 3.完整的代碼


#include <ntddk.h>
#define INITCODE code_seg("INIT")
#define PAGECODE code_seg("PAGE") 
#pragma INITCODE
NTSTATUS CreateMyDevice (IN PDRIVER_OBJECT DriverObject)
{
NTSTATUS status;
PDEVICE_OBJECT DevObj;

//初始化
UNICODE_STRING DevName;
UNICODE_STRING symName; //
RtlInitUnicodeString(&DevName,L"\\Device\\DDK_HelloWorld");

//創建設備
status = IoCreateDevice( DriverObject,\
0,\
&DevName,\
FILE_DEVICE_UNKNOWN,\
0, TRUE,\
&DevObj);
if (!NT_SUCCESS(status))
{
if (status==STATUS_INSUFFICIENT_RESOURCES)
{
KdPrint(("資源不足"));
}
if (status==STATUS_OBJECT_NAME_COLLISION )
{
KdPrint(("對象名有衝突"));
}
if (status==STATUS_OBJECT_NAME_EXISTS  )
{
KdPrint(("對象名以存在"));
}
KdPrint(("創建設備失敗"));
return status;
}
KdPrint(("創建設備成功"));

DevObj->Flags |= DO_BUFFERED_IO;

//創建符號鏈接

RtlInitUnicodeString(&symName,L"\\??\\HelloWorld");
status = IoCreateSymbolicLink( &symName,&DevName );
if (!NT_SUCCESS(status))
{
IoDeleteDevice( DevObj );
return status;
}
return STATUS_SUCCESS;
}

VOID DDK_Unload (IN PDRIVER_OBJECT DriverObject); //申明卸載

#pragma INITCODE
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING B) //TYPEDEF LONG NTSTATUS
{
KdPrint(("驅動加載成功!!"));

CreateMyDevice(DriverObject); //創建設備
DriverObject->DriverUnload=DDK_Unload;
return 1;
}

#pragma PAGECODE
VOID DDK_Unload (IN PDRIVER_OBJECT DriverObject)
{

PDEVICE_OBJECT Dev;//取得要被刪除的設備對象
UNICODE_STRING symName; //取得符號鏈接名稱

Dev=DriverObject->DeviceObject;
IoDeleteDevice(Dev); //刪除設備

//取得符號鏈接名稱
RtlInitUnicodeString(&symName,L"\\??\\HelloWorld");
//刪除符號鏈接
IoDeleteSymbolicLink(&symName);


KdPrint(("驅動卸載成功"));

}

 

4.現在來測試我們的代碼

編寫代碼成功!!

1  

DriverMonitor步驟

DriverMonitor  

 DbgView設定

DbgView  

 現在來看看測試效果

2  

測試是成功的

可以加載 卸載 加載 卸載

就代表編寫成功了

一個簡單的驅動


pua0156k 發表在 痞客邦 PIXNET 留言(0) 人氣()