Restart worker if it failed to send the log messages.
authorEric Kohl <eric.kohl@reactos.org>
Fri, 21 Nov 2003 22:28:50 +0000 (22:28 +0000)
committerEric Kohl <eric.kohl@reactos.org>
Fri, 21 Nov 2003 22:28:50 +0000 (22:28 +0000)
Add driver or device name to the log message.
Silence debug messages.

svn path=/trunk/; revision=6743

reactos/ntoskrnl/io/errlog.c

index 1d6e087..d460325 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: errlog.c,v 1.14 2003/11/20 11:08:52 ekohl Exp $
+/* $Id: errlog.c,v 1.15 2003/11/21 22:28:50 ekohl Exp $
  *
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS kernel
  *
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS kernel
@@ -15,7 +15,7 @@
 
 #include <internal/port.h>
 
 
 #include <internal/port.h>
 
-//#define NDEBUG
+#define NDEBUG
 #include <internal/debug.h>
 
 /* TYPES *********************************************************************/
 #include <internal/debug.h>
 
 /* TYPES *********************************************************************/
@@ -24,6 +24,7 @@ typedef struct _ERROR_LOG_ENTRY
 {
   LIST_ENTRY Entry;
   LARGE_INTEGER TimeStamp;
 {
   LIST_ENTRY Entry;
   LARGE_INTEGER TimeStamp;
+  PVOID IoObject;
   ULONG PacketSize;
 } ERROR_LOG_ENTRY, *PERROR_LOG_ENTRY;
 
   ULONG PacketSize;
 } ERROR_LOG_ENTRY, *PERROR_LOG_ENTRY;
 
