在C中与VxD进行汇编编程
1. 添加“Thunk”以支持来自VMM/VxD的回调
许多VMM和VxD服务要求调用的VxD注册一个回调函数,之后VMM/VxD会调用这个回调函数,以通知调用的VxD发生了某些有趣的事情。例如:
- 一个VxD可能会调用VPICD_Virtualize_IRQ来注册一个硬件中断处理程序,当硬件中断发生时,VPICD会调用已注册的处理程序。
- 一个VxD可能会调用VMM服务Install_IO_Handler来注册一个端口陷阱处理程序,当Ring 3应用程序访问特定的I/O端口时,VMM会调用这个处理程序。
在大多数情况下,提供给回调函数的参数是通过寄存器传递的,而不是通过栈。不过,配置管理器VxD是个明显的例外,它使用栈来向回调函数传递参数。因此,注册的回调函数通常位于汇编语言模块中,这样回调函数就可以访问寄存器参数。
示例VxD遵循这样的约定:所有注册的回调函数都位于VxD的汇编模块(包含DDB和设备控制过程的那个模块)中,但回调函数在调用VxD的C模块中的函数进行实际处理之前,只进行最少的处理。在示例VxD中,汇编回调函数的名称总是以“Thunk”结尾,而它调用的C函数的名称基名相同,但以“Handler”结尾。例如,PORTTRAP示例中,VxD的汇编语言模块中有函数PortTrapThunk,它会调用位于VxD的C模块中的PortTrapHandler。
每个需要回调的VMM/VxD服务使用不同的寄存器集合来向回调函数传递参数。因此,在使用回调时,必须参考服务文档,了