有两种方式可以让设备和应用程序之间联系: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
该气体分析仪是我公司吸取国内外同类产品先进经验,独立开发完成的一种高科技产品,该产品采用了国外先进的氧传感器及红外二氧化碳传感器,配合现代的电子测量技术,使产品在测量精度上提高了一个档次,同时为了便于用户使用,整合了湿度传感器及温度传感器。 一、主要性能: 1、对氧气、二氧化碳、湿度、温度进行测量。 a、氧气含量的测定。采用英国City公司先进的氧传感器。 b、二氧化碳含量。采用芬兰维萨拉公司红外二氧化碳传感器。 c、湿度测量。本机集成了两路湿度测量功能,1路位于进气孔始端,另一路手持(可选)。采用法国Humirel公司产品。 d、温度测量。(可选)采用德国进口铂电阻温度传感器,以探针方式封装,用于测量果蔬内部温度。 2、采用便携式设计,集成了免维护电池及气泵,便于现场工作。 3、采用6寸液晶屏显示,显示内容直观,外观大方。 4、配有微型打印机,可打印样本数据。 5、能够保存250个样本数据。 6、可与电脑联机,把数据上传到电脑长期保存。 7、可对电池亏电,运行错误报警。 二、性能参数: 1、测量参数: a、氧气测量范围:0~25%,分辨率0.1%,精度0.2% b、二氧化碳测量范围:0~10%,分辨率0.1%,精度0.2% c、湿度测量范围:0~100%,分辨率0.1%,精度2% d、温度测量范围:-10~120℃,分辨率0.1℃,精度0.1℃(-10℃~+50℃) 2、整机尺寸:400MM x 160MM x 330MM
上传时间: 2013-11-23
上传用户:tecman
A. 产生一个长为1000的二进制随机序列,“0”的概率为0.8,”1”的概率为0.2;B. 对上述数据进行归零AMI编码,脉冲宽度为符号宽度的50%,波形采样率为符号率的8倍,画出前20个符号对应的波形(同时给出前20位信源序列);C. 改用HDB3码,画出前20个符号对应的波形;D. 改用密勒码,画出前20个符号对应的波形;E. 分别对上述1000个符号的波形进行功率谱估计,画出功率谱;F. 改变信源“0”的概率,观察AMI码的功率谱变化情况;
上传时间: 2015-03-16
上传用户:Altman
如果整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。求3000以内的全部亲密数。 *题目分析与算法设计 按照亲密数定义,要判断数a是否有亲密数,只要计算出a的全部因子的累加和为b,再计算b的全部因子的累加和为n,若n等于a则可判定a和b是亲密数。计算数a的各因子的算法: 用a依次对i(i=1~a/2)进行模运算,若模运算结果等于0,则i为a的一个因子;否则i就不是a的因子。 *
标签: 整数
上传时间: 2015-04-24
上传用户:金宜
K3:--- P1.6 K4:--- P1.7 BEEP:--- P3.7 K3 --- 控制按键 K4 --- 清零按键 开机显示: SECOND-CLOCK 0 TIME 00:00:00:00 K3 --- 控制按键: 第一次按下时,开始计时。 显示 BEGIN COUNT 1 TIME 00:00:01:88 第二次按下时,暂停计时。 显示 PAUST COUNT 2 TIME 00:00:01:88 第三次按下时,累计计时。 显示 BEGIN COUNT 3 TIME 00:08:08:88 第四次按下时,暂停计时。 显示 PAUST COUNT 4 TIME 00:08:08:88 K4 --- 清零按键: 在任何状态下,按一下K4,均可清零。 显示 SECOND-CLOCK 0 TIME 00:00:00:00 0,1,2,3,4 表示按下K3键的次数。
标签: SECOND-CLOCK K3 BEEP K4
上传时间: 2014-01-14
上传用户:515414293
用verilog设计密勒解码器 一、题目: 设计一个密勒解码器电路 二、输入信号: 1. DIN:输入数据 2. CLK:频率为2MHz的方波,占空比为50% 3. RESET:复位信号,低有效 三、输入信号说明: 输入数据为串行改进密勒码,每个码元持续时间为8μs,即16个CLK时钟;数据流是由A、B、C三种信号组成; A:前8个时钟保持“1”,接着5个时钟变为“0”,最后3个时钟为“1”。 B:在整个码元持续时间内都没有出现“0”,即连续16个时钟保持“1”。 C:前5个时钟保持“0”,后面11个时钟保持“1”。 改进密勒码编码规则如下: 如果码元为逻辑“1”,用A信号表示。 如果码元为逻辑“0”,用B信号表示,但以下两种特例除外:如果出现两个以上连“0”,则从第二个“0”起用C信号表示;如果在“通信起始位”之后第一位就是“0”,则用C信号表示,以下类推; “通信起始位”,用C信号表示; “通信结束位”,用“0”及紧随其后的B信号表示。 “无数据”,用连续的B信号表示。
上传时间: 2013-12-02
上传用户:wang0123456789
功能:编写的计算皮亚诺相关系数 开发语言:ruby 调用:correlate(x,y) 其中,x,y为需要计算相关度的向量 调用示例: a = [3, 6, 9, 12, 15, 18, 21] b = [1.1, 2.1, 3.4, 4.8, 5.6] c = [1.9, 1.0, 3.9, 3.1, 6.9] c1 = correlate(a,a) # 1.0 c2 = correlate(a,a.reverse) # -1.0 c3 = correlate(b,c) # 0.8221970228 puts c1#,c2,c3
上传时间: 2013-12-18
上传用户:skfreeman
Implement the following integer methods: a) Method celsius returns the Celsius equivalent of a Fahrenheit calculation celsius = 5.0 / 9.0 * ( fahrenheit - 32 ) b) Method fahrenheit returns the Fahrenheit equivalent of a Celsius the calculation fahrenheit = 9.0 / 5.0 * celsius + 32 c) Use the methods from parts (a) and (b) to write an application either to enter a Fahrenheit temperature and display the Celsius or to enter a Celsius temperature and display the Fahrenheit equivalent.
标签: equivalent Implement the following
上传时间: 2014-01-19
上传用户:jackgao
成績顯示三個部份abc #include<stdio.h> #include<stdlib.h> int main(void) { float gread printf("請輸入分數\n") scanf("%f",&gread) if(gread>=80&&gread<=100) printf("成績為A\n") else if(gread>=60&&gread<=79) { printf("成績為B\n") } else if(gread>=0&&gread<60) { printf("成績為C\n") } else { printf("分數輸入錯誤\n") } system("pause") return 0 }
标签: include stdlib float gread
上传时间: 2014-01-15
上传用户:waizhang
第一节、samba是干什么的?它有什么用? Samba(SMB是其缩写) 是一个网络服务器,它是Linux作为本地服务器最重要的一个服务,用于Linux和Windows共享文件之用;Samba可以用于Windows和 Linux之间的共享文件,也一样用于Linux和Linux之间的共享文件;不过对于Linux和Linux之间共享文件有更好的网络文件系统 NFS,NFS也是需要架设服务器的; 2、安装及服务操作命令 安装samba程序非常简单,使用rpm -q samba查看当前系统是否已经安装了samba软件。 如果没有那就进入光盘,rpm -ivh *samba*.rpm即可。 仔细说下安装的包: samba-common-3.0.28-0.el5.8 //samba服务器和客户端中的最基本文件 samba-3.0.28-0.el5.8 //samba服务器核心软件包 system-config-samba-1.2.39-1.el5 //samba图形配置界面 samba-client-3.0.28-0.el5.8 //samba客户端软件 启动、暂停和停止服务: /etc/init.d/smb start /etc/init.d/smb stop /etc/init.d/smb restart 或 service smb start service smb stop service smb restart 第二节、由最简单的一个例子说起,匿名用户可读可写的实现 第一步: 更改smb.conf 我们来实现一个最简单的功能,让所有用户可以读写一个Samba 服务器共享的一个文件夹;我们要改动一下smb.conf ;首先您要备份一下smb.conf文件; [root@localhost ~]# cd /etc/samba [root@localhost samba]# cp smb.conf smb.conf.bak [root@localhost samba]# vi smb.conf 或geidt smb.conf & 然后我们把下面这段写入smb.conf中: [global] workgroup = WORKGROUP netbios name = Liukai server string = Liukai's Samba Server security = share [test] path = /opt/test writeable = yes browseable = yes guest ok = yes 注解: [global]这段是全局配置,是必段写的。其中有如下的几行; workgroup 就是Windows中显示的工作组;在这里我设置的是WORKGROUP (用大写); netbios name 就是在Windows中显示出来的计算机名; server string 就是Samba服务器说明,可以自己来定义;这个不是什么重要的; security 这是验证和登录方式,这里我们用了share ;验证方式有好多种,这是其中一种;另外一种常用的是user的验证方式;如果用share呢,就是不用设置用户和密码了; [test] 这个在Windows中显示出来是共享的目录; path = 可以设置要共享的目录放在哪里; writeable 是否可写,这里我设置为可写; browseable 是否可以浏览,可以;可以浏览意味着,我们在工作组下能看到共享文件夹。如果您不想显示出来,那就设置为 browseable=no,guest ok 匿名用户以guest身份是登录; 第二步:建立相应目录并授权 [root@localhost ~]# mkdir -p /opt/test [root@localhost ~]# id nobody uid=99(nobody) gid=99(nobody) groups=99(nobody) [root@localhost ~]# chown -R nobody:nobody /opt/test 注释:关于授权nobody,我们先用id命令查看了nobody用户的信息,发现他的用户组也是nobody,我们要以这个为准。有些系统nobody用户组并非是nobody ; 第三步:启动服务器 第四步:访问Samba 服务器的共享; 1、在Linux 中您可以用下面的命令来访问; [root@localhost ~]# smbclient -L //liukai或 smbclient //192.168.0.94/test Password: 注:直接按回车 2、在Windows中,您可以用下面的办法来访问; \\liukai 或 \\192.168.0.94 3、说明:如果用了netbiosname,就可以用“\\主机名”来访问,如果没用netbiosname,就不能用主机名访问。 第三节、简单的密码验证服务器 修改smb.conf文件: security = user guest account = liukai encrypt passwords = yes smb passwd file = /etc/samba/smbpasswd 然后,建立一个新用户 useradd liukai passwd liukai 成功后,cat /etc/passwd | mksmbpasswd.sh > /etc/samba/smbpasswd smbpasswd -a liukai 这就成功地添加了一个smb用户。 重启服务,使用这个用户进行登录即可。
上传时间: 2015-05-13
上传用户:yangkang1192