[NTOS:KE/x64] Handle NMI vs swapgs race condition
[reactos.git] / drivers / usb / usbccgp / pdo.c
index 9ce5506..da73ed1 100644 (file)
 
 #include "usbccgp.h"
 
+#include <ntddk.h>
+
+#define NDEBUG
+#include <debug.h>
+
 NTSTATUS
 USBCCGP_PdoHandleQueryDeviceText(
     IN PDEVICE_OBJECT DeviceObject,
     IN OUT PIRP Irp)
 {
+    PIO_STACK_LOCATION IoStack;
     LPWSTR Buffer;
     PPDO_DEVICE_EXTENSION PDODeviceExtension;
     LPWSTR GenericString = L"Composite USB Device";
+
+    //
+    // get current irp stack location
+    //
+    IoStack = IoGetCurrentIrpStackLocation(Irp);
+
     //
     // get device extension
     //
     PDODeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
 
+    //
+    // check if type is description
+    //
+    if (IoStack->Parameters.QueryDeviceText.DeviceTextType != DeviceTextDescription)
+    {
+        //
+        // we only handle description
+        //
+        return Irp->IoStatus.Status;
+    }
+
     //
     // is there a device description
     //
@@ -52,7 +75,7 @@ USBCCGP_PdoHandleQueryDeviceText(
     //
     // FIXME use GenericCompositeUSBDeviceString
     //
-    UNIMPLEMENTED
+    UNIMPLEMENTED;
     Buffer = AllocateItem(PagedPool, (wcslen(GenericString) + 1) * sizeof(WCHAR));
     if (!Buffer)
     {
@@ -208,7 +231,15 @@ USBCCGP_PdoHandleQueryId(
         //
         // handle query device id
         //
-        Status = USBCCGP_SyncForwardIrp(PDODeviceExtension->NextDeviceObject, Irp);
+        if (IoForwardIrpSynchronously(PDODeviceExtension->NextDeviceObject, Irp))
+        {
+            Status = Irp->IoStatus.Status;
+        }
+        else
+        {
+            Status = STATUS_UNSUCCESSFUL;
+        }
+
         if (NT_SUCCESS(Status))
         {
             //
@@ -713,6 +744,14 @@ USBCCGP_PDOSelectConfiguration(
         return STATUS_SUCCESS;
     }
 
+    //
+    // if there is no configuration descriptor, unconfigure the device
+    //
+    if (Urb->UrbSelectConfiguration.ConfigurationDescriptor == NULL)
+    {
+        return STATUS_SUCCESS;
+    }
+
     // sanity checks
     //C_ASSERT(sizeof(struct _URB_HEADER) == 16);
     //C_ASSERT(FIELD_OFFSET(struct _URB_SELECT_CONFIGURATION, Interface.Length) == 24);
@@ -752,7 +791,6 @@ USBCCGP_PDOSelectConfiguration(
             // invalid parameter
             //
             DPRINT1("InterfaceInformation InterfaceNumber %x Alternative %x NumberOfPipes %x not found\n", InterfaceInformation->InterfaceNumber, InterfaceInformation->AlternateSetting, InterfaceInformation->NumberOfPipes);
-            ASSERT(FALSE);
             return STATUS_INVALID_PARAMETER;
         }
 
@@ -1058,6 +1096,30 @@ PDO_HandleInternalDeviceControl(
     return STATUS_NOT_IMPLEMENTED;
 }
 
+NTSTATUS
+PDO_HandlePower(
+    PDEVICE_OBJECT DeviceObject,
+    PIRP Irp)
+{
+    NTSTATUS Status;
+    PIO_STACK_LOCATION IoStack;
+
+    IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+    switch (IoStack->MinorFunction)
+    {
+        case IRP_MN_SET_POWER:
+        case IRP_MN_QUERY_POWER:
+            Irp->IoStatus.Status = STATUS_SUCCESS;
+            break;
+    }
+
+    Status = Irp->IoStatus.Status;
+    PoStartNextPowerIrp(Irp);
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+    return Status;
+}
+
 
 NTSTATUS
 PDO_Dispatch(
@@ -1077,10 +1139,7 @@ PDO_Dispatch(
         case IRP_MJ_INTERNAL_DEVICE_CONTROL:
             return PDO_HandleInternalDeviceControl(DeviceObject, Irp);
         case IRP_MJ_POWER:
-            PoStartNextPowerIrp(Irp);
-            Irp->IoStatus.Status = STATUS_SUCCESS;
-            IoCompleteRequest(Irp, IO_NO_INCREMENT);
-            return STATUS_SUCCESS;
+            return PDO_HandlePower(DeviceObject, Irp);
         default:
             DPRINT1("PDO_Dispatch Function %x not implemented\n", IoStack->MajorFunction);
             Status = Irp->IoStatus.Status;