Author: fireball Date: Mon Oct 1 12:14:24 2007 New Revision: 29323
URL: http://svn.reactos.org/svn/reactos?rev=29323&view=rev Log: - Rewrite IntVideoPortGetProcAddress() implementation to use a lookup table instead of doing a wrong call to ZwQuerySystemInformation() which always returned STATUS_IMAGE_ALREADY_LOADED (it's supposed to return this). MS's VideoPort seems to do it in a similar way, because it doesn't import neither ZwQSI() nor MmLoadSystemImage(). - VMWare's video driver now calls VideoPortCreateSecondaryDisplay(), without much success though (it's unimplemented).
Added: trunk/reactos/drivers/video/videoprt/funclist.c (with props) Modified: trunk/reactos/drivers/video/videoprt/videoprt.c trunk/reactos/drivers/video/videoprt/videoprt.h trunk/reactos/drivers/video/videoprt/videoprt.rbuild
Added: trunk/reactos/drivers/video/videoprt/funclist.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/video/videoprt/func... ============================================================================== --- trunk/reactos/drivers/video/videoprt/funclist.c (added) +++ trunk/reactos/drivers/video/videoprt/funclist.c Mon Oct 1 12:14:24 2007 @@ -1,0 +1,64 @@ +/* + * VideoPort driver + * + * Copyright (C) 2007 ReactOS Team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * $Id: videoprt.c 28975 2007-09-09 12:39:11Z fireball $ + */ + + +#include "videoprt.h" + +typedef struct _VIDEO_PORT_FUNCTION_TABLE { + PVOID Address; + PUCHAR Name; +} *PVIDEO_PORT_FUNCTION_TABLE, VIDEO_PORT_FUNCTION_TABLE; + +/* GLOBAL VARIABLES ***********************************************************/ + +#define VP_EXPORTED_FUNCS 1 + +UCHAR FN_VideoPortCreateSecondaryDisplay[] = "VideoPortCreateSecondaryDisplay"; + +VIDEO_PORT_FUNCTION_TABLE VideoPortExports[] = { + {VideoPortCreateSecondaryDisplay, FN_VideoPortCreateSecondaryDisplay} +}; + +PVOID NTAPI +IntVideoPortGetProcAddress( + IN PVOID HwDeviceExtension, + IN PUCHAR FunctionName) +{ + ULONG i = 0; + + DPRINT("VideoPortGetProcAddress(%s)\n", FunctionName); + + /* Search by name */ + for (i = 0; i < VP_EXPORTED_FUNCS; i++) + { + if (!_strnicmp((PCHAR)FunctionName, (PCHAR)VideoPortExports[i].Name, + strlen((PCHAR)FunctionName))) + { + return (PVOID)VideoPortExports[i].Address; + } + } + + DPRINT("VideoPortGetProcAddress: Can't resolve symbol %s\n", FunctionName); + + return NULL; +}
Propchange: trunk/reactos/drivers/video/videoprt/funclist.c ------------------------------------------------------------------------------ svn:eol-style = native
Modified: trunk/reactos/drivers/video/videoprt/videoprt.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/video/videoprt/vide... ============================================================================== --- trunk/reactos/drivers/video/videoprt/videoprt.c (original) +++ trunk/reactos/drivers/video/videoprt/videoprt.c Mon Oct 1 12:14:24 2007 @@ -61,62 +61,6 @@ return NULL;
return (PVOID)((ULONG_PTR)BaseAddress + Va); -} - -PVOID NTAPI -IntVideoPortGetProcAddress( - IN PVOID HwDeviceExtension, - IN PUCHAR FunctionName) -{ - SYSTEM_GDI_DRIVER_INFORMATION GdiDriverInfo; - PVOID BaseAddress; - PIMAGE_EXPORT_DIRECTORY ExportDir; - PUSHORT OrdinalPtr; - PULONG NamePtr; - PULONG AddressPtr; - ULONG i = 0; - NTSTATUS Status; - - DPRINT("VideoPortGetProcAddress(%s)\n", FunctionName); - - RtlInitUnicodeString(&GdiDriverInfo.DriverName, L"videoprt"); - Status = ZwSetSystemInformation( - SystemLoadGdiDriverInformation, - &GdiDriverInfo, - sizeof(SYSTEM_GDI_DRIVER_INFORMATION)); - if (!NT_SUCCESS(Status)) - { - DPRINT("Couldn't get our own module handle?\n"); - return NULL; - } - - BaseAddress = GdiDriverInfo.ImageAddress; - - /* Get the pointer to the export directory */ - ExportDir = (PIMAGE_EXPORT_DIRECTORY)IntVideoPortImageDirectoryEntryToData( - BaseAddress, - IMAGE_DIRECTORY_ENTRY_EXPORT); - - /* Search by name */ - AddressPtr = (PULONG) - ((ULONG_PTR)BaseAddress + (ULONG_PTR)ExportDir->AddressOfFunctions); - OrdinalPtr = (PUSHORT) - ((ULONG_PTR)BaseAddress + (ULONG_PTR)ExportDir->AddressOfNameOrdinals); - NamePtr = (PULONG) - ((ULONG_PTR)BaseAddress + (ULONG_PTR)ExportDir->AddressOfNames); - for (i = 0; i < ExportDir->NumberOfNames; i++, NamePtr++, OrdinalPtr++) - { - if (!_strnicmp((PCHAR)FunctionName, (PCHAR)((ULONG_PTR)BaseAddress + *NamePtr), - strlen((PCHAR)FunctionName))) - { - return (PVOID)((ULONG_PTR)BaseAddress + - (ULONG_PTR)AddressPtr[*OrdinalPtr]); - } - } - - DPRINT("VideoPortGetProcAddress: Can't resolve symbol %s\n", FunctionName); - - return NULL; }
VOID NTAPI
Modified: trunk/reactos/drivers/video/videoprt/videoprt.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/video/videoprt/vide... ============================================================================== --- trunk/reactos/drivers/video/videoprt/videoprt.h (original) +++ trunk/reactos/drivers/video/videoprt/videoprt.h Mon Oct 1 12:14:24 2007 @@ -34,7 +34,7 @@ #include <ndk/ntndk.h> #include <reactos/helper.h>
-#define NDEBUG +//#define NDEBUG #include <debug.h>
#define TAG_VIDEO_PORT TAG('V', 'I', 'D', 'P') @@ -222,6 +222,11 @@ IN PVIDEO_PORT_DRIVER_EXTENSION DriverExtension, IN PDEVICE_OBJECT DeviceObject);
+PVOID NTAPI +IntVideoPortGetProcAddress( + IN PVOID HwDeviceExtension, + IN PUCHAR FunctionName); + /* int10.c */
VP_STATUS NTAPI
Modified: trunk/reactos/drivers/video/videoprt/videoprt.rbuild URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/video/videoprt/vide... ============================================================================== --- trunk/reactos/drivers/video/videoprt/videoprt.rbuild (original) +++ trunk/reactos/drivers/video/videoprt/videoprt.rbuild Mon Oct 1 12:14:24 2007 @@ -14,6 +14,7 @@ <file>dispatch.c</file> <file>dma.c</file> <file>event.c</file> + <file>funclist.c</file> <file>int10.c</file> <file>interrupt.c</file> <file>resource.c</file>