关于IoGetTopLevelIrp()
IoGetTopLevelIrp()=NULL 時,Usermode直接产生的Irp。
IoGetTopLevelIrp()!=NULL 時,Kernel其他driver产生的Irp,因为CM或VM会调用IoSetTopLevelIrp来标记源IRP。在这IRP之前,一定会有一个对应的Usermode的Irp
VOID
STDCALL
IoSetTopLevelIrp (
IN PIRP Irp
)
{
PETHREAD Thread;
Thread = PsGetCurrentThread ();
Thread->TopLevelIrp->TopLevelIrp = Irp;
}
PIRP
STDCALL
IoGetTopLevelIrp (
VOID
)
{
return (PsGetCurrentThread ()->TopLevelIrp->TopLevelIrp);
}