从头开始了解和使用Hypervisor(第1部分)

来源:岁月联盟 编辑:猪蛋儿 时间:2020-01-29
#define IRP_MJ_READ                     0x03
#define IRP_MJ_WRITE                    0x04
#define IRP_MJ_QUERY_INFORMATION        0x05
#define IRP_MJ_SET_INFORMATION          0x06
#define IRP_MJ_QUERY_EA                 0x07
#define IRP_MJ_SET_EA                   0x08
#define IRP_MJ_FLUSH_BUFFERS            0x09
#define IRP_MJ_QUERY_VOLUME_INFORMATION 0x0a
#define IRP_MJ_SET_VOLUME_INFORMATION   0x0b
#define IRP_MJ_DIRECTORY_CONTROL        0x0c
#define IRP_MJ_FILE_SYSTEM_CONTROL      0x0d
#define IRP_MJ_DEVICE_CONTROL           0x0e
#define IRP_MJ_INTERNAL_DEVICE_CONTROL  0x0f
#define IRP_MJ_SHUTDOWN                 0x10
#define IRP_MJ_LOCK_CONTROL             0x11
#define IRP_MJ_CLEANUP                  0x12
#define IRP_MJ_CREATE_MAILSLOT          0x13
#define IRP_MJ_QUERY_SECURITY           0x14
#define IRP_MJ_SET_SECURITY             0x15
#define IRP_MJ_POWER                    0x16
#define IRP_MJ_SYSTEM_CONTROL           0x17
#define IRP_MJ_DEVICE_CHANGE            0x18
#define IRP_MJ_QUERY_QUOTA              0x19
#define IRP_MJ_SET_QUOTA                0x1a
#define IRP_MJ_PNP                      0x1b
#define IRP_MJ_PNP_POWER                IRP_MJ_PNP      // Obsolete....
#define IRP_MJ_MAXIMUM_FUNCTION         0x1b
每个主要函数只有在我们从用户模式调用相应函数时才会被触发,例如,在用户模式下,有一个名为CreateFile的函数,它已经有了变体,如用于ASCII和Unicode的CreateFileA和CreateFileW。因此我们每次调用CreateFile时,都会调用注册为IRP_MJ_CREATE的函数,或者如果我们调用ReadFile,则调用IRP_MJ_READ和WriteFile,最后IRP_MJ_WRITE被调用。你可以看到Windows将其设备视为文件,并且当调用该函数时,PIRP Irp中提供了从用户模式传递到内核模式所需的所有内容,作为缓冲区。
在本文的示例中,Windows负责将用户模式缓冲区复制到内核模式堆栈。不用担心,我们在项目的其余部分会经常使用它,但是在本部分中我们仅支持IRP_MJ_CREATE,而在以后的部分中则没有实现其他函数。
IRP次要函数
IRP次要函数主要用于PnP管理器通知特殊事件,例如,PnP管理器在将硬件资源(如果有的话)分配给设备后发送IRP_MN_START_DEVICE或PnP管理器发送IRP_MN_STOP_DEVICE来停止设备,以便重新配置设备的硬件资源。
在后面部分,我们将需要这些次要函数。
IRP次要函数列表如下:
IRP_MN_START_DEVICE
IRP_MN_QUERY_STOP_DEVICE
IRP_MN_STOP_DEVICE
IRP_MN_CANCEL_STOP_DEVICE
IRP_MN_QUERY_REMOVE_DEVICE
IRP_MN_REMOVE_DEVICE
IRP_MN_CANCEL_REMOVE_DEVICE
IRP_MN_SURPRISE_REMOVAL
IRP_MN_QUERY_CAPABILITIES 
IRP_MN_QUERY_PNP_DEVICE_STATE
IRP_MN_FILTER_RESOURCE_REQUIREMENTS
IRP_MN_DEVICE_USAGE_NOTIFICATION
IRP_MN_QUERY_DEVICE_RELATIONS
IRP_MN_QUERY_RESOURCES
IRP_MN_QUERY_RESOURCE_REQUIREMENTS
IRP_MN_QUERY_ID
IRP_MN_QUERY_DEVICE_TEXT
IRP_MN_QUERY_BUS_INFORMATION
IRP_MN_QUERY_INTERFACE
IRP_MN_READ_CONFIG
IRP_MN_WRITE_CONFIG
IRP_MN_DEVICE_ENUMERATED
IRP_MN_SET_LOCK
快速I/O
为了优化VMM,可以使用快速I/O,这是一种启动I/O操作的方法,该方法比IRP快,快速的I/O操作始终是同步的。
快速I/O专为缓存文件上的快速同步I/O而设计。在快速I/O操作中,数据直接在用户缓冲区和系统缓存之间传输,而绕过文件系统和存储驱动程序堆栈。存储驱动程序不使用快速I/O,如果在收到快速I/O读或写请求时从文件读取的所有数据都驻留在系统高速缓存中,则该请求将立即得到满足。
当I/O管理器收到对同步文件I/O(而不是分页I/O)的请求时,它将首先调用快速I/O例程。如果快速I/O例程返回TRUE,则该操作由快速I/O例程提供服务。如果快速I/O例程返回FALSE,则I/O管理器将创建并发送IRP。

上一页  [1] [2] [3] [4] [5] [6]  下一页