deviceiocontrolDeviceIoControl这个函数的使用

deviceiocontrol  时间:2021-06-26  阅读:()

USB之WDM架构驱动中DeviceIoControl读取细节

DeviceIoControl是WIN32子系统向内核发送控制函数。

驱动程序在IRP_MJ_DEVICE_CONTROL这个IRP派遣函数中对DeviceIoControl发送的控制进行处理。

进行何种控制就靠控制码来识别。

也就是说在IRP_MJ_DEVICE_CONTROL派遣函数中应该取用一个switch结构进行判断是何种控制。

DeviceIoControl的具体使用参数你可以在BAIDU上查到。

其第二个参数就为控制码。

IOCTL_CODE是一个宏定义。

该宏定义了控制码。

IOCTL_CODE(FILE_DEVICE_UNKNOW,Ox800,METHOD_BUFFED,ACCESS_ANY)
第一个参数是设备类型

FILE_DEVICE_UNKNOW是未知文件设备。

对于没有硬件支持的功能驱动程序一般定义为FILE_DEVICE_UNKNOW。

第二个参数是IOCTL码

0X800是驱动程序定义的IOCTL码

0x0000-0X7FFF为微软使用

0x800-0xFFF为用户使用

第三个参数是操作模式

METHOD_BUFFED使用缓存区方式操作。

WIN32子系统下的应用程序在和内核模式下的驱动通信时,通信数据会被操作系统复制一份,再传递到内核中。

应为WINDOWS是一个多任务的操作系统,线程使用的内存可能随时被替换掉,还有WIN32程序使用的内存段和内核模式使用的内存段是不一样的。

使用METHOD_BUFFED保证了WINDOWS线程切换时WIN32程序和驱动程序的通信数据安全。

还有几种其他的操作模式你可以在BAIDU上查到。

第四个参数是读取权限

ACCESS_ANY就可以了。

我想知道我手机的device ID是什么?

安卓系统手机的DEVICE ID只要很简单的一个命令就可以查看: 1、点击电话,启动拨号界面,然后输入“*#*#8255#*#*”即可进入GTalk Service Monitor界面了。

GTalk Service Monitor界面 2、红圈圈便是Device ID了。

devicevm 是什么意思

快速启动上网的小型操作系统,能够实现秒及启动开始网上冲浪。

DeviceVM 基本参数 产品类型 Linux 产品概述 是由厂商预安装在新电脑和主板的硬盘或闪存里。

是一个纯软件解决方案,无需额外的硬件安装。

的其中一部分内置在电脑的BIOS里 - BIOS即您一按下电源开关运行的那部分。

有了,您就可以选择先运行某个程序,比如网页浏览器,还是先启动您的主操作系统。

与任何操作系统兼容,包括Windows和Linux系统。

有着和其他操作系统相类似的网络功能。

可以通过WiFi、LAN、xDSL和Cable上网,并且支持WEP、WPA和WPA2无线安全标准。

如何用DeviceIOControl读取并口信息

应用程序和驱动程序的通信过程是:应用程序使用CreateFile函数打开设备,然后用DeviceIoControl与驱动程序进行通信,包括读和写两种操作。

还可以用ReadFile读数据用WriteFile写数据。

操作完毕时用CloseHandle关闭设备。

我们比较常用的就是用DeviceIoControl对设备进行读写操作。

