[filedisk/grub4dos] Pend WvFilediskG4dIo_
authorShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Sat, 22 Jan 2011 12:47:51 +0000 (07:47 -0500)
committerShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Sat, 22 Jan 2011 12:47:51 +0000 (07:47 -0500)
If we attempt to perform ZwReadFile() in a thread
context where there is already a read happening
(such as when Windows' SETUPDD is attempting to
mount our disk), then we will deadlock.  So we
pend the IRP and execute it within our filedisk's
thread's context.  This probably has to do with IRQL.

src/winvblock/filedisk/grub4dos.c

index 8ff95e8..841d4cf 100644 (file)
@@ -145,6 +145,23 @@ static NTSTATUS STDCALL WvFilediskG4dIo_(
 
     /* Establish pointer to the filedisk. */
     filedisk_ptr = CONTAINING_RECORD(disk, WV_S_FILEDISK_T, disk);
+
+    /*
+     * These SCSI read/write IRPs should be completed in the thread context.
+     * Check if the IRP was already marked pending.
+     */
+    if (!(IoGetCurrentIrpStackLocation(irp)->Control & SL_PENDING_RETURNED)) {
+        /* Enqueue and signal work. */
+        IoMarkIrpPending(irp);
+        ExInterlockedInsertTailList(
+            filedisk_ptr->Irps,
+            &irp->Tail.Overlay.ListEntry,
+            filedisk_ptr->IrpsLock
+          );
+        KeSetEvent(&filedisk_ptr->Thread->Signal, 0, FALSE);
+        return STATUS_PENDING;
+      }
+
     /*
      * Find the backing disk and use it.  We walk a list
      * of unicode disk device names and check each one.