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

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

Megalayer美国服务器CN2优化线路30M带宽3独立IP限时月299元

Megalayer 商家算是比较新晋的国内主机商,主要方向是美国、香港、菲律宾等机房的独立服务器为主,以及站群服务器和显卡服务器。同时也有新增价格并不是特别优惠的VPS云服务器。上午的时候有网友问问有没有CN2线路的美国独立服务器的,这里我推荐他选择Megalayer看看,目前也是有活动截止到月底的。Megalayer 商家创办2年左右时间,如果我们初次使用建议月付体验。目前在进行且可能截止到6月...

pigyun25元/月,香港云服务器仅起;韩国云服务器,美国CUVIP

pigyun怎么样?PIGYun成立于2019年,2021是PIGYun为用户提供稳定服务的第三年,期待我们携手共进、互利共赢。PIGYun为您提供:香港CN2线路、韩国CN2线路、美西CUVIP-9929线路优质IaaS服务。月付另有通用循环优惠码:PIGYun,获取8折循环优惠(永久有效)。目前,PIGYun提供的香港cn2云服务器仅29元/月起;韩国cn2云服务器仅22元/月起;美国CUVI...

美国VPS 美国高防VPS 香港VPS 日本VPS 首月9元 百纵科技

百纵科技湖南百纵科技有限公司是一家具有ISP ICP 电信增值许可证的正规公司,多年不断转型探索现已颇具规模,公司成立于2009年 通过多年经营积累目前已独具一格,公司主要经营香港服务器,香港站群服务器,美国高防服务器,美国站群服务器,云服务器,母机租用托管!美国CN2云服务器,美国VPS,美国高防云主机,美国独立服务器,美国站群服务器,美国母机。美国原生IP支持大批量订货 合作 适用电商 亚马逊...

deviceiocontrol为你推荐
mergefield邮件合并日期,想让电子表格中的日期格式与WORD中的日期格式一致youtube创始人我的世界captainsparklez是谁上行宽带上行宽带和下行宽带代表什么?云输入法如何使用QQ云输入法?erp系统教程ERP系统怎样操作,有教学视频吗?gbk内码Gbk内码查询flushes翻譯下面的日記全峰快递官网请问全峰快递客服是多少?linux启动盘制作工具linux下有没有制作u盘启动盘的东西mpeg4格式mp4格式有哪些??
草根过期域名 flashfxp怎么用 isatap 美国主机论坛 免费ftp空间 softbank官网 老左博客 tightvnc 网站实时监控 国外免费空间 亚洲小于500m 创梦 天互数据 柚子舍官网 linux服务器维护 美国在线代理服务器 四核服务器 网页加速 空间申请 电信主机托管 更多