对 Windows驱动开发技术详解 第九章的(IRP的同步)自我理解
BY:ALALMN—飞龙 QQ:316118740 BLOG:http://hi.baidu.com/alalmn
同步异步处理(这个也都是很好理解的) 在R0和R3下都给了例子
///
同步操作设备
用户函数 打开设备
HANDLE CreateFile(
LPCTSTR lpFileName, //指向文件名的指针
DWORD dwDesiredAccess, //访问模式(写/读)
DWORD dwShareMode, //共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, //指向安全属性的指针
DWORD dwCreationDisposition, //如何创建
DWORD dwFlagsAndAttributes, //文件属性
HANDLE hTemplateFile //用于复制文件句柄
);
用户函数 读取数据
BOOL ReadFile(
HANDLE hFile, //文件的句柄
LPVOID lpBuffer, //用于保存读入数据的一个缓冲区
DWORD nNumberOfBytesToRead, //要读入的字符数
LPDWORD lpNumberOfBytesRead, //指向实际读取字节数的指针
LPOVERLAPPED lpOverlapped //如文件打开时指定了FILE_FLAG_OVERLAPPED,那么必须,用这个参数引用一个特殊的结构。该结构定义了一次异步读取操作。否则,应将这个参数设为NULL
);
///
异步操作设备
typedef struct _OVERLAPPED{
DWORD Internal;//操作系统保留,指出一个和系统相关的状态
DWORD InternalHigh;//指出发送或接收的数据长度
DWORD Offset;//文件传送的开始位置
DWORD OffsetHigh;//文件传送的字节偏移量的高位字
HANDLE hEvent;//指定一个I/O操作完成后触发的事件
}OVERLAPPED;
在使用OVERLAPPED结构前,先要对其内部清零,并且为其创建事件。
ReadFile和WriteFile即可以支持同步读写操作,又可以支持异步读写操作。
ReadFileEx和WriteFileEx函数是专门用于异步读写操作的,不能进行同步读写。
BOOL ReadFileEx(
HANDLE hFile, //设备句柄
LPVOID lpBuffer, //读取缓冲区
DWORD nNumberOfBytesToRead, //读取的字节数
LPOVERLAPPED lpOverlapped, //offset指针
LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine //完成函数
);
错误报告
FileIOCompletionRoutine(
DWORD dwErrorCode;//0:表示操作完成;ERROR_HANDLE_EOF:表示已经到了文件尾端
DWORD dwNumberOfBytesTransferred;//真正被传输的数据字节数
LPOVERLAPPED lpOverlapped;//由开启overlapped I/O 操作的函数提供
);
///
取消IRP
PDRIVER_CANCEL
IoSetCancelRoutine(
IN PIRP Irp, //这个参数是需要取消的IRP
IN PDRIVER_CANCEL CancelRoutine //这个是取消函数的函数指针。一旦IRP请求被取消的时候,操作系统会调用这个取消函数。
);
///
StartiO例程
系统提供了一个IRP队列来实现串行,这个队列用KDEVICE_QUEUE数据结构表示。
typedef struct _KDEVICE_QUEUE {
CSHORT Type;
CSHORT Size;
LIST_ENTRY devicelisthead;
KSPIN_LOCK Lock;
BOOLEAN Busy;
} KDEVICE_QUEUE, *PKDEVICE_QUEUE, *RESTRICTED_POINTER PRKDEVICE_QUEUE;
插入队列的内核函数是KeInsertDeviceQueue
BOOLEAN
KeInsertDeviceQueue(
IN PKDEVICE_QUEUE DeviceQueue, //这个参数是需要被插入的队列
IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry //这个参数是要被插入的元素
);
删除队列元素函数是KeRemoveDeviceQueue
PKDEVICE_QUEUE_ENTRY
KeRemoveDeviceQueue(
IN PKDEVICE_QUEUE DeviceQueue //指定从哪个队列中取出元素
);
///
中断服务例程(ISR)
ISR函数同步的内核函数KeSynchronizeExecution
BOOLEAN
KeSynchronizeExecution(
IN PKINTERRUPT Interrupt, //这个参数是中断对象指针,ISR和这个对象关联着。
IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine, //将当前IRQL提升至中断对象相应的DIRQL,并执行SynchronizeRoutine函数
IN PVOID SynchronizeContext //为SynchronizeRoutine提供的参数
);
///
使用DPC例程,首先要初始化DPC对象,该动作使用内核函数KeInitializeDpc
VOID
KeInitializeDpc(
IN PRKDPC Dpc, //需要初始化的DPC对象指针
IN PKDEFERRED_ROUTINE DeferredRoutine, //与DPC关联的DPC例程
IN PVOID DeferredContext //传入DPC例程的参数
);
///
对 Windows驱动开发技术详解 第九章的(IRP的同步)自我理解
最新推荐文章于 2024-08-12 19:23:15 发布