先看看DeviceIoControl是怎么定义的: BOOL DeviceIoControl( HANDLE hDevice, // (CreateFile返回的设备句柄) DWORD dwIoControlCode, // (应用程序调用驱动程序的控制命令,就是IOCTL_XXX IOCTLs ) LPVOID lpInBuffer, //(应用程序传递给驱动程序的数据缓冲区地址) DWORD nInBufferSize, //(应用程序传递给驱动程序的数据缓冲区大小,字节数) LPVOID lpOutBuffer, //(驱动程序返回给应用程序的数据缓冲区地址) DWORD nOutBufferSize, //(驱动程序返回给应用程序的数据缓冲区大小,字节数) LPDWORD lpBytesReturned, //(驱动程序实际返回给应用程序的数据字节数地址) LPOVERLAPPED lpOverlapped // (重叠操作结构) ); Parameters(参数) hDevice (CreateFile返回的设备句柄) [in] Handle to the device that is to perform the operation. To obtain a device handle, call the CreateFile function. dwIoControlCode (应用程序调用驱动程序的控制命令,就是IOCTL_XXX IOCTLs ) [in] IOCTL for the operation. This value identifies the specific operation to perform and the type of device on which to perform the operation. There are no specific values defined for the dwIoControlCode parameter. However, you can define custom IOCTL_XXX IOCTLs with the CTL_CODE macro. You can then advertise these IOCTLs and an application can use these IOCTLs with DeviceIoControl to perform the driver-specific functions. lpInBuffer (应用程序传递给驱动程序的数据缓冲区地址) [in] Long pointer to a buffer that contains the data required to perform the operation. Set to NULL if the dwIoControlCode parameter specifies an operation that does not require input data. nInBufferSize (应用程序传递给驱动程序的数据缓冲区大小,字节数) [in] Size, in bytes, of the buffer pointed to by lpInBuffer. lpOutBuffer (驱动程序返回给应用程序的数据缓冲区地址) [out] Long pointer to a buffer that receives the output data for the operation. Set to NULL if the dwIoControlCode parameter specifies an operation that does not produce output data. nOutBufferSize (驱动程序返回给应用程序的数据缓冲区大小,字节数) [out] Size, in bytes, of the buffer pointed to by lpOutBuffer. lpBytesReturned (驱动程序实际返回给应用程序的数据字节数地址) [out] Long pointer to a variable that receives the size, in bytes, of the data stored in lpOutBuffer. The DeviceIoControl function may unnecessarily use this parameter. For example, if an operation does not produce data for lpOutBuffer and lpOutBuffer is NULL, the value of lpBytesReturned is meaningless. lpOverlapped (重叠操作结构) [in] Ignored; set to NULL. Return Values(返回值) Nonzero indicates ess. Zero indicates failure. To obtain extended error information, call the GetLastError function. (非0成功,0失败) 具体使用我们看看列子: 1,向设备传递数据,我们定义一个函数来实现 bool CDeviceOperDlg::SendKeyData(HANDLE handle, BYTE *bData, int iSize) { ULONG nOutput; BYTE bTemp[512]; //将数据放置到发送数组 memset(bTemp,0,sizeof(bTemp)); memcpy(bTemp,&bData[0],iSize); //向设备发送 if (!DeviceIoControl(handle, ATST2004_IOCTL_WRITE, //根据具体的设备有相关的定义 bTemp, //向设备传递的数据地址 iSize, //数据大小,字节数 NULL, //没有返回的数据,置为NULL 0, //没有返回的数据,置为0 &nOutput, NULL) ) { return false; } return true; } 2,从设备读取数据 bool CDeviceOperDlg::ReviceKeyData(HANDLE handle, BYTE *bData, int iSize) { ULONG nOutput; BYTE bTemp[512]; //数组清零 memset(bTemp,0,sizeof(bTemp)); //向设备发送 if (!DeviceIoControl(handle, ATST2004_IOCTL_READ, //根据具体的设备有相关的定义 NULL, //没有向设备传递的数据,置为NULL 0, //没有向设备传递的数据,置为NULL bTemp, //读取设备的数据返回地址 iSize, //读取数据的字节数 &nOutput, NULL) ) { return false; } //放置到公用数组 memcpy(&bData[0],&bTemp[0],iSize); return true; }

C#怎么使用DeviceIoControl控制端口输出

//开始输出数据 do{ inputBuffer[0] = 0x00600378; //Output Data Register DeviceIoControl(hDevice, WRITE_PORT, inputBuffer, sizeof(inputBuffer), NULL, 0, &dwOutput, NULL); for (i=0;i<850;i++){;}

DeviceIoControl这个函数的使用

用CreateFile打开驱动,路径是Device,例如驱动名是MyDriver,则打开DeviceMyDriver即可。

然后利用返回的句柄发送控制码

舍利云:海外云服务器,6核16G超大带宽vps;支持全球范围,原价516,折后价200元/月!

舍利云怎么样?舍利云推出了6核16G超大带宽316G高性能SSD和CPU,支持全球范围,原价516,折后价200元一月。原价80美元,现价30美元,支持地区:日本,新加坡,荷兰,法国,英国,澳大利亚,加拿大,韩国,美国纽约,美国硅谷,美国洛杉矶,美国亚特兰大,美国迈阿密州,美国西雅图,美国芝加哥,美国达拉斯。舍利云是vps云服务器的销售商家,其产品主要的特色是适合seo和建站,性价比方面非常不错,...

易探云(QQ音乐绿钻)北京/深圳云服务器8核8G10M带宽低至1332.07元/年起

易探云怎么样?易探云香港云服务器比较有优势,他家香港BGP+CN2口碑不错,速度也很稳定。尤其是今年他们动作很大,推出的香港云服务器有4个可用区价格低至18元起,试用过一个月的用户基本会续费,如果年付的话还可以享受8.5折或秒杀价格。今天,云服务器网(yuntue.com)小编推荐一下易探云国内云服务器优惠活动,北京和深圳这二个机房的云服务器2核2G5M带宽低至330.66元/年,还有高配云服务器...

月费$389,RackNerd美国大硬盘独立服务器

这次RackNerd商家提供的美国大硬盘独立服务器,数据中心位于洛杉矶multacom,可选Windows、Linux镜像系统,默认内存是64GB,也可升级至128GB内存,而且硬盘采用的是256G SSD系统盘+10个16TSAS数据盘,端口提供的是1Gbps带宽,每月提供200TB,且包含5个IPv4,如果有需要更多IP,也可以升级增加。CPU核心内存硬盘流量带宽价格选择2XE5-2640V2...

deviceiocontrol为你推荐
mergefield合并邮件,最后怎么生成呢?ico监管为何央行叫停代币发行?renderpartialrenderHtml和render有什么区别flash实例FLASH中实例是个什么概念,真心期待着!!!期待好心人,感恩!希望大家多讨论listviewitemListView具有多种item布局5e5e5e计算器里5.55556e-5是什么意思网站客服代码怎么在网页用HTML代码设置QQ客服空间导航怎么把空间的导航变成只有留言板跟相册微盟价格微盟怎么收费?在线操作系统什么是网络操作系统,与普通操作系统有什么区别
linuxapache虚拟主机 godaddy域名解析 云网数据 idc评测网 paypal认证 双11抢红包攻略 免费ddos防火墙 php免费空间 台湾谷歌网址 个人免费空间 小米数据库 坐公交投2700元 e蜗 服务器是干什么的 qq对话框 国外视频网站有哪些 免费外链相册 备案空间 韩国代理ip 防cc攻击 更多