From 11164521c37bdd3677cf544d0d986eee30e96ec9 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Sat, 14 Mar 2015 11:12:32 +0000 Subject: [PATCH] [MMSYS] - 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 | 2 +- reactos/drivers/ksfilter/ks/swenum.c | 71 ++++++++++++++----- reactos/drivers/ksfilter/swenum/swenum.c | 6 +- reactos/lib/drivers/sound/mmixer/controls.c | 5 +- reactos/media/inf/wdmaudio.inf | 75 ++++++++++++++++++++- reactos/ntoskrnl/io/iomgr/deviface.c | 8 +-- reactos/ntoskrnl/ob/oblink.c | 2 +- 7 files changed, 139 insertions(+), 30 deletions(-) diff --git a/reactos/dll/cpl/mmsys/mmsys.c b/reactos/dll/cpl/mmsys/mmsys.c index b1d850aff78..e8d37fb7566 100644 --- a/reactos/dll/cpl/mmsys/mmsys.c +++ b/reactos/dll/cpl/mmsys/mmsys.c @@ -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); diff --git a/reactos/drivers/ksfilter/ks/swenum.c b/reactos/drivers/ksfilter/ks/swenum.c index 0c18ba9d1ae..7310d7a750e 100644 --- a/reactos/drivers/ksfilter/ks/swenum.c +++ b/reactos/drivers/ksfilter/ks/swenum.c @@ -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; diff --git a/reactos/drivers/ksfilter/swenum/swenum.c b/reactos/drivers/ksfilter/swenum/swenum.c index a48bf55545c..90b9b9c0e10 100644 --- a/reactos/drivers/ksfilter/swenum/swenum.c +++ b/reactos/drivers/ksfilter/swenum/swenum.c @@ -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 */ diff --git a/reactos/lib/drivers/sound/mmixer/controls.c b/reactos/lib/drivers/sound/mmixer/controls.c index 04fe001dc0e..079d3b4657f 100644 --- a/reactos/lib/drivers/sound/mmixer/controls.c +++ b/reactos/lib/drivers/sound/mmixer/controls.c @@ -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); diff --git a/reactos/media/inf/wdmaudio.inf b/reactos/media/inf/wdmaudio.inf index 2096352efed..c0a6e20a4e4 100644 --- a/reactos/media/inf/wdmaudio.inf +++ b/reactos/media/inf/wdmaudio.inf @@ -25,8 +25,11 @@ ExcludeFromSelect = SW\{EEC12DB6-AD9C-4168-8658-B03DAEF417FE} ExcludeFromSelect = WDMAUDIO_CopyFilesOnlyId [GenericMfg] +;%WDM_KMIXER.DeviceDesc% = WDM_KMIXER, SW\{B7EAFDC0-A680-11D0-96D8-00AA0051E51D} +;%WDM_SYSAUDIO.DeviceDesc% = WDM_SYSAUDIO, SW\{A7C7A5B0-5AF3-11D1-9CED-00A024BF0407} %WDM_WDMAUD.DeviceDesc% = WDM_WDMAUD, SW\{CD171DE3-69E5-11D2-B56D-0000F8754380} -%WDM_DRMKAUD.DeviceDesc% = WDM_DRMKAUD, SW\{EEC12DB6-AD9C-4168-8658-B03DAEF417FE} +;%WDM_DRMKAUD.DeviceDesc% = WDM_DRMKAUD, SW\{EEC12DB6-AD9C-4168-8658-B03DAEF417FE} + %WDMAUDIO_CopyFilesOnlyId.DeviceDesc% = WDMAUDIO.CopyFilesOnly, WDMAUDIO_CopyFilesOnlyId [WDMAUDIO.CopyFilesOnly] @@ -43,11 +46,69 @@ AddReg = DeviceRegistration CopyFiles = WDM.CopyFiles [DeviceRegistration] +; Kmixer swenum install +;HKLM,%RunOnce%,"WDM_KMIXER0",,"rundll32.exe streamci.dll,StreamingDeviceSetup %WDM_KMIXER.DeviceId%,%KSNAME_Filter%,%KSCATEGORY_MIXER%,%17%\WDMAUDIO.inf,WDM_KMIXER.Interface.Install" +;HKLM,%RunOnce%,"WDM_KMIXER1",,"rundll32.exe streamci.dll,StreamingDeviceSetup %WDM_KMIXER.DeviceId%,%KSNAME_Filter%,%KSCATEGORY_AUDIO%,%17%\WDMAUDIO.inf,WDM_KMIXER.Interface.Install" + +; Sysaudio swenum install +;HKLM,%RunOnce%,"WDM_SYSAUDIO",,"rundll32.exe streamci.dll,StreamingDeviceSetup %WDM_SYSAUDIO.DeviceId%,%KSNAME_Filter%,%KSCATEGORY_SYSAUDIO%,%17%\WDMAUDIO.inf,WDM_SYSAUDIO.Interface.Install" + ; WDMAud install HKLM,%RunOnce%,"WDM_WDMAUD",,"rundll32.exe streamci.dll,StreamingDeviceSetup %WDM_WDMAUD.DeviceId%,%KSNAME_Filter%,%KSCATEGORY_WDMAUD%,%17%\WDMAUDIO.inf,WDM_WDMAUD.Interface.Install" -; DRMKAUD install -HKLM,%RunOnce%,"WDM_DRMKAUD",,"rundll32.exe streamci,StreamingDeviceSetup %WDM_DRMKAUD.DeviceId%,%KSNAME_DRMKAUD%,%KSCATEGORY_DRM_DESCRAMBLE%,%17%\WDMAUDIO.inf,WDM_DRMKAUD.Interface.Install" +; DRMKAUD install +;HKLM,%RunOnce%,"WDM_DRMKAUD",,"rundll32.exe streamci,StreamingDeviceSetup %WDM_DRMKAUD.DeviceId%,%KSNAME_DRMKAUD%,%KSCATEGORY_DRM_DESCRAMBLE%,%17%\WDMAUDIO.inf,WDM_DRMKAUD.Interface.Install" + +;-------------------------------------------------------------------------------- +; SysAudio Install +[WDM_SYSAUDIO.Interface.Install] +AddReg=WDM_SYSAUDIO.Interface.AddReg + +[WDM_SYSAUDIO.Interface.AddReg] +HKR,,CLSID,,%Proxy.CLSID% +HKR,,FriendlyName,,%WDM_SYSAUDIO.FriendlyName% + +[WDM_SYSAUDIO] +CopyFiles = WDM_SYSAUDIO.CopyFiles + + +[WDM_SYSAUDIO.CopyFiles] +sysaudio.sys + +[WDM_SYSAUDIO.Services] +AddService = sysaudio,0x00000002, sysaudio_Service_Inst + +[sysaudio_Service_Inst] +DisplayName = %sysaudio.SvcDesc% +ServiceType = 1 ; SERVICE_KERNEL_DRIVER +StartType = 3 ; SERVICE_DEMAND_START +ErrorControl = 1 ; SERVICE_ERROR_NORMAL +ServiceBinary = %10%\system32\drivers\sysaudio.sys + +;-------------------------------------------------------------------------------- +; KMixer Install +[WDM_KMIXER.Interface.Install] +AddReg=WDM_KMIXER.Interface.AddReg + +[WDM_KMIXER.Interface.AddReg] +HKR,,CLSID,,%Proxy.CLSID% +HKR,,FriendlyName,,%WDM_KMIXER.FriendlyName% + +[WDM_KMIXER] +CopyFiles = WDM_KMIXER.CopyFiles + +[WDM_KMIXER.CopyFiles] +kmixer.sys + +[WDM_KMIXER.Services] +AddService = kmixer, 0x00000002, kmixer_Service_Inst + +[kmixer_Service_Inst] +DisplayName = %kmixer.SvcDesc% +ServiceType = 1 ; SERVICE_KERNEL_DRIVER +StartType = 3 ; SERVICE_DEMAND_START +ErrorControl = 1 ; SERVICE_ERROR_NORMAL +ServiceBinary = %10%\system32\drivers\kmixer.sys ;-------------------------------------------------------------------------------- ; WDMAUD Install [WDM_WDMAUD.Interface.Install] @@ -119,6 +180,8 @@ RunOnce = "SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" Proxy.CLSID = "{17CCA71B-ECD7-11D0-B908-00A0C9223196}" KSNAME_Filter = "{9B365890-165F-11D0-A195-0020AFD156E4}" KSNAME_DRMKAUD = "{ABD61E00-9350-47e2-A632-4438B90C6641}" +WDM_SYSAUDIO.DeviceId = "{A7C7A5B0-5AF3-11D1-9CED-00A024BF0407}" +KSCATEGORY_SYSAUDIO = "{A7C7A5B1-5AF3-11D1-9CED-00A024BF0407}" WDM_DRMKAUD.DeviceId = "{EEC12DB6-AD9C-4168-8658-B03DAEF417FE}" KSCATEGORY_DRM_DESCRAMBLE = "{FFBB6E3F-CCFE-4D84-90D9-421418B03A8E}" KSCATEGORY_DATATRANSFORM = "{2EB07EA0-7E70-11D0-A5D6-28DB04C10000}" @@ -129,6 +192,12 @@ KSCATEGORY_WDMAUD = "{3E227E76-690D-11D2-8161-0000F8775BF1}" ;Localizable +WDM_KMIXER.DeviceDesc = "ReactOS Wave Audio Mixer" +WDM_KMIXER.FriendlyName = "ReactOS Wave Audio Mixer" +kmixer.SvcDesc = "ReactOS Wave Audio Mixer" +WDM_SYSAUDIO.DeviceDesc = "ReactOS System audio device" +WDM_SYSAUDIO.FriendlyName = "ReactOS System audio device" +sysaudio.SvcDesc = "ReactOS System audio device" WDM_DRMKAUD.DeviceDesc = "ReactOS Trusted Audio Drivers" WDM_DRMKAUD.FriendlyName = "ReactOS Trusted Audio Drivers" drmkaud.SvcDesc = "ReactOS Trusted Audio Drivers" diff --git a/reactos/ntoskrnl/io/iomgr/deviface.c b/reactos/ntoskrnl/io/iomgr/deviface.c index 6916261db3c..6029c83b407 100644 --- a/reactos/ntoskrnl/io/iomgr/deviface.c +++ b/reactos/ntoskrnl/io/iomgr/deviface.c @@ -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)) { diff --git a/reactos/ntoskrnl/ob/oblink.c b/reactos/ntoskrnl/ob/oblink.c index ce4c8c60e6a..c94f85029b3 100644 --- a/reactos/ntoskrnl/ob/oblink.c +++ b/reactos/ntoskrnl/ob/oblink.c @@ -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