- Remove hacks for bug 4566
authorJohannes Anderwald <johannes.anderwald@reactos.org>
Fri, 21 Aug 2009 10:06:29 +0000 (10:06 +0000)
committerJohannes Anderwald <johannes.anderwald@reactos.org>
Fri, 21 Aug 2009 10:06:29 +0000 (10:06 +0000)
svn path=/trunk/; revision=42820

reactos/drivers/ksfilter/ks/deviceinterface.c
reactos/drivers/ksfilter/ks/irp.c
reactos/drivers/ksfilter/ks/priv.h
reactos/drivers/wdm/audio/backpln/portcls/adapter.c
reactos/drivers/wdm/audio/sysaudio/deviface.c

index 05546c3..e7f6cf7 100644 (file)
@@ -74,7 +74,7 @@ KspRegisterDeviceInterfaces(
         /* now register device interface */
         Status = IoRegisterDeviceInterface(PhysicalDeviceObject, 
                                            &Categories[Index],
-                                           ReferenceString, /* see damn bug 4566 */
+                                           ReferenceString,
                                            &SymEntry->SymbolicLink);
 
         if (!NT_SUCCESS(Status))
index fecd76b..22023db 100644 (file)
@@ -635,7 +635,7 @@ KsStreamIo(
 }
 
 /*
-    @unimplemented
+    @implemented
 */
 KSDDKAPI
 NTSTATUS
@@ -1781,9 +1781,10 @@ KspCreate(
     /* get device header */
     DeviceHeader = DeviceExtension->DeviceHeader;
 
-    /* hack for bug 4566 */
+
     if (IoStack->FileObject->FileName.Buffer == NULL)
     {
+        /* FIXME Pnp-Issue */
         DPRINT("Using reference string hack\n");
         Irp->IoStatus.Information = 0;
         /* set return status */
@@ -1833,116 +1834,6 @@ KspCreate(
     return STATUS_UNSUCCESSFUL;
 }
 
-NTSTATUS
-RosDeviceInterfaceReferenceStringHack(
-    IN  PDEVICE_OBJECT DeviceObject,
-    IN  PIRP Irp)
-{
-    PIO_STACK_LOCATION IoStack;
-    PKSIDEVICE_HEADER DeviceHeader;
-    PDEVICE_EXTENSION DeviceExtension;
-    PCREATE_ITEM_ENTRY CreateItemEntry;
-    PLIST_ENTRY Entry;
-    LPWSTR Buffer;
-    ULONG Length;
-
-    /* get current stack location */
-    IoStack = IoGetCurrentIrpStackLocation(Irp);
-
-    /* get device extension */
-    DeviceExtension = (PDEVICE_EXTENSION)IoStack->DeviceObject->DeviceExtension;
-    /* get device header */
-    DeviceHeader = DeviceExtension->DeviceHeader;
-
-    /* retrieve all available reference strings registered */
-    Length = 0;
-    Entry = DeviceHeader->ItemList.Flink;
-    while(Entry != &DeviceHeader->ItemList)
-    {
-        CreateItemEntry = (PCREATE_ITEM_ENTRY)CONTAINING_RECORD(Entry, CREATE_ITEM_ENTRY, Entry);
-
-        ASSERT(CreateItemEntry->CreateItem);
-        if (CreateItemEntry->CreateItem->Create && CreateItemEntry->CreateItem->ObjectClass.Buffer)
-            Length += wcslen(CreateItemEntry->CreateItem->ObjectClass.Buffer) + 1;
-
-        Entry = Entry->Flink;
-    }
-
-    /* add extra zero */
-    Length += 1;
-
-    /* allocate the buffer */
-    Buffer = ExAllocatePool(NonPagedPool, Length * sizeof(WCHAR));
-    if (!Buffer)
-    {
-        Irp->IoStatus.Information = 0;
-        Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
-        IoCompleteRequest(Irp, IO_NO_INCREMENT);
-        return STATUS_INSUFFICIENT_RESOURCES;
-    }
-
-
-    *((LPWSTR*)Irp->UserBuffer) = Buffer;
-    Irp->IoStatus.Status = STATUS_SUCCESS;
-    Irp->IoStatus.Information = sizeof(LPWSTR);
-
-    Entry = DeviceHeader->ItemList.Flink;
-    while(Entry != &DeviceHeader->ItemList)
-    {
-        CreateItemEntry = (PCREATE_ITEM_ENTRY)CONTAINING_RECORD(Entry, CREATE_ITEM_ENTRY, Entry);
-
-        ASSERT(CreateItemEntry->CreateItem);
-        if (CreateItemEntry->CreateItem->Create && CreateItemEntry->CreateItem->ObjectClass.Buffer)
-        {
-            wcscpy(Buffer, CreateItemEntry->CreateItem->ObjectClass.Buffer);
-            Buffer += wcslen(Buffer) + 1;
-        }
-        Entry = Entry->Flink;
-    }
-
-
-
-    *Buffer = L'\0';
-    IoCompleteRequest(Irp, IO_NO_INCREMENT);
-    return STATUS_SUCCESS;
-
-}
-
-NTSTATUS
-NTAPI
-KspDeviceControl(
-    IN  PDEVICE_OBJECT DeviceObject,
-    IN  PIRP Irp)
-{
-    PIO_STACK_LOCATION IoStack;
-    PKSIOBJECT_HEADER ObjectHeader;
-    PKSIDEVICE_HEADER DeviceHeader;
-    PDEVICE_EXTENSION DeviceExtension;
-
-
-
-    /* get current stack location */
-    IoStack = IoGetCurrentIrpStackLocation(Irp);
-
-    /* get device extension */
-    DeviceExtension = (PDEVICE_EXTENSION)IoStack->DeviceObject->DeviceExtension;
-    /* get device header */
-    DeviceHeader = DeviceExtension->DeviceHeader;
-
-    if (IoStack->MajorFunction == IRP_MJ_DEVICE_CONTROL && IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_OBJECT_CLASS)
-    {
-        /* hack for bug 4566 */
-        return RosDeviceInterfaceReferenceStringHack(DeviceObject, Irp);
-    }
-
-    ObjectHeader = (PKSIOBJECT_HEADER) IoStack->FileObject->FsContext;
-
-    ASSERT(ObjectHeader);
-    //KSCREATE_ITEM_IRP_STORAGE(Irp) = ObjectHeader->CreateItem;
-
-    return ObjectHeader->DispatchTable.DeviceIoControl(DeviceObject, Irp);
-}
-
 NTSTATUS
 NTAPI
 KspDispatchIrp(
@@ -1969,7 +1860,7 @@ KspDispatchIrp(
 
     if (!ObjectHeader)
     {
-        /* hack for bug 4566 */
+        /* FIXME Pnp-Issue*/
         Irp->IoStatus.Status = STATUS_SUCCESS;
         Irp->IoStatus.Information = 0;
         /* complete and forget */
@@ -2045,8 +1936,6 @@ KsSetMajorFunctionHandler(
             break;
             break;
         case IRP_MJ_DEVICE_CONTROL:
-            DriverObject->MajorFunction[MajorFunction] = KspDeviceControl;
-            break;
         case IRP_MJ_CLOSE:
         case IRP_MJ_READ:
         case IRP_MJ_WRITE:
@@ -2102,12 +1991,6 @@ KsDispatchIrp(
             }
         }
 
-        if (IoStack->MajorFunction == IRP_MJ_DEVICE_CONTROL)
-        {
-            /* handle device requests */
-            return KspDeviceControl(DeviceObject, Irp);
-        }
-
         switch (IoStack->MajorFunction)
         {
             case IRP_MJ_CLOSE:
@@ -2117,6 +2000,7 @@ KsDispatchIrp(
             case IRP_MJ_QUERY_SECURITY:
             case IRP_MJ_SET_SECURITY:
             case IRP_MJ_PNP:
+            case IRP_MJ_DEVICE_CONTROL:
                 return KspDispatchIrp(DeviceObject, Irp);
             default:
                 return KsDispatchInvalidDeviceRequest(DeviceObject, Irp);
index 3ee1033..a068ffd 100644 (file)
@@ -20,9 +20,6 @@
 
 #define TAG_DEVICE_HEADER TAG('H','D','S','K')
 
-#define IOCTL_KS_OBJECT_CLASS CTL_CODE(FILE_DEVICE_KS, 0x7, METHOD_NEITHER, FILE_ANY_ACCESS)
-
-
 #define DEFINE_KSPROPERTY_PINPROPOSEDATAFORMAT(PinSet,\
     PropGeneral, PropInstances, PropIntersection)\
 DEFINE_KSPROPERTY_TABLE(PinSet) {\
index dbb319e..50ef850 100644 (file)
@@ -312,8 +312,9 @@ PcRegisterSubdevice(
          */
         Status = IoRegisterDeviceInterface(DeviceExt->PhysicalDeviceObject,
                                            &SubDeviceDescriptor->Interfaces[Index],
-                                           NULL, //&RefName,
+                                           &RefName,
                                            &SymbolicLinkName);
+
         if (NT_SUCCESS(Status))
         {
             /* activate device interface */
index cee9acb..bc35a46 100644 (file)
@@ -14,8 +14,6 @@ const GUID KS_CATEGORY_AUDIO                   = {0x6994AD04L, 0x93EF, 0x11D0, {
 const GUID KS_CATEGORY_TOPOLOGY                = {0xDDA54A40, 0x1E4C, 0x11D1, {0xA0, 0x50, 0x40, 0x57, 0x05, 0xC1, 0x00, 0x00}};
 const GUID DMOCATEGORY_ACOUSTIC_ECHO_CANCEL    = {0xBF963D80L, 0xC559, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
 
-#define IOCTL_KS_OBJECT_CLASS CTL_CODE(FILE_DEVICE_KS, 0x7, METHOD_NEITHER, FILE_ANY_ACCESS)
-
 NTSTATUS
 BuildPinDescriptor(
     IN PKSAUDIO_DEVICE_ENTRY DeviceEntry,
@@ -198,14 +196,15 @@ OpenDevice(
 NTSTATUS
 InsertAudioDevice(
     IN PDEVICE_OBJECT DeviceObject,
-    IN PUNICODE_STRING DeviceName,
-    IN LPWSTR ReferenceString)
+    IN PUNICODE_STRING DeviceName)
 {
     NTSTATUS Status = STATUS_SUCCESS;
     PFILTER_WORKER_CONTEXT Ctx = NULL;
     PIO_WORKITEM WorkItem = NULL;
     PSYSAUDIODEVEXT DeviceExtension;
     PKSAUDIO_DEVICE_ENTRY DeviceEntry = NULL;
+    PDEVICE_OBJECT AudioDeviceObject;
+    UNICODE_STRING ReferenceString, SymbolicLinkName;
 
     /* a new device has arrived */
     DeviceEntry = ExAllocatePool(NonPagedPool, sizeof(KSAUDIO_DEVICE_ENTRY));
@@ -240,12 +239,6 @@ InsertAudioDevice(
     DeviceEntry->DeviceName.Length = 0;
     DeviceEntry->DeviceName.MaximumLength = DeviceName->MaximumLength + 10 * sizeof(WCHAR);
 
-    /* hack for bug 4566 */
-    if (ReferenceString)
-    {
-        DeviceEntry->DeviceName.MaximumLength += (wcslen(ReferenceString) + 2) * sizeof(WCHAR);
-    }
-
     DeviceEntry->DeviceName.Buffer = ExAllocatePool(NonPagedPool, DeviceEntry->DeviceName.MaximumLength);
 
     if (!DeviceEntry->DeviceName.Buffer)
@@ -257,12 +250,6 @@ InsertAudioDevice(
     RtlAppendUnicodeToString(&DeviceEntry->DeviceName, L"\\??\\");
     RtlAppendUnicodeStringToString(&DeviceEntry->DeviceName, DeviceName);
 
-    if (ReferenceString)
-    {
-        RtlAppendUnicodeToString(&DeviceEntry->DeviceName, L"\\");
-        RtlAppendUnicodeToString(&DeviceEntry->DeviceName, ReferenceString);
-    }
-
     Status = OpenDevice(&DeviceEntry->DeviceName, &DeviceEntry->Handle, &DeviceEntry->FileObject);
 
      if (!NT_SUCCESS(Status))
@@ -273,6 +260,24 @@ InsertAudioDevice(
     Ctx->DeviceEntry = DeviceEntry;
     Ctx->WorkItem = WorkItem;
 
+    /* HACK
+     * sysaudio should register the device object for itself 
+     */
+    AudioDeviceObject = IoGetRelatedDeviceObject(DeviceEntry->FileObject);
+    RtlInitUnicodeString(&ReferenceString, L"sad0");
+    Status = IoRegisterDeviceInterface(AudioDeviceObject, &KSCATEGORY_AUDIO_DEVICE, &ReferenceString, &SymbolicLinkName);
+    if (NT_SUCCESS(Status))
+    {
+        IoSetDeviceInterfaceState(&SymbolicLinkName, TRUE);
+        RtlFreeUnicodeString(&SymbolicLinkName);
+    }
+    else
+       {
+               DPRINT1("Failed to open %wZ with Status %x\n", &DeviceEntry->DeviceName, Status);
+       DbgBreakPoint();
+
+       }
+
     /* fetch device extension */
     DeviceExtension = (PSYSAUDIODEVEXT)DeviceObject->DeviceExtension;
     /* insert new audio device */
@@ -312,13 +317,6 @@ DeviceInterfaceChangeCallback(
     DEVICE_INTERFACE_CHANGE_NOTIFICATION * Event;
     NTSTATUS Status = STATUS_SUCCESS;
     PSYSAUDIODEVEXT DeviceExtension;
-    UNICODE_STRING DeviceName;
-    HANDLE Handle;
-    PFILE_OBJECT FileObject;
-    LPWSTR ReferenceString;
-    ULONG BytesReturned;
-
-
     PDEVICE_OBJECT DeviceObject = (PDEVICE_OBJECT)Context;
 
     DeviceExtension = (PSYSAUDIODEVEXT)DeviceObject->DeviceExtension;
@@ -328,54 +326,7 @@ DeviceInterfaceChangeCallback(
     if (IsEqualGUIDAligned(&Event->Event,
                            &GUID_DEVICE_INTERFACE_ARRIVAL))
     {
-        /*<HACK>
-         * 1) Open the filter w/o reference string
-         * 2) Retrieve reference strings with our private IOCTL_KS_OBJECT_CLASS
-         * 3) Append these reference strings to symbolic link we got
-         * * see bug 4566
-         */
-
-        DeviceName.Length = 0;
-        DeviceName.MaximumLength = Event->SymbolicLinkName->Length + 10 * sizeof(WCHAR);
-
-        DeviceName.Buffer = ExAllocatePool(NonPagedPool, DeviceName.MaximumLength);
-
-        if (!DeviceName.Buffer)
-        {
-            return STATUS_INSUFFICIENT_RESOURCES;
-        }
-
-       RtlAppendUnicodeToString(&DeviceName, L"\\??\\");
-       RtlAppendUnicodeStringToString(&DeviceName, Event->SymbolicLinkName);
-
-
-        Status = OpenDevice(&DeviceName, &Handle, &FileObject);
-        if (!NT_SUCCESS(Status))
-        {
-            ExFreePool(DeviceName.Buffer);
-            return Status;
-        }
-
-        Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_OBJECT_CLASS, NULL, 0, &ReferenceString, sizeof(LPWSTR), &BytesReturned);
-        if (!NT_SUCCESS(Status))
-        {
-            DPRINT1("failed Status %x\n", Status);
-
-            ExFreePool(DeviceName.Buffer);
-            ObDereferenceObject(FileObject);
-            ZwClose(Handle);
-            return Status;
-       }
-
-        while(*ReferenceString)
-        {
-            Status = InsertAudioDevice(DeviceObject, Event->SymbolicLinkName, ReferenceString);
-            ReferenceString += wcslen(ReferenceString) + 1;
-        }
-        //ExFreePool(ReferenceString);
-        ObDereferenceObject(FileObject);
-        ZwClose(Handle);
-        ExFreePool(DeviceName.Buffer);
+        Status = InsertAudioDevice(DeviceObject, Event->SymbolicLinkName);
         return Status;
     }
     else