DeviceIoControl解读

DeviceIoControl解读设备驱动程序可以被当作内核模式函数包来看待,I/O控制代码就是用来指定访问其中的哪个函数的。DeviceIoControl函数的dwIoControlCode参数就是这个代码,它指出了我们需要进行的操作,以及如何进行操作。 控制代码是32位数字型常量,可以CTL_CODE宏来定义,它们定义在winioctl.inc和ntddk.inc文件中。 控制代码中各数据位字段的含义如下: ◎

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
设备驱动程序可以被当作内核模式函数包来看待,I/O控制代码就是用来指定访问其中的哪个函数的。DeviceIoControl函数的dwIoControlCode参数就是这个代码,它指出了我们需要进行的操作,以及如何进行操作。 


控制代码是32位数字型常量,可以CTL_CODE宏来定义,它们定义在winioctl.inc和ntddk.inc文件中。 




控制代码中各数据位字段的含义如下: 


◎ DeviceType–设备类型(16bit)指出了设备的类型,微软保留了0-7FFFh的取值,剩下的8000h-0FFFFh供开发商定义新的内 核模式驱动程序。我们可以在\include\w2k\ntddk.inc文件中找到一组FILE_DEVICE_XXX符号常量,这些值都是微软保留的 值,我们可以使用其中的FILE_DEVICE_UNKNOWN。当然你也可以定义另外一个FILE_DEVICE_XXX值 


◎ Access–存取代码(2bit)指明应用程序存取设备的方式,由于这个字段只有2位,所以只有4种可能性: 


· FILE_ANY_ACCESS (0)–最大的存取权限,就是什么操作都可以 


· FILE_READ_ACCESS (1)–读权限,设备将数据传递到指定的缓冲区 


· FILE_WRITE_ACCESS (2)–写权限,可以从内存中向设备传递数据 


· FILE_READ_ACCESS or FILE_WRITE_ACCESS (3)–读写权限,设备和内存缓冲区之间可以互相传递数据 


◎ Function–功能代码(12bit)用来描述要进行的操作,我们可以用800h-0FFFh来定义自己的I/O控制代码,0-7FFh之间的值是被微软保留的,用来定义公用的I/O控制代码 


◎ Method–缓冲模式(2bit)表示I/O管理器如何对输入和输出的数据进行缓冲,这个字段的长度是2位,所以有4种可能性: 


· METHOD_BUFFERED (0)–对I/O进行缓冲 


· METHOD_IN_DIRECT (1)–对输入不进行缓冲 


· METHOD_OUT_DIRECT (2)–对输出不进行缓冲 


· METHOD_NEITHER (3)–都不缓冲 




缓冲模式的管理我们会在后面进行更详细的讨论,当前最重要的是,虽然进行缓冲会带来一些额外的内存开销,但却是最安全的,因为系统已经做好了相关的全部工 作。在传输的数据小于一页(4Kb)的时候,驱动程序通常使用缓冲方式的I/O,因为对大量小块内存进行内存锁定带来的开销也是很大的。在 VirtToPhys驱动程序中,我们使用带缓冲的方式。 


读者可以手工去定义I/O控制代码,但是使用CTL_CODE宏会方便得多,它提供了创建IOCTL值的算法,具体如下: 




CTL_CODE MACRO DeviceType:= <0> , Function:= <0> , Method:= <0> , Access:= <0> 


EXITM %(((DeviceType) SHL 16) OR ((Access) SHL 14) OR ((Function) SHL 2) OR (Method)) 


ENDM 




CTL_CODE宏在winioctl.inc文件和ntddk.inc文件中都有定义。




在应用程序里定义的CTL_CODE和驱动中IRP_MJ_DEVICE_CONTROL的函数里控制码对应即可。在驱动程序里取出码值进行对比操作,如:


   dwIoControlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode;


    switch (dwIoControlCode)


    {



     // 我们约定,缓冲区共两个DWORD,第一个DWORD为端口,第二个DWORD为数据


     // 一般做法是专门定义一个结构,此处简单化处理了


     case IOCTL_MYPORT_READ_BYTE:   // 从端口读字节


      pvIOBuffer[1] = _inp(pvIOBuffer[0]);


      Irp->IoStatus.Information = 8;   // 输出长度为8


      break;


     case IOCTL_MYPORT_WRITE_BYTE:   // 写字节到端口


      _outp(pvIOBuffer[0], pvIOBuffer[1]);


      break;


     default:   // 不支持的IOCTL


      Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;


    }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/196547.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java使用allure_allure基本使用

    java使用allure_allure基本使用应用记录时间:2020-10-23问题一:使用alluregenerateresult-oreport,java执行错误。原因:在使用allure.attach()时,name传了一个dict对象导致报错(name应该是一个String类型)问题二:使用pytest–alluredirresult,alluregenerateresult-oreport。html报告中会输出…

    2022年7月26日
    26
  • 五大常用算法之分支定界法

    五大常用算法之分支定界法看了五大常用算法之一这篇博文,感觉理解了很多,可是纯粹都是理论,缺少一些示例,所以准备综合一篇博文,以帮助自己记忆,原文:一、基本描述   类似于回溯法,也是一种在问题的解空间树T上搜索问题解的算法。但在一般情况下,分支限界法与回溯法的求解目标不同。回溯法的求解目标是找出T中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中

    2025年6月18日
    0
  • linux recv返回值,recv recvfrom[通俗易懂]

    linux recv返回值,recv recvfrom[通俗易懂]recv和recvfrom都是用来接受来自的网络的数据。来看看它们的原型:intrecv(SOCKET,charFAR*,int,int);intrecvfrom(SOCKET,charFAR*,int,int,structsockaddrFAR*,intFAR*);这是在windows下面的定义。在linux下面的定义只是将SOCKET改成int,那么在linux下面的原型是这样:…

    2022年7月23日
    32
  • HashMap的数据结构(浅谈有与无)

    HashMap数据结构浅谈开篇语:hashmap作为一种非常重要的数据结构,无论是在理论学习中,还是实际开发中都会经常遇到。这里总结一下对于hashmap一些基础的知识点。1、常见的数据结构一般开发中常见的数据结构有数组、链表、树、及HashMap。数组结构和链表结构的图形结构非常简单。本次主要讲解HashMap的结构,并结合着源码进行简要分析2、HashMapHashMap的结构图如…

    2022年4月10日
    43
  • MSF搭建socks代理[通俗易懂]

    MSF搭建socks代理[通俗易懂]目录搭建代理添加路由​搭建Socks4a代理搭建Socks5代理连接代理搭建代理当我们通过MSF拿到一个机器的权限后,想通过MSF搭建socks代理,然后通内网。MSF中有三个代理模块,分别是socks4a、socks5、socks_unc。我们一般用socks4a和socks5进行代理。socks5可以设置用户名和密码。这里运行代理后,有时候MSF不会监听端口…

    2022年6月16日
    113
  • mp3格式音频文件结构解析图_mp3文件结构

    mp3格式音频文件结构解析图_mp3文件结构一、概述Layer-3音频文件,MPEG(MovingPictureExpertsGroup)在汉语中译为活动图像专家组,特指活动影音压缩标准,MPEG音频文件是MPEG1标准中的声音部分,也叫MPEG音频层,它根据压缩质量和编码复杂程度划分为三层,即Layer-1、Layer2、Layer3,且分别对应MP1、MP2、MP3这三种声音文件,并根据不同的用途,使用不同层次的编码

    2025年6月9日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号