@@ -74,12 +75,12 @@ IopLogDpcRoutine (PKDPC Dpc,
 {
   PWORK_QUEUE_ITEM LogWorkItem;
 
 {
   PWORK_QUEUE_ITEM LogWorkItem;
 
-  DPRINT1 ("\nIopLogDpcRoutine() called\n");
+  DPRINT ("\nIopLogDpcRoutine() called\n");
 
   /* Release the WorkerDpc struct */
   ExFreePool (DeferredContext);
 
 
   /* Release the WorkerDpc struct */
   ExFreePool (DeferredContext);
 
-  /* Allocate, initialize and reissue a work item */
+  /* Allocate, initialize and restart a work item */
   LogWorkItem = ExAllocatePool (NonPagedPool,
                                sizeof(WORK_QUEUE_ITEM));
   if (LogWorkItem == NULL)
   LogWorkItem = ExAllocatePool (NonPagedPool,
                                sizeof(WORK_QUEUE_ITEM));
   if (LogWorkItem == NULL)
@@ -103,7 +104,7 @@ IopRestartLogWorker (VOID)
   PLOG_WORKER_DPC WorkerDpc;
   LARGE_INTEGER Timeout;
 
   PLOG_WORKER_DPC WorkerDpc;
   LARGE_INTEGER Timeout;
 
-  DPRINT1 ("IopRestartWorker() called\n");
+  DPRINT ("IopRestartWorker() called\n");
 
   WorkerDpc = ExAllocatePool (NonPagedPool,
                              sizeof(LOG_WORKER_DPC));
 
   WorkerDpc = ExAllocatePool (NonPagedPool,
                              sizeof(LOG_WORKER_DPC));
@@ -132,9 +133,8 @@ IopConnectLogPort (VOID)
 {
   UNICODE_STRING PortName;
   NTSTATUS Status;
 {
   UNICODE_STRING PortName;
   NTSTATUS Status;
-  ULONG MaxMessageSize;
 
 
-  DPRINT1 ("IopConnectLogPort() called\n");
+  DPRINT ("IopConnectLogPort() called\n");
 
   RtlInitUnicodeString (&PortName,
                        L"\\ErrorLogPort");
 
   RtlInitUnicodeString (&PortName,
                        L"\\ErrorLogPort");
@@ -144,19 +144,16 @@ IopConnectLogPort (VOID)
                          NULL,
                          NULL,
                          NULL,
                          NULL,
                          NULL,
                          NULL,
-                         &MaxMessageSize, //NULL,
+                         NULL,
                          NULL,
                          NULL);
                          NULL,
                          NULL);
-  DPRINT1 ("NtConnectPort() (Status %lx)\n", Status);
   if (!NT_SUCCESS(Status))
     {
   if (!NT_SUCCESS(Status))
     {
-      DPRINT1 ("NtConnectPort() failed (Status %lx)\n", Status);
+      DPRINT ("NtConnectPort() failed (Status %lx)\n", Status);
       return FALSE;
     }
 
       return FALSE;
     }
 
-  DPRINT1 ("Maximum message size %lu\n", MaxMessageSize);
-
-  DPRINT1 ("IopConnectLogPort() done\n");
+  DPRINT ("IopConnectLogPort() done\n");
 
   return TRUE;
 }
 
   return TRUE;
 }
@@ -172,7 +169,13 @@ IopLogWorker (PVOID Parameter)
   KIRQL Irql;
   NTSTATUS Status;
 
   KIRQL Irql;
   NTSTATUS Status;
 
-  DPRINT1 ("IopLogWorker() called\n");
+  UCHAR Buffer[256];
+  POBJECT_NAME_INFORMATION ObjectNameInfo;
+  ULONG ReturnedLength;
+  PWCHAR DriverName;
+  ULONG DriverNameLength;
+
+  DPRINT ("IopLogWorker() called\n");
 
   /* Release the work item */
   ExFreePool (Parameter);
 
   /* Release the work item */
   ExFreePool (Parameter);
@@ -183,12 +186,10 @@ IopLogWorker (PVOID Parameter)
     {
       if (IopConnectLogPort () == FALSE)
        {
     {
       if (IopConnectLogPort () == FALSE)
        {
-CHECKPOINT1;
          IopRestartLogWorker ();
          return;
        }
 
          IopRestartLogWorker ();
          return;
        }
 
-CHECKPOINT1;
       IopLogPortConnected = TRUE;
     }
 
       IopLogPortConnected = TRUE;
     }
 
@@ -215,21 +216,54 @@ CHECKPOINT1;
 
       if (LogEntry == NULL)
        {
 
       if (LogEntry == NULL)
        {
-         DPRINT1 ("No message in log list\n");
+         DPRINT ("No message in log list\n");
          break;
        }
 
       /* Get pointer to the log packet */
       Packet = (PIO_ERROR_LOG_PACKET)((ULONG_PTR)LogEntry + sizeof(ERROR_LOG_ENTRY));
 
          break;
        }
 
       /* Get pointer to the log packet */
       Packet = (PIO_ERROR_LOG_PACKET)((ULONG_PTR)LogEntry + sizeof(ERROR_LOG_ENTRY));
 
+
+      /* Get driver or device name */
+      ObjectNameInfo = (POBJECT_NAME_INFORMATION)Buffer;
+      Status = ObQueryNameString (LogEntry->IoObject,
+                                 ObjectNameInfo,
+                                 256,
+                                 &ReturnedLength);
+      if (NT_SUCCESS(Status))
+       {
+         DPRINT ("ReturnedLength: %lu\n", ReturnedLength);
+         DPRINT ("Length: %hu\n", ObjectNameInfo->Name.Length);
+         DPRINT ("MaximumLength: %hu\n", ObjectNameInfo->Name.MaximumLength);
+         DPRINT ("Object: %wZ\n", &ObjectNameInfo->Name);
+
+         DriverName = wcsrchr(ObjectNameInfo->Name.Buffer, L'\\');
+         if (DriverName != NULL)
+           DriverName++;
+         else
+           DriverName = ObjectNameInfo->Name.Buffer;
+
+         DriverNameLength = wcslen (DriverName) * sizeof(WCHAR);
+         DPRINT ("Driver name '%S'\n", DriverName);
+       }
+      else
+       {
+         DriverName = NULL;
+         DriverNameLength = 0;
+       }
+
       /* Allocate request buffer */
       Request = ExAllocatePool (NonPagedPool,
                                sizeof(LPC_MAX_MESSAGE));
       if (Request == NULL)
        {
       /* Allocate request buffer */
       Request = ExAllocatePool (NonPagedPool,
                                sizeof(LPC_MAX_MESSAGE));
       if (Request == NULL)
        {
-         DPRINT1("Failed to allocate request buffer!\n");
+         DPRINT ("Failed to allocate request buffer!\n");
 
 
-         /* FIXME: Requeue log message and restart the worker */
+         /* Requeue log message and restart the worker */
+         ExInterlockedInsertTailList (&IopLogListHead,
+                                      &LogEntry->Entry,
+                                      &IopLogListLock);
+         IopRestartLogWorker ();
 
          return;
        }
 
          return;
        }
@@ -238,16 +272,23 @@ CHECKPOINT1;
       Message = (PIO_ERROR_LOG_MESSAGE)Request->Data;
       Message->Type = 0xC; //IO_TYPE_ERROR_MESSAGE;
       Message->Size =
       Message = (PIO_ERROR_LOG_MESSAGE)Request->Data;
       Message->Type = 0xC; //IO_TYPE_ERROR_MESSAGE;
       Message->Size =
-       sizeof(IO_ERROR_LOG_MESSAGE) - sizeof(IO_ERROR_LOG_PACKET) + LogEntry->PacketSize;
-      Message->DriverNameLength = 0; /* FIXME */
+       sizeof(IO_ERROR_LOG_MESSAGE) - sizeof(IO_ERROR_LOG_PACKET) +
+       LogEntry->PacketSize + DriverNameLength;
+      Message->DriverNameLength = DriverNameLength;
       Message->TimeStamp.QuadPart = LogEntry->TimeStamp.QuadPart;
       Message->TimeStamp.QuadPart = LogEntry->TimeStamp.QuadPart;
-      Message->DriverNameOffset = 0;  /* FIXME */
+      Message->DriverNameOffset = (DriverName != NULL) ? LogEntry->PacketSize : 0;
 
 
+      /* Copy error log packet */
       RtlCopyMemory (&Message->EntryData,
                     Packet,
                     LogEntry->PacketSize);
 
       RtlCopyMemory (&Message->EntryData,
                     Packet,
                     LogEntry->PacketSize);
 
-  DPRINT1 ("SequenceNumber %lx\n", Packet->SequenceNumber);
+      /* Copy driver or device name */
+      RtlCopyMemory ((PVOID)((ULONG_PTR)Message + Message->DriverNameOffset),
+                    DriverName,
+                    DriverNameLength);
+
+      DPRINT ("SequenceNumber %lx\n", Packet->SequenceNumber);
 
       Request->Header.DataSize = Message->Size;
       Request->Header.MessageSize =
 
       Request->Header.DataSize = Message->Size;
       Request->Header.MessageSize =
@@ -262,9 +303,13 @@ CHECKPOINT1;
 
       if (!NT_SUCCESS(Status))
        {
 
       if (!NT_SUCCESS(Status))
        {
-         DPRINT1 ("NtRequestPort() failed (Status %lx)\n", Status);
+         DPRINT ("NtRequestPort() failed (Status %lx)\n", Status);
 
 
-         /* FIXME: Requeue log message and restart the worker */
+         /* Requeue log message and restart the worker */
+         ExInterlockedInsertTailList (&IopLogListHead,
+                                      &LogEntry->Entry,
+                                      &IopLogListLock);
+         IopRestartLogWorker ();
 
          return;
        }
 
          return;
        }
@@ -282,7 +327,7 @@ CHECKPOINT1;
 
   IopLogWorkerRunning = FALSE;
 
 
   IopLogWorkerRunning = FALSE;
 
-  DPRINT1 ("IopLogWorker() done\n");
+  DPRINT ("IopLogWorker() done\n");
 }
 
 
 }
 
 
