mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 17:34:57 +00:00
[KS]
- fix multiple bugs in software bus pnp enumerator [INF] - add wdmaud.sys as a client of the software bus pnp enumerator svn path=/trunk/; revision=66600
This commit is contained in:
parent
4f6af40fc9
commit
20b24dadb9
2 changed files with 81 additions and 34 deletions
|
@ -98,7 +98,7 @@ KspRegisterDeviceAssociation(
|
|||
RtlInitUnicodeString(&ReferenceString, DeviceEntry->DeviceName);
|
||||
|
||||
/* register device interface */
|
||||
Status = IoRegisterDeviceInterface(BusDeviceExtension->PhysicalDeviceObject, &BusInstanceEntry->InterfaceGuid, &ReferenceString, &BusInstanceEntry->SymbolicLink);
|
||||
Status = IoRegisterDeviceInterface(BusDeviceExtension->PhysicalDeviceObject, &DeviceEntry->DeviceGuid, NULL, &BusInstanceEntry->SymbolicLink);
|
||||
|
||||
/* check for success */
|
||||
if (!NT_SUCCESS(Status))
|
||||
|
@ -231,7 +231,7 @@ KspEnumerateBusRegistryKeys(
|
|||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
/* perform callback */
|
||||
Status = Callback(hNewKey, BusDeviceExtension, DeviceEntry, ReferenceString, KeyInfo->Name);
|
||||
Status = Callback(hNewKey, BusDeviceExtension, DeviceEntry, KeyInfo->Name, ReferenceString);
|
||||
|
||||
/* should enumeration stop */
|
||||
if (!NT_SUCCESS(Status))
|
||||
|
@ -272,6 +272,8 @@ KspCreateDeviceAssociation(
|
|||
|
||||
/* check if the device is already present */
|
||||
Entry = DeviceEntry->DeviceInterfaceList.Flink;
|
||||
DPRINT1("KspCreateDeviceAssociation ReferenceString %S\n", ReferenceString);
|
||||
DPRINT1("KspCreateDeviceAssociation InterfaceString %S\n", InterfaceString);
|
||||
|
||||
while(Entry != &DeviceEntry->DeviceInterfaceList)
|
||||
{
|
||||
|
@ -325,8 +327,8 @@ KspCreateDeviceReference(
|
|||
IN PHANDLE hKey,
|
||||
IN PBUS_ENUM_DEVICE_EXTENSION BusDeviceExtension,
|
||||
IN PBUS_DEVICE_ENTRY DummyEntry,
|
||||
IN LPWSTR DeviceCategory,
|
||||
IN LPWSTR ReferenceString)
|
||||
IN LPWSTR InterfaceId,
|
||||
IN LPWSTR DeviceId)
|
||||
{
|
||||
LPWSTR DeviceName;
|
||||
SIZE_T Length;
|
||||
|
@ -338,7 +340,7 @@ KspCreateDeviceReference(
|
|||
KIRQL OldLevel;
|
||||
|
||||
/* first construct device name & reference guid */
|
||||
Length = wcslen(DeviceCategory) + wcslen(ReferenceString);
|
||||
Length = wcslen(DeviceId) + wcslen(InterfaceId);
|
||||
|
||||
/* append '&' and null byte */
|
||||
Length += 2;
|
||||
|
@ -353,7 +355,9 @@ KspCreateDeviceReference(
|
|||
}
|
||||
|
||||
/* construct device name */
|
||||
swprintf(DeviceName, L"%s&%s", DeviceCategory, ReferenceString);
|
||||
wcscpy(DeviceName, DeviceId);
|
||||
wcscat(DeviceName, L"&");
|
||||
wcscat(DeviceName, InterfaceId);
|
||||
|
||||
/* scan list and check if it is already present */
|
||||
Entry = BusDeviceExtension->Common.Entry.Flink;
|
||||
|
@ -391,15 +395,15 @@ KspCreateDeviceReference(
|
|||
InitializeListHead(&DeviceEntry->IrpPendingList);
|
||||
|
||||
/* copy device guid */
|
||||
RtlInitUnicodeString(&String, DeviceCategory);
|
||||
RtlInitUnicodeString(&String, DeviceId);
|
||||
RtlGUIDFromString(&String, &DeviceEntry->DeviceGuid);
|
||||
|
||||
/* copy device names */
|
||||
DeviceEntry->DeviceName = DeviceName;
|
||||
DeviceEntry->Instance = (DeviceName + wcslen(DeviceCategory) + 1);
|
||||
DeviceEntry->Instance = (DeviceName + wcslen(DeviceId) + 1);
|
||||
|
||||
/* copy name */
|
||||
DeviceEntry->BusId = AllocateItem(NonPagedPool, (wcslen(DeviceCategory) + 1) * sizeof(WCHAR));
|
||||
DeviceEntry->BusId = AllocateItem(NonPagedPool, (wcslen(DeviceId) + 1) * sizeof(WCHAR));
|
||||
if (!DeviceEntry->BusId)
|
||||
{
|
||||
/* no memory */
|
||||
|
@ -407,11 +411,11 @@ KspCreateDeviceReference(
|
|||
FreeItem(DeviceEntry);
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
}
|
||||
wcscpy(DeviceEntry->BusId, DeviceCategory);
|
||||
wcscpy(DeviceEntry->BusId, DeviceId);
|
||||
}
|
||||
|
||||
/* now enumerate the devices */
|
||||
Status = KspEnumerateBusRegistryKeys(hKey, ReferenceString, KspCreateDeviceAssociation, BusDeviceExtension, DeviceEntry);
|
||||
/* now enumerate the interfaces */
|
||||
Status = KspEnumerateBusRegistryKeys(hKey, InterfaceId, KspCreateDeviceAssociation, BusDeviceExtension, DeviceEntry);
|
||||
|
||||
/* check if list is empty */
|
||||
if (IsListEmpty(&DeviceEntry->DeviceInterfaceList))
|
||||
|
@ -466,7 +470,7 @@ KspCreateDeviceReferenceTrampoline(
|
|||
IN LPWSTR DeviceCategory,
|
||||
IN LPWSTR ReferenceString)
|
||||
{
|
||||
return KspEnumerateBusRegistryKeys(hKey, ReferenceString, KspCreateDeviceReference, BusDeviceExtension, DummyEntry);
|
||||
return KspEnumerateBusRegistryKeys(hKey, DeviceCategory, KspCreateDeviceReference, BusDeviceExtension, DummyEntry);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1015,35 +1019,36 @@ KspInstallInterface(
|
|||
Status = ZwCreateKey(&hDeviceKey, GENERIC_WRITE, &ObjectAttributes, 0, NULL, 0, NULL);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
/* initialize reference string */
|
||||
RtlInitUnicodeString(&ReferenceString, InstallInterface->ReferenceString);
|
||||
|
||||
/* initialize object attributes */
|
||||
InitializeObjectAttributes(&ObjectAttributes, &ReferenceString, OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE, hDeviceKey, NULL);
|
||||
|
||||
/* construct device key */
|
||||
Status = ZwCreateKey(&hReferenceKey, GENERIC_WRITE, &ObjectAttributes, 0, NULL, 0, NULL);
|
||||
/* convert interface guid to string */
|
||||
Status = RtlStringFromGUID(&InstallInterface->InterfaceId, &InterfaceString);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
/* convert interface guid to string */
|
||||
Status = RtlStringFromGUID(&InstallInterface->InterfaceId, &InterfaceString);
|
||||
/* initialize object attributes */
|
||||
InitializeObjectAttributes(&ObjectAttributes, &InterfaceString, OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE, hDeviceKey, NULL);
|
||||
|
||||
/* construct device key */
|
||||
Status = ZwCreateKey(&hInterfaceKey, GENERIC_WRITE, &ObjectAttributes, 0, NULL, 0, NULL);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
/* initialize reference string */
|
||||
RtlInitUnicodeString(&ReferenceString, InstallInterface->ReferenceString);
|
||||
|
||||
/* initialize object attributes */
|
||||
InitializeObjectAttributes(&ObjectAttributes, &InterfaceString, OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE, hReferenceKey, NULL);
|
||||
InitializeObjectAttributes(&ObjectAttributes, &ReferenceString, OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE, hInterfaceKey, NULL);
|
||||
|
||||
/* construct device key */
|
||||
Status = ZwCreateKey(&hInterfaceKey, GENERIC_WRITE, &ObjectAttributes, 0, NULL, 0, NULL);
|
||||
Status = ZwCreateKey(&hReferenceKey, GENERIC_WRITE, &ObjectAttributes, 0, NULL, 0, NULL);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
/* close key */
|
||||
ZwClose(hInterfaceKey);
|
||||
ZwClose(hReferenceKey);
|
||||
}
|
||||
/* free interface string */
|
||||
RtlFreeUnicodeString(&InterfaceString);
|
||||
}
|
||||
/* free interface string */
|
||||
RtlFreeUnicodeString(&InterfaceString);
|
||||
|
||||
/* close reference key */
|
||||
ZwClose(hReferenceKey);
|
||||
ZwClose(hInterfaceKey);
|
||||
}
|
||||
/* close device key */
|
||||
ZwClose(hDeviceKey);
|
||||
|
@ -1123,15 +1128,19 @@ KspInstallBusEnumInterface(
|
|||
{
|
||||
/* get device entry */
|
||||
DeviceEntry = (PBUS_DEVICE_ENTRY)CONTAINING_RECORD(Entry, BUS_DEVICE_ENTRY, Entry);
|
||||
|
||||
if (IsEqualGUIDAligned(&DeviceEntry->DeviceGuid, &InstallInterface->DeviceId) &&
|
||||
!wcsicmp(DeviceEntry->Instance, InstallInterface->ReferenceString))
|
||||
if (IsEqualGUIDAligned(&DeviceEntry->DeviceGuid, &InstallInterface->DeviceId))
|
||||
{
|
||||
if (!DeviceEntry->PDO)
|
||||
{
|
||||
/* release device entry lock */
|
||||
KeReleaseSpinLock(&Context->BusDeviceExtension->Lock, OldLevel);
|
||||
|
||||
/* create pdo */
|
||||
Status = KspCreatePDO(Context->BusDeviceExtension, DeviceEntry, &DeviceEntry->PDO);
|
||||
|
||||
/* acquire device entry lock */
|
||||
KeAcquireSpinLock(&Context->BusDeviceExtension->Lock, &OldLevel);
|
||||
|
||||
/* done */
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -25,6 +25,7 @@ ExcludeFromSelect = SW\{EEC12DB6-AD9C-4168-8658-B03DAEF417FE}
|
|||
ExcludeFromSelect = WDMAUDIO_CopyFilesOnlyId
|
||||
|
||||
[GenericMfg]
|
||||
%WDM_WDMAUD.DeviceDesc% = WDM_WDMAUD, SW\{CD171DE3-69E5-11D2-B56D-0000F8754380}
|
||||
%WDM_DRMKAUD.DeviceDesc% = WDM_DRMKAUD, SW\{EEC12DB6-AD9C-4168-8658-B03DAEF417FE}
|
||||
%WDMAUDIO_CopyFilesOnlyId.DeviceDesc% = WDMAUDIO.CopyFilesOnly, WDMAUDIO_CopyFilesOnlyId
|
||||
|
||||
|
@ -42,10 +43,38 @@ AddReg = DeviceRegistration
|
|||
CopyFiles = WDM.CopyFiles
|
||||
|
||||
[DeviceRegistration]
|
||||
;; DRMKAUD swenum 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
|
||||
;--------------------------------------------------------------------------------
|
||||
; WDMAUD Install
|
||||
[WDM_WDMAUD.Interface.Install]
|
||||
AddReg=WDM_WDMAUD.Interface.AddReg
|
||||
|
||||
[WDM_WDMAUD.Interface.AddReg]
|
||||
HKR,,CLSID,,%Proxy.CLSID%
|
||||
HKR,,FriendlyName,,%WDM_WDMAUD.FriendlyName%
|
||||
|
||||
[WDM_WDMAUD]
|
||||
CopyFiles = WDM_WDMAUD.CopyFiles
|
||||
|
||||
[WDM_WDMAUD.CopyFiles]
|
||||
wdmaud.sys
|
||||
|
||||
[WDM_WDMAUD.Services]
|
||||
AddService = wdmaud,0x00000002, wdmaud_Service_Inst
|
||||
|
||||
[wdmaud_Service_Inst]
|
||||
DisplayName = %wdmaud.SvcDesc%
|
||||
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
|
||||
StartType = 3 ; SERVICE_DEMAND_START
|
||||
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
|
||||
ServiceBinary = %10%\system32\drivers\wdmaud.sys
|
||||
|
||||
;--------------------------------------------------------------------------------
|
||||
; DRMKAUD Install
|
||||
[WDM_DRMKAUD.Interface.Install]
|
||||
AddReg=WDM_DRMKAUD.Interface.AddReg
|
||||
|
||||
|
@ -80,6 +109,7 @@ portcls.sys,,,0x0100
|
|||
WDM.CopyFiles = 10,system32\drivers ; %SystemRoot%\system32\drivers
|
||||
WDM_DRMKAUD.CopyFiles = 10,system32\drivers
|
||||
|
||||
;---------------------------------------------------------------------------------
|
||||
[Strings]
|
||||
;Non-localizable
|
||||
ReactOS="ReactOS"
|
||||
|
@ -87,18 +117,26 @@ MfgName="ReactOS"
|
|||
|
||||
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_DRMKAUD.DeviceId = "{EEC12DB6-AD9C-4168-8658-B03DAEF417FE}"
|
||||
KSCATEGORY_DRM_DESCRAMBLE = "{FFBB6E3F-CCFE-4D84-90D9-421418B03A8E}"
|
||||
KSCATEGORY_DATATRANSFORM = "{2EB07EA0-7E70-11D0-A5D6-28DB04C10000}"
|
||||
KSCATEGORY_AUDIO = "{6994AD04-93EF-11D0-A3CC-00A0C9223196}"
|
||||
PKEY_AudioEngine_OEMFormat = "{E4870E26-3CC5-4CD2-BA46-CA0A9A70ED04},3"
|
||||
WDM_WDMAUD.DeviceId = "{CD171DE3-69E5-11D2-B56D-0000F8754380}"
|
||||
KSCATEGORY_WDMAUD = "{3E227E76-690D-11D2-8161-0000F8775BF1}"
|
||||
|
||||
|
||||
;Localizable
|
||||
WDM_DRMKAUD.DeviceDesc = "ReactOS Trusted Audio Drivers"
|
||||
WDM_DRMKAUD.FriendlyName = "ReactOS Trusted Audio Drivers"
|
||||
drmkaud.SvcDesc = "ReactOS Trusted Audio Drivers"
|
||||
WDMAUDIO_CopyFilesOnlyId.DeviceDesc = "ReactOS WDM Audio Drivers"
|
||||
WDM_WDMAUD.DeviceDesc = "Driver for ReactOS WINMM-WDM-Audio"
|
||||
WDM_WDMAUD.FriendlyName = "Driver for ReactOS WINMM-WDM-Audio"
|
||||
wdmaud.SvcDesc = "Driver for ReactOS WINMM-WDM-Audio"
|
||||
|
||||
|
||||
[Strings.0418]
|
||||
WDM_DRMKAUD.DeviceDesc = "Module-pilot audio de încredere ale ReactOS"
|
||||
|
|
Loading…
Reference in a new issue