[ros-diffs] [janderwald] 38762: - Implement PcForwardIrpSynchronous

janderwald at svn.reactos.org janderwald at svn.reactos.org
Wed Jan 14 18:14:21 CET 2009


Author: janderwald
Date: Wed Jan 14 11:14:20 2009
New Revision: 38762

URL: http://svn.reactos.org/svn/reactos?rev=38762&view=rev
Log:
- Implement PcForwardIrpSynchronous

Modified:
    trunk/reactos/drivers/wdm/audio/backpln/portcls/irp.c

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/irp.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/irp.c?rev=38762&r1=38761&r2=38762&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/irp.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/irp.c [iso-8859-1] Wed Jan 14 11:14:20 2009
@@ -119,7 +119,7 @@
         if ( ! NT_SUCCESS(status) )
         {
             DPRINT("StartDevice returned a failure code [0x%8x]\n", status);
-            resource_list->lpVtbl->Release(resource_list);
+            //resource_list->lpVtbl->Release(resource_list);
 
             Irp->IoStatus.Status = status;
             IoCompleteRequest(Irp, IO_NO_INCREMENT);
@@ -261,14 +261,50 @@
     return STATUS_UNSUCCESSFUL;
 }
 
-/*
- * @unimplemented
+static
+NTSTATUS
+NTAPI
+IrpCompletionRoutine(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp,
+    IN PVOID Context)
+{
+    KeSetEvent((PRKEVENT)Context, IO_NO_INCREMENT, FALSE);
+    return STATUS_SUCCESS;
+}
+
+
+/*
+ * @implemented
  */
 NTSTATUS NTAPI
 PcForwardIrpSynchronous(
     IN  PDEVICE_OBJECT DeviceObject,
     IN  PIRP Irp)
 {
-    UNIMPLEMENTED;
-    return STATUS_UNSUCCESSFUL;
-}
+    KEVENT Event;
+    PCExtension* DeviceExt;
+    NTSTATUS Status;
+
+    DPRINT1("PcRegisterSubdevice\n");
+
+    DeviceExt = (PCExtension*)DeviceObject->DeviceExtension;
+
+    /* initialize the notification event */
+    KeInitializeEvent(&Event, NotificationEvent, FALSE);
+
+    /* setup a completion routine */
+    IoSetCompletionRoutine(Irp, IrpCompletionRoutine, (PVOID)&Event, TRUE, FALSE, FALSE);
+
+    /* now call the driver */
+    Status = IoCallDriver(DeviceExt->PrevDeviceObject, Irp);
+    /* did the request complete yet */
+    if (Status == STATUS_PENDING)
+    {
+        /* not yet, lets wait a bit */
+        KeWaitForSingleObject(&Event, Executive, FALSE, FALSE, NULL);
+        Status = STATUS_SUCCESS;
+    }
+
+    return Status;
+}



More information about the Ros-diffs mailing list