/** * effects: Register trap struct. */ NTSTATUS NTAPI MadDog_RegisterTrap ( PCPU Cpu, PNBP_TRAP Trap ) { return TrRegisterTrap(Cpu, Trap); }
/** * effects: Register traps in this function * requires: <Cpu> is valid */ NTSTATUS NTAPI VmxRegisterTraps ( PCPU Cpu, struct arch_phy* arch ) {//Finished NTSTATUS Status; PNBP_TRAP Trap; // used to set dummy handler for all VMX intercepts when we compile without nested support ULONG32 i, TableOfVmxExits[] = { EXIT_REASON_VMCALL, EXIT_REASON_VMCLEAR, EXIT_REASON_VMLAUNCH, EXIT_REASON_VMRESUME, EXIT_REASON_VMPTRLD, EXIT_REASON_VMPTRST, EXIT_REASON_VMREAD, EXIT_REASON_VMWRITE, EXIT_REASON_VMXON, EXIT_REASON_VMXOFF }; Status = TrInitializeGeneralTrap ( //<----------------4.1 Finish Cpu, EXIT_REASON_CPUID, 0, // length of the instruction, 0 means length need to be get from vmcs later. VmxDispatchCpuid, //<----------------4.2 Finish &Trap); if (!NT_SUCCESS (Status)) { Print(("VmxRegisterTraps(): Failed to register VmxDispatchCpuid with status 0x%08hX\n", Status)); return Status; } TrRegisterTrap (Cpu, Trap);//<----------------4.3//Finish Status = TrInitializeGeneralTrap ( Cpu, EXIT_REASON_MSR_READ, 0, // length of the instruction, 0 means length need to be get from vmcs later. VmxDispatchMsrRead, //VmxDispatchVmxInstrDummy, &Trap); if (!NT_SUCCESS (Status)) { Print(("VmxRegisterTraps(): Failed to register VmxDispatchMsrRead with status 0x%08hX\n", Status)); return Status; } TrRegisterTrap (Cpu, Trap); Status = TrInitializeGeneralTrap ( Cpu, EXIT_REASON_EPT_VIOLATION, 0, // length of the instruction, 0 means length need to be get from vmcs later. ept_handle_violation, //VmxDispatchVmxInstrDummy, &Trap); if (!NT_SUCCESS (Status)) { Print(("VmxRegisterTraps(): Failed to register VmxDispatchMsrRead with status 0x%08hX\n", Status)); return Status; } TrRegisterTrap (Cpu, Trap); Status = TrInitializeGeneralTrap ( Cpu, EXIT_REASON_EPT_MISCONFIG, 0, // length of the instruction, 0 means length need to be get from vmcs later. ept_handle_misconfiguration, //VmxDispatchVmxInstrDummy, &Trap); if (!NT_SUCCESS (Status)) { Print(("VmxRegisterTraps(): Failed to register VmxDispatchMsrRead with status 0x%08hX\n", Status)); return Status; } TrRegisterTrap (Cpu, Trap); Status = TrInitializeGeneralTrap ( Cpu, EXIT_REASON_MSR_WRITE, 0, // length of the instruction, 0 means length need to be get from vmcs later. VmxDispatchMsrWrite, //VmxDispatchVmxInstrDummy, &Trap); if (!NT_SUCCESS (Status)) { Print(("VmxRegisterTraps(): Failed to register VmxDispatchMsrWrite with status 0x%08hX\n", Status)); return Status; } TrRegisterTrap (Cpu, Trap); Status = TrInitializeGeneralTrap ( Cpu, EXIT_REASON_CR_ACCESS, 0, // length of the instruction, 0 means length need to be get from vmcs later. VmxDispatchCrAccess, &Trap); if (!NT_SUCCESS (Status)) { Print(("VmxRegisterTraps(): Failed to register VmxDispatchCrAccess with status 0x%08hX\n", Status)); return Status; } TrRegisterTrap (Cpu, Trap); Status = TrInitializeGeneralTrap ( Cpu, EXIT_REASON_INVD, 0, // length of the instruction, 0 means length need to be get from vmcs later. VmxDispatchINVD, &Trap); if (!NT_SUCCESS (Status)) { Print(("VmxRegisterTraps(): Failed to register VmxDispatchINVD with status 0x%08hX\n", Status)); return Status; } TrRegisterTrap (Cpu, Trap); Status = TrInitializeGeneralTrap ( Cpu, EXIT_REASON_EXCEPTION_NMI, 0, // length of the instruction, 0 means length need to be get from vmcs later. VmxDispatchVmxInstrDummy,//VmxDispatchPageFault, &Trap); if (!NT_SUCCESS (Status)) { Print(("VmxRegisterTraps(): Failed to register VmxDispatchPageFault with status 0x%08hX\n", Status)); return Status; } TrRegisterTrap (Cpu, Trap); // set IO handler Status = TrInitializeGeneralTrap ( Cpu, EXIT_REASON_IO_INSTRUCTION, 0, // length of the instruction, 0 means length need to be get from vmcs later. VmxDispatchIO, &Trap); if (!NT_SUCCESS (Status)) { Print(("VmxRegisterTraps(): Failed to register VmxDispatchIO with status 0x%08hX\n", Status)); return Status; } TrRegisterTrap (Cpu, Trap); // set dummy handler for all VMX intercepts if we compile without nested support for (i = 0; i < sizeof (TableOfVmxExits) / sizeof (ULONG32); i++) { Status = TrInitializeGeneralTrap ( Cpu, TableOfVmxExits[i], 0, // length of the instruction, 0 means length need to be get from vmcs later. VmxDispatchVmxInstrDummy, &Trap); if (!NT_SUCCESS (Status)) { Print(("VmxRegisterTraps(): Failed to register VmxDispatchVmon with status 0x%08hX\n", Status)); return Status; } TrRegisterTrap (Cpu, Trap); } return STATUS_SUCCESS; }