[ros-diffs] [hyperion] 33633: - Remove WINE-isms from KeDeviceQueue code - Fix memory corruption that happened pretty much everytime you pressed a key or moved the mouse -- reponsible for countless crashes, including the famous ASSERT during 1-stage setup. - Remove anti-memory-corruption-workaround from VFAT - Note: If you're going to do use device queues in your driver, please learn how. Kthxbye. Patch by Alex Ionescu <alex.ionescu at reactos.org> _____ Alex, Marry me, KJK::Hyperion XOXOXO See issue #3116 for more details.

hyperion at svn.reactos.org hyperion at svn.reactos.org
Thu May 22 13:46:47 CEST 2008


Author: hyperion
Date: Thu May 22 06:46:46 2008
New Revision: 33633

URL: http://svn.reactos.org/svn/reactos?rev=33633&view=rev
Log:
 - Remove WINE-isms from KeDeviceQueue code
 - Fix memory corruption that happened pretty much everytime you pressed a key or moved the mouse -- reponsible for countless crashes, including the famous ASSERT during 1-stage setup.
 - Remove anti-memory-corruption-workaround from VFAT
 - Note: If you're going to do use device queues in your driver, please learn how. Kthxbye.
Patch by Alex Ionescu <alex.ionescu at reactos.org>
_____

Alex,
 Marry me,
KJK::Hyperion
XOXOXO

See issue #3116 for more details.

Modified:
    trunk/reactos/drivers/filesystems/fastfat/flush.c
    trunk/reactos/drivers/filesystems/fastfat/vfat.h
    trunk/reactos/drivers/input/kbdclass/kbdclass.c
    trunk/reactos/drivers/input/mouclass/mouclass.c
    trunk/reactos/ntoskrnl/ke/devqueue.c

Modified: trunk/reactos/drivers/filesystems/fastfat/flush.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfat/flush.c?rev=33633&r1=33632&r2=33633&view=diff
==============================================================================
--- trunk/reactos/drivers/filesystems/fastfat/flush.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/filesystems/fastfat/flush.c [iso-8859-1] Thu May 22 06:46:46 2008
@@ -52,7 +52,6 @@
        ListEntry = ListEntry->Flink;
        if (!vfatFCBIsDirectory(Fcb))
          {
-             if (Fcb->PadPad51) continue; // Corrupt FCB
            ExAcquireResourceExclusiveLite(&Fcb->MainResource, TRUE);
            Status = VfatFlushFile(DeviceExt, Fcb);
            ExReleaseResourceLite (&Fcb->MainResource);

Modified: trunk/reactos/drivers/filesystems/fastfat/vfat.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfat/vfat.h?rev=33633&r1=33632&r2=33633&view=diff
==============================================================================
--- trunk/reactos/drivers/filesystems/fastfat/vfat.h [iso-8859-1] (original)
+++ trunk/reactos/drivers/filesystems/fastfat/vfat.h [iso-8859-1] Thu May 22 06:46:46 2008
@@ -322,21 +322,6 @@
 {
   /* FCB header required by ROS/NT */
   FSRTL_COMMON_FCB_HEADER RFCB;
-    ULONG PadPad;
-    ULONG PadPad2;
-    ULONG PadPad3;
-    ULONG PadPad4;
-    ULONG PadPad5;
-    ULONG PadPad50;
-    ULONG PadPad51;
-    ULONG PadPad52;
-    ULONG PadPad53;
-    ULONG PadPad54;
-    ULONG PadPad55;
-    ULONG PadPad56;
-    ULONG PadPad6;
-    ULONG PadPad7;
-    ULONG PadPad8;
   SECTION_OBJECT_POINTERS SectionObjectPointers;
   ERESOURCE MainResource;
   ERESOURCE PagingIoResource;

Modified: trunk/reactos/drivers/input/kbdclass/kbdclass.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/input/kbdclass/kbdclass.c?rev=33633&r1=33632&r2=33633&view=diff
==============================================================================
--- trunk/reactos/drivers/input/kbdclass/kbdclass.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/input/kbdclass/kbdclass.c [iso-8859-1] Thu May 22 06:46:46 2008
@@ -798,9 +798,6 @@
 		/* Go to next packet and complete this request */
 		Irp->IoStatus.Status = Status;
 
-		if (IsInStartIo)
-			IoStartNextPacket(DeviceObject, TRUE);
-
 		(VOID)IoSetCancelRoutine(Irp, NULL);
 		IoCompleteRequest(Irp, IO_KEYBOARD_INCREMENT);
 		DeviceExtension->PendingIrp = NULL;
@@ -818,8 +815,6 @@
 			IoMarkIrpPending(Irp);
 			DeviceExtension->PendingIrp = Irp;
 			Status = STATUS_PENDING;
-			if (!IsInStartIo)
-				IoStartPacket(DeviceObject, Irp, NULL, NULL);
 		}
 	}
 	return Status;

Modified: trunk/reactos/drivers/input/mouclass/mouclass.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/input/mouclass/mouclass.c?rev=33633&r1=33632&r2=33633&view=diff
==============================================================================
--- trunk/reactos/drivers/input/mouclass/mouclass.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/input/mouclass/mouclass.c [iso-8859-1] Thu May 22 06:46:46 2008
@@ -774,9 +774,6 @@
 		/* Go to next packet and complete this request */
 		Irp->IoStatus.Status = Status;
 
