134为DDKHelloWorld添加设备例程 12课.docx
- 文档编号:6007473
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:9
- 大小:18.51KB
134为DDKHelloWorld添加设备例程 12课.docx
《134为DDKHelloWorld添加设备例程 12课.docx》由会员分享,可在线阅读,更多相关《134为DDKHelloWorld添加设备例程 12课.docx(9页珍藏版)》请在冰豆网上搜索。
134为DDKHelloWorld添加设备例程12课
1.3.4为DDK_HelloWorld添加设备例程-12课
A、相关内核API介绍
B、重要数据结构驱动对象DRIVER_OBJECT
C、重要数据结构设备对象DEVICE_OBJECT
D、添加创建设备的例程
E、用工具查看驱动及驱动设备
课时39:
18
===================教案===================
一、VS2003编译环境配置
二、创建设备的具体步骤
1用RtlInitUnicodeString初如化设备名称指针
2用IoCreateDevice创建设备,如果不成功则返回
3用IoCreateSymlicLink创建符号链接,创建成功返回STATUS_SUCCESS;创建不成功则调用IoDeleteDevice删除设备;
三、写代码测试.
#pragmaINITCODE
NTSTATUSCreateMyDevice(INPDRIVER_OBJECTpDriverObject)
{
NTSTATUSstatus;
PDEVICE_OBJECTpDevObj;/*用来返回创建设备*/
//创建设备名称
UNICODE_STRINGdevName;
UNICODE_STRINGsymLinkName;
RtlInitUnicodeString(&devName,L"\\Device\\yjxDDK_Device");/*对devName初始化字串为"\\Device\\yjxDDK_Device"*/
//创建设备
status=IoCreateDevice(pDriverObject,\
0,\
&devName,\
FILE_DEVICE_UNKNOWN,\
0,TRUE,\
&pDevObj);
if(!
NT_SUCCESS(status))
returnstatus;
pDevObj->Flags|=DO_BUFFERED_IO;
//创建符号链接
RtlInitUnicodeString(&symLinkName,L"\\?
?
\\yjx888");
status=IoCreateSymbolicLink(&symLinkName,&devName);
if(!
NT_SUCCESS(status))
{
IoDeleteDevice(pDevObj);
returnstatus;
}
returnSTATUS_SUCCESS;
}
四、用工具查看我们的设备
VOIDRtlInitUnicodeString
(
INOUTPUNICODE_STRINGDestinationString,
INPCWSTRSourceString
);
DestinationString
需要初始化的指针PUNICODE_STRING
SourceString
指向一个以空结尾的Unicode字符串常量,用这个字符串来初始化DestinationString。
例子
PUNICODE_STRINGs;
RtlInitUnicodeString(s,L"宽字符");//s=L"宽字符";
IoCreateSymbolicLink
创建一个设备链接。
驱动程序虽然有了设备名称,但是这种设备名筄只能在内核态可见,而对于应用程序是不可见的,因此,驱动需要要暴露一个符号链接,该链接指向真正的设备名称
NTSTATUSIoCreateSymbolicLink(
INPUNICODE_STRINGSymbolicLinkName,
INPUNICODE_STRINGDeviceName);
参数:
SymbolicLinkName
Unicode字符串指针,是一个用户态可见的名称。
DeviceName
Unicode字符串指针,是驱动程序创建的设备对象名称。
ReturnValue
如果符号链接创建成功返回STATUS_SUCCESS
设备对象DEVICE_OBJECT结构
包含文件头ntddk.hwdm.h
typedefstructDECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT)_DEVICE_OBJECT{//设备对象
CSHORTType;//结构类型
USHORTSize;//结构大小
LONGReferenceCount;//引用计数
struct_DRIVER_OBJECT*DriverObject;//这个设备所属对象
struct_DEVICE_OBJECT*NextDevice;//指向下一个设备。
//在一个驱动对象中有N个设备,这些设备通过这个指针链接起来作为一个单向链表
struct_DEVICE_OBJECT*AttachedDevice;//
struct_IRP*CurrentIrp;//当前IRP
PIO_TIMERTimer;
ULONGFlags;
ULONGCharacteristics;
PVPBVpb;
PVOIDDeviceExtension;//自定义结构
DEVICE_TYPEDeviceType;//设备类型
CCHARStackSize;//IRP栈大小
union{
LIST_ENTRYListEntry;
WAIT_CONTEXT_BLOCKWcb;
}Queue;
ULONGAlignmentRequirement;
KDEVICE_QUEUEDeviceQueue;
KDPCDpc;
ULONGActiveThreadCount;
PSECURITY_DESCRIPTORSecurityDescriptor;
KEVENTDeviceLock;
USHORTSectorSize;
USHORTSpare1;
struct_DEVOBJ_EXTENSION*DeviceObjectExtension;
PVOIDReserved;
}DEVICE_OBJECT;
IoCreateDevice为驱动创建一个设备对象格式如下:
NTSTATUSIoCreateDevice(
INPDRIVER_OBJECTDriverObject,
INULONGDeviceExtensionSize,
INPUNICODE_STRINGDeviceNameOPTIONAL,
INDEVICE_TYPEDeviceType,
INULONGDeviceCharacteristics,
INBOOLEANExclusive,
OUTPDEVICE_OBJECT*DeviceObject);
参数:
DriverObject
为指针调用驱动程序对象。
每个驱动程序接收一个参数的指针,并将司机反对其DriverEntry例程。
波分复用功能和筛选器驱动程序也可领取的AddDevice例程的驱动程序对象的指针。
DeviceExtensionSize//0
给_DEVICE_OBJECT.DeviceExtension指定内存空间大小,具体看自己定义结构的大小
DeviceName
设备名字
DeviceType
设备类型这里我们用FILE_DEVICE_UNKNOWN
DeviceCharacteristics
设备特征信息一般为0
Exclusive
是否指定设备为独占是为TRUE,否为FALSE
DeviceObject
指针变量接收一个指向新创建的DEVICE_OBJECT结构。
用来回传数据
返回值
调用成功会返回STATUS_SUCCESS如果出错会返回下列值
STATUS_INSUFFICIENT_RESOURCES//资源不足
STATUS_OBJECT_NAME_EXISTS//指定对象名存在
STATUS_OBJECT_NAME_COLLISION//对象名有冲突
IoCreateSymbolicLink
创建一个设备链接。
驱动程序虽然有了设备名称,但是这种设备名筄只能在内核态可见,而对于应用程序是不可见的,因此,驱动需要要暴露一个符号链接,该链接指向真正的设备名称
NTSTATUSIoCreateSymbolicLink(
INPUNICODE_STRINGSymbolicLinkName,
INPUNICODE_STRINGDeviceName);
参数:
SymbolicLinkName
Unicode字符串指针,是一个用户态可见的名称。
DeviceName
Unicode字符串指针,是驱动程序创建的设备对象名称。
ReturnValue
如果符号链接创建成功返回STATUS_SUCCESS
VOIDIoDeleteDevice(
INPDEVICE_OBJECTDeviceObject
);
参数
DeviceObject
PDEVICE_OBJECT类型的指针,指向需要删除的设备对象
无返回值
===================教案===================
因为11课没有代码,所以这里将10课的代码复制出来,用VC2003打开,再设置一下各个选项.预处理这里是WIN32=100;_X86_=1;WINVER=0x501;DBG=1
本节课老师已经准备好了源代码,详细的讲解了每条指令.
首先介绍一下RtlInitUnicodeString函数,如果没装MSDN也可以直接去微软的网站+
老师详细讲解了代码,包括设备对象DEVICE_OBJECT结构
#definePAGECODEcode_seg("PAGE")
加入调试信息,当创建不成功的时候给予提示
用工具查看一下我们的驱动设备,今天又用到一个新的工具WinObj,可以查看已安装的所有驱动,就在Driver目录里.又介绍DDK里自带的工具DeviceTree,也同样可以查看所有已存在的驱动.
老师讲的非常详细,而且教案也很详细.今天学到驱动中的几个新函数,让我想起来刚开始学编程时学习的ReadProcessMemory和OpenProcess等等的函数,当时是那样的陌生可现在是很熟悉了,相信驱动的函数慢慢的也会学会.
下面是完整代码
//_stdcall
#include
#defineINITCODEcode_seg("INIT")
#definePAGECODEcode_seg("PAGE")/*表示内存不足时,可以被置换到硬盘*/
#pragmaINITCODE/*指的代码运行后就从内存释放掉*/
NTSTATUSCreateMyDevice(INPDRIVER_OBJECTpDriverObject)
{
NTSTATUSstatus;
PDEVICE_OBJECTpDevObj;/*用来返回创建设备,结构已经详细说明
//创建设备名称
UNICODE_STRINGdevName;//内核设备名
UNICODE_STRINGsymLinkName;//用户层符号连接
RtlInitUnicodeString(&devName,L"\\Device\\yjxDDK_Device");/*对devName初始化字串为"\\Device\\yjxDDK_Device"L就是宽字符的意思
//创建设备
status=IoCreateDevice(pDriverObject,\//与入口函数相连接的指针
0,\//创建大小
&devName,\//驱动名称
FILE_DEVICE_UNKNOWN,\//设备设置为未知类型
0,TRUE,\//斜杠\是换行用的
&pDevObj);//连接符号
if(!
NT_SUCCESS(status))//大于0则表示成功,这里取非
{
if(status==STATUS_INSUFFICIENT_RESOURCES)
{
KdPrint(("资源不足STATUS_INSUFFICIENT_RESOURCES"));
}
if(status==STATUS_OBJECT_NAME_EXISTS)
{
KdPrint(("指定对象名存在"));
}
if(status==STATUS_OBJECT_NAME_COLLISION)
{
KdPrint(("//对象名有冲突"));
}
KdPrint(("设备创建失败...++++++++"));
returnstatus;
}
KdPrint(("设备创建成功...++++++++"));
pDevObj->Flags|=DO_BUFFERED_IO;
//创建符号链接
RtlInitUnicodeString(&symLinkName,L"\\?
?
\\yjx888");
status=IoCreateSymbolicLink(&symLinkName,&devName);//用户层与驱动层符号连接
if(!
NT_SUCCESS(status))/*status等于*/
{
IoDeleteDevice(pDevObj);//打算删除但是未成功
returnstatus;
}
returnSTATUS_SUCCESS;
}
#pragmaINITCODE
VOIDDDK_Unload(INPDRIVER_OBJECTpDriverObject);//前置说明卸载例程
NTSTATUSDriverEntry(PDRIVER_OBJECTpDriverObject,PUNICODE_STRINGB)//TYPEDEFLONGNTSTATUS
{
KdPrint(("驱动成功被加载...OK++++++++"));
//jmp指令
CreateMyDevice(pDriverObject);
pDriverObject->DriverUnload=DDK_Unload;
return
(1);
}
VOIDDDK_Unload(INPDRIVER_OBJECTpDriverObject)
{
KdPrint(("驱动成功被卸载...OK-----------"));//sprintf,printf
//删掉所有设备
DbgPrint("卸载成功");
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 134为DDKHelloWorld添加设备例程 12课 134 DDKHelloWorld 添加 设备 例程 12