Windows R3与R0通信
Windows 分为应用层与内核层。它们之间是如何进行通信的呢?
内核主要由各种驱动(在磁盘上是.sys文件)组成,这些驱动有的是windows系统自带的(例如ntfs.sys、tcpip.sys、win32k.sys),有的是由第三方软件厂商提供的。驱动加载之后,会生成对应的设备对象,并可以选择向R3提供一个可供访问和打开的符号链接。常见的盘符C、D、E等其实都是文件系统驱动创建的设备对象的符号链接,对应的符号链接分别是 “\??\C:\” “\??\D:\” “\??\E:\”等。
应用程序可以根据内核驱动的符号链接名调用CreateFile()函数打开。在获得一个句柄(handle)之后,程序就可以调用应用层函数与内核驱动进行通信了,例如ReadFile()、WriteFile()及DeviceIoControl()等。
内核函数一旦执行了DriverEntry()入口函数,就可以接收R3层的通信请求了。在内核驱动中专门有一组分发派遣函数用来分别响应应用层的调用请求,如图7.9所示。每一个应用层负责I/O的API都对应与一个内核中的分发派遣函数,例如CreateFile()对应于DispatchCreate()。API被调用之后,传递给API的数据和命令就会通过IRP直接传递给对应的驱动分发派遣函数来处理。当驱动分发派遣函数处理完这个IRP请求之后,驱动可以结束(或允许,或阻止)这个IRP,或者把这个IRP发给下层驱动继续处理。
何为IRP ?
IRP的全名是I/O Request Package,即输入输出请求包,它是Windows内核中一种非常重要的数据结构。上层应用程序与底层驱动程序通信时,应用程序会发出I/O请求,操作系统将相应的I/O请求转换成相应的IRP, 不同的IRP会根据类型被分派到不同的派遣例程中进行处理。
通俗来讲,在R3向R0通信过程中,应用层的命令和数据会被系统的I/O管理器封装在一个叫作IRP的结构中。
附图两张: