From f1d20bbf5422079fa632e56743854f2ccf329c10 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sat, 6 Mar 2004 01:22:04 +0000 Subject: [PATCH] 2004-03-06 Filip Navara * drivers/video/videoprt/int10.c (VideoPortInt10): Print more debug informations. * drivers/video/videoprt/videoprt.c (VideoPortInitialize): Prevent conflicts when more miniport drivers are loaded. (VideoPortGetDeviceBase, VideoPortMapMemory, InternalMapMemory): Change way of reporting error to prevent reporting error when the resources were successfully mapped. (VideoPortDDCMonitorHelper): Add stub. (VidDispatchDeviceControl): Allocate memory from NonPagedPool. Add debug messages. * drivers/video/videoprt/videoprt.def (VideoPortDDCMonitorHelper): Add export. * drivers/video/videoprt/videoprt.edf (VideoPortDDCMonitorHelper): Ditto. * include/ddk/winddi.h (ENG_SYSTEM_ATTRIBUTE): Declare. * include/win32k/driver.h (DRIVER_FindMPDriver): Change declaration. * subsys/win32k/eng/surface.c (EngModifySurface): Implement. * subsys/win32k/misc/driver.c (DRIVER_FindMPDriver): Modify to open specific miniport driver depending on parameter. * subsys/win32k/objects/dc.c (GetRegistryPath): Add parameter to specify display driver number. (FindDriverFileNames): Ditto. (SetupDevMode): Ditto. (IntCreateDC): Correct DPRINT. (IntCreatePrimarySurface): Change to try more miniport drivers before giving up. * subsys/win32k/stubs/stubs.c (HeapVidMemAllocAligned, VidMemFree, EngDitherColor, EngQuerySystemAttribute): Add stubs. * subsys/win32k/win32k.edf (EngDitherColor, EngQuerySystemAttribute, HeapVidMemAllocAligned, VidMemFree, EngModifySurface): Add exports. * subsys/win32k/win32k.def: Ditto. svn path=/trunk/; revision=8547 --- reactos/drivers/video/videoprt/int10.c | 9 +- reactos/drivers/video/videoprt/videoprt.c | 180 +++++++--- reactos/drivers/video/videoprt/videoprt.def | 3 +- reactos/drivers/video/videoprt/videoprt.edf | 3 +- reactos/drivers/video/videoprt/videoprt.h | 7 +- reactos/include/ddk/winddi.h | 7 + reactos/include/win32k/driver.h | 2 +- reactos/subsys/win32k/eng/surface.c | 38 +- reactos/subsys/win32k/misc/driver.c | 8 +- reactos/subsys/win32k/objects/dc.c | 370 +++++++++++--------- reactos/subsys/win32k/stubs/stubs.c | 64 ++++ reactos/subsys/win32k/win32k.def | 7 +- reactos/subsys/win32k/win32k.edf | 7 +- 13 files changed, 472 insertions(+), 233 deletions(-) diff --git a/reactos/drivers/video/videoprt/int10.c b/reactos/drivers/video/videoprt/int10.c index 34efdef34af..87121980c26 100644 --- a/reactos/drivers/video/videoprt/int10.c +++ b/reactos/drivers/video/videoprt/int10.c @@ -18,7 +18,7 @@ * If not, write to the Free Software Foundation, * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Id: int10.c,v 1.2 2004/02/22 22:19:42 navaraf Exp $ + * $Id: int10.c,v 1.3 2004/03/06 01:22:02 navaraf Exp $ */ #include "videoprt.h" @@ -56,12 +56,19 @@ VideoPortInt10( } memset(&Regs, 0, sizeof(Regs)); + DPRINT("- Input register Eax: %x\n", BiosArguments->Eax); Regs.Eax = BiosArguments->Eax; + DPRINT("- Input register Ebx: %x\n", BiosArguments->Ebx); Regs.Ebx = BiosArguments->Ebx; + DPRINT("- Input register Ecx: %x\n", BiosArguments->Ecx); Regs.Ecx = BiosArguments->Ecx; + DPRINT("- Input register Edx: %x\n", BiosArguments->Edx); Regs.Edx = BiosArguments->Edx; + DPRINT("- Input register Esi: %x\n", BiosArguments->Esi); Regs.Esi = BiosArguments->Esi; + DPRINT("- Input register Edi: %x\n", BiosArguments->Edi); Regs.Edi = BiosArguments->Edi; + DPRINT("- Input register Ebp: %x\n", BiosArguments->Ebp); Regs.Ebp = BiosArguments->Ebp; Status = Ke386CallBios(0x10, &Regs); diff --git a/reactos/drivers/video/videoprt/videoprt.c b/reactos/drivers/video/videoprt/videoprt.c index 3cd5e90506d..8d8a4f35e68 100644 --- a/reactos/drivers/video/videoprt/videoprt.c +++ b/reactos/drivers/video/videoprt/videoprt.c @@ -18,7 +18,7 @@ * If not, write to the Free Software Foundation, * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Id: videoprt.c,v 1.5 2004/03/04 18:51:58 navaraf Exp $ + * $Id: videoprt.c,v 1.6 2004/03/06 01:22:02 navaraf Exp $ */ #include "videoprt.h" @@ -155,7 +155,7 @@ VideoPortGetDeviceBase(IN PVOID HwDeviceExtension, VIDEO_PORT_DEVICE_EXTENSION, MiniPortDeviceExtension); - return InternalMapMemory(DeviceExtension, IoAddress, NumberOfUchars, InIoSpace); + return InternalMapMemory(DeviceExtension, IoAddress, NumberOfUchars, InIoSpace, NULL); } @@ -208,8 +208,11 @@ VideoPortGetAccessRanges(IN PVOID HwDeviceExtension, if (0 == NumRequestedResources && PCIBus == DeviceExtension->AdapterInterfaceType) { - DPRINT("Looking for VendorId 0x%04x DeviceId 0x%04x\n", (int)*((USHORT *) VendorId), - (int)*((USHORT *) DeviceId)); + if (DeviceId != NULL && VendorId != NULL) + { + DPRINT("Looking for VendorId 0x%04x DeviceId 0x%04x\n", (int)*((USHORT *) VendorId), + (int)*((USHORT *) DeviceId)); + } FoundDevice = FALSE; PciSlotNumber.u.AsULONG = *Slot; for (FunctionNumber = 0; ! FoundDevice && FunctionNumber < 8; FunctionNumber++) @@ -220,11 +223,15 @@ VideoPortGetAccessRanges(IN PVOID HwDeviceExtension, PciSlotNumber.u.AsULONG,&Config, 0, sizeof(PCI_COMMON_CONFIG))) { - DPRINT("Slot 0x%02x (Device %d Function %d) VendorId 0x%04x DeviceId 0x%04x\n", - PciSlotNumber.u.AsULONG, PciSlotNumber.u.bits.DeviceNumber, - PciSlotNumber.u.bits.FunctionNumber, Config.VendorID, Config.DeviceID); - FoundDevice = (Config.VendorID == *((USHORT *) VendorId) && - Config.DeviceID == *((USHORT *) DeviceId)); + if (DeviceId != NULL && VendorId != NULL) + { + DPRINT("Slot 0x%02x (Device %d Function %d) VendorId 0x%04x DeviceId 0x%04x\n", + PciSlotNumber.u.AsULONG, PciSlotNumber.u.bits.DeviceNumber, + PciSlotNumber.u.bits.FunctionNumber, Config.VendorID, Config.DeviceID); + } + + FoundDevice = (VendorId == NULL || Config.VendorID == *((USHORT *) VendorId)) && + (DeviceId == NULL || Config.DeviceID == *((USHORT *) DeviceId)); } } if (! FoundDevice) @@ -451,7 +458,7 @@ VideoPortInitialize(IN PVOID Context1, IN PVOID HwContext) { PUNICODE_STRING RegistryPath; - UCHAR Again; + UCHAR Again = FALSE; WCHAR DeviceBuffer[20]; WCHAR SymlinkBuffer[20]; WCHAR DeviceVideoBuffer[20]; @@ -460,7 +467,7 @@ VideoPortInitialize(IN PVOID Context1, PDEVICE_OBJECT MPDeviceObject; VIDEO_PORT_CONFIG_INFO ConfigInfo; PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; - ULONG DeviceNumber = 0; + ULONG DisplayNumber; UNICODE_STRING DeviceName; UNICODE_STRING SymlinkName; ULONG MaxBus; @@ -468,30 +475,59 @@ VideoPortInitialize(IN PVOID Context1, KIRQL IRQL; KAFFINITY Affinity; ULONG InterruptVector; + OBJECT_ATTRIBUTES Obj; + HANDLE ObjHandle; DPRINT("VideoPortInitialize\n"); RegistryPath = (PUNICODE_STRING) Context2; - /* Build Dispatch table from passed data */ + /* Build Dispatch table from passed data */ MPDriverObject->DriverStartIo = (PDRIVER_STARTIO) HwInitializationData->HwStartIO; - /* Create a unicode device name */ + /* Find the first free device number */ + for (DisplayNumber = 0;;) + { + swprintf(SymlinkBuffer, L"\\??\\DISPLAY%lu", DisplayNumber + 1); + RtlInitUnicodeString(&SymlinkName, SymlinkBuffer); + InitializeObjectAttributes(&Obj, &SymlinkName, 0, NULL, NULL); + Status = ZwOpenSymbolicLinkObject(&ObjHandle, GENERIC_READ, &Obj); + if (NT_SUCCESS(Status)) + { + ZwClose(ObjHandle); + DisplayNumber++; + continue; + } + else if (Status == STATUS_NOT_FOUND || Status == STATUS_UNSUCCESSFUL) + { + break; + } + else + { + return Status; + } + } + + DPRINT("- DisplayNumber: %d\n", DisplayNumber); + Again = FALSE; + do { - swprintf(DeviceBuffer, L"\\Device\\Video%lu", DeviceNumber); + /* Create a unicode device name. */ + swprintf(DeviceBuffer, L"\\Device\\Video%lu", DisplayNumber); RtlInitUnicodeString(&DeviceName, DeviceBuffer); - /* Create the device */ - Status = IoCreateDevice(MPDriverObject, - HwInitializationData->HwDeviceExtensionSize + - sizeof(VIDEO_PORT_DEVICE_EXTENSION), - &DeviceName, - FILE_DEVICE_VIDEO, - 0, - TRUE, - &MPDeviceObject); + /* Create the device. */ + Status = IoCreateDevice( + MPDriverObject, + HwInitializationData->HwDeviceExtensionSize + + sizeof(VIDEO_PORT_DEVICE_EXTENSION), + &DeviceName, + FILE_DEVICE_VIDEO, + 0, + TRUE, + &MPDeviceObject); if (!NT_SUCCESS(Status)) { DPRINT("IoCreateDevice call failed with status 0x%08x\n", Status); @@ -518,8 +554,8 @@ VideoPortInitialize(IN PVOID Context1, DeviceExtension->RegistryPath.Buffer = ExAllocatePoolWithTag(PagedPool, MaxLen, TAG_VIDEO_PORT); - swprintf(DeviceExtension->RegistryPath.Buffer, L"%s\\Device%d", - RegistryPath->Buffer, DeviceNumber); + swprintf(DeviceExtension->RegistryPath.Buffer, L"%s\\Device0", + RegistryPath->Buffer); DeviceExtension->RegistryPath.Length = wcslen(DeviceExtension->RegistryPath.Buffer) * sizeof(WCHAR); @@ -569,14 +605,14 @@ VideoPortInitialize(IN PVOID Context1, DPRINT("Found adapter\n"); /* create symbolic link "\??\DISPLAYx" */ - swprintf(SymlinkBuffer, L"\\??\\DISPLAY%lu", DeviceNumber+1); + swprintf(SymlinkBuffer, L"\\??\\DISPLAY%lu", DisplayNumber + 1); RtlInitUnicodeString (&SymlinkName, SymlinkBuffer); IoCreateSymbolicLink (&SymlinkName, &DeviceName); /* Add entry to DEVICEMAP\VIDEO key in registry */ - swprintf(DeviceVideoBuffer, L"\\Device\\Video%d", DeviceNumber); + swprintf(DeviceVideoBuffer, L"\\Device\\Video%d", DisplayNumber); RtlWriteRegistryValue(RTL_REGISTRY_DEVICEMAP, L"VIDEO", DeviceVideoBuffer, @@ -632,7 +668,7 @@ VideoPortInitialize(IN PVOID Context1, return Status; } } - DeviceNumber++; + DisplayNumber++; } while (Again); @@ -712,6 +748,7 @@ VideoPortMapMemory(IN PVOID HwDeviceExtension, OUT PVOID *VirtualAddress) { PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; + NTSTATUS Status; DPRINT("VideoPortMapMemory\n"); @@ -719,9 +756,9 @@ VideoPortMapMemory(IN PVOID HwDeviceExtension, VIDEO_PORT_DEVICE_EXTENSION, MiniPortDeviceExtension); *VirtualAddress = InternalMapMemory(DeviceExtension, PhysicalAddress, - *Length, *InIoSpace); + *Length, *InIoSpace, &Status); - return NULL == *VirtualAddress ? STATUS_NO_MEMORY : STATUS_SUCCESS; + return Status; } @@ -1133,7 +1170,7 @@ VidDispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject, DeviceExtension = DeviceObject->DeviceExtension; /* Translate the IRP to a VRP */ - vrp = ExAllocatePool(PagedPool, sizeof(VIDEO_REQUEST_PACKET)); + vrp = ExAllocatePool(NonPagedPool, sizeof(VIDEO_REQUEST_PACKET)); if (NULL == vrp) { return STATUS_NO_MEMORY; @@ -1141,6 +1178,8 @@ VidDispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject, vrp->StatusBlock = (PSTATUS_BLOCK) &(Irp->IoStatus); vrp->IoControlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode; + DPRINT("- IoControlCode: %x\n", vrp->IoControlCode); + /* We're assuming METHOD_BUFFERED */ vrp->InputBuffer = Irp->AssociatedIrp.SystemBuffer; vrp->InputBufferLength = IrpStack->Parameters.DeviceIoControl.InputBufferLength; @@ -1153,6 +1192,8 @@ VidDispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject, /* Free the VRP */ ExFreePool(vrp); + DPRINT("- Returned status: %x\n", Irp->IoStatus.Status); + IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; @@ -1162,7 +1203,8 @@ PVOID STDCALL InternalMapMemory(IN PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension, IN PHYSICAL_ADDRESS IoAddress, IN ULONG NumberOfUchars, - IN UCHAR InIoSpace) + IN UCHAR InIoSpace, + OUT NTSTATUS *Status) { PHYSICAL_ADDRESS TranslatedAddress; PVIDEO_PORT_ADDRESS_MAPPING AddressMapping; @@ -1187,6 +1229,10 @@ InternalMapMemory(IN PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension, NumberOfUchars <= AddressMapping->NumberOfUchars) { AddressMapping->MappingCount++; + if (Status) + { + *Status = STATUS_SUCCESS; + } return AddressMapping->MappedAddress; } Entry = Entry->Flink; @@ -1199,35 +1245,62 @@ InternalMapMemory(IN PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension, IoAddress, &AddressSpace, &TranslatedAddress) == FALSE) - return NULL; + { + if (Status) + { + *Status = STATUS_NO_MEMORY; + } + return NULL; + } /* i/o space */ if (AddressSpace != 0) { - assert(0 == TranslatedAddress.u.HighPart); - return (PVOID) TranslatedAddress.u.LowPart; + assert(0 == TranslatedAddress.u.HighPart); + if (Status) + { + *Status = STATUS_SUCCESS; + } + return (PVOID) TranslatedAddress.u.LowPart; } MappedAddress = MmMapIoSpace(TranslatedAddress, NumberOfUchars, FALSE); - AddressMapping = ExAllocatePoolWithTag(PagedPool, - sizeof(VIDEO_PORT_ADDRESS_MAPPING), - TAG_VIDEO_PORT); - if (AddressMapping == NULL) - return MappedAddress; + if (MappedAddress) + { + if (Status) + { + *Status = STATUS_SUCCESS; + } - AddressMapping->MappedAddress = MappedAddress; - AddressMapping->NumberOfUchars = NumberOfUchars; - AddressMapping->IoAddress = IoAddress; - AddressMapping->SystemIoBusNumber = DeviceExtension->SystemIoBusNumber; - AddressMapping->MappingCount = 1; + AddressMapping = ExAllocatePoolWithTag(PagedPool, + sizeof(VIDEO_PORT_ADDRESS_MAPPING), + TAG_VIDEO_PORT); + if (AddressMapping == NULL) + return MappedAddress; - InsertHeadList(&DeviceExtension->AddressMappingListHead, - &AddressMapping->List); + AddressMapping->MappedAddress = MappedAddress; + AddressMapping->NumberOfUchars = NumberOfUchars; + AddressMapping->IoAddress = IoAddress; + AddressMapping->SystemIoBusNumber = DeviceExtension->SystemIoBusNumber; + AddressMapping->MappingCount = 1; - return MappedAddress; + InsertHeadList(&DeviceExtension->AddressMappingListHead, + &AddressMapping->List); + + return MappedAddress; + } + else + { + if (Status) + { + *Status = STATUS_NO_MEMORY; + } + + return NULL; + } } VOID STDCALL @@ -1261,3 +1334,14 @@ InternalUnmapMemory(IN PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension, Entry = Entry->Flink; } } + +BOOLEAN STDCALL +VideoPortDDCMonitorHelper( + PVOID HwDeviceExtension, + /*PI2C_FNC_TABLE*/PVOID I2CFunctions, + PUCHAR pEdidBuffer, + ULONG EdidBufferSize + ) +{ + return FALSE; +} diff --git a/reactos/drivers/video/videoprt/videoprt.def b/reactos/drivers/video/videoprt/videoprt.def index 361457e1490..2d4ff5a9105 100644 --- a/reactos/drivers/video/videoprt/videoprt.def +++ b/reactos/drivers/video/videoprt/videoprt.def @@ -1,10 +1,11 @@ -; $Id: videoprt.def,v 1.2 2004/02/25 02:59:55 jimtabor Exp $ +; $Id: videoprt.def,v 1.3 2004/03/06 01:22:02 navaraf Exp $ ; ; vidport.def - export definition file for ReactOS ; EXPORTS ReturnCsrssAddress VideoPortCompareMemory@12 +VideoPortDDCMonitorHelper@16 VideoPortDebugPrint VideoPortDisableInterrupt@4 VideoPortEnableInterrupt@4 diff --git a/reactos/drivers/video/videoprt/videoprt.edf b/reactos/drivers/video/videoprt/videoprt.edf index 47e9cfb65bc..6c6bbbfdd3b 100644 --- a/reactos/drivers/video/videoprt/videoprt.edf +++ b/reactos/drivers/video/videoprt/videoprt.edf @@ -1,10 +1,11 @@ -; $Id: videoprt.edf,v 1.2 2004/02/25 03:05:27 jimtabor Exp $ +; $Id: videoprt.edf,v 1.3 2004/03/06 01:22:02 navaraf Exp $ ; ; vidport.def - export definition file for ReactOS ; EXPORTS VideoPortCompareMemory=NTOSKRNL.RtlCompareMemory VideoPortAllocatePool=VideoPortAllocatePool@16 +VideoPortDDCMonitorHelper=VideoPortDDCMonitorHelper@16 VideoPortDebugPrint VideoPortDisableInterrupt=VideoPortDisableInterrupt@4 VideoPortEnableInterrupt=VideoPortEnableInterrupt@4 diff --git a/reactos/drivers/video/videoprt/videoprt.h b/reactos/drivers/video/videoprt/videoprt.h index ec69dfa91f6..b9f5e92cd1d 100644 --- a/reactos/drivers/video/videoprt/videoprt.h +++ b/reactos/drivers/video/videoprt/videoprt.h @@ -18,7 +18,7 @@ * If not, write to the Free Software Foundation, * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Id: videoprt.h,v 1.1 2004/01/19 15:56:53 navaraf Exp $ + * $Id: videoprt.h,v 1.2 2004/03/06 01:22:02 navaraf Exp $ */ #ifndef VIDEOPRT_H @@ -86,9 +86,10 @@ VidDispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); PVOID STDCALL InternalMapMemory( IN PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension, - IN PHYSICAL_ADDRESS IoAddress, + IN PHYSICAL_ADDRESS IoAddress, IN ULONG NumberOfUchars, - IN UCHAR InIoSpace); + IN UCHAR InIoSpace, + OUT NTSTATUS *Status); VOID STDCALL InternalUnmapMemory( diff --git a/reactos/include/ddk/winddi.h b/reactos/include/ddk/winddi.h index d6d40fdf533..deb43990caf 100644 --- a/reactos/include/ddk/winddi.h +++ b/reactos/include/ddk/winddi.h @@ -867,6 +867,13 @@ typedef struct _ENG_TIME_FIELDS USHORT usWeekday; } ENG_TIME_FIELDS, *PENG_TIME_FIELDS; +typedef enum _ENG_SYSTEM_ATTRIBUTE { + EngProcessorFeature = 1, + EngNumberOfProcessors, + EngOptimumAvailableUserMemory, + EngOptimumAvailableSystemMemory, +} ENG_SYSTEM_ATTRIBUTE; + typedef struct _LINEATTRS { FLONG fl; diff --git a/reactos/include/win32k/driver.h b/reactos/include/win32k/driver.h index 06485fbe2d8..9a7d7aa604e 100644 --- a/reactos/include/win32k/driver.h +++ b/reactos/include/win32k/driver.h @@ -162,7 +162,7 @@ typedef struct _DRIVER_FUNCTIONS BOOL DRIVER_RegisterDriver(LPCWSTR Name, PGD_ENABLEDRIVER EnableDriver); PGD_ENABLEDRIVER DRIVER_FindDDIDriver(LPCWSTR Name); -PFILE_OBJECT DRIVER_FindMPDriver(LPCWSTR Name); +PFILE_OBJECT DRIVER_FindMPDriver(ULONG DisplayNumber); BOOL DRIVER_BuildDDIFunctions(PDRVENABLEDATA DED, PDRIVER_FUNCTIONS DF); BOOL DRIVER_UnregisterDriver(LPCWSTR Name); diff --git a/reactos/subsys/win32k/eng/surface.c b/reactos/subsys/win32k/eng/surface.c index 45b98f52bf3..9ced7dcd2eb 100644 --- a/reactos/subsys/win32k/eng/surface.c +++ b/reactos/subsys/win32k/eng/surface.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: surface.c,v 1.32 2004/02/14 22:24:54 navaraf Exp $ +/* $Id: surface.c,v 1.33 2004/03/06 01:22:03 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -477,6 +477,42 @@ EngAssociateSurface(IN HSURF Surface, return TRUE; } +/* + * @implemented + */ +BOOL STDCALL +EngModifySurface( + IN HSURF hsurf, + IN HDEV hdev, + IN FLONG flHooks, + IN FLONG flSurface, + IN DHSURF dhsurf, + OUT VOID *pvScan0, + IN LONG lDelta, + IN VOID *pvReserved) +{ + SURFOBJ *pso; + + pso = EngLockSurface(hsurf); + if (pso == NULL) + { + return FALSE; + } + + if (!EngAssociateSurface(hsurf, hdev, flHooks)) + { + return FALSE; + } + + pso->dhsurf = dhsurf; + pso->lDelta = lDelta; + pso->pvScan0 = pvScan0; + + EngUnlockSurface(pso); + + return TRUE; +} + /* * @implemented */ diff --git a/reactos/subsys/win32k/misc/driver.c b/reactos/subsys/win32k/misc/driver.c index 8bc4753b8dd..c87e80a013b 100644 --- a/reactos/subsys/win32k/misc/driver.c +++ b/reactos/subsys/win32k/misc/driver.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: driver.c,v 1.36 2004/02/22 12:06:43 weiden Exp $ +/* $Id: driver.c,v 1.37 2004/03/06 01:22:03 navaraf Exp $ * * GDI Driver support routines * (mostly swiped from Wine) @@ -236,16 +236,18 @@ BOOL DRIVER_BuildDDIFunctions(PDRVENABLEDATA DED, typedef VP_STATUS (*PMP_DRIVERENTRY)(PVOID, PVOID); -PFILE_OBJECT DRIVER_FindMPDriver(LPCWSTR Name) +PFILE_OBJECT DRIVER_FindMPDriver(ULONG DisplayNumber) { OBJECT_ATTRIBUTES ObjectAttributes; + WCHAR DeviceNameBuffer[20]; UNICODE_STRING DeviceName; IO_STATUS_BLOCK Iosb; HANDLE DisplayHandle; NTSTATUS Status; PFILE_OBJECT VideoFileObject; - RtlRosInitUnicodeStringFromLiteral(&DeviceName, L"\\??\\DISPLAY1"); + swprintf(DeviceNameBuffer, L"\\??\\DISPLAY%d", DisplayNumber + 1); + RtlInitUnicodeString(&DeviceName, DeviceNameBuffer); InitializeObjectAttributes(&ObjectAttributes, &DeviceName, 0, diff --git a/reactos/subsys/win32k/objects/dc.c b/reactos/subsys/win32k/objects/dc.c index 19fa36ca070..04f4abe3288 100644 --- a/reactos/subsys/win32k/objects/dc.c +++ b/reactos/subsys/win32k/objects/dc.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: dc.c,v 1.122 2004/03/05 09:02:42 hbirr Exp $ +/* $Id: dc.c,v 1.123 2004/03/06 01:22:03 navaraf Exp $ * * DC.C - Device context functions * @@ -239,15 +239,17 @@ NtGdiCreateCompatableDC(HDC hDC) } static BOOL FASTCALL -GetRegistryPath(PUNICODE_STRING RegistryPath) +GetRegistryPath(PUNICODE_STRING RegistryPath, ULONG DisplayNumber) { RTL_QUERY_REGISTRY_TABLE QueryTable[2]; + WCHAR DeviceNameBuffer[20]; NTSTATUS Status; + swprintf(DeviceNameBuffer, L"\\Device\\Video%d", DisplayNumber); RtlInitUnicodeString(RegistryPath, NULL); RtlZeroMemory(QueryTable, sizeof(QueryTable)); QueryTable[0].Flags = RTL_QUERY_REGISTRY_REQUIRED | RTL_QUERY_REGISTRY_DIRECT; - QueryTable[0].Name = L"\\Device\\Video0"; + QueryTable[0].Name = DeviceNameBuffer; QueryTable[0].EntryContext = RegistryPath; Status = RtlQueryRegistryValues(RTL_REGISTRY_DEVICEMAP, @@ -257,7 +259,7 @@ GetRegistryPath(PUNICODE_STRING RegistryPath) NULL); if (! NT_SUCCESS(Status)) { - DPRINT1("No \\Device\\Video0 value in DEVICEMAP\\VIDEO found\n"); + DPRINT1("No \\Device\\Video%d value in DEVICEMAP\\VIDEO found\n", DisplayNumber); return FALSE; } @@ -267,13 +269,13 @@ GetRegistryPath(PUNICODE_STRING RegistryPath) } static BOOL FASTCALL -FindDriverFileNames(PUNICODE_STRING DriverFileNames) +FindDriverFileNames(PUNICODE_STRING DriverFileNames, ULONG DisplayNumber) { RTL_QUERY_REGISTRY_TABLE QueryTable[2]; UNICODE_STRING RegistryPath; NTSTATUS Status; - if (! GetRegistryPath(&RegistryPath)) + if (! GetRegistryPath(&RegistryPath, DisplayNumber)) { DPRINT("GetRegistryPath failed\n"); return FALSE; @@ -350,7 +352,7 @@ DevModeCallback(IN PWSTR ValueName, } static BOOL FASTCALL -SetupDevMode(PDEVMODEW DevMode) +SetupDevMode(PDEVMODEW DevMode, ULONG DisplayNumber) { static WCHAR RegistryMachineSystem[] = L"\\REGISTRY\\MACHINE\\SYSTEM\\"; static WCHAR CurrentControlSet[] = L"CURRENTCONTROLSET\\"; @@ -363,7 +365,7 @@ SetupDevMode(PDEVMODEW DevMode) RTL_QUERY_REGISTRY_TABLE QueryTable[2]; NTSTATUS Status; - if (! GetRegistryPath(&RegistryPath)) + if (! GetRegistryPath(&RegistryPath, DisplayNumber)) { DPRINT("GetRegistryPath failed\n"); return FALSE; @@ -464,187 +466,208 @@ SetupDevMode(PDEVMODEW DevMode) BOOL FASTCALL IntCreatePrimarySurface() { - PGD_ENABLEDRIVER GDEnableDriver; - DRVENABLEDATA DED; - PSURFOBJ SurfObj; - PSURFGDI SurfGDI; - UNICODE_STRING DriverFileNames; - PWSTR CurrentName; - BOOL GotDriver; - BOOL DoDefault; + PGD_ENABLEDRIVER GDEnableDriver; + DRVENABLEDATA DED; + PSURFOBJ SurfObj; + PSURFGDI SurfGDI; + UNICODE_STRING DriverFileNames; + PWSTR CurrentName; + BOOL GotDriver; + BOOL DoDefault; + ULONG DisplayNumber; - RtlZeroMemory(&PrimarySurface, sizeof(PrimarySurface)); + for (DisplayNumber = 0; ; DisplayNumber++) + { + DPRINT("Trying to load display driver no. %d\n", DisplayNumber); - ExInitializeFastMutex(&PrimarySurface.DriverLock); + RtlZeroMemory(&PrimarySurface, sizeof(PrimarySurface)); + ExInitializeFastMutex(&PrimarySurface.DriverLock); - /* Open the miniport driver */ - if ((PrimarySurface.VideoFileObject = DRIVER_FindMPDriver(L"DISPLAY")) == NULL) - { - DPRINT1("FindMPDriver failed\n"); - return FALSE; - } + PrimarySurface.VideoFileObject = DRIVER_FindMPDriver(DisplayNumber); - /* Retrieve DDI driver names from registry */ - RtlInitUnicodeString(&DriverFileNames, NULL); - if (! FindDriverFileNames(&DriverFileNames)) - { - DPRINT1("FindDriverFileNames failed\n"); - return FALSE; - } + /* Open the miniport driver */ + if (PrimarySurface.VideoFileObject == NULL) + { + DPRINT1("FindMPDriver failed\n"); + return FALSE; + } - /* DriverFileNames may be a list of drivers in REG_SZ_MULTI format, scan all of - them until a good one found */ - CurrentName = DriverFileNames.Buffer; - GotDriver = FALSE; - while (! GotDriver && CurrentName < DriverFileNames.Buffer + DriverFileNames.Length) - { - /* Get the DDI driver's entry point */ - GDEnableDriver = DRIVER_FindDDIDriver(CurrentName); - if (NULL == GDEnableDriver) - { - DPRINT("FindDDIDriver failed for %S\n", CurrentName); - } + /* Retrieve DDI driver names from registry */ + RtlInitUnicodeString(&DriverFileNames, NULL); + if (!FindDriverFileNames(&DriverFileNames, DisplayNumber)) + { + DPRINT1("FindDriverFileNames failed\n"); + /* return FALSE; */ + continue; + } + + /* + * DriverFileNames may be a list of drivers in REG_SZ_MULTI format, + * scan all of them until a good one found. + */ + CurrentName = DriverFileNames.Buffer; + GotDriver = FALSE; + while (!GotDriver && + CurrentName < DriverFileNames.Buffer + DriverFileNames.Length) + { + /* Get the DDI driver's entry point */ + GDEnableDriver = DRIVER_FindDDIDriver(CurrentName); + if (NULL == GDEnableDriver) + { + DPRINT("FindDDIDriver failed for %S\n", CurrentName); + } + else + { + /* Call DDI driver's EnableDriver function */ + RtlZeroMemory(&DED, sizeof(DED)); + + if (! GDEnableDriver(DDI_DRIVER_VERSION, sizeof(DED), &DED)) + { + DPRINT("DrvEnableDriver failed for %S\n", CurrentName); + } + else + { + GotDriver = TRUE; + } + } + + if (! GotDriver) + { + /* Skip to the next name but never get past the Unicode string */ + while (L'\0' != *CurrentName && + CurrentName < DriverFileNames.Buffer + DriverFileNames.Length) + { + CurrentName++; + } + if (CurrentName < DriverFileNames.Buffer + DriverFileNames.Length) + { + CurrentName++; + } + } + } + + RtlFreeUnicodeString(&DriverFileNames); + + if (!GotDriver) + { + ObDereferenceObject(PrimarySurface.VideoFileObject); + DPRINT1("No suitable DDI driver found\n"); + /* return FALSE; */ + continue; + } + + DPRINT("Display driver %S loaded\n", CurrentName); + + DPRINT("Building DDI Functions\n"); + + /* Construct DDI driver function dispatch table */ + if (!DRIVER_BuildDDIFunctions(&DED, &PrimarySurface.DriverFunctions)) + { + ObDereferenceObject(PrimarySurface.VideoFileObject); + DPRINT1("BuildDDIFunctions failed\n"); + return FALSE; + } + + /* Allocate a phyical device handle from the driver */ + if (SetupDevMode(&PrimarySurface.DMW, DisplayNumber)) + { + PrimarySurface.PDev = PrimarySurface.DriverFunctions.EnablePDev( + &PrimarySurface.DMW, + L"", + HS_DDI_MAX, + PrimarySurface.FillPatterns, + sizeof(PrimarySurface.GDIInfo), + (ULONG *) &PrimarySurface.GDIInfo, + sizeof(PrimarySurface.DevInfo), + &PrimarySurface.DevInfo, + NULL, + L"", + (HANDLE) (PrimarySurface.VideoFileObject->DeviceObject)); + DoDefault = (NULL == PrimarySurface.PDev); + if (DoDefault) + { + DPRINT1("DrvEnablePDev with registry parameters failed\n"); + } + } else - { - /* Call DDI driver's EnableDriver function */ - RtlZeroMemory(&DED, sizeof(DED)); + { + DoDefault = TRUE; + } - if (! GDEnableDriver(DDI_DRIVER_VERSION, sizeof(DED), &DED)) - { - DPRINT("DrvEnableDriver failed for %S\n", CurrentName); - } - else - { - GotDriver = TRUE; - } - } - - if (! GotDriver) - { - /* Skip to the next name but never get past the Unicode string */ - while (L'\0' != *CurrentName && - CurrentName < DriverFileNames.Buffer + DriverFileNames.Length) - { - CurrentName++; - } - if (CurrentName < DriverFileNames.Buffer + DriverFileNames.Length) - { - CurrentName++; - } - } - } - RtlFreeUnicodeString(&DriverFileNames); - if (! GotDriver) - { - ObDereferenceObject(PrimarySurface.VideoFileObject); - DPRINT1("No suitable DDI driver found\n"); - return FALSE; - } - - DPRINT("Display driver %S loaded\n", CurrentName); - - DPRINT("Building DDI Functions\n"); - - /* Construct DDI driver function dispatch table */ - if (! DRIVER_BuildDDIFunctions(&DED, &PrimarySurface.DriverFunctions)) - { - ObDereferenceObject(PrimarySurface.VideoFileObject); - DPRINT1("BuildDDIFunctions failed\n"); - return FALSE; - } - - /* Allocate a phyical device handle from the driver */ - if (SetupDevMode(&PrimarySurface.DMW)) - { - PrimarySurface.PDev = - PrimarySurface.DriverFunctions.EnablePDev(&PrimarySurface.DMW, - L"", - HS_DDI_MAX, - PrimarySurface.FillPatterns, - sizeof(PrimarySurface.GDIInfo), - (ULONG *) &PrimarySurface.GDIInfo, - sizeof(PrimarySurface.DevInfo), - &PrimarySurface.DevInfo, - NULL, - L"", - (HANDLE) (PrimarySurface.VideoFileObject->DeviceObject)); - DoDefault = (NULL == PrimarySurface.PDev); if (DoDefault) - { - DPRINT1("DrvEnablePDev with registry parameters failed\n"); - } - } - else - { - DoDefault = TRUE; - } + { + RtlZeroMemory(&(PrimarySurface.DMW), sizeof(DEVMODEW)); + PrimarySurface.PDev = PrimarySurface.DriverFunctions.EnablePDev( + &PrimarySurface.DMW, + L"", + HS_DDI_MAX, + PrimarySurface.FillPatterns, + sizeof(PrimarySurface.GDIInfo), + (ULONG *) &PrimarySurface.GDIInfo, + sizeof(PrimarySurface.DevInfo), + &PrimarySurface.DevInfo, + NULL, + L"", + (HANDLE) (PrimarySurface.VideoFileObject->DeviceObject)); - if (DoDefault) - { - RtlZeroMemory(&(PrimarySurface.DMW), sizeof(DEVMODEW)); - PrimarySurface.PDev = - PrimarySurface.DriverFunctions.EnablePDev(&PrimarySurface.DMW, - L"", - HS_DDI_MAX, - PrimarySurface.FillPatterns, - sizeof(PrimarySurface.GDIInfo), - (ULONG *) &PrimarySurface.GDIInfo, - sizeof(PrimarySurface.DevInfo), - &PrimarySurface.DevInfo, - NULL, - L"", - (HANDLE) (PrimarySurface.VideoFileObject->DeviceObject)); + if (NULL == PrimarySurface.PDev) + { + ObDereferenceObject(PrimarySurface.VideoFileObject); + DPRINT1("DrvEnablePDEV with default parameters failed\n"); + DPRINT1("Perhaps DDI driver doesn't match miniport driver?\n"); + /* return FALSE; */ + continue; + } + } - if (NULL == PrimarySurface.PDev) - { - ObDereferenceObject(PrimarySurface.VideoFileObject); - DPRINT1("DrvEnablePDEV with default parameters failed\n"); - DPRINT1("Perhaps DDI driver doesn't match miniport driver?\n"); - return FALSE; - } - } + if (0 == PrimarySurface.GDIInfo.ulLogPixelsX) + { + DPRINT("Adjusting GDIInfo.ulLogPixelsX\n"); + PrimarySurface.GDIInfo.ulLogPixelsX = 96; + } + if (0 == PrimarySurface.GDIInfo.ulLogPixelsY) + { + DPRINT("Adjusting GDIInfo.ulLogPixelsY\n"); + PrimarySurface.GDIInfo.ulLogPixelsY = 96; + } - if (0 == PrimarySurface.GDIInfo.ulLogPixelsX) - { - DPRINT("Adjusting GDIInfo.ulLogPixelsX\n"); - PrimarySurface.GDIInfo.ulLogPixelsX = 96; - } - if (0 == PrimarySurface.GDIInfo.ulLogPixelsY) - { - DPRINT("Adjusting GDIInfo.ulLogPixelsY\n"); - PrimarySurface.GDIInfo.ulLogPixelsY = 96; - } + DPRINT("calling completePDev\n"); - DPRINT("calling completePDev\n"); + /* Complete initialization of the physical device */ + PrimarySurface.DriverFunctions.CompletePDev( + PrimarySurface.PDev, + &PrimarySurface); - /* Complete initialization of the physical device */ - PrimarySurface.DriverFunctions.CompletePDev(PrimarySurface.PDev, - &PrimarySurface); + DPRINT("calling DRIVER_ReferenceDriver\n"); - DPRINT("calling DRIVER_ReferenceDriver\n"); + DRIVER_ReferenceDriver(L"DISPLAY"); - DRIVER_ReferenceDriver(L"DISPLAY"); + DPRINT("calling EnableSurface\n"); - DPRINT("calling EnableSurface\n"); + /* Enable the drawing surface */ + PrimarySurface.Handle = + PrimarySurface.DriverFunctions.EnableSurface(PrimarySurface.PDev); + if (NULL == PrimarySurface.Handle) + { +/* PrimarySurface.DriverFunctions.AssertMode(PrimarySurface.PDev, FALSE);*/ + PrimarySurface.DriverFunctions.DisablePDev(PrimarySurface.PDev); + ObDereferenceObject(PrimarySurface.VideoFileObject); + DPRINT1("DrvEnableSurface failed\n"); + /* return FALSE; */ + continue; + } - /* Enable the drawing surface */ - PrimarySurface.Handle = - PrimarySurface.DriverFunctions.EnableSurface(PrimarySurface.PDev); - if (NULL == PrimarySurface.Handle) - { - ObDereferenceObject(PrimarySurface.VideoFileObject); - DPRINT1("DrvEnableSurface failed\n"); - return FALSE; - } + SurfObj = (PSURFOBJ)AccessUserObject((ULONG) PrimarySurface.Handle); + SurfObj->dhpdev = PrimarySurface.PDev; + SurfGDI = (PSURFGDI)AccessInternalObject((ULONG) PrimarySurface.Handle); + IntShowDesktop( + IntGetActiveDesktop(), + SurfGDI->SurfObj.sizlBitmap.cx, + SurfGDI->SurfObj.sizlBitmap.cy); + break; + } - SurfObj = (PSURFOBJ)AccessUserObject((ULONG) PrimarySurface.Handle); - SurfObj->dhpdev = PrimarySurface.PDev; - SurfGDI = (PSURFGDI)AccessInternalObject((ULONG) PrimarySurface.Handle); - IntShowDesktop(IntGetActiveDesktop(), - SurfGDI->SurfObj.sizlBitmap.cx, - SurfGDI->SurfObj.sizlBitmap.cy); - - return TRUE; + return TRUE; } VOID FASTCALL @@ -704,7 +727,10 @@ IntGdiCreateDC(PUNICODE_STRING Driver, return NtGdiCreateCompatableDC(hDC); } - DPRINT("NAME: %S\n", Driver); // FIXME: Should not crash if NULL + if (Driver != NULL && Driver->Buffer != NULL) + { + DPRINT("NAME: %S\n", Driver->Buffer); // FIXME: Should not crash if NULL + } /* Allocate a DC object */ if ((hNewDC = DC_AllocDC(Driver)) == NULL) diff --git a/reactos/subsys/win32k/stubs/stubs.c b/reactos/subsys/win32k/stubs/stubs.c index a9704f04308..5d417d2f1c0 100644 --- a/reactos/subsys/win32k/stubs/stubs.c +++ b/reactos/subsys/win32k/stubs/stubs.c @@ -1235,3 +1235,67 @@ STUB(FLOATOBJ_AddFloatObj) STUB(FLOATOBJ_DivFloatObj) STUB(FLOATOBJ_MulFloatObj) STUB(FLOATOBJ_SubFloatObj) + +/* + * @unimplemented + */ +ULONG STDCALL +EngDitherColor( + IN HDEV hdev, + IN ULONG iMode, + IN ULONG rgb, + OUT ULONG *pul) +{ + return DCR_SOLID; +} + +/* + * @unimplemented + */ +BOOL STDCALL +EngQuerySystemAttribute( + IN ENG_SYSTEM_ATTRIBUTE CapNum, + OUT PDWORD pCapability) +{ + switch (CapNum) + { + case EngNumberOfProcessors: + *pCapability = 1; + return TRUE; + + case EngProcessorFeature: + *pCapability = 0; + return TRUE; + + default: + break; + } + + return FALSE; +} + +/* + * @unimplemented + */ +FLATPTR STDCALL +HeapVidMemAllocAligned( + IN VIDEOMEMORY *lpVidMem, + IN DWORD dwWidth, + IN DWORD dwHeight, + IN /*LPSURFACEALIGNMENT*/LPVOID lpAlignment, + OUT LPLONG lpNewPitch) +{ + UNIMPLEMENTED; + return 0; +} + +/* + * @unimplemented + */ +VOID STDCALL +VidMemFree( + IN LPVMEMHEAP pvmh, + IN FLATPTR ptr) +{ + UNIMPLEMENTED; +} diff --git a/reactos/subsys/win32k/win32k.def b/reactos/subsys/win32k/win32k.def index 2c86a4371a6..98eb30c5812 100644 --- a/reactos/subsys/win32k/win32k.def +++ b/reactos/subsys/win32k/win32k.def @@ -1,4 +1,4 @@ -; $Id: win32k.def,v 1.24 2004/02/11 19:26:51 weiden Exp $ +; $Id: win32k.def,v 1.25 2004/03/06 01:22:04 navaraf Exp $ ; ; win32k.def ; @@ -41,6 +41,7 @@ EngDeleteSemaphore@4 EngDeleteSurface@4 EngDeleteWnd@4 EngDeviceIoControl@28 +EngDitherColor@16 EngEnumForms@24 EngEraseSurface@12 EngFillPath@28 @@ -73,6 +74,7 @@ EngMapEvent@20 EngMapFontFile@12 EngMapModule@8 EngMarkBandingSurface@4 +EngModifySurface@32 EngMovePointer@16 EngMulDiv@12 EngMultiByteToUnicodeN@20 @@ -84,6 +86,7 @@ EngQueryLocalTime@4 EngQueryPalette@16 EngQueryPerformanceCounter@4 EngQueryPerformanceFrequency@4 +EngQuerySystemAttribute@8 EngReleaseSemaphore@4 EngRestoreFloatingPointState@4 EngSaveFloatingPointState@8 @@ -142,6 +145,7 @@ FONTOBJ_pifi@4 FONTOBJ_pvTrueTypeFontFile@8 FONTOBJ_pxoGetXform@4 FONTOBJ_vGetInfo@12 +HeapVidMemAllocAligned@20 HT_ComputeRGBGammaTable@24 HT_Get8BPPFormatPalette PALOBJ_cGetColors@16 @@ -165,6 +169,7 @@ RtlUpcaseUnicodeToMultiByteN@20 STROBJ_bEnum@12 STROBJ_dwGetCodePage@4 STROBJ_vEnumStart@4 +VidMemFree@8 Win32kInitialize@0 WNDOBJ_bEnum@12 WNDOBJ_cEnumStart@16 diff --git a/reactos/subsys/win32k/win32k.edf b/reactos/subsys/win32k/win32k.edf index 99a4e0c82d2..eb50ffdf9e2 100644 --- a/reactos/subsys/win32k/win32k.edf +++ b/reactos/subsys/win32k/win32k.edf @@ -1,4 +1,4 @@ -; $Id: win32k.edf,v 1.20 2004/02/11 19:26:51 weiden Exp $ +; $Id: win32k.edf,v 1.21 2004/03/06 01:22:04 navaraf Exp $ ; ; win32k.def ; @@ -41,6 +41,7 @@ EngDeleteSemaphore=EngDeleteSemaphore@4 EngDeleteSurface=EngDeleteSurface@4 EngDeleteWnd=EngDeleteWnd@4 EngDeviceIoControl=EngDeviceIoControl@28 +EngDitherColor=EngDitherColor@16 EngEnumForms=EngEnumForms@24 EngEraseSurface=EngEraseSurface@12 EngFillPath=EngFillPath@28 @@ -73,6 +74,7 @@ EngMapEvent=EngMapEvent@20 EngMapFontFile=EngMapFontFile@12 EngMapModule=EngMapModule@8 EngMarkBandingSurface=EngMarkBandingSurface@4 +EngModifySurface=EngModifySurface@32 EngMovePointer=EngMovePointer@16 EngMulDiv=EngMulDiv@12 EngMultiByteToUnicodeN=EngMultiByteToUnicodeN@20 @@ -84,6 +86,7 @@ EngQueryLocalTime=EngQueryLocalTime@4 EngQueryPalette=EngQueryPalette@16 EngQueryPerformanceCounter=EngQueryPerformanceCounter@4 EngQueryPerformanceFrequency=EngQueryPerformanceFrequency@4 +EngQuerySystemAttribute=EngQuerySystemAttribute@8 EngReleaseSemaphore=EngReleaseSemaphore@4 EngRestoreFloatingPointState=EngRestoreFloatingPointState@4 EngSaveFloatingPointState=EngSaveFloatingPointState@8 @@ -143,6 +146,7 @@ FONTOBJ_pifi=FONTOBJ_pifi@4 FONTOBJ_pvTrueTypeFontFile=FONTOBJ_pvTrueTypeFontFile@8 FONTOBJ_pxoGetXform=FONTOBJ_pxoGetXform@4 FONTOBJ_vGetInfo=FONTOBJ_vGetInfo@12 +HeapVidMemAllocAligned=HeapVidMemAllocAligned@20 HT_ComputeRGBGammaTable=HT_ComputeRGBGammaTable@24 HT_Get8BPPFormatPalette=HT_Get8BPPFormatPalette@16 PALOBJ_cGetColors=PALOBJ_cGetColors@16 @@ -166,6 +170,7 @@ RtlUpcaseUnicodeToMultiByteN=NTOSKRNL.RtlUpcaseUnicodeToMultiByteN STROBJ_bEnum=STROBJ_bEnum@12 STROBJ_dwGetCodePage=STROBJ_dwGetCodePage@4 STROBJ_vEnumStart=STROBJ_vEnumStart@4 +VidMemFree=VidMemFree@8 Win32kInitialize=Win32kInitialize@0 WNDOBJ_bEnum=WNDOBJ_bEnum@12 WNDOBJ_cEnumStart=WNDOBJ_cEnumStart@16