KSPIN_LOCK BugCheckCallbackLock;
ULONG KeBugCheckActive, KeBugCheckOwner;
LONG KeBugCheckOwnerRecursionCount;
-PRTL_MESSAGE_RESOURCE_DATA KiBugCodeMessages;
+PMESSAGE_RESOURCE_DATA KiBugCodeMessages;
ULONG KeBugCheckCount = 1;
ULONG KiHardwareTrigger;
PUNICODE_STRING KiBugCheckDriver;
ULONG_PTR KiBugCheckData[5];
+PKNMI_HANDLER_CALLBACK KiNmiCallbackListHead;
+KSPIN_LOCK KiNmiCallbackListLock;
/* Bugzilla Reporting */
UNICODE_STRING KeRosProcessorName, KeRosBiosDate, KeRosBiosVersion;
NTAPI
KiInitializeBugCheck(VOID)
{
- PRTL_MESSAGE_RESOURCE_DATA BugCheckData;
+ PMESSAGE_RESOURCE_DATA BugCheckData;
LDR_RESOURCE_INFO ResourceInfo;
PIMAGE_RESOURCE_DATA_ENTRY ResourceDataEntry;
NTSTATUS Status;
for (i = 0; i < IdOffset; i++)
{
/* Advance in the Entries */
- MessageEntry += ((PRTL_MESSAGE_RESOURCE_ENTRY)MessageEntry)->
+ MessageEntry += ((PMESSAGE_RESOURCE_ENTRY)MessageEntry)->
Length;
}
/* Get the final Code */
- BugCode = ((PRTL_MESSAGE_RESOURCE_ENTRY)MessageEntry)->Text;
+ BugCode = (PCHAR)((PMESSAGE_RESOURCE_ENTRY)MessageEntry)->Text;
i = strlen(BugCode);
/* Handle newlines */
while (TRUE);
}
+BOOLEAN
+NTAPI
+KiHandleNmi(VOID)
+{
+ BOOLEAN Handled = FALSE;
+ PKNMI_HANDLER_CALLBACK NmiData;
+
+ //
+ // Parse the list of callbacks
+ //
+ NmiData = KiNmiCallbackListHead;
+ while (NmiData)
+ {
+ //
+ // Save if this callback has handled it -- all it takes is one
+ //
+ Handled |= NmiData->Callback(NmiData->Context, Handled);
+ NmiData = NmiData->Next;
+ }
+
+ //
+ // Has anyone handled this?
+ //
+ return Handled;
+}
+
/* PUBLIC FUNCTIONS **********************************************************/
/*
return Status;
}
-/*
- * @unimplemented
- */
-NTSTATUS
-NTAPI
-KeDeregisterNmiCallback(PVOID Handle)
-{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
-}
-
/*
* @implemented
*/
}
/*
- * @unimplemented
+ * @implemented
*/
PVOID
NTAPI
KeRegisterNmiCallback(IN PNMI_CALLBACK CallbackRoutine,
IN PVOID Context)
{
+ KIRQL OldIrql;
+ PKNMI_HANDLER_CALLBACK NmiData, Next;
+ ASSERT_IRQL_LESS_OR_EQUAL(DISPATCH_LEVEL);
+
+ //
+ // Allocate NMI callback data
+ //
+ NmiData = ExAllocatePoolWithTag(NonPagedPool,
+ sizeof(KNMI_HANDLER_CALLBACK),
+ 'IMNK');
+ if (!NmiData) return NULL;
+
+ //
+ // Fill in the information
+ //
+ NmiData->Callback = CallbackRoutine;
+ NmiData->Context = Context;
+ NmiData->Handle = NmiData;
+
+ //
+ // Insert it into NMI callback list
+ //
+ KiAcquireNmiListLock(&OldIrql);
+ NmiData->Next = KiNmiCallbackListHead;
+ Next = InterlockedCompareExchangePointer(&KiNmiCallbackListHead,
+ NmiData,
+ NmiData->Next);
+ ASSERT(Next == NmiData->Next);
+ KiReleaseNmiListLock(OldIrql);
+
+ //
+ // Return the opaque "handle"
+ //
+ return NmiData->Handle;
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+KeDeregisterNmiCallback(PVOID Handle)
+{
UNIMPLEMENTED;
- return NULL;
+ return STATUS_UNSUCCESSFUL;
}
/*