mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 21:45:41 +00:00
Patch by Filip Navara/Hervé Poussineau:
- Simplify device number allocation - Check the case of a NULL Pdo if we're called by a legacy driver svn path=/trunk/; revision=19054
This commit is contained in:
parent
1608efe156
commit
a485607cfc
2 changed files with 15 additions and 38 deletions
|
@ -68,6 +68,8 @@ IntVideoPortAddDevice(
|
|||
IN PDEVICE_OBJECT PhysicalDeviceObject)
|
||||
{
|
||||
PVIDEO_PORT_DRIVER_EXTENSION DriverExtension;
|
||||
PDEVICE_OBJECT DeviceObject;
|
||||
NTSTATUS Status;
|
||||
|
||||
/*
|
||||
* Get the initialization data we saved in VideoPortInitialize.
|
||||
|
@ -79,11 +81,20 @@ IntVideoPortAddDevice(
|
|||
* Create adapter device object.
|
||||
*/
|
||||
|
||||
return IntVideoPortCreateAdapterDeviceObject(
|
||||
Status = IntVideoPortCreateAdapterDeviceObject(
|
||||
DriverObject,
|
||||
DriverExtension,
|
||||
PhysicalDeviceObject,
|
||||
NULL);
|
||||
&DeviceObject);
|
||||
if (!NT_SUCCESS(Status))
|
||||
return Status;
|
||||
|
||||
if (PhysicalDeviceObject == NULL)
|
||||
{
|
||||
/* We will never have a IRP_MJ_PNP/IRP_MN_START_DEVICE Irp */
|
||||
Status = IntVideoPortFindAdapter(DriverObject, DriverExtension, DeviceObject);
|
||||
}
|
||||
return Status;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
|
||||
ULONG CsrssInitialized = FALSE;
|
||||
PKPROCESS Csrss = NULL;
|
||||
ULONG VideoPortDeviceNumber = 0;
|
||||
|
||||
/* PRIVATE FUNCTIONS **********************************************************/
|
||||
|
||||
|
@ -128,41 +129,6 @@ IntVideoPortDeferredRoutine(
|
|||
((PMINIPORT_DPC_ROUTINE)SystemArgument1)(HwDeviceExtension, SystemArgument2);
|
||||
}
|
||||
|
||||
ULONG NTAPI
|
||||
IntVideoPortAllocateDeviceNumber(VOID)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
ULONG DeviceNumber;
|
||||
WCHAR SymlinkBuffer[20];
|
||||
UNICODE_STRING SymlinkName;
|
||||
|
||||
for (DeviceNumber = 0;;)
|
||||
{
|
||||
OBJECT_ATTRIBUTES Obj;
|
||||
HANDLE ObjHandle;
|
||||
|
||||
swprintf(SymlinkBuffer, L"\\??\\DISPLAY%lu", DeviceNumber + 1);
|
||||
RtlInitUnicodeString(&SymlinkName, SymlinkBuffer);
|
||||
InitializeObjectAttributes(&Obj, &SymlinkName, 0, NULL, NULL);
|
||||
Status = ZwOpenSymbolicLinkObject(&ObjHandle, GENERIC_READ, &Obj);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
ZwClose(ObjHandle);
|
||||
DeviceNumber++;
|
||||
continue;
|
||||
}
|
||||
else if (Status == STATUS_OBJECT_NAME_NOT_FOUND)
|
||||
break;
|
||||
else
|
||||
{
|
||||
DPRINT1("ZwOpenSymbolicLinkObject() returned unexpected status: 0x%08lx\n", Status);
|
||||
return 0xFFFFFFFF;
|
||||
}
|
||||
}
|
||||
|
||||
return DeviceNumber;
|
||||
}
|
||||
|
||||
NTSTATUS NTAPI
|
||||
IntVideoPortCreateAdapterDeviceObject(
|
||||
IN PDRIVER_OBJECT DriverObject,
|
||||
|
@ -186,7 +152,7 @@ IntVideoPortCreateAdapterDeviceObject(
|
|||
* object names and symlinks.
|
||||
*/
|
||||
|
||||
DeviceNumber = IntVideoPortAllocateDeviceNumber();
|
||||
DeviceNumber = VideoPortDeviceNumber++;
|
||||
if (DeviceNumber == 0xFFFFFFFF)
|
||||
{
|
||||
DPRINT("Can't find free device number\n");
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue