采用NUMEGA Software 公司出品的VXD(virtual device driver)开发软件包VtoolsD,开发出了DMA 方式下的PCL_818L 数据采集卡虚拟设备驱
上传时间: 2013-04-24
上传用户:s363994250
有两种方式可以让设备和应用程序之间联系: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
Port1.0 使用说明 Port1.0是作者本人在进行电子制作和维修过程中萌发的一个思路。在电子制作、维修中,经常要用到多路的脉冲信号或是要测量多路的脉冲信号。本软件可通过微机并口向用户提供多达12路的标准TTL脉冲信号,同时可进行5路的标准TTL脉冲信号的波形显示。 软件的使用方法极为简单。输出信号时,只要选中或取消引脚号,就能在相应的引脚得到相应的脉冲信号(统一为选中为高电平,取消为低电平),“清零”按钮为对应该组的所有信号清零。 输入信号的波形显示,按“开始”按钮为开始进行显示,“停止”为暂停。 在设置面板中,“数据读入时间间隔”为读入时间的设定。“并行打印端口设置”为显示微机中存在的可用打印端口,并可以设定本软件当前要使用的端口(如只有一个可用端口,就为缺省端口,如有多个可用端口软件自动选择最后一个可用端口为当前使用端口)。 本软件的输入波形显示没有运用VXD等的技术支持,在速度上不能做到高频的实时性,只能用在低速的环境下。这个版本没有提供多数据的连续输出。这些问题在下一个版本中得到改进和支持。 本软件可使用在微机的打印适配器、打印机等各种的并口设备检修中,还可用在各种数字电路、单片机的制作和维修中。在下一版本在这方面会有更大的支持。 * 注意:只支持win9x * 注意:并口的输入/输出电平为0-5伏TTL,不能连接高电压高电流的电路,以免埙坏主板或打印适配器。要连接COMS的0-12伏时请用户自做转换电路再连接。 * 注意:在使用本软件时最好不要同时使用打印机之类的并口设备。如本程序已运行请先关闭,再使用并口设备。
上传时间: 2014-04-18
上传用户:paladin
磁盘格式化是计算机用户经常使用的操作之一,但是对于如何编程实现磁盘格式化,很多人却不清楚。很多人认为磁盘格式化应该需要编写负载的VXD或者WDM驱动程序来直接对硬件进行操作。世界上完全可以通过调用一个简单的Shell函数来实现这一功能。
上传时间: 2013-12-31
上传用户:mpquest
计算机接口技术系列 Visual C++串口通信技术与工程实践 在编译本章程序后,请将winio.dll、winio.VXD和winio.sys文件复制到可执行文件所在目录下, 否则WinIo库初始化函数initializeWinIO调用将会失败。
上传时间: 2013-12-15
上传用户:wlcaption
Win32汇编编程系列 本帮助文件由yyc个人整理后出版,内容全摘自网络。版权归实际作者所有。 为了让网友们能更好的学习Win32汇编编程,于是我为大家将网上的资料整理成一个帮助文件。 本帮助文件包括:Iczelion的Win32汇编教程、Iczelion 的 ODBC 教程、Iczelion 的 VXD 教程共三部分
上传时间: 2015-03-09
上传用户:qb1993225
-有 没 有 简 单 一 些 的 办 法 呢 ? 我 们 可 以 令 一 个 普 通Win32 应 用 程 序 运 行 在Ring0 下, 从 而 获 得VXD 的 能 力 吗 ? 答 案 是 肯 定 的,请看本文
上传时间: 2013-12-30
上传用户:我干你啊
汇编超全资料,学汇编的不要错过 Iczelion的Win32汇编教程、Iczelion 的 ODBC 教程、Iczelion 的 VXD 教程共三部分
标签: 汇编
上传时间: 2014-01-20
上传用户:离殇
非常好的驱动开发学习书籍,是学习驱动开发的好资料Windows.设备驱动程序(VXD与WDM)开发实务
上传时间: 2014-01-18
上传用户:王者A
WDM驱动程序设计 一.WDM简介 微软不断推出新的操作系统,现在Windows98和Windows2000已经成了主流,原先用来实现驱动程序的VXD技术随着Win95的淡出也慢慢地将退出历史舞台,在Windows98和Windows2000中设备驱动程序将根据Windows驱动程序模型(WDM)来设计。WDM通过提供一种灵活的方式来简化驱动程序的开发,在实现对新硬件支持的基础上减少并降低所必须开发的驱动程序的数量和复杂性。
上传时间: 2015-06-29
上传用户:253189838