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)


生成控制代码的宏
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必须与设备驱动程序内定义的设备名称一致
没有评论:
发表评论