2013年4月2日星期二

DeviceIoControl


DeviceIoControl   Winbase.h  Kernel32.lib

直接向指定设备驱动程序(device driver),发送一个控制代码(control code),使设备执行相应的操作。
为应用程序提供了一个,直接与设备驱动程序 通信\输入输出 接口。
The DeviceIoControl function provides a device input and output control (IOCTL) interface through which an application can communicate directly with a device driver.
控制代码(LINUX里叫做命令代码): winioctl.h
标准控制代码(standard control codes
驱动程序自定义控制代码(device-specific control codes
Diagram illustrating the I/O control code layout
生成控制代码的宏
DeviceType
FunctionCode
TransferType
                  METHOD_BUFFERED
                  METHOD_IN_DIRECT or METHOD_OUT_DIRECT
                  METHOD_NEITHER
RequiredAccess
                  FILE_ANY_ACCESS
                  FILE_READ_DATA
                  FILE_WRITE_DATA

Windows定义的 控制代码列表
http://www.ioctls.net/

有用的宏:Wdm.h and Ntddk.h
#define IOCTL_Device_Function CTL_CODE(DeviceType, Function, Method, Access)
#define DEVICE_TYPE_FROM_CTL_CODE(ctrlCode) (((ULONG)(ctrlCode & 0xffff0000)) >> 16)
#define METHOD_FROM_CTL_CODE(ctrlCode)        ((ULONG)(ctrlCode & 3))

BOOL WINAPI DeviceIoControl(
  _In_         HANDLE hDevice,          设备句柄
  _In_         DWORD dwIoControlCode,   控制码
  _In_opt_     LPVOID lpInBuffer,
  _In_         DWORD nInBufferSize,
  _Out_opt_    LPVOID lpOutBuffer,
  _In_         DWORD nOutBufferSize,
  _Out_opt_    LPDWORD lpBytesReturned,
  _Inout_opt_  LPOVERLAPPED lpOverlapped
);

ioctl.h

在头文件winioctl.h中,预定义的标准设备控制码,都以IOCTL或FSCTL开头。
例如,IOCTL_DISK_GET_DRIVE_GEOMETRY是对物理驱动器取结构参数(介质类型、柱面数、每柱面磁道数、每磁道扇区数等)的控制码,FSCTL_LOCK_VOLUME是对逻辑驱动器的卷加锁的控制码

IoControlCode由四部分组成:DeviceType、Access(读/写)、Function、Method


HANDLE CreateFile(
    LPCTSTR lpFileName,                         // 文件名/设备路径
    DWORD dwDesiredAccess,                      // 访问方式
    DWORD dwShareMode,                          // 共享方式
    LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 安全描述符指针
    DWORD dwCreationDisposition,                // 创建方式
    DWORD dwFlagsAndAttributes,                 // 文件属性及标志
    HANDLE hTemplateFile                        // 模板文件的句柄
);
设备驱动的“文件名”(常称为“设备路径”)形式固定为“//./DeviceName”(注意在C程序中该字符串写法为“////.//DeviceName”),DeviceName必须与设备驱动程序内定义的设备名称一致

没有评论:

发表评论