static FORCEINLINE VOID __DebugTrigger( IN PXENBUS_DEBUG_CONTEXT Context, IN BOOLEAN Crashing ) { PLIST_ENTRY ListEntry; for (ListEntry = Context->List.Flink; ListEntry != &Context->List; ListEntry = ListEntry->Flink) { PXENBUS_DEBUG_CALLBACK Callback; PCHAR Name; ULONG_PTR Offset; Callback = CONTAINING_RECORD(ListEntry, XENBUS_DEBUG_CALLBACK, ListEntry); ModuleLookup((ULONG_PTR)Callback->Function, &Name, &Offset); if (Name == NULL) { ModuleLookup((ULONG_PTR)Callback->Caller, &Name, &Offset); if (Name != NULL) { LogQemuPrintf("XEN|DEBUG: SKIPPING %p PREFIX '%s' REGISTERED BY %s + %p\n", Callback->Function, Callback->Prefix, Name, Offset); } else { LogQemuPrintf("XEN|DEBUG: SKIPPING %p PREFIX '%s' REGISTERED BY %p\n", Callback->Function, Callback->Prefix, Callback->Caller); } } else { LogQemuPrintf("XEN|DEBUG: ====> (%s + %p)\n", Name, Offset); Callback->Function(Callback->Argument, Crashing); LogQemuPrintf("XEN|DEBUG: <==== (%s + %p)\n", Name, Offset); } } }
VOID DebugTeardown( IN OUT PXENBUS_DEBUG_INTERFACE Interface ) { PXENBUS_DEBUG_CONTEXT Context = Interface->Context; Trace("====>\n"); (VOID) KeDeregisterBugCheckCallback(&Context->BugCheckCallbackRecord); RtlZeroMemory(&Context->BugCheckCallbackRecord, sizeof (KBUGCHECK_CALLBACK_RECORD)); if (!IsListEmpty(&Context->List)) { PLIST_ENTRY ListEntry; for (ListEntry = Context->List.Flink; ListEntry != &Context->List; ListEntry = ListEntry->Flink) { PXENBUS_DEBUG_CALLBACK Callback; PCHAR Name; ULONG_PTR Offset; Callback = CONTAINING_RECORD(ListEntry, XENBUS_DEBUG_CALLBACK, ListEntry); ModuleLookup((ULONG_PTR)Callback->Caller, &Name, &Offset); if (Name != NULL) { Error("CALLBACK: %p PREFIX '%s' REGISTERED BY %s + %p\n", Callback->Function, Callback->Prefix, Name, (PVOID)Offset); } else { Error("CALLBACK: %p PREFIX '%s' REGISTERED BY %p\n", Callback->Function, Callback->Prefix, Callback->Caller); } } BUG("OUTSTANDING CALLBACKS"); } RtlZeroMemory(&Context->Lock, sizeof (KSPIN_LOCK)); RtlZeroMemory(&Context->List, sizeof (LIST_ENTRY)); ASSERT(IsZeroMemory(Context, sizeof (XENBUS_DEBUG_CONTEXT))); __DebugFree(Context); RtlZeroMemory(Interface, sizeof (XENBUS_DEBUG_INTERFACE)); Trace("<====\n"); }
static VOID SuspendDebugCallback( IN PVOID Argument, IN BOOLEAN Crashing ) { PXENBUS_SUSPEND_CONTEXT Context = Argument; PLIST_ENTRY ListEntry; UNREFERENCED_PARAMETER(Crashing); XENBUS_DEBUG(Printf, &Context->DebugInterface, "Count = %u\n", Context->Count); for (ListEntry = Context->EarlyList.Flink; ListEntry != &Context->EarlyList; ListEntry = ListEntry->Flink) { PXENBUS_SUSPEND_CALLBACK Callback; PCHAR Name; ULONG_PTR Offset; Callback = CONTAINING_RECORD(ListEntry, XENBUS_SUSPEND_CALLBACK, ListEntry); ModuleLookup((ULONG_PTR)Callback->Function, &Name, &Offset); if (Name == NULL) { XENBUS_DEBUG(Printf, &Context->DebugInterface, "EARLY: %p (%p)\n", Callback->Function, Callback->Argument); } else { XENBUS_DEBUG(Printf, &Context->DebugInterface, "EARLY: %s + %p (%p)\n", Name, (PVOID)Offset, Callback->Argument); } } for (ListEntry = Context->LateList.Flink; ListEntry != &Context->LateList; ListEntry = ListEntry->Flink) { PXENBUS_SUSPEND_CALLBACK Callback; PCHAR Name; ULONG_PTR Offset; Callback = CONTAINING_RECORD(ListEntry, XENBUS_SUSPEND_CALLBACK, ListEntry); ModuleLookup((ULONG_PTR)Callback->Function, &Name, &Offset); if (Name == NULL) { XENBUS_DEBUG(Printf, &Context->DebugInterface, "LATE: %p (%p)\n", Callback->Function, Callback->Argument); } else { XENBUS_DEBUG(Printf, &Context->DebugInterface, "LATE: %s + %p (%p)\n", Name, (PVOID)Offset, Callback->Argument); } } }