驅動工具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.現在來測試我們的代碼
編寫代碼成功!!
DriverMonitor步驟
DbgView設定
現在來看看測試效果
測試是成功的
可以加載 卸載 加載 卸載
就代表編寫成功了
一個簡單的驅動
留言列表