@@ -324,6 +369,7 @@ IoAllocateErrorLogEntry (IN PVOID IoObject,
 
   IopTotalLogSize += EntrySize;
 
 
   IopTotalLogSize += EntrySize;
 
+  LogEntry->IoObject = IoObject;
   LogEntry->PacketSize = LogEntrySize;
 
   KeReleaseSpinLock (&IopAllocationLock,
   LogEntry->PacketSize = LogEntrySize;
 
   KeReleaseSpinLock (&IopAllocationLock,
@@ -343,7 +389,7 @@ IoWriteErrorLogEntry (IN PVOID ElEntry)
   PERROR_LOG_ENTRY LogEntry;
   KIRQL Irql;
 
   PERROR_LOG_ENTRY LogEntry;
   KIRQL Irql;
 
-  DPRINT1 ("IoWriteErrorLogEntry() called\n");
+  DPRINT ("IoWriteErrorLogEntry() called\n");
 
   LogEntry = (PERROR_LOG_ENTRY)((ULONG_PTR)ElEntry - sizeof(ERROR_LOG_ENTRY));
 
 
   LogEntry = (PERROR_LOG_ENTRY)((ULONG_PTR)ElEntry - sizeof(ERROR_LOG_ENTRY));
 
@@ -376,7 +422,7 @@ IoWriteErrorLogEntry (IN PVOID ElEntry)
   KeReleaseSpinLock (&IopLogListLock,
                     Irql);
 
   KeReleaseSpinLock (&IopLogListLock,
                     Irql);
 
-  DPRINT1 ("IoWriteErrorLogEntry() done\n");
+  DPRINT ("IoWriteErrorLogEntry() done\n");
 }
 
 /* EOF */
 }
 
 /* EOF */