[MMSYS]
authorJohannes Anderwald <johannes.anderwald@reactos.org>
Sat, 14 Mar 2015 11:12:32 +0000 (11:12 +0000)
committerJohannes Anderwald <johannes.anderwald@reactos.org>
Sat, 14 Mar 2015 11:12:32 +0000 (11:12 +0000)
- hardware ids must be terminated by 2 zero bytes
[KS]
- more fixes to software bus pnp enumerator
[MMIXER]
- dont assert on buggy topology lines
[NTOS]
- keys must be REG_OPTION_VOLATILE
- allocate file object with correct tag
[INF]
- register wdmaudio as pnp software device (not yet ready)

svn path=/trunk/; revision=66684

reactos/dll/cpl/mmsys/mmsys.c
reactos/drivers/ksfilter/ks/swenum.c
reactos/drivers/ksfilter/swenum/swenum.c
reactos/lib/drivers/sound/mmixer/controls.c
reactos/media/inf/wdmaudio.inf
reactos/ntoskrnl/io/iomgr/deviface.c
reactos/ntoskrnl/ob/oblink.c

index b1d850a..e8d37fb 100644 (file)
@@ -544,7 +544,7 @@ MMSYS_InstallDevice(HDEVINFO hDevInfo, PSP_DEVINFO_DATA pspDevInfoData)
         }
 
         wcscpy(pBuffer, L"inf\\machine.inf");
-        InstallSoftwareBusPnpEnumerator(szBuffer, L"ROOT\\SWENUM");
+        InstallSoftwareBusPnpEnumerator(szBuffer, L"ROOT\\SWENUM\0");
     }
 
     hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
