欢迎来到天天文库
浏览记录
ID:16138834
大小:34.50 KB
页数:4页
时间:2018-08-08
《应用程序调用驱动的方式》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、有两种方式可以让设备和应用程序之间联系:1. 通过为设备创建的一个符号链;2. 通过输出到一个接口WDM驱动程序建议使用输出到一个接口而不推荐使用创建符号链的方法。这个接口保证PDO的安全,也保证安全地创建一个惟一的、独立于语言的访问设备的方法。一个应用程序使用Win32APIs来调用设备。在某个Win32APIs和设备对象的分发函数之间存在一个映射关系。获得对设备对象访问的第一步就是打开一个设备对象的句柄。用符号链打开一个设备的句柄为了打开一个设备,应用程序需要使用C
2、reateFile。如果该设备有一个符号链出口,应用程序可以用下面这个例子的形式打开句柄:hDevice=CreateFile(""""".""OMNIPORT3", GENERIC_READ
3、GENERIC_WRITE,FILE_SHARE_READ, NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);文件路径名的前缀“""."”告诉系统本调用希望打开一个设备。这个设备必须有一个符号链,以便应用程序能够打开它。有关细节查看有关Kdevice和Creat
4、eLink的内容。在上述调用中第一个参数中前缀后的部分就是这个符号链的名字。注意:CreatFile中的第一个参数不是Windows98/2000中驱动程序(.sys文件)的路径。是到设备对象的符号链。如果使用DriverWizard产生驱动程序,它通常使用类KunitizedName来构成设备的符号链。这意味着符号链名有一个附加的数字,通常是0。例如:如果链接名称的主干是L“TestDevice”那么在CreateFile中的串就该是“"""".""TestDevice0”。如果应用程序需要被覆盖的
5、I/O,第六个参数(Flags)必须或上FILE_FLAG_OVERLAPPED。使用一个输出接口打开句柄用这种方式打开一个句柄会稍微麻烦一些。DriverWorks库提供两个助手类来使获得对该接口的访问容易一些,这两个类是CDeviceInterface, 和CdeviceInterfaceClass。CdeviceInterfaceClass类封装了一个设备信息集,该信息集包含了特殊类中的所有设备接口信息。应用程序能有用CdeviceInterfaceClass类的一个实例来获得一个或更多的Cde
6、viceInterface类的实例。CdeviceInterface类是一个单一设备接口的抽象。它的成员函数DevicePath()返回一个路径名的指针,该指针可以在CreateFile中使用来打开设备。下面用一个小例子来显示这些类最基本的使用方法:externGUIDTestGuid;HANDLEOpenByInterface( GUID*pClassGuid, DWORDinstance, PDWORDpError){ CDeviceInterfaceClassDevClass(pClas
7、sGuid,pError); if(*pError!=ERROR_SUCCESS) returnINVALID_HANDLE_VALUE; CDeviceInterfaceDevInterface(&DevClass,instance,pError); if(*pError!=ERROR_SUCCESS) returnINVALID_HANDLE_VALUE; cout<<"Thedevicepathis" <8、ndl; HANDLEhDev; hDev=CreateFile( DevInterface.DevicePath(), GENERIC_READ9、GENERIC_WRITE, FILE_SHARE_READ10、FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if(hDev==INVALID_HANDLE_VALUE) *pError=GetLastError11、(); returnhDev;}在设备中执行I/O操作一旦应用程序获得一个有效的设备句柄,它就能使用Win32APIs来产生到设备对象的IRPs。下面的表显示了这种对应关系。 WDM驱动程序开发之设备接口篇:CDeviceInterface和CDeviceInterfaceClass类 收藏 CDeviceInterfaceClass,CDeviceInterface类:【在应用程序级上使用设备接口】 DriverWorks提供了这两个类用来支持设
8、ndl; HANDLEhDev; hDev=CreateFile( DevInterface.DevicePath(), GENERIC_READ
9、GENERIC_WRITE, FILE_SHARE_READ
10、FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if(hDev==INVALID_HANDLE_VALUE) *pError=GetLastError
11、(); returnhDev;}在设备中执行I/O操作一旦应用程序获得一个有效的设备句柄,它就能使用Win32APIs来产生到设备对象的IRPs。下面的表显示了这种对应关系。 WDM驱动程序开发之设备接口篇:CDeviceInterface和CDeviceInterfaceClass类 收藏 CDeviceInterfaceClass,CDeviceInterface类:【在应用程序级上使用设备接口】 DriverWorks提供了这两个类用来支持设
此文档下载收益归作者所有