[NTOS]: I am sorry, this is embarssing. Fix build again.
[reactos.git] / reactos / ntoskrnl / ke / bug.c
index 6b054ca..642c9a2 100644 (file)
@@ -23,11 +23,13 @@ LIST_ENTRY KeBugcheckReasonCallbackListHead;
 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;
@@ -392,7 +394,7 @@ INIT_FUNCTION
 NTAPI
 KiInitializeBugCheck(VOID)
 {
-    PRTL_MESSAGE_RESOURCE_DATA BugCheckData;
+    PMESSAGE_RESOURCE_DATA BugCheckData;
     LDR_RESOURCE_INFO ResourceInfo;
     PIMAGE_RESOURCE_DATA_ENTRY ResourceDataEntry;
     NTSTATUS Status;
@@ -456,12 +458,12 @@ KeGetBugMessageText(IN ULONG BugCheckCode,
             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 */
@@ -1208,6 +1210,32 @@ KeBugCheckWithTf(IN ULONG BugCheckCode,
     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 **********************************************************/
 
 /*
@@ -1280,17 +1308,6 @@ KeDeregisterBugCheckReasonCallback(
     return Status;
 }
 
-/*
- * @unimplemented
- */
-NTSTATUS
-NTAPI
-KeDeregisterNmiCallback(PVOID Handle)
-{
-    UNIMPLEMENTED;
-    return STATUS_UNSUCCESSFUL;
-}
-
 /*
  * @implemented
  */
@@ -1362,15 +1379,58 @@ KeRegisterBugCheckReasonCallback(
 }
 
 /*
- * @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;
 }
 
 /*