index 0c18ba9..7310d7a 100644 (file)
@@ -98,7 +98,7 @@ KspRegisterDeviceAssociation(
     RtlInitUnicodeString(&ReferenceString, DeviceEntry->DeviceName);
 
     /* register device interface */
-    Status = IoRegisterDeviceInterface(BusDeviceExtension->PhysicalDeviceObject, &DeviceEntry->DeviceGuid, NULL, &BusInstanceEntry->SymbolicLink);
+    Status = IoRegisterDeviceInterface(BusDeviceExtension->PhysicalDeviceObject, &BusInstanceEntry->InterfaceGuid, &ReferenceString, &BusInstanceEntry->SymbolicLink);
 
     /* check for success */
     if (!NT_SUCCESS(Status))
@@ -255,8 +255,8 @@ KspCreateDeviceAssociation(
     IN PHANDLE hKey,
     IN PBUS_ENUM_DEVICE_EXTENSION BusDeviceExtension,
     IN PBUS_DEVICE_ENTRY DeviceEntry,
-    IN LPWSTR ReferenceString,
-    IN LPWSTR InterfaceString)
+    IN LPWSTR InterfaceString,
+    IN LPWSTR ReferenceString)
 {
     GUID InterfaceGUID;
     NTSTATUS Status;
@@ -699,8 +699,8 @@ KspDoReparseForIrp(
 
     /* construct buffer */
     swprintf(Buffer, L"%s\\%s", DeviceEntry->PDODeviceName, DeviceEntry->Instance);
-
-    ExFreePool(IoStack->FileObject->FileName.Buffer);
+    // HACK
+    //ExFreePool(IoStack->FileObject->FileName.Buffer);
 
     /* store new file name */
     RtlInitUnicodeString(&IoStack->FileObject->FileName, Buffer);
@@ -906,7 +906,7 @@ KspQueryId(
         ASSERT(DeviceEntry->Instance);
 
         /* calculate length */
-        Length = wcslen(DeviceEntry->Instance) + 1;
+        Length = wcslen(DeviceEntry->Instance) + 2;
 
         /* allocate buffer */
         Name = AllocateItem(PagedPool, Length * sizeof(WCHAR));
@@ -945,11 +945,11 @@ KspQueryId(
         Length = wcslen(BusDeviceExtension->BusIdentifier);
         Length += wcslen(DeviceEntry->BusId);
 
-        /* extra length for '\\' and zero byte */
-        Length += 2;
+        /* extra length for '\\' and 2 zero bytes */
+        Length += 4;
 
         /* allocate buffer */
-        Name = ExAllocatePool(PagedPool, Length * sizeof(WCHAR));
+        Name = AllocateItem(PagedPool, Length * sizeof(WCHAR));
         if (!Name)
         {
             /* failed to allocate buffer */
@@ -957,7 +957,10 @@ KspQueryId(
         }
 
         /* construct id */
-        swprintf(Name, L"%s\\%s", BusDeviceExtension->BusIdentifier, DeviceEntry->BusId);
+        wcscpy(Name, BusDeviceExtension->BusIdentifier);
+        wcscat(Name, L"\\");
+        wcscat(Name, DeviceEntry->BusId);
+        //swprintf(Name, L"%s\\%s", BusDeviceExtension->BusIdentifier, DeviceEntry->BusId);
 
         /* store result */
         Irp->IoStatus.Information = (ULONG_PTR)Name;
@@ -1205,7 +1208,7 @@ KspBusWorkerRoutine(
 
                 if (Diff.QuadPart > Int32x32To64(15000, 10000))
                 {
-                     DPRINT1("DeviceID %S  Instance %S TimeCreated %I64u Now %I64u Diff %I64u hung\n", DeviceEntry->DeviceName, DeviceEntry->Instance, DeviceEntry->TimeCreated.QuadPart, Time.QuadPart, Diff.QuadPart);
+                     //DPRINT1("DeviceID %S  Instance %S TimeCreated %I64u Now %I64u Diff %I64u hung\n", DeviceEntry->DeviceName, DeviceEntry->Instance, DeviceEntry->TimeCreated.QuadPart, Time.QuadPart, Diff.QuadPart);
 
                      /* release spin lock */
                      KeReleaseSpinLock(&BusDeviceExtension->Lock, OldLevel);
@@ -1509,6 +1512,9 @@ KsCreateBusEnumObject(
     UNICODE_STRING ServiceKeyPath = RTL_CONSTANT_STRING(L"\\REGISTRY\\MACHINE\\SYSTEM\\CurrentControlSet\\Services\\");
     PBUS_ENUM_DEVICE_EXTENSION BusDeviceExtension;
     PDEV_EXTENSION DeviceExtension;
+    PBUS_DEVICE_ENTRY DeviceEntry;
+    PLIST_ENTRY Entry;
+    KIRQL OldLevel;
 
     DPRINT1("KsCreateBusEnumObject %S BusDeviceObject %p\n", ServiceRelativePath, BusDeviceObject);
 
@@ -1677,6 +1683,39 @@ KsCreateBusEnumObject(
         FreeItem(BusDeviceExtension);
     }
 
+    /* acquire device entry lock */
+    KeAcquireSpinLock(&BusDeviceExtension->Lock, &OldLevel);
+
+    /* now iterate all device entries */
+    Entry = BusDeviceExtension->Common.Entry.Flink;
+    while(Entry != &BusDeviceExtension->Common.Entry)
+    {
+        /* get device entry */
+        DeviceEntry = (PBUS_DEVICE_ENTRY)CONTAINING_RECORD(Entry, BUS_DEVICE_ENTRY, Entry);
+        if (!DeviceEntry->PDO)
+        {
+            /* release device entry lock */
+            KeReleaseSpinLock(&BusDeviceExtension->Lock, OldLevel);
+
+            /* create pdo */
+            Status = KspCreatePDO(BusDeviceExtension, DeviceEntry, &DeviceEntry->PDO);
+
+            /* acquire device entry lock */
+            KeAcquireSpinLock(&BusDeviceExtension->Lock, &OldLevel);
+
+            /* done */
+            break;
+        }
+        /* move to next entry */
+        Entry = Entry->Flink;
+    }
+
+    /* release device entry lock */
+    KeReleaseSpinLock(&BusDeviceExtension->Lock, OldLevel);
+
+
+    /* invalidate device relations */
+    IoInvalidateDeviceRelations(BusDeviceExtension->PhysicalDeviceObject, BusRelations);
     DPRINT("KsCreateBusEnumObject Status %x\n", Status);
     /* done */
     return Status;
@@ -1908,7 +1947,8 @@ KsServiceBusEnumCreateRequest(
             Status =  KspDoReparseForIrp(Irp, DeviceEntry);
             DPRINT("REPARSE Irp %p '%wZ'\n", Irp, &IoStack->FileObject->FileName);
 
-            Irp->IoStatus.Status = Status;
+            Irp->IoStatus.Status = Status; 
+            Irp->IoStatus.Information = IO_REPARSE;
             return Status;
         }
 
@@ -2051,11 +2091,8 @@ KsServiceBusEnumPnpRequest(
             /* set state no notstarted */
             DeviceEntry->DeviceState = NotStarted;
 
-        /* time to create PDO */
-        KspCreatePDO(BusDeviceExtension, DeviceEntry, &DeviceEntry->PDO);
-
-        /* invalidate device relations */
-        IoInvalidateDeviceRelations(BusDeviceExtension->PhysicalDeviceObject, BusRelations);
+            /* complete pending irps */
+            KspCompletePendingIrps(DeviceEntry, STATUS_DEVICE_REMOVED);
 
             /* done */
             Status = STATUS_SUCCESS;
index a48bf55..90b9b9c 100644 (file)
@@ -110,7 +110,7 @@ SwDispatchPnp(
     Status = KsServiceBusEnumPnpRequest(DeviceObject, Irp);
 
     /* check if the request was for a pdo */
-    if (!ChildDevice)
+    if (ChildDevice)
     {
         if (Status != STATUS_NOT_SUPPORTED)
         {
@@ -144,9 +144,9 @@ SwDispatchPnp(
     if (!NT_SUCCESS(Status))
     {
         /* failed to get pnp object */
-        Irp->IoStatus.Status = Status;
+        Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
         IoCompleteRequest(Irp, IO_NO_INCREMENT);
-        return Status;
+        return STATUS_NOT_SUPPORTED;
     }
 
     /* sanity check */
index 04fe001..079d3b4 100644 (file)
@@ -1358,7 +1358,10 @@ MMixerHandlePhysicalConnection(
 
         /* sanity checks */
         ASSERT(PinsCount != 0);
-        ASSERT(PinsCount == 1);
+        if (PinsCount != 1)
+        {
+            DPRINT1("MMixerHandlePhysicalConnection Expected 1 pin but got %lu\n", PinsCount);
+        }
 
         /* create destination line */
         Status = MMixerBuildMixerDestinationLine(MixerContext, MixerInfo, MixerData->hDevice, Pins[0], bInput);
index 2096352..c0a6e20 100644 (file)
@@ -25,8 +25,11 @@ ExcludeFromSelect = SW\{EEC12DB6-AD9C-4168-8658-B03DAEF417FE}
 ExcludeFromSelect = WDMAUDIO_CopyFilesOnlyId\r
 \r
 [GenericMfg]\r
+;%WDM_KMIXER.DeviceDesc%   = WDM_KMIXER,   SW\{B7EAFDC0-A680-11D0-96D8-00AA0051E51D}\r
+;%WDM_SYSAUDIO.DeviceDesc% = WDM_SYSAUDIO, SW\{A7C7A5B0-5AF3-11D1-9CED-00A024BF0407}\r
 %WDM_WDMAUD.DeviceDesc%   = WDM_WDMAUD,   SW\{CD171DE3-69E5-11D2-B56D-0000F8754380}\r
-%WDM_DRMKAUD.DeviceDesc%  = WDM_DRMKAUD,  SW\{EEC12DB6-AD9C-4168-8658-B03DAEF417FE}\r
+;%WDM_DRMKAUD.DeviceDesc%  = WDM_DRMKAUD,  SW\{EEC12DB6-AD9C-4168-8658-B03DAEF417FE}\r
+\r
 %WDMAUDIO_CopyFilesOnlyId.DeviceDesc% = WDMAUDIO.CopyFilesOnly, WDMAUDIO_CopyFilesOnlyId\r
 \r
 [WDMAUDIO.CopyFilesOnly]\r
@@ -43,11 +46,69 @@ AddReg = DeviceRegistration
 CopyFiles = WDM.CopyFiles\r
 \r
 [DeviceRegistration]\r
+; Kmixer swenum install\r
+;HKLM,%RunOnce%,"WDM_KMIXER0",,"rundll32.exe streamci.dll,StreamingDeviceSetup %WDM_KMIXER.DeviceId%,%KSNAME_Filter%,%KSCATEGORY_MIXER%,%17%\WDMAUDIO.inf,WDM_KMIXER.Interface.Install"\r
+;HKLM,%RunOnce%,"WDM_KMIXER1",,"rundll32.exe streamci.dll,StreamingDeviceSetup %WDM_KMIXER.DeviceId%,%KSNAME_Filter%,%KSCATEGORY_AUDIO%,%17%\WDMAUDIO.inf,WDM_KMIXER.Interface.Install"\r
+\r
+; Sysaudio swenum install\r
+;HKLM,%RunOnce%,"WDM_SYSAUDIO",,"rundll32.exe streamci.dll,StreamingDeviceSetup %WDM_SYSAUDIO.DeviceId%,%KSNAME_Filter%,%KSCATEGORY_SYSAUDIO%,%17%\WDMAUDIO.inf,WDM_SYSAUDIO.Interface.Install"\r
+\r
 ; WDMAud install\r
 HKLM,%RunOnce%,"WDM_WDMAUD",,"rundll32.exe streamci.dll,StreamingDeviceSetup %WDM_WDMAUD.DeviceId%,%KSNAME_Filter%,%KSCATEGORY_WDMAUD%,%17%\WDMAUDIO.inf,WDM_WDMAUD.Interface.Install"\r
+\r
 ; DRMKAUD install\r
-HKLM,%RunOnce%,"WDM_DRMKAUD",,"rundll32.exe streamci,StreamingDeviceSetup %WDM_DRMKAUD.DeviceId%,%KSNAME_DRMKAUD%,%KSCATEGORY_DRM_DESCRAMBLE%,%17%\WDMAUDIO.inf,WDM_DRMKAUD.Interface.Install"\r
+;HKLM,%RunOnce%,"WDM_DRMKAUD",,"rundll32.exe streamci,StreamingDeviceSetup %WDM_DRMKAUD.DeviceId%,%KSNAME_DRMKAUD%,%KSCATEGORY_DRM_DESCRAMBLE%,%17%\WDMAUDIO.inf,WDM_DRMKAUD.Interface.Install"\r
+\r
+;--------------------------------------------------------------------------------\r
+; SysAudio Install\r
+[WDM_SYSAUDIO.Interface.Install]\r
+AddReg=WDM_SYSAUDIO.Interface.AddReg\r
+\r
+[WDM_SYSAUDIO.Interface.AddReg]\r
+HKR,,CLSID,,%Proxy.CLSID%\r
+HKR,,FriendlyName,,%WDM_SYSAUDIO.FriendlyName%\r
+\r
+[WDM_SYSAUDIO]\r
+CopyFiles = WDM_SYSAUDIO.CopyFiles\r
+\r
+\r
+[WDM_SYSAUDIO.CopyFiles]\r
+sysaudio.sys\r
+\r
+[WDM_SYSAUDIO.Services]\r
+AddService = sysaudio,0x00000002, sysaudio_Service_Inst\r
+\r
+[sysaudio_Service_Inst]\r
+DisplayName    = %sysaudio.SvcDesc%\r
+ServiceType    = 1                  ; SERVICE_KERNEL_DRIVER\r
+StartType      = 3                  ; SERVICE_DEMAND_START\r
+ErrorControl   = 1                  ; SERVICE_ERROR_NORMAL\r
+ServiceBinary  = %10%\system32\drivers\sysaudio.sys\r
+\r
+;--------------------------------------------------------------------------------\r
+; KMixer Install\r
+[WDM_KMIXER.Interface.Install]\r
+AddReg=WDM_KMIXER.Interface.AddReg\r
+\r
+[WDM_KMIXER.Interface.AddReg]\r
+HKR,,CLSID,,%Proxy.CLSID%\r
+HKR,,FriendlyName,,%WDM_KMIXER.FriendlyName%\r
 \r
+[WDM_KMIXER]\r
+CopyFiles = WDM_KMIXER.CopyFiles\r
+\r
+[WDM_KMIXER.CopyFiles]\r
+kmixer.sys\r
+\r
+[WDM_KMIXER.Services]\r
+AddService = kmixer,  0x00000002, kmixer_Service_Inst\r
+\r
+[kmixer_Service_Inst]\r
+DisplayName    = %kmixer.SvcDesc%\r
+ServiceType    = 1                  ; SERVICE_KERNEL_DRIVER\r
+StartType      = 3                  ; SERVICE_DEMAND_START\r
+ErrorControl   = 1                  ; SERVICE_ERROR_NORMAL\r
+ServiceBinary  = %10%\system32\drivers\kmixer.sys\r
 ;--------------------------------------------------------------------------------\r
 ; WDMAUD Install\r
 [WDM_WDMAUD.Interface.Install]\r
@@ -119,6 +180,8 @@ RunOnce = "SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce"
 Proxy.CLSID               = "{17CCA71B-ECD7-11D0-B908-00A0C9223196}"\r
 KSNAME_Filter             = "{9B365890-165F-11D0-A195-0020AFD156E4}"\r
 KSNAME_DRMKAUD            = "{ABD61E00-9350-47e2-A632-4438B90C6641}"\r
+WDM_SYSAUDIO.DeviceId     = "{A7C7A5B0-5AF3-11D1-9CED-00A024BF0407}"\r
+KSCATEGORY_SYSAUDIO       = "{A7C7A5B1-5AF3-11D1-9CED-00A024BF0407}"\r
 WDM_DRMKAUD.DeviceId      = "{EEC12DB6-AD9C-4168-8658-B03DAEF417FE}"\r
 KSCATEGORY_DRM_DESCRAMBLE = "{FFBB6E3F-CCFE-4D84-90D9-421418B03A8E}"\r
 KSCATEGORY_DATATRANSFORM  =  "{2EB07EA0-7E70-11D0-A5D6-28DB04C10000}"\r
@@ -129,6 +192,12 @@ KSCATEGORY_WDMAUD         = "{3E227E76-690D-11D2-8161-0000F8775BF1}"
 \r
 \r
 ;Localizable\r
+WDM_KMIXER.DeviceDesc     = "ReactOS Wave Audio Mixer"\r
+WDM_KMIXER.FriendlyName   = "ReactOS Wave Audio Mixer"\r
+kmixer.SvcDesc            = "ReactOS Wave Audio Mixer"\r
+WDM_SYSAUDIO.DeviceDesc   = "ReactOS System audio device"\r
+WDM_SYSAUDIO.FriendlyName = "ReactOS System audio device"\r
+sysaudio.SvcDesc          = "ReactOS System audio device"\r
 WDM_DRMKAUD.DeviceDesc    = "ReactOS Trusted Audio Drivers"\r
 WDM_DRMKAUD.FriendlyName  = "ReactOS Trusted Audio Drivers"\r
 drmkaud.SvcDesc           = "ReactOS Trusted Audio Drivers"\r
index 6916261..6029c83 100644 (file)
@@ -103,7 +103,7 @@ OpenRegistryHandlesFromSymbolicLink(IN PUNICODE_STRING SymbolicLinkName,
                          &ObjectAttributes,
                          0,
                          NULL,
-                         REG_OPTION_NON_VOLATILE,
+                         REG_OPTION_VOLATILE,
                          NULL);
     ZwClose(ClassesKey);
     if (!NT_SUCCESS(Status))
@@ -154,11 +154,11 @@ OpenRegistryHandlesFromSymbolicLink(IN PUNICODE_STRING SymbolicLinkName,
                          &ObjectAttributes,
                          0,
                          NULL,
-                         REG_OPTION_NON_VOLATILE,
+                         REG_OPTION_VOLATILE,
                          NULL);
     if (!NT_SUCCESS(Status))
     {
-        DPRINT1("Failed to open %wZ%wZ\\%wZ\n", &BaseKeyU, &GuidString, &SubKeyName);
+        DPRINT1("Failed to open %wZ%wZ\\%wZ Status %x\n", &BaseKeyU, &GuidString, &SubKeyName, Status);
         goto cleanup;
     }
 
@@ -172,7 +172,7 @@ OpenRegistryHandlesFromSymbolicLink(IN PUNICODE_STRING SymbolicLinkName,
                          &ObjectAttributes,
                          0,
                          NULL,
-                         REG_OPTION_NON_VOLATILE,
+                         REG_OPTION_VOLATILE,
                          NULL);
     if (!NT_SUCCESS(Status))
     {
index ce4c8c6..c94f850 100644 (file)
@@ -452,7 +452,7 @@ ObpParseSymbolicLink(IN PVOID ParsedObject,
         MaximumLength = LengthUsed + sizeof(WCHAR);
         NewTargetPath = ExAllocatePoolWithTag(NonPagedPool,
                                               MaximumLength,
-                                              TAG_SYMLINK_TTARGET);
+                                              OB_NAME_TAG);
         if (!NewTargetPath) return STATUS_INSUFFICIENT_RESOURCES;
     }
     else