From 76f55a8a938b31964960cac3d1ef2a0ad9916792 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Wed, 1 Mar 2000 03:25:11 +0000 Subject: [PATCH] Fixed mp driver initialization bug and some other ones svn path=/trunk/; revision=1022 --- reactos/drivers/dd/vidport/vidport.c | 42 +++++++++++++++----------- reactos/include/win32k/gdiobj.h | 1 + reactos/subsys/win32k/misc/driver.c | 14 +++++++-- reactos/subsys/win32k/objects/dc.c | 14 +++++---- reactos/subsys/win32k/objects/gdiobj.c | 15 ++++++++- 5 files changed, 58 insertions(+), 28 deletions(-) diff --git a/reactos/drivers/dd/vidport/vidport.c b/reactos/drivers/dd/vidport/vidport.c index 7a671c1fcce..5f8a79f8cc7 100644 --- a/reactos/drivers/dd/vidport/vidport.c +++ b/reactos/drivers/dd/vidport/vidport.c @@ -1,4 +1,4 @@ -/* $Id: vidport.c,v 1.10 1999/12/29 01:37:30 ekohl Exp $ +/* $Id: vidport.c,v 1.11 2000/03/01 03:25:11 ekohl Exp $ * * VideoPort driver * Written by Rex Jolliff @@ -40,15 +40,7 @@ STDCALL NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) { - DbgPrint("VideoPort Driver %s\n", VERSION); - - // Export other driver entry points... - DriverObject->DriverStartIo = VidStartIo; - DriverObject->MajorFunction[IRP_MJ_CREATE] = VidDispatchOpenClose; - DriverObject->MajorFunction[IRP_MJ_CLOSE] = VidDispatchOpenClose; - DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = VidDispatchDeviceControl; - return STATUS_SUCCESS; } @@ -176,14 +168,16 @@ VideoPortInitialize(IN PVOID Context1, IN PVOID HwContext) { UCHAR Again; - WCHAR UnicodeBuffer[18]; + WCHAR DeviceBuffer[20]; + WCHAR SymlinkBuffer[20]; NTSTATUS Status; - ANSI_STRING AnsiName; - UNICODE_STRING UnicodeName; PDRIVER_OBJECT MPDriverObject = (PDRIVER_OBJECT) Context1; PDEVICE_OBJECT MPDeviceObject; VIDEO_PORT_CONFIG_INFO ConfigInfo; PVIDEOPORT_EXTENSION_DATA ExtensionData; + ULONG DeviceNumber = 0; + UNICODE_STRING DeviceName; + UNICODE_STRING SymlinkName; /* Build Dispatch table from passed data */ MPDriverObject->DriverStartIo = (PDRIVER_STARTIO) HwInitializationData->HwStartIO; @@ -192,17 +186,14 @@ VideoPortInitialize(IN PVOID Context1, Again = FALSE; do { - /* FIXME: Need to add a device index for multiple adapters */ - RtlInitAnsiString(&AnsiName, "\\Device\\Display"); - UnicodeName.MaximumLength = 18 * sizeof(WCHAR); - UnicodeName.Buffer = UnicodeBuffer; - RtlAnsiStringToUnicodeString(&UnicodeName, &AnsiName, FALSE); + swprintf(DeviceBuffer, L"\\Device\\Video%lu", DeviceNumber); + RtlInitUnicodeString(&DeviceName, DeviceBuffer); /* Create the device */ Status = IoCreateDevice(MPDriverObject, HwInitializationData->HwDeviceExtensionSize + sizeof(VIDEOPORT_EXTENSION_DATA), - &UnicodeName, + &DeviceName, FILE_DEVICE_VIDEO, 0, TRUE, @@ -212,6 +203,19 @@ VideoPortInitialize(IN PVOID Context1, DbgPrint("IoCreateDevice call failed\n",0); return Status; } + + /* initialize the miniport drivers dispatch table */ + MPDriverObject->MajorFunction[IRP_MJ_CREATE] = VidDispatchOpenClose; + MPDriverObject->MajorFunction[IRP_MJ_CLOSE] = VidDispatchOpenClose; + MPDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = VidDispatchDeviceControl; + + /* create symbolic link "\??\DISPLAYx" */ + swprintf(SymlinkBuffer, L"\\??\\DISPLAY%lu", DeviceNumber+1); + RtlInitUnicodeString (&SymlinkName, + SymlinkBuffer); + IoCreateSymbolicLink (&SymlinkName, + &DeviceName); + ExtensionData = (PVIDEOPORT_EXTENSION_DATA) MPDeviceObject->DeviceExtension; ExtensionData->DeviceObject = MPDeviceObject; @@ -271,9 +275,11 @@ VideoPortInitialize(IN PVOID Context1, } } + DeviceNumber++; } while (Again); + /* FIXME: initialize timer routine for MP Driver */ if (HwInitializationData->HwTimer != NULL) { diff --git a/reactos/include/win32k/gdiobj.h b/reactos/include/win32k/gdiobj.h index 9ba496f417a..1a87335e4ce 100644 --- a/reactos/include/win32k/gdiobj.h +++ b/reactos/include/win32k/gdiobj.h @@ -64,6 +64,7 @@ typedef struct _GDIOBJHDR typedef PVOID PGDIOBJ; PGDIOBJ GDIOBJ_AllocObject(WORD Size, WORD Magic); +BOOL GDIOBJ_FreeObject (PGDIOBJ Obj, WORD Magic); HGDIOBJ GDIOBJ_PtrToHandle (PGDIOBJ Obj, WORD Magic); PGDIOBJ GDIOBJ_HandleToPtr (HGDIOBJ Obj, WORD Magic); BOOL GDIOBJ_LockObject (HGDIOBJ Obj); diff --git a/reactos/subsys/win32k/misc/driver.c b/reactos/subsys/win32k/misc/driver.c index 53b2c089b76..da5168a2f72 100644 --- a/reactos/subsys/win32k/misc/driver.c +++ b/reactos/subsys/win32k/misc/driver.c @@ -1,4 +1,4 @@ -/* $Id: driver.c,v 1.6 1999/12/09 02:45:05 rex Exp $ +/* $Id: driver.c,v 1.7 2000/03/01 03:23:42 ekohl Exp $ * * GDI Driver support routines * (mostly swiped from Wine) @@ -90,8 +90,16 @@ HANDLE DRIVER_FindMPDriver(LPCWSTR Name) { lName = ExAllocatePool(NonPagedPool, wcslen(Name) * sizeof(WCHAR) + 10 * sizeof(WCHAR)); - wcscpy(lName, L"\\Devices\\"); - wcscat(lName, Name); + wcscpy(lName, L"\\??\\"); + if (!wcscmp (Name, L"DISPLAY")) + { + /* FIXME: Read this information from the registry ??? */ + wcscat(lName, L"DISPLAY1"); + } + else + { + wcscat(lName, Name); + } } else { diff --git a/reactos/subsys/win32k/objects/dc.c b/reactos/subsys/win32k/objects/dc.c index 4a0f3529b0b..cf7a3b79165 100644 --- a/reactos/subsys/win32k/objects/dc.c +++ b/reactos/subsys/win32k/objects/dc.c @@ -1,4 +1,4 @@ -/* $Id: dc.c,v 1.10 1999/12/09 02:45:06 rex Exp $ +/* $Id: dc.c,v 1.11 2000/03/01 03:23:57 ekohl Exp $ * * DC.C - Device context functions * @@ -13,6 +13,7 @@ #include #include #include +#include // #define NDEBUG #include @@ -163,7 +164,7 @@ HDC STDCALL W32kCreateDC(LPCWSTR Driver, { PGD_ENABLEDRIVER GDEnableDriver; PDC NewDC; - HDC hDC; + HDC hDC = NULL; DRVENABLEDATA DED; /* Check for existing DC object */ @@ -866,7 +867,7 @@ PDC DC_AllocDC(LPCWSTR Driver) if (Driver != NULL) { NewDC->DriverName = ExAllocatePool(NonPagedPool, - wcslen(Driver) * sizeof(WCHAR)); + (wcslen(Driver) + 1) * sizeof(WCHAR)); wcscpy(NewDC->DriverName, Driver); } @@ -895,10 +896,11 @@ void DC_InitDC(PDC DCToInit) void DC_FreeDC(PDC DCToFree) { - PDC Tmp; - ExFreePool(DCToFree->DriverName); - ExFreePool(DCToFree); + if (!GDIOBJ_FreeObject((PGDIOBJ)DCToFree, GO_DC_MAGIC)) + { + DbgPrint("DC_FreeDC failed\n"); + } } void diff --git a/reactos/subsys/win32k/objects/gdiobj.c b/reactos/subsys/win32k/objects/gdiobj.c index 50ed414c1db..4e98819bb16 100644 --- a/reactos/subsys/win32k/objects/gdiobj.c +++ b/reactos/subsys/win32k/objects/gdiobj.c @@ -1,7 +1,7 @@ /* * GDIOBJ.C - GDI object manipulation routines * - * $Id: gdiobj.c,v 1.4 1999/11/17 20:54:05 rex Exp $ + * $Id: gdiobj.c,v 1.5 2000/03/01 03:23:57 ekohl Exp $ * */ @@ -29,6 +29,19 @@ PGDIOBJ GDIOBJ_AllocObject(WORD Size, WORD Magic) return (PGDIOBJ)(((PCHAR) NewObj) + sizeof (GDIOBJHDR)); } +BOOL GDIOBJ_FreeObject (PGDIOBJ Obj, WORD Magic) +{ + PGDIOBJHDR ObjHdr; + + ObjHdr = (PGDIOBJHDR)(((PCHAR)Obj) - sizeof (GDIOBJHDR)); + if (ObjHdr->wMagic != Magic) + { + return FALSE; + } + ExFreePool (ObjHdr); + return TRUE; +} + HGDIOBJ GDIOBJ_PtrToHandle (PGDIOBJ Obj, WORD Magic) { PGDIOBJHDR objHeader;