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 Modified: trunk/reactos/drivers/video/videoprt/dispatch.c Modified: trunk/reactos/drivers/video/videoprt/videoprt.c _____
Modified: trunk/reactos/drivers/video/videoprt/dispatch.c --- trunk/reactos/drivers/video/videoprt/dispatch.c 2005-11-08 08:56:41 UTC (rev 19053) +++ trunk/reactos/drivers/video/videoprt/dispatch.c 2005-11-08 16:24:58 UTC (rev 19054) @@ -68,6 +68,8 @@
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 @@ * 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; }
/* _____
Modified: trunk/reactos/drivers/video/videoprt/videoprt.c --- trunk/reactos/drivers/video/videoprt/videoprt.c 2005-11-08 08:56:41 UTC (rev 19053) +++ trunk/reactos/drivers/video/videoprt/videoprt.c 2005-11-08 16:24:58 UTC (rev 19054) @@ -27,6 +27,7 @@
ULONG CsrssInitialized = FALSE; PKPROCESS Csrss = NULL; +ULONG VideoPortDeviceNumber = 0;
/* PRIVATE FUNCTIONS **********************************************************/
@@ -128,41 +129,6 @@ ((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 @@ * object names and symlinks. */
- DeviceNumber = IntVideoPortAllocateDeviceNumber(); + DeviceNumber = VideoPortDeviceNumber++; if (DeviceNumber == 0xFFFFFFFF) { DPRINT("Can't find free device number\n");