- Implemented InterlockedBitTestAndReset, InterlockedBitTestAndSet, InterlockedExchan...
[reactos.git] / reactos / ntoskrnl / kd / kdio.c
index e463282..a15a8b9 100644 (file)
@@ -55,10 +55,9 @@ KdpPrintToLogInternal(PVOID Context)
 
 VOID
 STDCALL
-KdpPrintToLog(PCH String)
+KdpPrintToLog(PCH String,
+              ULONG StringLength)
 {
-    ULONG StringLength = strlen(String);
-
     /* Don't overflow */
     if ((CurrentPosition + StringLength) > BufferSize) return;
 
@@ -71,9 +70,17 @@ KdpPrintToLog(PCH String)
     /* Make sure we are initialized and can queue */
     if (!KdpLogInitialized || (ItemQueued)) return;
 
-    /* Queue the work item */
-    ExQueueWorkItem(&KdpDebugLogQueue, HyperCriticalWorkQueue);
-    ItemQueued = TRUE;
+    /* 
+     * Queue the work item 
+     * Note that we don't want to queue if we are > DISPATCH_LEVEL...
+     * The message is in the buffer and will simply be taken care of at
+     * the next time we are at <= DISPATCH, so it won't be lost.
+     */
+    if (KeGetCurrentIrql() <= DISPATCH_LEVEL)
+    {
+        ExQueueWorkItem(&KdpDebugLogQueue, HyperCriticalWorkQueue);
+        ItemQueued = TRUE;
+    }
 }
 
 VOID
@@ -81,12 +88,13 @@ STDCALL
 KdpInitDebugLog(PKD_DISPATCH_TABLE DispatchTable,
                 ULONG BootPhase)
 {
-    if (!KdpDebugMode.File) return;
     NTSTATUS Status;
     OBJECT_ATTRIBUTES ObjectAttributes;
     UNICODE_STRING FileName;
     IO_STATUS_BLOCK Iosb;
 
+    if (!KdpDebugMode.File) return;
+
     if (BootPhase == 0)
     {
         /* Write out the functions that we support for now */
@@ -133,7 +141,8 @@ KdpInitDebugLog(PKD_DISPATCH_TABLE DispatchTable,
 
 VOID
 STDCALL
-KdpSerialDebugPrint(LPSTR Message)
+KdpSerialDebugPrint(LPSTR Message,
+                    ULONG Length)
 {
     PCHAR pch = (PCHAR) Message;
 
@@ -162,7 +171,11 @@ KdpSerialInit(PKD_DISPATCH_TABLE DispatchTable,
         DispatchTable->KdpPrintRoutine = KdpSerialDebugPrint;
 
         /* Initialize the Port */
-        KdPortInitializeEx(&SerialPortInfo, 0, 0);
+        if (!KdPortInitializeEx(&SerialPortInfo, 0, 0))
+        {
+            KdpDebugMode.Serial = FALSE;
+            return;
+        }
 
         /* Register as a Provider */
         InsertTailList(&KdProviders, &DispatchTable->KdProvidersList);
@@ -175,6 +188,15 @@ KdpSerialInit(PKD_DISPATCH_TABLE DispatchTable,
 
 /* SCREEN FUNCTIONS **********************************************************/
 
+VOID
+STDCALL
+KdpScreenPrint(LPSTR Message,
+               ULONG Length)
+{
+    /* Call HAL */
+    HalDisplayString(Message);
+}
+
 VOID
 STDCALL
 KdpScreenInit(PKD_DISPATCH_TABLE DispatchTable,
@@ -186,7 +208,7 @@ KdpScreenInit(PKD_DISPATCH_TABLE DispatchTable,
     {
         /* Write out the functions that we support for now */
         DispatchTable->KdpInitRoutine = KdpScreenInit;
-        DispatchTable->KdpPrintRoutine = HalDisplayString;
+        DispatchTable->KdpPrintRoutine = KdpScreenPrint;
 
         /* Register as a Provider */
         InsertTailList(&KdProviders, &DispatchTable->KdProvidersList);
@@ -238,13 +260,14 @@ KdpDetectConflicts(PCM_RESOURCE_LIST DriverList)
 
 ULONG
 STDCALL
-KdpPrintString(PANSI_STRING String)
+KdpPrintString(LPSTR String,
+               ULONG Length)
 {
-    if (!KdpDebugMode.Value) return 0;
-    PCH pch = String->Buffer;
     PLIST_ENTRY CurrentEntry;
     PKD_DISPATCH_TABLE CurrentTable;
 
+    if (!KdpDebugMode.Value) return 0;
+
     /* Call the registered handlers */
     CurrentEntry = KdProviders.Flink;
     while (CurrentEntry != &KdProviders)
@@ -255,17 +278,17 @@ KdpPrintString(PANSI_STRING String)
                                          KdProvidersList);
 
         /* Call it */
-        CurrentTable->KdpPrintRoutine(pch);
+        CurrentTable->KdpPrintRoutine(String, Length);
 
         /* Next Table */
         CurrentEntry = CurrentEntry->Flink;
     }
 
     /* Call the Wrapper Routine */
-    if (WrapperInitRoutine) WrapperTable.KdpPrintRoutine(pch);
+    if (WrapperInitRoutine) WrapperTable.KdpPrintRoutine(String, Length);
 
     /* Return the Length */
-    return((ULONG)String->Length);
+    return Length;
 }
 
 /* EOF */