Replace pldevNext and pldevPrev with a LIST_ENTRY and use standard list routines instead of broken manual handling. Should fix crash in user32:sysparams test

svn path=/trunk/; revision=62068
This commit is contained in:
Timo Kreuzer 2014-02-09 12:46:19 +00:00
parent d73bc4070e
commit 92cfc61486
2 changed files with 17 additions and 19 deletions

View file

@ -18,7 +18,7 @@ DBG_DEFAULT_CHANNEL(EngLDev);
/** Globals *******************************************************************/ /** Globals *******************************************************************/
static HSEMAPHORE ghsemLDEVList; static HSEMAPHORE ghsemLDEVList;
static LDEVOBJ *gpldevHead = NULL; static LIST_ENTRY gleLdevListHead;
static LDEVOBJ *gpldevWin32k = NULL; static LDEVOBJ *gpldevWin32k = NULL;
@ -31,6 +31,9 @@ InitLDEVImpl(VOID)
{ {
ULONG cbSize; ULONG cbSize;
/* Initialize the LDEV list head */
InitializeListHead(&gleLdevListHead);
/* Initialize the loader lock */ /* Initialize the loader lock */
ghsemLDEVList = EngCreateSemaphore(); ghsemLDEVList = EngCreateSemaphore();
if (!ghsemLDEVList) if (!ghsemLDEVList)
@ -50,8 +53,8 @@ InitLDEVImpl(VOID)
} }
/* Initialize the LDEVOBJ for win32k */ /* Initialize the LDEVOBJ for win32k */
gpldevWin32k->pldevNext = NULL; gpldevWin32k->leLink.Flink = NULL;
gpldevWin32k->pldevPrev = NULL; gpldevWin32k->leLink.Blink = NULL;
gpldevWin32k->ldevtype = LDEV_DEVICE_DISPLAY; gpldevWin32k->ldevtype = LDEV_DEVICE_DISPLAY;
gpldevWin32k->cRefs = 1; gpldevWin32k->cRefs = 1;
gpldevWin32k->ulDriverVersion = GDI_ENGINE_VERSION; gpldevWin32k->ulDriverVersion = GDI_ENGINE_VERSION;
@ -320,6 +323,7 @@ EngLoadImageEx(
_In_ ULONG ldevtype) _In_ ULONG ldevtype)
{ {
WCHAR acwBuffer[MAX_PATH]; WCHAR acwBuffer[MAX_PATH];
PLIST_ENTRY pleLink;
PLDEVOBJ pldev; PLDEVOBJ pldev;
UNICODE_STRING strDriverName; UNICODE_STRING strDriverName;
SIZE_T cwcLength; SIZE_T cwcLength;
@ -368,13 +372,15 @@ EngLoadImageEx(
EngAcquireSemaphore(ghsemLDEVList); EngAcquireSemaphore(ghsemLDEVList);
/* Search the List of LDEVS for the driver name */ /* Search the List of LDEVS for the driver name */
for (pldev = gpldevHead; pldev != NULL; pldev = pldev->pldevNext) for (pleLink = gleLdevListHead.Flink;
pleLink != &gleLdevListHead;
pleLink = pleLink->Flink)
{ {
pldev = CONTAINING_RECORD(pleLink, LDEVOBJ, leLink);
/* Check if the ldev is associated with a file */ /* Check if the ldev is associated with a file */
if (pldev->pGdiDriverInfo) if (pldev->pGdiDriverInfo)
{ {
ERR("Driver Name 1 %wZ\n", &strDriverName);
ERR("Driver Name 2 %wZ\n", &pldev->pGdiDriverInfo->DriverName);
/* Check for match (case insensative) */ /* Check for match (case insensative) */
if (RtlEqualUnicodeString(&pldev->pGdiDriverInfo->DriverName, &strDriverName, 1)) if (RtlEqualUnicodeString(&pldev->pGdiDriverInfo->DriverName, &strDriverName, 1))
{ {
@ -385,7 +391,7 @@ EngLoadImageEx(
} }
/* Did we find one? */ /* Did we find one? */
if (!pldev) if (pleLink == &gleLdevListHead)
{ {
/* No, allocate a new LDEVOBJ */ /* No, allocate a new LDEVOBJ */
pldev = LDEVOBJ_AllocLDEV(ldevtype); pldev = LDEVOBJ_AllocLDEV(ldevtype);
@ -421,11 +427,7 @@ EngLoadImageEx(
} }
/* Insert the LDEV into the global list */ /* Insert the LDEV into the global list */
pldev->pldevPrev = NULL; InsertHeadList(&gleLdevListHead, &pldev->leLink);
pldev->pldevNext = gpldevHead;
if (gpldevHead)
gpldevHead->pldevPrev = pldev;
gpldevHead = pldev;
} }
/* Increase ref count */ /* Increase ref count */
@ -459,7 +461,7 @@ EngUnloadImage(
PLDEVOBJ pldev = (PLDEVOBJ)hModule; PLDEVOBJ pldev = (PLDEVOBJ)hModule;
/* Make sure the LDEV is in the list */ /* Make sure the LDEV is in the list */
ASSERT(pldev->pldevPrev || pldev->pldevNext); ASSERT((pldev->leLink.Flink != NULL) && (pldev->leLink.Blink != NULL));
/* Lock loader */ /* Lock loader */
EngAcquireSemaphore(ghsemLDEVList); EngAcquireSemaphore(ghsemLDEVList);
@ -471,10 +473,7 @@ EngUnloadImage(
if (pldev->cRefs == 0) if (pldev->cRefs == 0)
{ {
/* Remove ldev from the list */ /* Remove ldev from the list */
if (pldev->pldevPrev) RemoveEntryList(&pldev->leLink);
pldev->pldevPrev->pldevNext = pldev->pldevNext;
if (pldev->pldevNext)
pldev->pldevNext->pldevPrev = pldev->pldevPrev;
/* Unload the image and free the LDEV */ /* Unload the image and free the LDEV */
LDEVOBJ_vUnloadImage(pldev); LDEVOBJ_vUnloadImage(pldev);

View file

@ -15,8 +15,7 @@ typedef enum
typedef struct _LDEVOBJ typedef struct _LDEVOBJ
{ {
struct _LDEVOBJ *pldevNext; LIST_ENTRY leLink;
struct _LDEVOBJ *pldevPrev;
SYSTEM_GDI_DRIVER_INFORMATION *pGdiDriverInfo; SYSTEM_GDI_DRIVER_INFORMATION *pGdiDriverInfo;
LDEVTYPE ldevtype; LDEVTYPE ldevtype;
ULONG cRefs; ULONG cRefs;