/** * effects: install Vis on the fly. */ NTSTATUS NTAPI HvmSwallowBluepill() {//SAME CCHAR cProcessorNumber; NTSTATUS Status, CallbackStatus; Print(("HelloWorld:HvmSwallowBluepill(): Going to subvert %d processor%s\n", KeNumberProcessors, KeNumberProcessors == 1 ? "" : "s")); KeWaitForSingleObject (&g_HvmMutex, Executive, KernelMode, FALSE, NULL); for (cProcessorNumber = 0; cProcessorNumber < KeNumberProcessors; cProcessorNumber++) { Print(("HelloWorld:HvmSwallowBluepill():Installing HelloWorld VT Root Manager on processor #%d\n", cProcessorNumber)); Status = CmDeliverToProcessor(cProcessorNumber, CmSubvert, NULL, &CallbackStatus); if (!NT_SUCCESS (Status)) { Print(("HelloWorld:HvmSwallowBluepill(): CmDeliverToProcessor() failed with status 0x%08hX\n", Status)); KeReleaseMutex (&g_HvmMutex, FALSE); HvmSpitOutBluepill (); return Status; } if (!NT_SUCCESS (CallbackStatus)) { Print(("HelloWorld:HvmSwallowBluepill(): HvmSubvertCpu() failed with status 0x%08hX\n", CallbackStatus)); KeReleaseMutex (&g_HvmMutex, FALSE); HvmSpitOutBluepill (); return CallbackStatus; } } KeReleaseMutex (&g_HvmMutex, FALSE); if (KeNumberProcessors != g_uSubvertedCPUs) { HvmSpitOutBluepill (); return STATUS_UNSUCCESSFUL; } return STATUS_SUCCESS; }
NTSTATUS DriverUnload(PDRIVER_OBJECT DriverObject) { NTSTATUS status; status = HvmSpitOutBluepill(); if (!NT_SUCCESS(status)) { Trace(("DriverUnload : HvmSplitOutBluepill() failed with status 0x%08hX\n", status)); } MmShutdownManager(); return STATUS_SUCCESS; }
/** * effects: Uninstall HelloWorld VMM Hypervisor */ NTSTATUS NTAPI MadDog_UninstallHypervisor() { return HvmSpitOutBluepill(); }