zoukankan      html  css  js  c++  java
  • ioctl

    ioctl是设备驱动程序中对设备的I/O通道进行管理的函数

    int ioctl(int fd, int cmd, …)

    fd:用户程序打开设备时返回的文件标示符
    cmd:用户程序对设备的控制命令

    定义格式

    | 设备类型| 序列号| 方向 |数据尺寸|
    |---------|-------|------|--------|
    |  8 bit  | 8 bit |2 bit |8~14 bit|
    |---------|-------|------|--------|

    宏头文件

    asm/ioctl.h

    宏注释

    #define _IOC_SIZEBITS 14 //大小(size)字段的字位宽度,14bits
    #define _IOC_NRBITS   8  //序数(number)字段的字位宽度,8bits
    #define _IOC_TYPEBITS 8  //幻数(type)字段的字位宽度,8bits
    
    #define _IOC_DIRSHIFT  (_IOC_SIZESHIFT+_IOC_SIZEBITS) //16+14
    #define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS) //0+8
    #define _IOC_NRSHIFT   0 //0
    #define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS) //8+8
    
    #define _IOC(dir, type, nr, size) 
    (((dir) << _IOC_DIRSHIFT) | 
    ((type) << _IOC_TYPESHIFT) | 
    ((nr) << _IOC_NRSHIFT) | 
    ((size) << _IOC_SIZESHIFT))
    
    #define _IOC_NONE 0U    //没有数据传输
    #define _IOC_WRITE 1U   //向设备写入数据
    #define _IOC_READ 2U    //从设备中读取数据
    
    #define _IO(type,nr) _IOC(_IOC_NONE, (type), (nr), 0)
    #define _IOR(type,nr,size) _IOC(_IOC_READ, (type), (nr), sizeof(size))
    #define _IOW(type,nr,size) _IOC(_IOC_WRITE, (type), (nr), sizeof(size))
    #define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE, (type), (nr), sizeof(size))

    type(魔数): 魔数范围为 0~255 。通常,用英文字符 “A” ~ “Z” 或者 “a” ~ “z” 来表示。不同的设备驱动程序最好设置不同的魔数,但并不是要求绝对,也是可以使用其他设备驱动程序已用过的魔数
    nr(序列号):通常,从 0开始递增,相同设备驱动程序上可以重复使用该值。例如,读取和写入命令中使用了相同的基数,设备驱动程序也能分辨出来
    size(变量型):变量或者是变量的类型

    cmd组成

    _IOC(dir, type, nr, size)
    _IO(type, nr)   //简单方法

    举例

    #define NEWCHAR_IOC_MAGIC   'M'
    #define NEWCHAR_SET    _IO(NEWCHAR_IOC_MAGIC, 0)
    #define NEWCHAR_GET    _IO(NEWCHAR_IOC_MAGIC, 1)
    #define NEWCHAR_IOC_MAXNR   1
  • 相关阅读:
    代码注入——c++代码注入
    Windows 用来定位 DLL 的搜索路径
    LoadLibraryA与GetProcAddress介绍
    DLL 函数导出的规则和方法
    C++ dll的隐式与显式调用
    C++ main函数的参数
    DLL注入之修改PE静态注入
    用户权限设置和进程权限提升
    DLL注入之windows消息钩取
    c++回调函数
  • 原文地址:https://www.cnblogs.com/zhangxuechao/p/11709819.html
Copyright © 2011-2022 走看看