Beispiel #1
0
/**
 * effects: Register trap struct.
 */
NTSTATUS NTAPI MadDog_RegisterTrap (
  PCPU Cpu,
  PNBP_TRAP Trap
)
{
	return TrRegisterTrap(Cpu, Trap);
}
Beispiel #2
0
/**
 * 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;
}