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

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

新版本Apache HTTP Server 2.4.51发布更新(有安全漏洞建议升级)

今天中午的时候看到群里网友在讨论新版本的Apache HTTP Server 2.4.51发布且建议更新升级,如果有服务器在使用较早版本的话可能需要升级安全,这次的版本中涉及到安全漏洞的问题。Apache HTTP 中2.4.50的修复补丁CVE-2021-41773 修复不完整,导致新的漏洞CVE-2021-42013。攻击者可以使用由类似别名的指令配置将URL映射到目录外的文件的遍历攻击。这里...

WebHorizon($10.56/年)256MB/5G SSD/200GB/日本VPS

WebHorizon是一家去年成立的国外VPS主机商,印度注册,提供虚拟主机和VPS产品,其中VPS包括OpenVZ和KVM架构,有独立IP也有共享IP,数据中心包括美国、波兰、日本、新加坡等(共享IP主机可选机房更多)。目前商家对日本VPS提供一个8折优惠码,优惠后最低款OpenVZ套餐年付10.56美元起。OpenVZCPU:1core内存:256MB硬盘:5G NVMe流量:200GB/1G...

HostYun 新增可选洛杉矶/日本机房 全场9折月付19.8元起

关于HostYun主机商在之前也有几次分享,这个前身是我们可能熟悉的小众的HostShare商家,主要就是提供廉价主机,那时候官方还声称选择这个品牌的机器不要用于正式生产项目,如今这个品牌重新转变成Hostyun。目前提供的VPS主机包括KVM和XEN架构,数据中心可选日本、韩国、香港和美国的多个地区机房,电信双程CN2 GIA线路,香港和日本机房,均为国内直连线路,访问质量不错。今天和大家分享下...

deviceiocontrol为你推荐
windowsmedia电脑的大部分软件打开方式变为了Windows media centerlistviewitem求解如何获取listview中的item手机软件开发工具做安卓软件开发需要哪些工具?broadcast播哈尔滨哪里有卖broadcast播 这个服装品牌的特斯拉model3降价小鹏P7和特斯拉Model 3,买哪个更加划算?ocr软件下载如何安装汉王ocr文字识别软件gbk内码怎么查GBK内码?flex是什么Adobe 软件系列有那些,分别是做什么的?driversbackup为什么电脑开机时一直进backup system卡发短信移动卡怎么样发短信查自己的号码
手机域名注册 网通vps 抗投诉vps主机 godaddy域名解析教程 tier ev证书 华为4核 本网站服务器在美国 本网站在美国维护 我爱水煮鱼 微信收钱 jsp空间 免费活动 卡巴斯基试用版 美国堪萨斯 万网空间购买 789电视剧 美国独立日 服务器是干什么用的 国外在线代理服务器 更多