虫虫首页| 资源下载| 资源专辑| 精品软件
登录| 注册

c<b>On</b>necti<b>On</b>s

  • 驱动程序与应用程序的接口

    有两种方式可以让设备和应用程序之间联系:1. 通过为设备创建的一个符号链;2. 通过输出到一个接口WDM驱动程序建议使用输出到一个接口而不推荐使用创建符号链的方法。这个接口保证PDO的安全,也保证安全地创建一个惟一的、独立于语言的访问设备的方法。一个应用程序使用Win32APIs来调用设备。在某个Win32 APIs和设备对象的分发函数之间存在一个映射关系。获得对设备对象访问的第一步就是打开一个设备对象的句柄。 用符号链打开一个设备的句柄为了打开一个设备,应用程序需要使用CreateFile。如果该设备有一个符号链出口,应用程序可以用下面这个例子的形式打开句柄:hDevice = CreateFile("\\\\.\\OMNIPORT3",  GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ,  NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL ,NULL);文件路径名的前缀“\\.\”告诉系统本调用希望打开一个设备。这个设备必须有一个符号链,以便应用程序能够打开它。有关细节查看有关Kdevice和CreateLink的内容。在上述调用中第一个参数中前缀后的部分就是这个符号链的名字。注意:CreatFile中的第一个参数不是Windows 98/2000中驱动程序(.sys文件)的路径。是到设备对象的符号链。如果使用DriverWizard产生驱动程序,它通常使用类KunitizedName来构成设备的符号链。这意味着符号链名有一个附加的数字,通常是0。例如:如果链接名称的主干是L“TestDevice”那么在CreateFile中的串就该是“\\\\.\\TestDevice0”。如果应用程序需要被覆盖的I/O,第六个参数(Flags)必须或上FILE_FLAG_OVERLAPPED。 使用一个输出接口打开句柄用这种方式打开一个句柄会稍微麻烦一些。DriverWorks库提供两个助手类来使获得对该接口的访问容易一些,这两个类是CDeviceInterface, 和 CdeviceInterfaceClass。CdeviceInterfaceClass类封装了一个设备信息集,该信息集包含了特殊类中的所有设备接口信息。应用程序能有用CdeviceInterfaceClass类的一个实例来获得一个或更多的CdeviceInterface类的实例。CdeviceInterface类是一个单一设备接口的抽象。它的成员函数DevicePath()返回一个路径名的指针,该指针可以在CreateFile中使用来打开设备。下面用一个小例子来显示这些类最基本的使用方法:extern GUID TestGuid;HANDLE OpenByInterface(  GUID* pClassGuid,  DWORD instance,  PDWORD pError){  CDeviceInterfaceClass DevClass(pClassGuid, pError);  if (*pError != ERROR_SUCCESS)    return INVALID_HANDLE_VALUE;  CDeviceInterface DevInterface(&DevClass, instance, pError);  if (*pError != ERROR_SUCCESS)    return INVALID_HANDLE_VALUE;  cout << "The device path is "    << DevInterface.DevicePath()    << endl;   HANDLE hDev;  hDev = CreateFile(   DevInterface.DevicePath(),    GENERIC_READ | GENERIC_WRITE,    FILE_SHARE_READ | FILE_SHARE_WRITE,    NULL,    OPEN_EXISTING,    FILE_ATTRIBUTE_NORMAL,    NULL  );  if (hDev == INVALID_HANDLE_VALUE)    *pError = GetLastError();  return hDev;} 在设备中执行I/O操作一旦应用程序获得一个有效的设备句柄,它就能使用Win32 APIs来产生到设备对象的IRPs。下面的表显示了这种对应关系。Win32 API  DRIVER_FUNCTION_xxxIRP_MJ_xxx  KDevice subclass member function CreateFile  CREATE  Create ReadFile  READ  Read WriteFile  WRITE  Write DeviceIoControl  DEVICE_CONTROL  DeviceControl CloseHandle  CLOSECLEANUP  CloseCleanUp 需要解释一下设备类成员的Close和CleanUp:CreateFile使内核为设备创建一个新的文件对象。这使得多个句柄可以映射同一个文件对象。当这个文件对象的最后一个用户级句柄被撤销后,I/O管理器调用CleanUp。当没有任何用户级和核心级的对文件对象的访问的时候,I/O管理器调用Close。如果被打开的设备不支持指定的功能,则调用相应的Win32将引起错误(无效功能)。以前为Windows95编写的VxD的应用程序代码中可能会在打开设备的时候使用FILE_FLAG_DELETE_ON_CLOSE属性。在Windows NT/2000中,建议不要使用这个属性,因为它将导致没有特权的用户企图打开这个设备,这是不可能成功的。I/O管理器将ReadFile和WriteFile的buff参数转换成IRP域的方法依赖于设备对象的属性。当设备设置DO_DIRECT_IO标志,I/O管理器将buff锁住在存储器中,并且创建了一个存储在IRP中的MDL域。一个设备可以通过调用Kirp::Mdl来存取MDL。当设备设置DO_BUFFERED_IO标志,设备对象分别通过KIrp::BufferedReadDest或 KIrp::BufferedWriteSource为读或写操作获得buff地址。当设备不设置DO_BUFFERED_IO标志也不设置DO_DIRECT_IO,内核设置IRP 的UserBuffer域来对应ReadFile或WriteFile中的buff参数。然而,存储区并没有被锁住而且地址只对调用进程有效。驱动程序可以使用KIrp::UserBuffer来存取IRP域。对于DeviceIoControl调用,buffer参数的转换依赖于特殊的I/O控制代码,它不在设备对象的特性中。宏CTL_CODE(在winioctl.h中定义)用来构造控制代码。这个宏的其中一个参数指明缓冲方法是METHOD_BUFFERED, METHOD_IN_DIRECT, METHOD_OUT_DIRECT, 或METHOD_NEITHER。下面的表显示了这些方法和与之对应的能获得输入缓冲与输出缓冲的KIrp中的成员函数:Method  Input Buffer Parameter  Output Buffer Parameter METHOD_BUFFERED  KIrp::IoctlBuffer KIrp::IoctlBuffer METHOD_IN_DIRECT  KIrp::IoctlBuffer KIrp::Mdl METHOD_OUT_DIRECT  KIrp::IoctlBuffer KIrp::Mdl METHOD_NEITHER  KIrp::IoctlType3InputBuffer KIrp::UserBuffer 如果控制代码指明METHOD_BUFFERED,系统分配一个单一的缓冲来作为输入与输出。驱动程序必须在向输出缓冲放数据之前拷贝输入数据。驱动程序通过调用KIrp::IoctlBuffer获得缓冲地址。在完成时,I/O管理器从系统缓冲拷贝数据到提供给Ring 3级调用者使用的缓冲中。驱动程序必须在结束前存储拷贝到IRP的Information成员中的数据个数。如果控制代码不指明METHOD_IN_DIRECT或METHOD_OUT_DIRECT,则DeviceIoControl的参数呈现不同的含义。参数InputBuffer被拷贝到一个系统缓冲,这个缓冲驱动程序可以通过调用KIrp::IoctlBuffer。参数OutputBuffer被映射到KMemory对象,驱动程序对这个对象的访问通过调用KIrp::Mdl来实现。对于METHOD_OUT_DIRECT,调用者必须有对缓冲的写访问权限。注意,对METHOD_NEITHER,内核只提供虚拟地址;它不会做映射来配置缓冲。虚拟地址只对调用进程有效。这里是一个用METHOD_BUFFERED的例子:首先,使用宏CTL_CODE来定义一个IOCTL代码:#define IOCTL_MYDEV_GET_FIRMWARE_REV \CTL_CODE (FILE_DEVICE_UNKNOWN,0,METHOD_BUFFERED,FILE_ANY_ACCESS)现在使用一个DeviceIoControl调用:BOOLEAN b;CHAR FirmwareRev[60];ULONG FirmwareRevSize;b = DeviceIoControl(hDevice, IOCTL_MYDEV_GET_VERSION_STRING,  NULL, // no input  注意,这里放的是包含有执行操作命令的字符串指针  0, FirmwareRev,      //这里是output串指针,存放从驱动程序中返回的字符串。sizeof(FirmwareRev),& FirmwareRevSize,  NULL // not overlapped I/O );如果输出缓冲足够大,设备拷贝串到里面并将拷贝的资结束设置到FirmwareRevSize中。在驱动程序中,代码看起来如下所示:const char* FIRMWARE_REV = "FW 16.33 v5";NTSTATUS MyDevice::DeviceControl( KIrp I ){  ULONG fwLength=0;  switch ( I.IoctlCode() )  {    case IOCTL_MYDEV_GET_FIRMWARE_REV:      fwLength = strlen(FIRMWARE_REV)+1;      if (I.IoctlOutputBufferSize() >= fwLength)      {        strcpy((PCHAR)I.IoctlBuffer(),FIRMWARE_REV);        I.Information() = fwLength;         return I.Complete(STATUS_SUCCESS);      }      else      {              }    case . . .   } }

    标签: 驱动程序 应用程序 接口

    上传时间: 2013-10-17

    上传用户:gai928943

  • VI图标和连线板

    当一个VI A.vi在VI B.vi 中使用,就称A.vi为B.vi的子VI,B.vi为A.vi的主VI。子VI 相当于文本编程语言中的子程序。 在主VI的程序框图中双击子VI的图标时,将出现该子VI 的前面板和程序框图。在前面板窗口和程序框图窗口的右上角可以看到该VI 的图标。该图标与将VI放置在程序框图中时所显示的图标相同。

    标签:

    上传时间: 2013-10-31

    上传用户:jisujeke

  • 一元稀疏多项式计算器[加法和乘法] 问题描述: 设计一元系数多项式计数器实现两个多项式间的加法、减法。 基本要求: (1) 输入并建立多项式 (2) 输出多项式

    一元稀疏多项式计算器[加法和乘法] 问题描述: 设计一元系数多项式计数器实现两个多项式间的加法、减法。 基本要求: (1) 输入并建立多项式 (2) 输出多项式,输出形式为整数序列:n,c1,e1,c2,e2……cn,en,其中n是多项式的项数,ci,ei分别为第i项的系数和指数。序列按指数降序排列。 (3) 多项式a和b相加,建立多项式a+b,输出相加的多项式。 (4) 多项式a和b相减,建立多项式a-b,输出相减的多项式。 用带表头结点的单链表存储多项式。 测试数据: (1) (2x+5x8-3.1x11)+(7-5x8+11x9) (2) (6x-3-x+4.4x2-1.2x9)-(-6x-3+5.4x2+7.8x15) (3) (x+x2+x3)+0 (4) (x+x3)-(-x-x-3)

    标签: 多项式 加法 稀疏 乘法

    上传时间: 2013-12-03

    上传用户:561596

  • OpenCV means Intel® Open Source Computer Vision Library. It is a collection of C functions and a

    OpenCV means Intel® Open Source Computer Vision Library. It is a collection of C functions and a few C++ classes that implement some popular Image Processing and Computer Vision algorithms. OpenCV has cross-platform middle-to-high level API that consists of a few hundreds (>300) C functions. It does not rely on external libraries, though it can use some when it is possible. OpenCV is free for both non-commercial and commercial use (see the license for details). OpenCV provides transparent interface to Intel® Integrated Performance Primitives (IPP). That is, it loads automatically IPP libraries optimized for specific processor at runtime, if they are available. More information about IPP can be retrieved at http://www.intel.com/software/products/ipp/index.htm -------------------------------------------------------------------------------- 本文是opencv的入门教程

    标签: collection functions Computer Library

    上传时间: 2015-09-12

    上传用户:zhangyi99104144

  • About WepDecrypt: Wepdecrypt is a Wireless LAN Tool written in c which guesses WEP Keys based o

    About WepDecrypt: Wepdecrypt is a Wireless LAN Tool written in c which guesses WEP Keys based on a active dictionary attack, key generator, distributed network attack and some other methods, it s based on wepattack and GPL licensed. WepDecrypt highlights: - Implemented packet filters. - Only one crypted packet is enough to start cracking - Has its own key generator. - Can crack a dumpfile over a network. - Can act as a server and client. - Also works in windows. - Has an fltk gui.

    标签: WepDecrypt Wepdecrypt Wireless guesses

    上传时间: 2013-12-25

    上传用户:6546544

  • 利用最新的嵌入式开发工具EDK

    利用最新的嵌入式开发工具EDK,在FPGA 中完成对PDIUSBD12 的硬件定制和固件编程,从而在FPGA 中实现U S B 控制器, 并最终完成U S B 的枚举过程、驱动程序的开发和简单的应用。

    标签: EDK 嵌入式 开发工具

    上传时间: 2013-11-25

    上传用户:fnhhs

  • A detailed explanation of C# 2.0 An introduction to Visual Studio 2005, a tool set for building

    A detailed explanation of C# 2.0 An introduction to Visual Studio 2005, a tool set for building Windows and web applications More than 200 questions and programming exercises to help you better judge your understanding of the material A greater emphasis on event handling Information on generics and generic collections

    标签: introduction explanation detailed building

    上传时间: 2013-12-14

    上传用户:爱死爱死

  • 分数是两个整数的比

    分数是两个整数的比,通常表示为 (或b/a)的形式,其中b称为分子,a称为分母,分母不能为0。分数在计算机中以整数或浮点数(有限小数)的形式表示,大多数情况下都是近似表示,具有较大的误差,例如 ,在计算机中用整数表示为0,用浮点数表示为0.333333。本实例就是要设计一个Fraction (分数) 类类型,该类型的对象可以像基本类型数据一样进行运算,结果仍为分数,运算包括四则运算,关系运算,及求一元一次分式方程的解,输入输出要求按分数方式进行。

    标签: 分数 整数

    上传时间: 2016-02-18

    上传用户:zhoujunzhen

  • 正整数x 的约数是能整除x 的正整数。正整数x 的约数个数记为div(x)。例如

    正整数x 的约数是能整除x 的正整数。正整数x 的约数个数记为div(x)。例如,1,2, 5,10 都是正整数10 的约数,且div(10)=4。设a 和b 是2 个正整数,a≤b,找出a 和b 之间约数个数最多的数x。

    标签: 整数 div

    上传时间: 2014-11-24

    上传用户:gxmm

  • J2EE高校学籍管理信息系统的设计及实现 本文中的学籍信息管理系统将 Mvc 以ModelViewControl) 模式和J2EE相结合

    J2EE高校学籍管理信息系统的设计及实现 本文中的学籍信息管理系统将 Mvc 以ModelViewControl) 模式和J2EE相结合,使界面与业务逻辑彻底分离,在系统架构中各司其职、互不干涉,具有较强的伸缩性、 通用性和可操作性。 文中用统一建模语言UML对系统进行详细分析,并给出了系统的具体设计, 包括系统结构设计、数据库 设计、信息安全访问设计等。 此外,本文还着重描述了系统实现过程中的一些关键技术, 包括在系统数据访问,实 现的 相关技术( 如 数据库连接池技术) 以 及加密技术等。 系统采用基于J ZE E 多层结构,各项应用均在We b上展开,通过We b方式完成用 户与系统的交互。浏览器层为用户提供可视化图形界面 We b服务层响应客户请求,为 客户提供所请求的数据 应用服务层进行应用逻辑计算,完成浏览器请求的相应的商业 计算和业务数据操作 数据库层存储、管理数据信息。采用多层结构的方式使得系统具 有很强的伸缩性、通用性、兼容性和可操作性,每一层能够专注于特定的角色和功能。 系统的实现中采用J a va 的加密技术完成用户信息的加密、 认证功能 采用数据库连接池 技术提高系统的数据库访问效率等。

    标签: J2EE ModelViewControl Mvc 管理信息系统

    上传时间: 2016-06-01

    上传用户:离殇