对 Windows驱动开发技术详解 第九章的(IRP的同步)自我理解

对 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例程的参数
    );

///

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值