欢迎来到冰豆网! | 帮助中心 分享价值,成长自我!
冰豆网
全部分类
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • 党团工作>
  • ImageVerifierCode 换一换
    首页 冰豆网 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    设备管理通过设备接口打开设备详细步骤XXXXWord下载.docx

    • 资源ID:18111660       资源大小:293.64KB        全文页数:17页
    • 资源格式: DOCX        下载积分:3金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    设备管理通过设备接口打开设备详细步骤XXXXWord下载.docx

    1、默认函数调用采用标准调用(_stdcall)/MLd/W3:采用第三级警告模式/WX:将警告信息转换为错误信息,最大程度保证代码可靠/Z7:用Z7模式产生调试信息?/Od:关闭调试模式,VC的调试命令不能调试内核下的程序/D WIN32=100 /D_X86_=1 /D WINVER=0x500 /D DBG=1:定义4个宏(不知道为什么)/FoMyDriver_Check/:MyDriver_Check/为Output Directories中“创建”的文件夹,存放中间生成的目标代码路径/Fd: MyDriver_Check/为存放.PDB文件的文件夹/FD:生成文件依奈/c:只进行编译,不

    2、连接图6选择Link选项卡,将原有的Project Options 内容全部删除,替换成如下内容:wdm.lib /nologo /base:0x10000 /stack:0x400000,0x1000 /entry:DriverEntry /subsystem:console /incremental:no /pdb:MyDriver_Check/GuidOpen.pdb /debug /machine:I386 /nodefaultlib /out:MyDriver_Check/GuiOpen.sys /pdbtype:sept /subsystem:native /driver /SEC

    3、TION:INIT,D /IGNORE:4078wdm.lib:链接WDM库链接时不显示版本信息/base::加载驱动时,设定加载到虚拟内存的地址/stack:0x400000,0x1000:设定函数使用堆栈的地址与大小/entry:入口函数的地址(为符合标准函数调用的)/subsystem:console:设置子系统/incremental:no:非递曾式链接/pdb:设置pdb文件的文件名为GuidOpen,保存于MyDriver_Check文件夹下面C/C+属性页中的设置一样。/debug:以Debug方式链接/machine:I386:产生代码为386兼容的平台下的/nodefault

    4、lib:不使用默认的库/out:MyDriver_Check/GuidOpen.sys输出2进制的代码的文件名,保存于MyDriver_Check文件夹下与C/C+属性页中的设置一样。/pdbtype:sept:设置pdb文件的类型native:子系统为内核系统/driver:编译驱动/SECTION:INIT,D:将INIT的段设置为可抛弃的/IGNORE:4078:忽略4078号警告错误图7(5).修改VC的lib目录和include 目录。Tools-Options-Directories属性页下的Show directories for 切换到Includefie 添加的头文件 (安装

    5、的ddk的目录文件夹)Incw2k (ddk的目录文件夹)Incddkwdmw2k 置于最上面 添加库文件 (安装的ddk的目录文件夹)libw2ki3862.驱动程序说明(1)重要驱动程序中重要的数据结构驱动对象(DRIVER_OBJECT)在驱动加载时被内核中的对象管理程序所创建,由内核中的I/O管理器负责加载。typedef struct _DRIVER_OBJECT CSHORT Type; CSHORT Size; PDEVICE_OBJECT DeviceObject; ULONG Flags; PVOID DriverStart; ULONG DriverSize; PVOID

    6、DriverSection; PDRIVER_EXTENSION DriverExtension; UNICODE_STRING DriverName; PUNICODE_STRING HardwareDatabase; PFAST_IO_DISPATCH FastIoDispatch; PDRIVER_INITIALIZE DriverInit; PDRIVER_STARTIO DriverStartIo; PDRIVER_UNLOAD DriverUnload; PDRIVER_DISPATCH MajorFunctionIRP_MJ_MAXIMUM_FUNCTION+1; DRIVER_

    7、OBJECT;typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT;DeviceObject:每个驱动程序会有一个或多个设备对象。设备对象是由程序员自己创建的,而非操作系统完成,在驱动被卸载时,遍历每个设备对象,并将其删除。设备对象(DEVICE_OBJECT)typedef struct _DEVICE_OBJECT struct _DRIVER_OBJECT *DriverObject; struct _DEVICE_OBJECT *NextDevice; struct _DEVICE_OBJECT *AttachedDevice; struct _I

    8、RP *CurrentIrp; struct _DEVOBJ_EXTENSION *DeviceObjectExtension;. DEVICE_OBJECT;typedef struct _DEVICE_OBJECT *PDEVICE_OBJECT;/ntndis设备扩展 是由程序员制定内容和大小,由I/O管理器创建的,并且保存在非分页内存中。(2)WDM驱动程序基本结构,在WDM驱动程序中,完成一个设备操作,至少需要两个设备对象共同完成,一个是物理设备对象(Physical Device Object)PDO和功能设备对象(Function Device Object)FDO。当PC插入一

    9、个设备时,PDO会自动创建。确切的说是由总线驱动创建的,PDO不能单独操作设备,需要配合FDO一起使用。系统会检测到新设备,要求安装驱动程序,需要安装的驱动程序指的就是WDM程序,此驱动程序负责创建FDO,并且附加到PDO上。(3)驱动程序分析 头文件中,除了生命函数之外,还要定义一个设备扩展。 typedef struct _DEVICE_EXTENSION PDEVICE_OBJECT fdo; PDEVICE_OBJECT NextStackDevice; UNICODE_STRING interfaceName; /设备接口 DEVICE_EXTENSION, *PDEVICE_EXT

    10、ENSION; 当驱动程序被加载时,首先进入DriverEntry函数。DriverEntry主要是对驱动程序进行初始化,它是由系统进程所调用的,在Windows中有个特殊的进程叫做系统进程,打开进程管理器,里面有一个名为System的进程就是系统进程。系统进程在系统启动的时候就被创建了。驱动加载时,系统进程启动新的线程,调用执行体组建中的对象管理器,创建一个驱动对象。这个驱动对象是一个DRIVER_OBJECT的结构体。另外,系统进程调用执行体组建中的配置管理器程序,查询词驱动程序对应的注册表项。DriverEntry函数由两个参数PDRIVER_OBJECT pDeriverObject

    11、是刚才被创建的驱动对象的指针,和PUNICODE_STRING pRegistryPath,设备服务键的的键名字符串的指针。在这个函数中,主要是对系统进程创建的驱动对象进行初始化。 DriverEntry函数中,它对驱动对象的初始化一般是对例程的设置,卸载例程,AddDevice和IRP派遣函数。具体代码如下: pDriverObject-DriverExtension-AddDevice = GuidOpenAddDevice;MajorFunctionIRP_MJ_PNP = GuidOpenPnp;MajorFunctionIRP_MJ_DEVICE_CONTROL = MajorFun

    12、ctionIRP_MJ_CREATE = MajorFunctionIRP_MJ_CLOSE = MajorFunctionIRP_MJ_READ = MajorFunctionIRP_MJ_WRITE = GuidOpenDispatchRoutine;DriverUnload = GuidOpenUnload; 另外,设备服务键的键名有时候需要保存下来,因为这个字符串不是长期存在的,如果以后想使用这个UNICODE 字符串,就必须先把它复制到安全的地方,这个字符串的内容一般是REGISTRYMACHINESYSTEMControlSetService服务名.DriverEntry的返回值是

    13、NTSTATUS,是被定义的为32位的无符号长整形。00X7FFFFFFF被认为是正确的。而0X800000000XFFFFFFFF被认为是错误的。 接着驱动程序进入GuidOpenAddDevice例程。它的主要任务是创建设备对象(功能设备对象)并将其附加到PDO之上。它有两个参数 PDRIVER_OBJECT DriverObject,驱动对象和PDEVICE_OBJECT PhysicalDeviceObject 设备对象,就是底层总线驱动创建的PDO对象。 创建设备对象,用IoCreatDevice( IN PDRIVER_OBJECT DriverObject,/系统创建的驱动对象

    14、IN ULONG DeviceExtensionSize,/程序员自己定义的(在头文件中)设备扩展 的大小 IN PUNICODE_STRING DeviceName OPTIONAL,/设备名,可以为空,此时,I/O管理器会自动以一个数字作为该设备对象的名称IN DEVICE_TYPE DeviceType,/设备类型IN ULONG DeviceCharacteristics,/对设备的进一步描述IN BOOLEAN Exclusize,/是否一次只能进行一次IRP处理 OUT PDEVICE_OBJECT *DeviceObject)/新创建的设备对象 具体代码如下PDEVICE_OBJ

    15、ECT fdo; status = IoCreateDevice( DriverObject, sizeof(DEVICE_EXTENSION), NULL,/没有指定设备名 FILE_DEVICE_UNKNOWN, 0, FALSE, &fdo);此时,功能设备对象,创建完毕,接着是将,功能设备对象FDO附加到物理设备对象上PDO。利用函数PDEVICE_OBJECT IoAttachDeviceToDeviceStack( IN PDEVICE_OBJECT SourceDevice,/新创建的功能设备对象FDO IN PDEVICE_OBJECT TargetDevice/物理设备对象P

    16、DO );该函数调用成功的话返回一个设备对象,附加设备对象的设备对象,例如在这里,返回的是PDO,如果,The returned device object pointer can differ from TargetDevice if TargetDevice had additional drivers layered on top of it.如果该函数运行失败,则返回NULL。具体程序,我们将该函数返回的设备对象,保存在,设备扩展中,这样一来,我们就需要先得到新创建的功能设备对象的设备扩展。/得到设备扩展PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSIO

    17、N)fdo-DeviceExtension; pdx-fdo = fdo;/将FDO附加到PDO上pdx-NextStackDevice = IoAttachDeviceToDeviceStack(fdo, PhysicalDeviceObject);WDM驱动程序,设备名无法被用户模式下的应用程序查询到,应用程序可以通过符号链接,设备名或者是设备接口来访问设备。本文只介绍设备接口方式。设备接口就是一组全局标志,他是一个128位组成的数字,并能保证在全世界范围内不会冲突。VC中有一个创建GUID的工具,叫guidgen.exe,它在D:Program FilesMicrosoft Visual

    18、 StudioCommonTools中,运行它,它为用户提供了四种方式产生guid,其实它们都是128位的,只是输出的形式不同而已,一般选择第二种,单击New GUID会产生新的的guid,单击Copy将这个guid复制到新建的guid.h头文件中。DEFINE_GUID(, 0x5dada759, 0xde9a, 0x45e2, 0x8f, 0xb4, 0x1a, 0xa8, 0x8b, 0x1d, 0xe7, 0x8);需要将name换成自己为这个接口而起的名字,例如MY_WDM_DEVICE.另外需要注意,在创建guid时,程序中应该包含头文件#include ,其中initguid.h

    19、只能在一个.cpp中包含, DEFINE_GUID()宏定义了,如果包含了一个initguid.h,那么定义一个guid, 如果没有包含一个initguid.h ,则定义一个extern guid指向定义的那个guid, 所以项目中必须有一个文件.cpp包含initguid.h,否则会出错。但如果包含了多个的initguid.h,也会出错否则会出现错误。unresolved external symbol _MY_WDM_DEVICE创建设备接口用函数NTSTATUS IoRegisterDeviceInterface( IN PDEVICE_OBJECT PhysicalDeviceObje

    20、ct, IN CONST GUID *InterfaceClassGuid, IN PUNICODE_STRING ReferenceString OPTIONAL, OUT PUNICODE_STRING SymbolicLinkName/将GUID输出一串UNICODE字符串具体代码创建设备接口status = IoRegisterDeviceInterface(PhysicalDeviceObject, &MY_WDM_DEVICE, NULL, &interfaceName); 其中pdx-interfaceName就是暴露给应用程序的符号链接。包括四部分如图8图8(1)何种总线设备,

    21、例如ROOT(2)类设备的名称,LIUYOUJINDEVICE(3)这种设备的第几个设备#0000(4)制定的设备接口GUID。设置接口IoSetDeviceInterfaceState(&interfaceName, TRUE);/设置操作模式fdo-Flags |= DO_BUFFERED_IO | DO_POWER_PAGABLE; fdo-Flags &= DO_DEVICE_INITIALIZING; 实现即插即用 即插即用IRP即IRP_MJ_PNP,它一般是由即插即用管理器发送给WDM驱动程序的。不同情况下,即插即用管理器会发送不同子类型的IRP_MJ_PNP IRP。在IRP_

    22、MJ_PNP派遣函数中要处理不同子功能代码的IRP,本程序采用函数指针的方法。首先初始化一个函数指针组成的数组,然后在派遣函数中判断是那种子功能代码。根据这个子功能代码区寻找行的函数指针,再通过指针找到针对具体子功能代码所作的操作函数。加载驱动时,所用到的各个IRP_MJ_PNP子功能代码。1.953 Default Enter DefaultPnpHandler11.953 Default Leave DefaultPnpHandler11.953 Default Enter GuidOpenPnp11.953 Default PNP Request (IRP_MN_FILTER_RESOU

    23、RCE_REQUIREMENTS)修改I/O资源需求列表11.953 Default Enter DefaultPnpHandler11.953 Default Leave GuidOpenPnp11.953 Default PNP Request (IRP_MN_START_DEVICE)配置并初始化设备11.953 Default Enter HandleStartDevice11.953 Default Leave HandleStartDevice11.953 Default PNP Request (IRP_MN_QUERY_CAPABILITIES)取设备能力11.953 Defa

    24、ult PNP Request (IRP_MN_QUERY_PNP_DEVICE_STATE)取设备状态11.953 Default PNP Request (IRP_MN_QUERY_DEVICE_RELATIONS)给出与制定特征相关的设备列表对IRP_MN_DEVICE的处理3.应用程序说明创建一个对话框类型的驱动程序框架。(1)首先需要将驱动程序中的guid.h文件copy到应用程序中,并且添加到应用程序的工程里。(2)应用程序的Porject|Setting|Link的Object/library modules里要添加setupapi.lib库,否则会有类似这样的错误:GuidOp

    25、en_AppDlg.obj :unresolved external symbol _imp_SetupDiGetDeviceInterfaceDetailA24 error LNK2001: unresolved external symbol _imp_SetupDiDestroyDeviceInfoList4 unresolved external symbol _imp_SetupDiEnumDeviceInterfaces20 unresolved external symbol _imp_SetupDiGetClassDevsA16程序中应该包含setupapi.h头文件,否则,会出现这样的错误:error C2065: HDEVINFO : undeclared identifiererror C2146: syntax error : missing ; before identifier infoerror


    注意事项

    本文(设备管理通过设备接口打开设备详细步骤XXXXWord下载.docx)为本站会员主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2022 冰点文档网站版权所有

    经营许可证编号:鄂ICP备2022015515号-1

    收起
    展开