数据交换原理
A、用户层传入数据
B、驱动层接收数据
C、驱动层回传数据级用户层
A、用户层传入数据EXE WriteFile,ReadFile
BOOL DeviceIoControl
(
HANDLE hDevice, // 设备句柄 调用CreateFile获取
DWORD dwIoControlCode, // 操作执行的 控制码,用来区分不同的操作 是一个CTL_CODE宏
LPVOID lpInBuffer, // 输入参数 指针
DWORD nInBufferSize, // 输入参数大小(单位 字节)
LPVOID lpOutBuffer, // 输出参数 指针
DWORD nOutBufferSize, // 输出参数大小指针(单位 字节)
LPDWORD lpBytesReturned, // 实际输出参数大小指针(单位 字节)
LPOVERLAPPED lpOverlapped
//调用 CreateFile 时 FILE_FLAG_OVERLAPPED 标志打开时才有效,否则会被忽略,所以这里用NULL
);
B、CTL_CODE宏(用户层需要包含 winioctl.h头文件
http://msdn.microsoft.com/en-us/library/ms902086.aspx 这个地址CTL_CODE宏的详解介绍
CTL_CODE(DeviceType,Function,Method,Access);
//DeviceType 在SYS中用IOCreateDevice 创建的设备类型
//Function 驱动程序中定义的IOCTL码 取值范围 0x800-0xFFF 其它值为系统保留
//Method 访问方式 有4种 缓冲,直接,其它
//Access 访问权限,这个一般用:FILE_ANY_ACCESS 这个常量 表示有所有权限
示例:
#define add_code CTL_CODE(\
FILE_DEVICE_UNKNOWN, \ //DeviceType
0x800, \ // Function 0x800-0xfff 2048-4095
METHOD_BUFFERED, \ //Method
FILE_ANY_ACCESS) //Acess
hDevice=CreatFile
DeviceIoControl使用示例:exe
DWORD add(HANDLE hDevice,int a,int b)
{
int bufret;
int port[2];
port[0]=a;
port[1]=b;
DeviceIoControl(hDevice, add_code , &port, 8, &bufret, 4, &dwWrite, NULL);
return bufret;
}
B、驱动层接收数据
当用户层调用了DeviceIoControl时就会产生一个IRP_MJ_DEVICE_CONTROL 事件传送到相应的驱动设备
//所以在驱动部分 必须先注册一个 IRP_MJ_DEVICE_CONTROL IRP处理函数
pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = myDriver_DeviceIOControl;
//在这个回调函数里 可以通过 pIrp来获取 用户层EXE 传进来的参数
NTSTATUS myDriver_DeviceIOControl(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp)
{
NTSTATUS status = STATUS_SUCCESS;
//由pIrp得到输入缓冲区指针
//由pIrp得到输出缓冲区大小
//得到IOCTL码
//取得传入参数
//处理相送数据
//回传数据 SSDT hook
// C、驱动层回传数据给用户层
//完成IRP处理
//结束IRP请求
return status;
}