-		if (IsInStartIo)
-			IoStartNextPacket(DeviceObject, TRUE);
-
 		(VOID)IoSetCancelRoutine(Irp, NULL);
 		IoCompleteRequest(Irp, IO_MOUSE_INCREMENT);
 		DeviceExtension->PendingIrp = NULL;
@@ -794,8 +791,6 @@
 			IoMarkIrpPending(Irp);
 			DeviceExtension->PendingIrp = Irp;
 			Status = STATUS_PENDING;
-			if (!IsInStartIo)
-				IoStartPacket(DeviceObject, Irp, NULL, NULL);
 		}
 	}
 	return Status;

Modified: trunk/reactos/ntoskrnl/ke/devqueue.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/devqueue.c?rev=33633&r1=33632&r2=33633&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/ke/devqueue.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/ke/devqueue.c [iso-8859-1] Thu May 22 06:46:46 2008
@@ -86,6 +86,8 @@
 {
     KLOCK_QUEUE_HANDLE DeviceLock;
     BOOLEAN Inserted;
+    PLIST_ENTRY NextEntry;
+    PKDEVICE_QUEUE_ENTRY LastEntry;
     ASSERT_DEVICE_QUEUE(DeviceQueue);
 
     DPRINT("KeInsertByKeyDeviceQueue() DevQueue %p, Entry %p, SortKey 0x%x\n", DeviceQueue, DeviceQueueEntry, SortKey);
@@ -105,12 +107,34 @@
     }
     else
     {
-        /* Insert new entry after the last entry with SortKey less or equal to passed-in SortKey */
-        InsertAscendingListFIFO(&DeviceQueue->DeviceListHead,
-                                DeviceQueueEntry,
-                                KDEVICE_QUEUE_ENTRY,
-                                DeviceListEntry,
-                                SortKey);
+        /* Make sure the list isn't empty */
+        NextEntry = &DeviceQueue->DeviceListHead;
+        if (!IsListEmpty(NextEntry))
+        {
+            /* Get the last entry */
+            LastEntry = CONTAINING_RECORD(NextEntry->Blink,
+                                          KDEVICE_QUEUE_ENTRY,
+                                          DeviceListEntry);
+
+            /* Check if our sort key is lower */
+            if (SortKey < LastEntry->SortKey)
+            {
+                /* Loop each sort key */
+                do
+                {
+                    /* Get the next entry */
+                    NextEntry = NextEntry->Flink;
+                    LastEntry = CONTAINING_RECORD(NextEntry,
+                                                  KDEVICE_QUEUE_ENTRY,
+                                                  DeviceListEntry);
+
+                    /* Keep looping until we find a place to insert */
+                } while (SortKey >= LastEntry->SortKey);
+            }
+        }
+
+        /* Now insert us */
+        InsertTailList(NextEntry, &DeviceQueueEntry->DeviceListEntry);
         Inserted = TRUE;
     }
 
@@ -199,39 +223,33 @@
                                         KDEVICE_QUEUE_ENTRY,
                                         DeviceListEntry);
 
-        if (SortKey >= ReturnEntry->SortKey)
-        {
+        /* Check if we can just get the first entry */
+        if (ReturnEntry->SortKey <= SortKey)
+        {
+            /* Get the first entry */
             ReturnEntry = CONTAINING_RECORD(ListEntry->Flink,
                                             KDEVICE_QUEUE_ENTRY,
                                             DeviceListEntry);
-
-            /* Remove it from the list */
-            RemoveEntryList(&ReturnEntry->DeviceListEntry);
         }
         else
         {
-            /* Find entry with SortKey greater than or equal to the passed-in SortKey */
-            LIST_FOR_EACH(ReturnEntry, &DeviceQueue->DeviceListHead, KDEVICE_QUEUE_ENTRY, DeviceListEntry) 
+            /* Loop the list */
+            ListEntry = DeviceQueue->DeviceListHead.Flink;
+            while (TRUE)
             {
-                /* Check if keys match */
-                if (ReturnEntry->SortKey >= SortKey)
-                {
-                    /* We found it, so just remove it */
-                    RemoveEntryList(&ReturnEntry->DeviceListEntry);
-                    break;
-                }
-            }
-
-            /* Check if we found something */
-            if (!ReturnEntry)
-            {
-                /*  Not found, return the first entry */
-                ListEntry = RemoveHeadList(&DeviceQueue->DeviceListHead);
+                /* Get the next entry and check if the key is low enough */
                 ReturnEntry = CONTAINING_RECORD(ListEntry,
                                                 KDEVICE_QUEUE_ENTRY,
                                                 DeviceListEntry);
+                if (SortKey <= ReturnEntry->SortKey) break;
+
+                /* Try the next one */
+                ListEntry = ListEntry->Flink;
             }
         }
+
+        /* We have an entry, remove it now */
+        RemoveEntryList(&ReturnEntry->DeviceListEntry);
 
         /* Set it as non-inserted */
         ReturnEntry->Inserted = FALSE;



More information about the Ros-diffs mailing list