设为首页 收藏本站
查看: 860|回复: 0

[经验分享] 《Windows驱动开发技术详解》读书笔记(一)

[复制链接]

尚未签到

发表于 2016-5-21 11:59:32 | 显示全部楼层 |阅读模式
首先需要安装DDK,这里我选择Microsoft Windows Server 2003 SP1 DDKWindows驱动分成两类,一类是不支持即插即用的NT式驱动,一类是支持即插即用的WDM驱动.
首先来看一个最简单的NT式驱动。
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#pragmaonce

#ifdef__cplusplus
extern"C"
{
#endif
#include
<NTDDK.h>
#ifdef__cplusplus
}
#endif

#definePAGEDCODEcode_seg("PAGE")
#defineLOCKEDCODEcode_seg()
#defineINITCODEcode_seg("INIT")

#definePAGEDDATAdata_seg("PAGE")
#defineLOCKEDDATAdata_seg()
#defineINITDATAdata_seg("INIT")

#definearraysize(p)(sizeof(p)/sizeof((p)[0]))

typedef
struct_DEVICE_EXTENSION{
PDEVICE_OBJECTpDevice;
UNICODE_STRINGustrDeviceName;
//设备名称
UNICODE_STRINGustrSymLinkName;//符号链接名
}DEVICE_EXTENSION,*PDEVICE_EXTENSION;

//驱动函数声明
NTSTATUSCreateDevice(INPDRIVER_OBJECTpDriverObject);
VOIDHelloDDKUnload(INPDRIVER_OBJECTpDriverObject);
NTSTATUSHelloDDKDispatchRoutine(INPDEVICE_OBJECTpDevObj,
INPIRPpIrp);

  Driver.h头文件中包含了开发NT式驱动所需要的NTDDK.h,此外还定义了几个标志来指明函数和变量分配在分页内存还是非分页内存中。Windows驱动程序的入口函数是DriverEntry函数,
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include"Driver.h"

/************************************************************************
*函数名称:DriverEntry
*功能描述:初始化驱动程序,定位和申请硬件资源,创建内核对象
*参数列表:
pDriverObject:从I/O管理器中传进来的驱动对象
pRegistryPath:驱动程序在注册表的中的路径
*返回值:返回初始化驱动状态
************************************************************************
*/
#pragmaINITCODE
extern"C"NTSTATUSDriverEntry(
INPDRIVER_OBJECTpDriverObject,
INPUNICODE_STRINGpRegistryPath)
{
NTSTATUSstatus;
KdPrint((
"EnterDriverEntry/n"));

//注册其他驱动调用函数入口
pDriverObject->DriverUnload=HelloDDKUnload;
pDriverObject
->MajorFunction[IRP_MJ_CREATE]=HelloDDKDispatchRoutine;
pDriverObject
->MajorFunction[IRP_MJ_CLOSE]=HelloDDKDispatchRoutine;
pDriverObject
->MajorFunction[IRP_MJ_WRITE]=HelloDDKDispatchRoutine;
pDriverObject
->MajorFunction[IRP_MJ_READ]=HelloDDKDispatchRoutine;

//创建驱动设备对象
status=CreateDevice(pDriverObject);

KdPrint((
"DriverEntryend/n"));
returnstatus;
}

/************************************************************************
*函数名称:CreateDevice
*功能描述:初始化设备对象
*参数列表:
pDriverObject:从I/O管理器中传进来的驱动对象
*返回值:返回初始化状态
************************************************************************
*/
#pragmaINITCODE//指明此函数加载到INIT内存区域(即只在加载的时候需要载入内存,加载成功后可以从内存中卸载掉)
NTSTATUSCreateDevice(
INPDRIVER_OBJECTpDriverObject)
{
NTSTATUSstatus;
PDEVICE_OBJECTpDevObj;
PDEVICE_EXTENSIONpDevExt;

//创建设备名称
UNICODE_STRINGdevName;
RtlInitUnicodeString(
&devName,L"//Device//MyDDKDevice");

//创建设备
status=IoCreateDevice(pDriverObject,
sizeof(DEVICE_EXTENSION),
&(UNICODE_STRING)devName,
FILE_DEVICE_UNKNOWN,
//此种设备为独占设备
0,TRUE,
&pDevObj);
if(!NT_SUCCESS(status))
returnstatus;

pDevObj
->Flags|=DO_BUFFERED_IO;
pDevExt
=(PDEVICE_EXTENSION)pDevObj->DeviceExtension;
pDevExt
->pDevice=pDevObj;
pDevExt
->ustrDeviceName=devName;
//创建符号链接
UNICODE_STRINGsymLinkName;
RtlInitUnicodeString(
&symLinkName,L"//??//HelloDDK");
pDevExt
->ustrSymLinkName=symLinkName;
status
=IoCreateSymbolicLink(&symLinkName,&devName);
if(!NT_SUCCESS(status))
{
IoDeleteDevice(pDevObj);
returnstatus;
}
returnSTATUS_SUCCESS;
}

