Index: io/iomgr/deviface.c =================================================================== --- io/iomgr/deviface.c (revision 41511) +++ io/iomgr/deviface.c (working copy) @@ -621,6 +621,7 @@ UNICODE_STRING SubKeyName; UNICODE_STRING InterfaceKeyName; UNICODE_STRING BaseKeyName; + UNICODE_STRING DeviceName; UCHAR PdoNameInfoBuffer[sizeof(OBJECT_NAME_INFORMATION) + (256 * sizeof(WCHAR))]; POBJECT_NAME_INFORMATION PdoNameInfo = (POBJECT_NAME_INFORMATION)PdoNameInfoBuffer; UNICODE_STRING DeviceInstance = RTL_CONSTANT_STRING(L"DeviceInstance"); @@ -633,7 +634,6 @@ ULONG i; NTSTATUS Status; PEXTENDED_DEVOBJ_EXTENSION DeviceObjectExtension; - ASSERT_IRQL_EQUAL(PASSIVE_LEVEL); DPRINT("IoRegisterDeviceInterface(): PDO %p, RefString: %wZ\n", @@ -883,14 +883,44 @@ RtlAppendUnicodeStringToString(SymbolicLinkName, &GuidString); if (ReferenceString && ReferenceString->Length) { - RtlAppendUnicodeToString(SymbolicLinkName, L"\\"); + RtlAppendUnicodeToString(SymbolicLinkName, L"#"); RtlAppendUnicodeStringToString(SymbolicLinkName, ReferenceString); } + SymbolicLinkName->Buffer[SymbolicLinkName->Length/sizeof(WCHAR)] = L'\0'; + /* Create device name \\Device\\000000\ReferenceString */ + DeviceName.Length = 0; + DeviceName.MaximumLength = PdoNameInfo->Name.Length; + if (ReferenceString && ReferenceString->Length) + { + DeviceName.MaximumLength += ReferenceString->Length + 2 * sizeof(WCHAR); + } + DeviceName.Buffer = ExAllocatePool(PagedPool, DeviceName.MaximumLength); + + if (!DeviceName.Buffer) + { + DPRINT("ExAllocatePool() failed\n"); + ZwClose(SubKey); + ZwClose(InterfaceKey); + ZwClose(ClassKey); + ExFreePool(InterfaceKeyName.Buffer); + ExFreePool(SymbolicLinkName->Buffer); + ExFreePool(SubKeyName.Buffer); + ExFreePool(BaseKeyName.Buffer); + return STATUS_INSUFFICIENT_RESOURCES; + } + RtlAppendUnicodeStringToString(&DeviceName, &PdoNameInfo->Name); + if (ReferenceString && ReferenceString->Length) + { + RtlAppendUnicodeToString(&DeviceName, L"\\"); + RtlAppendUnicodeStringToString(&DeviceName, ReferenceString); + } + /* Create symbolic link */ - DPRINT1("IoRegisterDeviceInterface(): creating symbolic link %wZ -> %wZ\n", SymbolicLinkName, &PdoNameInfo->Name); - Status = IoCreateSymbolicLink(SymbolicLinkName, &PdoNameInfo->Name); + DPRINT1("IoRegisterDeviceInterface(): creating symbolic link %wZ -> %wZ\n", SymbolicLinkName, &DeviceName); + Status = IoCreateSymbolicLink(SymbolicLinkName, &DeviceName); + if (!NT_SUCCESS(Status)) { DPRINT("IoCreateSymbolicLink() failed with status 0x%08lx\n", Status); @@ -900,6 +930,7 @@ ExFreePool(SubKeyName.Buffer); ExFreePool(InterfaceKeyName.Buffer); ExFreePool(BaseKeyName.Buffer); + ExFreePool(DeviceName.Buffer); ExFreePool(SymbolicLinkName->Buffer); return Status; } @@ -926,6 +957,7 @@ ExFreePool(SubKeyName.Buffer); ExFreePool(InterfaceKeyName.Buffer); ExFreePool(BaseKeyName.Buffer); + ExFreePool(DeviceName.Buffer); return Status; }