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 pvProcAdress =
RVA_TO_ADDR(pvImageBase, pAddresses[pOrdinals[
i]]);
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");
462 TRACE(
"LDEVOBJ_pLoadDriver returning %p\n", pldev);
479 if (pldev->cRefs > 0)
497 WARN(
"Failed to unload driver '%wZ', trying to re-enable it.\n", &pldev->pGdiDriverInfo->DriverName);
518 TRACE(
"LDEVOBJ_ulGetDriverModes('%ls', %p)\n", pwszDriverName,
hDriver);
532 ERR(
"DrvGetModes returned 0\n");
540 ERR(
"Could not allocate devmodeinfo\n");
549 ERR(
"DrvrGetModes returned 0 on second call\n");
570 ULONG cbSize, cbFull;
572 if (pGraphicsDevice->pdevmodeInfo)
574 ASSERT(pGraphicsDevice->pDevModeList ==
NULL);
576 pwsz = pGraphicsDevice->pDiplayDrivers;
580 for (; *pwsz; pwsz +=
wcslen(pwsz) + 1)
583 TRACE(
"Trying driver: %ls\n", pwsz);
587 WARN(
"Driver %ls returned no valid mode\n", pwsz);
598 ERR(
"Could not allocate devmodeinfo\n");
608 pdminfo->
pdmiNext = pGraphicsDevice->pdevmodeInfo;
609 pGraphicsDevice->pdevmodeInfo = pdminfo;
614 (pdm + 1 <= pdmEnd) && (pdm->
dmSize != 0);
626 if (!pGraphicsDevice->pdevmodeInfo || cModes == 0)
628 ERR(
"No devmodes\n");
633 pGraphicsDevice->cDevModes = cModes;
637 if (!pGraphicsDevice->pDevModeList)
639 ERR(
"No devmode list\n");
644 for (pdminfo = pGraphicsDevice->pdevmodeInfo,
i = 0;
653 (pdm + 1 <= pdmEnd) && (pdm->
dmSize != 0);
656 TRACE(
" %S has mode %lux%lux%lu(%lu Hz)\n",
664 pGraphicsDevice->pDevModeList[
i].dwFlags = 0;
665 pGraphicsDevice->pDevModeList[
i].pdm = pdm;
693 #define DM_DIFF(field) (RequestedMode->field > pdmCurrent->field ? (RequestedMode->field - pdmCurrent->field) : (pdmCurrent->field - RequestedMode->field)) 694 for (
i = 0;
i < pGraphicsDevice->cDevModes;
i++)
696 pdmCurrent = pGraphicsDevice->pDevModeList[
i].pdm;
713 pdmBest = pdmCurrent;
719 TRACE(
"Closest display mode to '%dx%dx%d %d Hz' is '%dx%dx%d %d Hz'\n",
720 RequestedMode->dmPelsWidth,
721 RequestedMode->dmPelsHeight,
722 RequestedMode->dmBitsPerPel,
723 RequestedMode->dmDisplayFrequency,
730 *pSelectedMode = pdmBest;
731 return pdmBest !=
NULL;
744 ULONG ulVirtualWidth = 0, ulVirtualHeight = 0;
756 ERR(
"EngpGetDisplayDriverParameters() failed with status 0x%08x\n",
Status);
764 bSearchClosestMode |= RequestedMode->dmFields == 0;
767 if (RequestedMode->dmFields &
DM_BITSPERPEL && RequestedMode->dmBitsPerPel != 0)
769 if (RequestedMode->dmFields &
DM_PELSWIDTH && RequestedMode->dmPelsWidth != 0)
771 if (RequestedMode->dmFields &
DM_PELSHEIGHT && RequestedMode->dmPelsHeight != 0)
773 if (RequestedMode->dmFields &
DM_DISPLAYFREQUENCY && RequestedMode->dmDisplayFrequency != 0)
777 RequestedMode->dmPanningWidth != 0 && RequestedMode->dmPanningHeight != 0 &&
778 RequestedMode->dmPanningWidth < dmSearch.
dmPelsWidth &&
782 ulVirtualWidth = RequestedMode->dmPelsWidth;
783 ulVirtualHeight = RequestedMode->dmPelsHeight;
784 dmSearch.
dmPelsWidth = RequestedMode->dmPanningWidth;
787 else if (dmSearch.dmPanningWidth != 0 && dmSearch.dmPanningHeight != 0 &&
809 if (bSearchClosestMode)
822 if (!(RequestedMode->dmFields &
DM_BITSPERPEL) || RequestedMode->dmBitsPerPel == 0)
824 if (!(RequestedMode->dmFields &
DM_PELSWIDTH) || RequestedMode->dmPelsWidth == 0)
826 if (!(RequestedMode->dmFields &
DM_PELSHEIGHT) || RequestedMode->dmPelsHeight == 0)
828 if (!(RequestedMode->dmFields &
DM_DISPLAYFREQUENCY) || RequestedMode->dmDisplayFrequency == 0)
843 for (
i = 0;
i < pGraphicsDevice->cDevModes;
i++)
845 pdmCurrent = pGraphicsDevice->pDevModeList[
i].pdm;
857 pdmSelected = pdmCurrent;
863 ERR(
"Requested mode not found (%dx%dx%d %d Hz)\n",
883 if (ulVirtualWidth != 0 && ulVirtualHeight != 0 &&
894 *pSelectedMode = pdm;
940 if (
_strnicmp(lpProcName,
"DrvEnableDriver", 15) == 0)
NTSTRSAFEAPI RtlStringCbCopyW(_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cbDest, _In_ NTSTRSAFE_PCWSTR pszSrc)
VOID WINAPI EngReleaseSemaphore(IN HSEMAPHORE hsem)
static VOID LDEVOBJ_vDereference(_Inout_ PLDEVOBJ pldev)
DBG_DEFAULT_CHANNEL(EngLDev)
#define STATUS_INSUFFICIENT_RESOURCES
struct _devicemodeW * PDEVMODEW
NTSTATUS EngpGetDisplayDriverParameters(_In_ PGRAPHICS_DEVICE pGraphicsDevice, _Out_ PDEVMODEW pdm)
static VOID LDEVOBJ_vFreeLDEV(_In_ _Post_ptr_invalid_ PLDEVOBJ pldev)
BOOL LDEVOBJ_bProbeAndCaptureDevmode(_Inout_ PGRAPHICS_DEVICE pGraphicsDevice, _In_ PDEVMODEW RequestedMode, _Out_ PDEVMODEW *pSelectedMode, _In_ BOOL bSearchClosestMode)
struct _LIST_ENTRY * Blink
FORCEINLINE VOID InsertHeadList(_Inout_ PLIST_ENTRY ListHead, _Inout_ __drv_aliasesMem PLIST_ENTRY Entry)
static BOOL LDEVOBJ_bGetClosestMode(_Inout_ PGRAPHICS_DEVICE pGraphicsDevice, _In_ PDEVMODEW RequestedMode, _Out_ PDEVMODEW *pSelectedMode)
_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)
_In_ LPWSTR _In_ ULONG _In_ ULONG _In_ ULONG _Out_ DEVINFO _In_ HDEV _In_ LPWSTR _In_ HANDLE hDriver
ULONG LDEVOBJ_ulGetDriverModes(_In_ LPWSTR pwszDriverName, _In_ HANDLE hDriver, _Out_ PDEVMODEW *ppdm)
static VOID LDEVOBJ_vDisableDriver(_Inout_ PLDEVOBJ pldev)
static PVOID LDEVOBJ_pvFindImageProcAddress(_In_ PLDEVOBJ pldev, _In_z_ LPSTR pszProcName)
NTSYSAPI VOID NTAPI RtlCopyUnicodeString(PUNICODE_STRING DestinationString, PUNICODE_STRING SourceString)
DWORD AddressOfNameOrdinals
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
return STATUS_NOT_IMPLEMENTED
NTSTATUS NTAPI InitLDEVImpl(VOID)
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
static HSEMAPHORE ghsemLDEVList
static const unsigned GDI_ENGINE_VERSION
ENGAPI VOID APIENTRY EngAcquireSemaphore(_Inout_ HSEMAPHORE hsem)
FN_DrvEnableDriver * PFN_DrvEnableDriver
static LDEVOBJ * gpldevWin32k
static LIST_ENTRY gleLdevListHead
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
VOID APIENTRY EngUnloadImage(_In_ HANDLE hModule)
SYSTEM_GDI_DRIVER_INFORMATION * pGdiDriverInfo
#define _Post_ptr_invalid_
NTSTATUS RtlAppendUnicodeToString(IN PUNICODE_STRING Str1, IN PWSTR Str2)
struct _LIST_ENTRY * Flink
#define NT_SUCCESS(StatCode)
#define EXCEPTION_EXECUTE_HANDLER
struct _DEVMODEINFO * pdmiNext
static PLDEVOBJ LDEVOBJ_AllocLDEV(_In_ LDEVTYPE ldevtype)
#define _strnicmp(_String1, _String2, _MaxCount)
WCHAR dmDeviceName[CCHDEVICENAME]
#define ExAllocatePoolWithTag(hernya, size, tag)
HANDLE APIENTRY EngLoadImage(_In_ LPWSTR pwszDriverName)
#define RtlImageDirectoryEntryToData
NTSYSAPI NTSTATUS NTAPI ZwSetSystemInformation(_In_ SYSTEM_INFORMATION_CLASS SystemInformationClass, _In_reads_bytes_(SystemInformationLength) PVOID SystemInformation, _In_ ULONG SystemInformationLength)
#define DM_DISPLAYFREQUENCY
#define IMAGE_DIRECTORY_ENTRY_EXPORT
static BOOL LDEVOBJ_bEnableDriver(_Inout_ PLDEVOBJ pldev, _In_ PFN_DrvEnableDriver pfnEnableDriver)
#define SystemLoadGdiDriverInformation
PVOID APIENTRY EngFindImageProcAddress(_In_ HANDLE hModule, _In_ LPSTR lpProcName)
DRIVER_INITIALIZE DriverEntry
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
#define InitializeListHead(ListHead)
#define FIELD_OFFSET(t, f)
static BOOL LDEVOBJ_bUnloadImage(_Inout_ PLDEVOBJ pldev)
PLDEVOBJ LDEVOBJ_pLoadInternal(_In_ PFN_DrvEnableDriver pfnEnableDriver, _In_ ULONG ldevtype)
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
static BOOL LDEVOBJ_bLoadImage(_Inout_ PLDEVOBJ pldev, _In_ PUNICODE_STRING pustrPathName)
struct _SYSTEM_GDI_DRIVER_INFORMATION SYSTEM_GDI_DRIVER_INFORMATION
struct _LDEVOBJ * PLDEVOBJ
#define RVA_TO_ADDR(Base, Rva)
HSEMAPHORE WINAPI EngCreateSemaphore(VOID)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define RtlZeroMemory(Destination, Length)
char * cleanup(char *str)
BOOL LDEVOBJ_bBuildDevmodeList(_Inout_ PGRAPHICS_DEVICE pGraphicsDevice)
#define RtlCopyMemory(Destination, Source, Length)
#define _SEH2_EXCEPT(...)
#define ExFreePoolWithTag(_P, _T)
NTSYSAPI BOOLEAN NTAPI RtlEqualUnicodeString(PUNICODE_STRING String1, PUNICODE_STRING String2, BOOLEAN CaseInSensitive)
PLDEVOBJ NTAPI LDEVOBJ_pLoadDriver(_In_z_ LPWSTR pwszDriverName, _In_ ULONG ldevtype)