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

程序存储

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

    有两种方式可以让设备和应用程序之间联系: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

  • rs232串口通信程序下载

    主要功能:1、将串口通讯协议存储为一个通讯文件,可是随时将存储通讯协议文件调入计算机运行与下位机通讯可以实现通讯对话,供下位机工程师参考使用,其主要的通讯协议本程序把它们分成四种情况。以下说明:1)下位机直接发送数据,上位机只接收不回应数据。2)下位机直接发送数据,上位机接收并回应数据。3)上位机直接发送数据,下位机只接收不回应数据。4)上位机直接发送数据,下位机接收并回应数据。下位机工程师完全可以利用这个功能单独的并且很方便的调试与上位机通讯程序,更改双方的通讯协议,不再需要上位机工程师的配合。windwos标准操作,使用方便。2、可以监听活动串口的数据,将监听到的数据显示到数据显示区里面,可以保存。也可以将原先保存的文件数据读进来,以供分析。数据可以按照十六进制和ascii码显示出来。3、自动识别串口设置,当不知道对方设备的通讯串口设置时,可以利用该功能让此程序自动识别,当然前提是对方设备必须是一直在发数据,整个识别过程大概需要二分钟。4、可以通过该程序,利用串口将文件发送到另一个计算机上。另一个计算机通过接收文件接收所发出的文件。

    标签: 232 rs 串口通信

    上传时间: 2013-11-11

    上传用户:semi1981

  • 如何编写应用程序与USB HID设备通讯

      我们如果想实现一个USB 的HID 类设备,不需要在Windows 下开发自己的驱动程序。HID不一定要是标准的外设类型,唯一的要求是交换的数据存储在报文的结构内,设备固件必须支持报文的格式。任何工作在该限制之内的设备都可以成为一个HID,例如温度计、电压计、读卡机等。报文的格式是由报告描述符决定的,所以只要修改描述符就能实现我们需要的报文格式。下面我们来实现一个简单的报文格式:上位机发送固定64 字节数据给设备,这个数据可以是命令,也可是数据,具体含义并不是由报告描述符来决定的,是由开发人员事先约定好的。设备返回的数据也是64 个字节,同样这个数据流的每个字节(甚至每个位)的具体含义由开发人员事先约定好。

    标签: USB HID 编写 应用程序

    上传时间: 2013-12-05

    上传用户:xinyuzhiqiwuwu

  • 存储卡格式PMC的转换

    通过存储卡备份的 PMC 称之为存储卡格式的PMC。由于其为机器语言格式,不能由计算机直接识别和读取并进行修改和编辑,所以必须进行格式转换。同理,当在计算机上编辑好的PMC 程序也不能直接存储到M-CARD 上,然后装载到CNC 中,也必须通过格式转换。

    标签: PMC 存储卡 转换

    上传时间: 2013-11-17

    上传用户:13160677563

  • 基于云计算的海量图片存储管理系统研究

        随着网络信息容量的膨胀,如何高效地存储和管理海量图片数据,传统的数据管理技术难以满足这些应用所提出的对数据管理的需求。针对云计算应用的特点和需求,借鉴传统数据管理技术的理念,提出了一种基于CouchDB的高可扩展、高可靠的海量图片存储管理系统。系统采用分布式文件系统、分布式数据库等技术,支持海量数据存储、资源目录和交换体系以及并行程序处理,可提供从数据到处理功能的一体化服务。实验证明,本系统具有可行性,能满足空间信息服务的多种需求。

    标签: 云计算 海量 存储管理 系统研究

    上传时间: 2013-11-22

    上传用户:lacsx

  • 简介: 采用了静态的HTML作为新闻存储的格式

    简介: 采用了静态的HTML作为新闻存储的格式,先进的全文检索技术, 可视化的新闻发布界面 管理程序为admin/index.jsp,默认的管理员为admin(password:admin888), 编辑为: edit(password:edit888)

    标签: HTML 新闻 存储

    上传时间: 2014-12-08

    上传用户:chens000

  • 本程序在turboc 2.0中运行 输入表达式

    本程序在turboc 2.0中运行 输入表达式,并计算出表达式的值 采用二叉树存储方法,计算速度比较快

    标签: turboc 2.0 程序 运行

    上传时间: 2015-01-10

    上传用户:pkkkkp

  • 栈(stack)是程序设计过程中经常遇到朝气一种数据结构形式

    栈(stack)是程序设计过程中经常遇到朝气一种数据结构形式,它对于数据的存放和操作有下面这样的特点: 1) 它只有一个对数据进行存入和取出的端口; 2) 后进者先出,即最后被存入的数据将首先被取出。其形式很象一种存储硬币的小容器,每次只可以从顶端压入一个硬币,而取出也只可以从顶端进行,即后进先出。 这样的数据存储和管理形式在一些程序设计中很有用。例如,编译系统中(这是一类比较复杂的程序),对于函数调用的处理、对于表达式计算的处理,都利用了栈这样的数据结构。

    标签: stack 数据结构 程序设计

    上传时间: 2013-12-03

    上传用户:225588

  • 文件系统管理 在内存中为文件开辟存储空间 可以创建文件和文件夹 (至少有两级目录 :模拟DOS文件系统的操作 可以存储文件的内容 可以查看删除和修改文件(15 2

    文件系统管理 在内存中为文件开辟存储空间 可以创建文件和文件夹 (至少有两级目录 :模拟DOS文件系统的操作 可以存储文件的内容 可以查看删除和修改文件(15 2,系统设计功能:根据题目要求设计程序功能 考核内容:( 1,功能设计方面:功能设计是否全面,有无遗漏 2,完成功能设计算法方面:算法是否有效,算法的难易程度 3,运算演示方面:设计程序能否运行,运行时是否每一种情况都考虑 4,程序设计报告内容:程序功能,程序模块结构,流程图,源程序清单 5,教师质疑

    标签: DOS 文件系统 15 内存

    上传时间: 2014-01-07

    上传用户:Amygdala

  • 方舟网免费空间申请程序(自助建站系统) v3.0 1 界面美观 2 后台管理功能强大:A 可以设置多种参数

    方舟网免费空间申请程序(自助建站系统) v3.0 1 界面美观 2 后台管理功能强大:A 可以设置多种参数,比如注册时需要填写什么,哪些不需要填写。这些都可以自主选择。B 开通方式选择:可以选择邮件通知,可以选择即时开通,也可以选择管理员审核。C 用户管理:可以增,删,改用户。也可以修改用户的权限。D可以修改系统参数,管理方便。 3 系统数据库在www.99081.com文件夹下的data.mdb里。密码采用加密存储。 管理员账号:99081 密码:11111 后管登陆:99081 密码:

    标签: 3.0 程序 后台 参数

    上传时间: 2015-01-11

    上传用户:z1191176801