/************************************************************************
*函数名称:HelloDDKUnload
*功能描述:负责驱动程序的卸载操作
*参数列表:
pDriverObject:驱动对象
*返回值:返回状态
************************************************************************
*/
#pragmaPAGEDCODE
VOIDHelloDDKUnload(INPDRIVER_OBJECTpDriverObject)
{
//遍历系统中所有的此类设备对象,删除设备对象及其符号链接
PDEVICE_OBJECTpNextObj;
KdPrint((
"EnterDriverUnload/n"));
pNextObj
=pDriverObject->DeviceObject;
while(pNextObj!=NULL)
{
PDEVICE_EXTENSIONpDevExt
=(PDEVICE_EXTENSION)
pNextObj
->DeviceExtension;

//删除符号链接
UNICODE_STRINGpLinkName=pDevExt->ustrSymLinkName;
IoDeleteSymbolicLink(
&pLinkName);
pNextObj
=pNextObj->NextDevice;
IoDeleteDevice(pDevExt
->pDevice);
}
}

/************************************************************************
*函数名称:HelloDDKDispatchRoutine
*功能描述:对读IRP进行处理
*参数列表:
pDevObj:功能设备对象
pIrp:从IO请求包
*返回值:返回状态
************************************************************************
*/
#pragmaPAGEDCODE
NTSTATUSHelloDDKDispatchRoutine(INPDEVICE_OBJECTpDevObj,
INPIRPpIrp)
{
KdPrint((
"EnterHelloDDKDispatchRoutine/n"));
NTSTATUSstatus
=STATUS_SUCCESS;
//完成IRP
pIrp->IoStatus.Status=status;
pIrp
->IoStatus.Information=0;//bytesxfered
IoCompleteRequest(pIrp,IO_NO_INCREMENT);
KdPrint((
"LeaveHelloDDKDispatchRoutine/n"));
returnstatus;
}

  有两种编译驱动的办法,一种是用DDK环境来编译,需要在源代码所在目录下创建两个文件makefile和Sources,
makefile内容如下,功能是引入DDK的bin目录下的makefile.def文件:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->!INCLUDE$(NTMAKEENV)/makefile.def
  Sources内容如下:  

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->TARGETNAME=HelloDDK
TARGETTYPE
=DRIVER
TARGETPATH
=OBJ
INCLUDES
=$(BASEDIR)/inc;/
$(BASEDIR)/inc/ddk;/
SOURCES
=Driver.cpp/

  然后在开始菜单中选择“Windows XP Checked Build Environment”编译环境,进入需要编译的目录,输入”build“命令就可以, http://lh5.ggpht.com/_jUvB_C3ZaTU/SZzYG3lBbQI/AAAAAAAAINs/a204NdDJ15c/s800/2009021902.jpg
  编译后的驱动位于objchk_wxp_x86"i386目录下,名为HelloDDK.sys
第二种编译方式是使用VC++进行编译
  1,用vc新建工程。在"project"选项卡中,选择win32 Application,选择一个空的工程。
2,将两个源文件Driver.h和Driver.cpp拷贝到工程目录中,并添加到工程中。
3,增加新的编译版本,去掉Debug 和Release 版本,增加一个Win32 Driver Check Edition
  4,修改工程属性。选择"Project|Setting",或者直接按下Alt+F7键,弹出"Project Settings"。在对话框中,选择“General”选项卡。将Intermediate files和Output files都改为MyDriver_Check.
5,选择C/C++选项卡,将原有的Project Options 内容全部删除替换成如下内容:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->/nologo/Gz/MLd/W3/WX/Z7/Od/DWIN32=100/D_X86_=1/DWINVER=0x500/DDBG=1/Fo"MyDriver_Check/"/Fd"MyDriver_Check/"/FD/c
  6,选择Link选项卡,将原有的Project Options 内容全部删除,替换成如下内容:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->ntoskrnl.lib/nologo/base:"0x10000"/stack:0x400000,0x1000/entry:"DriverEntry"/subsystem:console/incremental:no/pdb:"MyDriver_Check/HelloDDK.pdb"/map:"MyDriver_Check/HelloDDK.map"/debug/machine:I386/nodefaultlib/out:"MyDriver_Check/HelloDDK.sys"/pdbtype:sept/subsystem:native/driver/SECTION:INIT,D/RELEASE/IGNORE:4078

  7。修改VC的lib目录和include目录。
在vc中选择"Tools"|"Options",在弹出的对话框中选择“Directories”选项卡。在“Show directories for”下拉菜单中选择“Include files”菜单,添加
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->D:/WINDDK/3790.1830/INC/W2K

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->D:/WINDDK/3790.1830/INC/DDK/W2K
并将这两个目录置于最上。
在"Show directories for "下拉菜单中选择“Library files”菜单,添加目录
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->D:/WINDDK/3790.1830/LIB/W2K/I386
并置于最上端。
8,按照书上所述的步骤做完后编译,会报错如下:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->fatalerrorC1083:Cannotopenincludefile:'specstrings.h':Nosuchfileordirectory


原因是include目录设置没完整,加入如下目录既可以正确编译
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->D:/WINDDK/3790.1830/INC/CRT
最后来安装此驱动,这里使用Driver Studio3.2.1中的Driver Monitor来完成
http://lh4.ggpht.com/_jUvB_C3ZaTU/SZzYCyiYn3I/AAAAAAAAINk/BtaVL6emC0Q/s800/2009021901.jpg

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-219918-1-1.html 上篇帖子: windows主机资源Snmp OIDs CPU, Memory, Disk等 下篇帖子: 郁闷的两天(Windows系统两个问题解决方案汇总)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表