CreateFile的使用示例,注意“.”对应着命名空间里的“GLOBAL??”:
if ((hDevice = CreateFile( "\\\\.\\IoctlTest",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL)) == INVALID_HANDLE_VALUE) {
三、Ioctl控制码
Ioctl控制码的结构类似于消息(如WM_XXX)或NTSTATUS的定义方式,它是一个驱动程序预定义的4字节整数,定义它的宏为:
#define IOCTL_Device_Function CTL_CODE(DeviceType, Function, Method, Access)
16-31 2-13 0-1 14-15
四、Ioctl的同异步与缓冲区操作
使用DeviceIoControl函数来实现用户模式下的Ioctl操作,它的定义如下:
BOOL DeviceIoControl( HANDLE hDevice,
DWORD dwIoControlCode,
LPVOID lpInBuffer,
DWORD nInBufferSize,
LPVOID lpOutBuffer,
DWORD nOutBufferSize,
LPDWORD lpBytesReturned,
LPOVERLAPPED lpOverlapped,
);
根据Ioctl码的不同,DeviceIoControl函数可以发出两种IRP:IRP_MJ_FILE_SYSTEM_CONTROL和IRP_MJ_DEVICE_CONTROL,前者代表了file system I/O control (FSCTL)请求,后者代表了设备的IOCTL请求。还有一种仅仅在内核模式下使用的IRP_MJ_INTERNAL_DEVICE_CONTROL,它用于内核不同组件间的通信。