15#define RVA_TO_ADDR(Base,Rva) ((PVOID)(((ULONG_PTR)(Base)) + (Rva)))
41 ERR(
"Failed to create ghsemLDEVList\n");
63 L"\\SystemRoot\\System32\\win32k.sys");
88 ERR(
"Failed to allocate LDEVOBJ.\n");
107 ASSERT(pldev && pldev->pGdiDriverInfo ==
NULL);
108 ASSERT(pldev->cRefs == 0);
125 ASSERT(pldev && pldev->pGdiDriverInfo ==
NULL);
132 ERR(
"Failed to allocate SYSTEM_GDI_DRIVER_INFORMATION\n");
137 RtlInitEmptyUnicodeString(&pDriverInfo->
DriverName,
138 (
PWSTR)(pDriverInfo + 1),
148 ERR(
"Failed to load a GDI driver: '%wZ', Status = 0x%lx\n",
157 pldev->pGdiDriverInfo = pDriverInfo;
172 TRACE(
"LDEVOBJ_bEnableDriver('%wZ')\n", &pldev->pGdiDriverInfo->DriverName);
175 ASSERT(pldev->cRefs == 0);
184 ERR(
"DrvEnableDriver failed\n");
192 for (
i = 0;
i < ded.
c;
i++)
207 ASSERT(pldev->cRefs == 0);
209 TRACE(
"LDEVOBJ_vDisableDriver('%wZ')\n", &pldev->pGdiDriverInfo->DriverName);
214 if (pldev->pfn.DisableDriver)
217 pldev->pfn.DisableDriver();
231 PULONG pNames, pAddresses;
235 ASSERT(pldev && pldev->pGdiDriverInfo !=
NULL);
238 pvImageBase = pldev->pGdiDriverInfo->ImageAddress;
239 pExportDir = pldev->pGdiDriverInfo->ExportSectionPointer;
242 ERR(
"LDEVOBJ_pvFindImageProcAddress: no export section found\n");
258 pvProcAddress =
RVA_TO_ADDR(pvImageBase, pAddresses[pOrdinals[
i]]);
264 return pvProcAddress;
275 ASSERT(pldev && pldev->pGdiDriverInfo !=
NULL);
276 ASSERT(pldev->cRefs == 0);
278 TRACE(
"LDEVOBJ_bUnloadImage('%wZ')\n", &pldev->pGdiDriverInfo->DriverName);
283 &pldev->pGdiDriverInfo->SectionPointer,
297 pldev->pGdiDriverInfo =
NULL;
309 TRACE(
"LDEVOBJ_pLoadInternal(%lu)\n", ldevtype);
318 ERR(
"Could not allocate LDEV\n");
325 ERR(
"LDEVOBJ_bEnableDriver failed\n");
341 TRACE(
"LDEVOBJ_pLoadInternal returning %p\n", pldev);
358 TRACE(
"LDEVOBJ_pLoadDriver(%ls, %lu)\n", pwszDriverName, ldevtype);
362 RtlInitEmptyUnicodeString(&strDriverName, acwBuffer,
sizeof(acwBuffer));
368 cwcLength =
wcslen(pwszDriverName);
371 pwsz = pwszDriverName + cwcLength;
372 while (pwsz > pwszDriverName)
374 if ((*pwsz ==
L'\\') && (
_wcsnicmp(pwsz,
L"\\system32\\", 10) == 0))
389 if ((cwcLength < 4) ||
390 ((
_wcsnicmp(pwszDriverName + cwcLength - 4,
L".dll", 4) != 0) &&
391 (
_wcsnicmp(pwszDriverName + cwcLength - 4,
L".sys", 4) != 0)) )
403 pleLink = pleLink->
Flink)
426 ERR(
"Could not allocate LDEV\n");
435 ERR(
"LDEVOBJ_bLoadImage failed\n");
442 ERR(
"LDEVOBJ_bEnableDriver failed\n");
448 ERR(
"Could not unload driver. Leaking memory\n");
464 TRACE(
"LDEVOBJ_pLoadDriver returning %p\n", pldev);
481 if (pldev->cRefs > 0)
499 WARN(
"Failed to unload driver '%wZ', trying to re-enable it.\n", &pldev->pGdiDriverInfo->DriverName);
520 TRACE(
"LDEVOBJ_ulGetDriverModes('%ls', %p)\n", pwszDriverName,
hDriver);
534 ERR(
"DrvGetModes returned 0\n");
542 ERR(
"Could not allocate devmodeinfo\n");
551 ERR(
"DrvrGetModes returned 0 on second call\n");
572 ULONG cbSize, cbFull;
574 if (pGraphicsDevice->pdevmodeInfo)
576 ASSERT(pGraphicsDevice->pDevModeList ==
NULL);
578 pwsz = pGraphicsDevice->pDiplayDrivers;
582 for (; *pwsz; pwsz +=
wcslen(pwsz) + 1)
585 TRACE(
"Trying driver: %ls\n", pwsz);
589 WARN(
"Driver %ls returned no valid mode\n", pwsz);
600 ERR(
"Could not allocate devmodeinfo\n");
610 pdminfo->
pdmiNext = pGraphicsDevice->pdevmodeInfo;
611 pGraphicsDevice->pdevmodeInfo = pdminfo;
616 (pdm + 1 <= pdmEnd) && (pdm->
dmSize != 0);
628 if (!pGraphicsDevice->pdevmodeInfo || cModes == 0)
630 ERR(
"No devmodes\n");
635 pGraphicsDevice->cDevModes = cModes;
639 if (!pGraphicsDevice->pDevModeList)
641 ERR(
"No devmode list\n");
646 for (pdminfo = pGraphicsDevice->pdevmodeInfo,
i = 0;
655 (pdm + 1 <= pdmEnd) && (pdm->
dmSize != 0);
658 TRACE(
" %S has mode %lux%lux%lu(%lu Hz)\n",
666 pGraphicsDevice->pDevModeList[
i].dwFlags = 0;
667 pGraphicsDevice->pDevModeList[
i].pdm = pdm;
695#define DM_DIFF(field) (RequestedMode->field > pdmCurrent->field ? (RequestedMode->field - pdmCurrent->field) : (pdmCurrent->field - RequestedMode->field))
696 for (
i = 0;
i < pGraphicsDevice->cDevModes;
i++)
698 pdmCurrent = pGraphicsDevice->pDevModeList[
i].pdm;
715 pdmBest = pdmCurrent;
721 TRACE(
"Closest display mode to '%dx%dx%d %d Hz' is '%dx%dx%d %d Hz'\n",
722 RequestedMode->dmPelsWidth,
723 RequestedMode->dmPelsHeight,
724 RequestedMode->dmBitsPerPel,
725 RequestedMode->dmDisplayFrequency,
732 *pSelectedMode = pdmBest;
733 return pdmBest !=
NULL;
746 ULONG ulVirtualWidth = 0, ulVirtualHeight = 0;
758 ERR(
"EngpGetDisplayDriverParameters() failed with status 0x%08x\n",
Status);
766 bSearchClosestMode |= RequestedMode->dmFields == 0;
769 if (RequestedMode->dmFields &
DM_BITSPERPEL && RequestedMode->dmBitsPerPel != 0)
771 if (RequestedMode->dmFields &
DM_PELSWIDTH && RequestedMode->dmPelsWidth != 0)
773 if (RequestedMode->dmFields &
DM_PELSHEIGHT && RequestedMode->dmPelsHeight != 0)
775 if (RequestedMode->dmFields &
DM_DISPLAYFREQUENCY && RequestedMode->dmDisplayFrequency != 0)
779 RequestedMode->dmPanningWidth != 0 && RequestedMode->dmPanningHeight != 0 &&
780 RequestedMode->dmPanningWidth < dmSearch.
dmPelsWidth &&
784 ulVirtualWidth = RequestedMode->dmPelsWidth;
785 ulVirtualHeight = RequestedMode->dmPelsHeight;
786 dmSearch.
dmPelsWidth = RequestedMode->dmPanningWidth;
789 else if (dmSearch.dmPanningWidth != 0 && dmSearch.dmPanningHeight != 0 &&
811 if (bSearchClosestMode)
824 if (!(RequestedMode->dmFields &
DM_BITSPERPEL) || RequestedMode->dmBitsPerPel == 0)
826 if (!(RequestedMode->dmFields &
DM_PELSWIDTH) || RequestedMode->dmPelsWidth == 0)
828 if (!(RequestedMode->dmFields &
DM_PELSHEIGHT) || RequestedMode->dmPelsHeight == 0)
830 if (!(RequestedMode->dmFields &
DM_DISPLAYFREQUENCY) || RequestedMode->dmDisplayFrequency == 0)
845 for (
i = 0;
i < pGraphicsDevice->cDevModes;
i++)
847 pdmCurrent = pGraphicsDevice->pDevModeList[
i].pdm;
859 pdmSelected = pdmCurrent;
865 ERR(
"Requested mode not found (%dx%dx%d %d Hz)\n",
885 if (ulVirtualWidth != 0 && ulVirtualHeight != 0 &&
896 *pSelectedMode = pdm;
942 if (
_strnicmp(lpProcName,
"DrvEnableDriver", 15) == 0)
struct _SYSTEM_GDI_DRIVER_INFORMATION SYSTEM_GDI_DRIVER_INFORMATION
#define SystemLoadGdiDriverInformation
#define DBG_DEFAULT_CHANNEL(ch)
#define STATUS_NOT_IMPLEMENTED
#define NT_SUCCESS(StatCode)
#define IMAGE_DIRECTORY_ENTRY_EXPORT
#define RtlImageDirectoryEntryToData
#define _strnicmp(_String1, _String2, _MaxCount)
static void cleanup(void)
DRIVER_INITIALIZE DriverEntry
#define RemoveEntryList(Entry)
#define InsertHeadList(ListHead, Entry)
#define ExAllocatePoolWithTag(hernya, size, tag)
NTSTATUS RtlAppendUnicodeToString(IN PUNICODE_STRING Str1, IN PWSTR Str2)
#define InitializeListHead(ListHead)
@ SystemUnloadGdiDriverInformation
VOID WINAPI EngReleaseSemaphore(IN HSEMAPHORE hsem)
HSEMAPHORE WINAPI EngCreateSemaphore(VOID)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define EXCEPTION_EXECUTE_HANDLER
#define RVA_TO_ADDR(Base, Rva)
static VOID LDEVOBJ_vDisableDriver(_Inout_ PLDEVOBJ pldev)
ULONG LDEVOBJ_ulGetDriverModes(_In_ LPWSTR pwszDriverName, _In_ HANDLE hDriver, _Out_ PDEVMODEW *ppdm)
static PVOID LDEVOBJ_pvFindImageProcAddress(_In_ PLDEVOBJ pldev, _In_z_ LPSTR pszProcName)
static BOOL LDEVOBJ_bLoadImage(_Inout_ PLDEVOBJ pldev, _In_ PUNICODE_STRING pustrPathName)
PVOID APIENTRY EngFindImageProcAddress(_In_ HANDLE hModule, _In_ LPSTR lpProcName)
static PLDEVOBJ LDEVOBJ_AllocLDEV(_In_ LDEVTYPE ldevtype)
VOID APIENTRY EngUnloadImage(_In_ HANDLE hModule)
static VOID LDEVOBJ_vFreeLDEV(_In_ _Post_ptr_invalid_ PLDEVOBJ pldev)
static VOID LDEVOBJ_vDereference(_Inout_ PLDEVOBJ pldev)
PLDEVOBJ NTAPI LDEVOBJ_pLoadDriver(_In_z_ LPWSTR pwszDriverName, _In_ ULONG ldevtype)
static BOOL LDEVOBJ_bUnloadImage(_Inout_ PLDEVOBJ pldev)
BOOL LDEVOBJ_bBuildDevmodeList(_Inout_ PGRAPHICS_DEVICE pGraphicsDevice)
static LDEVOBJ * gpldevWin32k
static LIST_ENTRY gleLdevListHead
static BOOL LDEVOBJ_bGetClosestMode(_Inout_ PGRAPHICS_DEVICE pGraphicsDevice, _In_ PDEVMODEW RequestedMode, _Out_ PDEVMODEW *pSelectedMode)
static BOOL LDEVOBJ_bEnableDriver(_Inout_ PLDEVOBJ pldev, _In_ PFN_DrvEnableDriver pfnEnableDriver)
HANDLE APIENTRY EngLoadImage(_In_ LPWSTR pwszDriverName)
BOOL LDEVOBJ_bProbeAndCaptureDevmode(_Inout_ PGRAPHICS_DEVICE pGraphicsDevice, _In_ PDEVMODEW RequestedMode, _Out_ PDEVMODEW *pSelectedMode, _In_ BOOL bSearchClosestMode)
PLDEVOBJ LDEVOBJ_pLoadInternal(_In_ PFN_DrvEnableDriver pfnEnableDriver, _In_ ULONG ldevtype)
static HSEMAPHORE ghsemLDEVList
NTSTATUS NTAPI InitLDEVImpl(VOID)
static const unsigned GDI_ENGINE_VERSION
struct _LDEVOBJ * PLDEVOBJ
#define ExFreePoolWithTag(_P, _T)
FORCEINLINE PVOID ExAllocatePoolZero(ULONG PoolType, SIZE_T NumberOfBytes, ULONG Tag)
NTSYSAPI NTSTATUS NTAPI ZwSetSystemInformation(_In_ SYSTEM_INFORMATION_CLASS SystemInformationClass, _In_reads_bytes_(SystemInformationLength) PVOID SystemInformation, _In_ ULONG SystemInformationLength)
#define _Post_ptr_invalid_
NTSYSAPI VOID NTAPI RtlCopyUnicodeString(PUNICODE_STRING DestinationString, PUNICODE_STRING SourceString)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
NTSYSAPI BOOLEAN NTAPI RtlEqualUnicodeString(PUNICODE_STRING String1, PUNICODE_STRING String2, BOOLEAN CaseInSensitive)
NTSTRSAFEAPI RtlStringCbCopyW(_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cbDest, _In_ NTSTRSAFE_PCWSTR pszSrc)
#define _SEH2_EXCEPT(...)
_Check_return_ _CRTIMP int __cdecl _wcsnicmp(_In_reads_or_z_(_MaxCount) const wchar_t *_Str1, _In_reads_or_z_(_MaxCount) const wchar_t *_Str2, _In_ size_t _MaxCount)
struct _DEVMODEINFO * pdmiNext
DWORD AddressOfNameOrdinals
SYSTEM_GDI_DRIVER_INFORMATION * pGdiDriverInfo
struct _LIST_ENTRY * Blink
struct _LIST_ENTRY * Flink
WCHAR dmDeviceName[CCHDEVICENAME]
#define FIELD_OFFSET(t, f)
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define CONTAINING_RECORD(address, type, field)
#define STATUS_INSUFFICIENT_RESOURCES
NTSTATUS EngpGetDisplayDriverParameters(_In_ PGRAPHICS_DEVICE pGraphicsDevice, _Out_ PDEVMODEW pdm)
ENGAPI VOID APIENTRY EngAcquireSemaphore(_Inout_ HSEMAPHORE hsem)
FN_DrvEnableDriver * PFN_DrvEnableDriver
_In_ LPWSTR _In_ ULONG _In_ ULONG _In_ ULONG _Out_ DEVINFO _In_ HDEV _In_ LPWSTR _In_ HANDLE hDriver
#define DM_DISPLAYFREQUENCY
struct _devicemodeW * PDEVMODEW