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:
Hervé Poussineau 2005-11-08 16:24:58 +00:00
parent 1608efe156
commit a485607cfc
2 changed files with 15 additions and 38 deletions

View file

@ -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;
}
/*

View file

@ -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");