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即可。

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

ZJI(月付480元),香港阿里云专线服务器

ZJI是成立于2011年原Wordpress圈知名主机商—维翔主机,2018年9月更名为ZJI,主要提供香港、日本、美国独立服务器(自营/数据中心直营)租用及VDS、虚拟主机空间、域名注册业务。本月商家针对香港阿里云线路独立服务器提供月付立减270-400元优惠码,优惠后香港独立服务器(阿里云专线)E3或者E5 CPU,SSD硬盘,最低每月仅480元起。阿里一型CPU:Intel E5-2630L...

BGP.TO日本和新加坡服务器进行促销,日本服务器6.5折

BGP.TO目前针对日本和新加坡服务器进行促销,其中日本东京服务器6.5折,而新加坡服务器7.5折起。这是一家专门的独立服务器租售网站,提供包括中国香港、日本、新加坡和洛杉矶的服务器租用业务,基本上都是自有硬件、IP资源等,国内优化直连线路,机器自动化部署上架,并提供产品的基本管理功能(自助开关机重启重装等)。新加坡服务器 $93.75/月CPU:E3-1230v3内存:16GB硬盘:480GB ...

Hostodo:$19.99/年KVM-1GB/12GB/4TB/拉斯维加斯

Hostodo发布了几款采用NVMe磁盘的促销套餐,从512MB内存起,最低年付14.99美元,基于KVM架构,开设在拉斯维加斯机房。这是一家成立于2014年的国外VPS主机商,主打低价VPS套餐且年付为主,基于OpenVZ和KVM架构,产品性能一般,数据中心目前在拉斯维加斯和迈阿密,支持使用PayPal或者支付宝等付款方式。下面列出几款NVMe硬盘套餐配置信息。CPU:1core内存:512MB...

deviceiocontrol为你推荐
excel大写金额EXCEL金额大写renderpartialHtml.RenderPartial 报错特斯拉model3降价特斯拉model 3中国有补贴吗gbk内码怎么查GBK内码?flash序列号Flash软件 的序列号是什么?particular教程有没有制作花瓣飘落的AE教程如何查看qq特别关心我的人怎么在QQ里查看自己有没有被设为特别关心?元宝汇热血传奇怎么冲元宝的邮政网关如何注销中国邮政支付网关网上账号ps5教程怎样用PS5打字
域名空间购买 免费动态域名 科迈动态域名 漂亮qq空间 hostmaster locvps bbr linkcloud win8升级win10正式版 韩国网名大全 免费个人空间申请 申请个人网站 网站cdn加速 699美元 adroit 爱奇艺会员免费试用 吉林铁通 双线机房 域名与空间 美国盐湖城 更多