zoukankan      html  css  js  c++  java
  • 设备读写方式

    1.缓冲区方式读写操作
    1.1 ReadFile 
      读取字节数:stack->Parameters.Read.Length
       偏移:stack->Parameters.Read.ByteOffset.QuadPart
      输出缓冲区:pIrp->AssociatedIrp.SystemBuffer
      输出字节数:pIrp->IoStatus.Information
     
    1.2 WriteFile
      写入字节数:stack->Parameters.Write.Length
       偏移:stack->Parameters.Write.ByteOffset.QuadPart
      写入缓冲区:pIrp->AssociatedIrp.SystemBuffer
      返回字节数:pIrp->IoStatus.Information
     
    1.3 IRP_MJ_QUERY_INFORMATION
      FILE_INFORMATION_CLASS: stack->Parameters.QueryFile.FileInformation
      输入输出缓冲区:pIrp->AssociatedIrp.SystemBuffer
          返回字节数:pIrp->IoStatus.Information=stack->Parameters.QueryFile.Length
     
    2.直接方式读写操作
    2.1 ReadFile
      读取字节数:stack->Parameters.Read.Length
       偏移:stack->Parameters.Read.ByteOffset.QuadPart
      输出缓冲区:MmGetSystemAddressForMdlSafe(pIrp->MdlAddress,NormalPagePriority)
      输出字节数:pIrp->IoStatus.Information
     
    2.2 WriteFile
      写入字节数:stack->Parameters.Write.Length
       偏移:stack->Parameters.Write.ByteOffset.QuadPart
      写入缓冲区:MmGetSystemAddressForMdlSafe(pIrp->MdlAddress,NormalPagePriority)
      返回字节数:pIrp->IoStatus.Information
     
    3.其他方式读写操作
    3.1 ReadFile
      读取字节数:stack->Parameters.Read.Length
       偏移:stack->Parameters.Read.ByteOffset.QuadPart
      输出缓冲区:ProbeForWrite(pIrp->UserBuffer)
      输出字节数:pIrp->IoStatus.Information
     
    3.2 WriteFile
      写入字节数:stack->Parameters.Write.Length
       偏移:stack->Parameters.Write.ByteOffset.QuadPart
      写入缓冲区:ProbeForRead(pIrp->UserBuffer)
      返回字节数:pIrp->IoStatus.Information
     
     
    IO设备控制操作
    1.缓冲内存模式IOCTL
     
    输入缓冲区大小:stack->Parameters.DeviceIoControl.InputBufferLength
    输出缓冲区大小:stack->Parameters.DeviceIoControl.OutputBufferLength
        输入缓冲区:pIrp->AssociatedIrp.SystemBuffer
        输出缓冲区:pIrp->AssociatedIrp.SystemBuffer
     
    2.直接内存模式IOCTL之METHOD_IN_DIRECT 
     
    输入缓冲区大小:stack->Parameters.DeviceIoControl.InputBufferLength
    输出缓冲区大小:stack->Parameters.DeviceIoControl.OutputBufferLength
        输入缓冲区:MmGetSystemAddressForMdlSafe(pIrp->MdlAddress,NormalPagePriority)
        输出缓冲区:pIrp->AssociatedIrp.SystemBuffer
     
     
    3.直接内存模式IOCTL之METHOD_OUT_DIRECT 
     
    输入缓冲区大小:stack->Parameters.DeviceIoControl.InputBufferLength
    输出缓冲区大小:stack->Parameters.DeviceIoControl.OutputBufferLength
        输入缓冲区:MmGetSystemAddressForMdlSafe(pIrp->MdlAddress,NormalPagePriority)
        输出缓冲区:pIrp->AssociatedIrp.SystemBuffer
     
    METHOD_IN_DIRECT与METHOD_OUT_DIRECT区别在于打开设备的权限
     
    1) 只读权限打开设备,METHOD_IN_DIRECT的IOCTL操作成功,而METHOD_OUT_DIRECT的操作失败
    2) 读写权限打开设备,METHOD_IN_DIRECT与METHOD_OUT_DIRECT的IOCTL操作都成功
     
    4.其他内存模式IOCTL
     
    输入缓冲区大小:stack->Parameters.DeviceIoControl.InputBufferLength
    输出缓冲区大小:stack->Parameters.DeviceIoControl.OutputBufferLength
        输入缓冲区:ProbeForRead(stack->Parameters.DeviceIoControl.Type3InputBuffer)
        输出缓冲区:ProbeForWrite(pIrp->UserBuffer)
  • 相关阅读:
    Angular 从入坑到挖坑
    如何获取 C# 类中发生数据变化的属性信息
    我的领域驱动设计运用实例
    Newbe.Claptrap
    体验 QQ机器人C# SDK 1.X 特性总结
    Newbe.Claptrap 框架中为什么用 Claptrap 和 Minion 两个词?
    轻松应对并发问题 Newbe.Claptrap 框架入门,第一步 —— 创建项目,实现简易购物车
    谈反应式编程在服务端中的应用,数据库操作优化,提速 Upsert
    十万同时在线用户,需要多少内存?——Newbe.Claptrap 框架水平扩展实验
    docker-mcr 助您全速下载 dotnet 镜像
  • 原文地址:https://www.cnblogs.com/endenvor/p/9060645.html
Copyright © 2011-2022 走看看