1、IRP
IRP(I/O Request Package),即输入输出请求包。上层应用程序与底层驱动程序通信时,应用程序会发出I/O请求,操作系统将I/O请求转化为相应的IRP数据。不同类型的IRP会传递给不同的派遣函数处理。
2、派遣函数
驱动中 处理IRP请求的函数。处理完了之后,必须通过IOCompleteRequest结束IRP。这样,发起I/O请求的Win32 API就会返回。
3、RendFile内部操作过程
(1)ReadFile调用ntdll中的NtReadFile,其中ReadFile是Win32 API,而NtReadFile函数是Native API.
(2)ntdll中的NtReadFile进入到内核模式,并调用系统服务中 的NtReadFile函数。
(3)系统服务函数NtReadFile创建IRP_MJ_WRITE类型的IRP,然后将这个IRP发送到驱动程序的派遣函数中。NtReadFile会去等待一个时间,这是当前线程进入等待状态。
(4)在派遣函数中,会将这个IRP结束。这是会设置刚才等待的那个事件。睡眠的线程恢复。
在读取很大的文件时,ReadFIle不会立即返回,而是等待一段时间。