Index: ntuser/windc.c =================================================================== --- ntuser/windc.c (revision 16879) +++ ntuser/windc.c (working copy) @@ -968,76 +968,79 @@ #undef COPY_DEVMODE_VALUE_TO_CALLER -LONG -STDCALL +LONG STDCALL NtUserChangeDisplaySettings( - PUNICODE_STRING lpszDeviceName, - LPDEVMODEW lpDevMode, - HWND hwnd, - DWORD dwflags, - LPVOID lParam) + PUNICODE_STRING lpszDeviceName, + LPDEVMODEW lpDevMode, + HWND hWnd, + DWORD dwFlags, + LPVOID lParam) { - NTSTATUS Status; - DEVMODEW DevMode; - PUNICODE_STRING pSafeDeviceName = NULL; - UNICODE_STRING SafeDeviceName; - LONG Ret; + DEVMODEW DevMode; + VIDEOPARAMETERS VideoParameters; + UNICODE_STRING DeviceName; + PWINDOW_OBJECT DesktopWindow; + LONG Ret; - /* Check arguments */ -#ifdef CDS_VIDEOPARAMETERS - if (dwflags != CDS_VIDEOPARAMETERS && lParam != NULL) -#else - if (lParam != NULL) -#endif - { - SetLastWin32Error(ERROR_INVALID_PARAMETER); - return DISP_CHANGE_BADPARAM; - } - if (hwnd != NULL) - { - SetLastWin32Error(ERROR_INVALID_PARAMETER); - return DISP_CHANGE_BADPARAM; - } + /* Check arguments */ + if ((dwFlags & ~(CDS_UPDATEREGISTRY | CDS_TEST | CDS_FULLSCREEN | + CDS_GLOBAL | CDS_SET_PRIMARY | CDS_VIDEOPARAMETERS | CDS_RESET | + CDS_NORESET)) || + (dwFlags & (CDS_NORESET | CDS_RESET)) == (CDS_NORESET | CDS_RESET)) + return DISP_CHANGE_BADFLAGS; - /* Copy devmode */ - Status = MmCopyFromCaller(&DevMode.dmSize, &lpDevMode->dmSize, sizeof (DevMode.dmSize)); - if (!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return DISP_CHANGE_BADPARAM; - } - DevMode.dmSize = min(sizeof (DevMode), DevMode.dmSize); - Status = MmCopyFromCaller(&DevMode, lpDevMode, DevMode.dmSize); - if (!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return DISP_CHANGE_BADPARAM; - } - if (DevMode.dmDriverExtra > 0) - { - DbgPrint("(%s:%i) WIN32K: %s lpDevMode->dmDriverExtra is IGNORED!\n", __FILE__, __LINE__, __FUNCTION__); - DevMode.dmDriverExtra = 0; - } + /* Don't allow changing resolution on non-active desktop. */ + if (PsGetWin32Thread()->Desktop != IntGetActiveDesktop()) + return DISP_CHANGE_FAILED; - /* Copy the device name */ - if (lpszDeviceName != NULL) - { - Status = IntSafeCopyUnicodeString(&SafeDeviceName, lpszDeviceName); - if (!NT_SUCCESS(Status)) - { - SetLastNtError(Status); + /* Copy the user mode parameters. */ + if ((ULONG_PTR)lpDevMode >= MM_USER_PROBE_ADDRESS) return DISP_CHANGE_BADPARAM; - } - pSafeDeviceName = &SafeDeviceName; - } + if ((dwFlags & CDS_VIDEOPARAMETERS) && (ULONG_PTR)lParam >= MM_USER_PROBE_ADDRESS) + return DISP_CHANGE_BADPARAM; + if (lpszDeviceName != NULL && + !NT_SUCCESS(IntSafeCopyUnicodeString(&DeviceName, lpszDeviceName))) + return DISP_CHANGE_BADPARAM; + _SEH_TRY + { + memcpy(&DevMode, lpDevMode, min(sizeof(DevMode), lpDevMode->dmSize)); + if (dwFlags & CDS_VIDEOPARAMETERS) + memcpy(&VideoParameters, lParam, sizeof(VideoParameters)); + } + _SEH_HANDLE + { + return DISP_CHANGE_BADPARAM; + } + _SEH_END - /* Call internal function */ - Ret = IntChangeDisplaySettings(pSafeDeviceName, &DevMode, dwflags, lParam); - if (pSafeDeviceName != NULL) - RtlFreeUnicodeString(pSafeDeviceName); + /* Do preparations for actual resultion change. */ + if (dwFlags & (CDS_TEST | CDS_NORESET)) + { + /* FIXME: Disable mouse cursor and get rid of all sprites that could + possibly be in video memory. */ + } - return Ret; + /* Call internal GDI function. */ + Ret = IntChangeDisplaySettings( + lpszDeviceName != NULL ? &DeviceName : NULL, + &DevMode, dwFlags, + (dwFlags & CDS_VIDEOPARAMETERS) ? &VideoParameters : NULL); + + /* If actual display resoultion change happens then restore the state. */ + if (dwFlags & (CDS_TEST | CDS_NORESET)) + { + /* FIXME: Enable mouse cursor. */ + DesktopWindow = IntGetWindowObject(IntGetDesktopWindow()); + IntRedrawWindow(DesktopWindow, NULL, NULL, RDW_ERASE | + RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN); + IntReleaseWindowObject(DesktopWindow); + } + + if (lpszDeviceName != NULL) + RtlFreeUnicodeString(&DeviceName); + + return Ret; } Index: ntuser/winsta.c =================================================================== --- ntuser/winsta.c (revision 16879) +++ ntuser/winsta.c (working copy) @@ -37,7 +37,7 @@ #include -#define NDEBUG +//#define NDEBUG #include /* GLOBALS *******************************************************************/ Index: ntuser/cursoricon.c =================================================================== --- ntuser/cursoricon.c (revision 16879) +++ ntuser/cursoricon.c (working copy) @@ -129,7 +129,7 @@ { return Ret; } - dcbmp = dc->w.hBitmap; + dcbmp = DC_BITMAP(dc); DevInfo = dc->DevInfo; DC_UnlockDc(dc); Index: ntuser/input.c =================================================================== --- ntuser/input.c (revision 16879) +++ ntuser/input.c (working copy) @@ -953,7 +953,7 @@ dc = DC_LockDc(hDC); if (dc) { - hBitmap = dc->w.hBitmap; + hBitmap = DC_BITMAP(dc); DC_UnlockDc(dc); BitmapObj = BITMAPOBJ_LockBitmap(hBitmap); Index: ntuser/desktop.c =================================================================== --- ntuser/desktop.c (revision 16879) +++ ntuser/desktop.c (working copy) @@ -350,7 +350,7 @@ BITMAPOBJ *BitmapObj; dc = DC_LockDc(ScreenDeviceContext); /* FIXME - Handle dc == NULL!!!! */ - BitmapObj = BITMAPOBJ_LockBitmap(dc->w.hBitmap); + BitmapObj = BITMAPOBJ_LockBitmap(DC_BITMAP(dc)); if(BitmapObj) { Ret->right = BitmapObj->SurfObj.sizlBitmap.cx; Index: ntuser/msgqueue.c =================================================================== --- ntuser/msgqueue.c (revision 16879) +++ ntuser/msgqueue.c (working copy) @@ -36,7 +36,7 @@ /* GLOBALS *******************************************************************/ -#define SYSTEM_MESSAGE_QUEUE_SIZE (256) +#define SYSTEM_MESSAGE_QUEUE_SIZE (/*256*/1024) static MSG SystemMessageQueue[SYSTEM_MESSAGE_QUEUE_SIZE]; static ULONG SystemMessageQueueHead = 0; @@ -454,11 +454,13 @@ PVOID WaitObjects[2]; NTSTATUS WaitStatus; +#if 1 if( !IntGetScreenDC() || PsGetWin32Thread()->MessageQueue == W32kGetPrimitiveMessageQueue() ) { return FALSE; } +#endif WaitObjects[1] = MessageQueue->NewMessages; WaitObjects[0] = &HardwareMessageQueueLock; Index: objects/dib.c =================================================================== --- objects/dib.c (revision 16737) +++ objects/dib.c (working copy) @@ -39,7 +39,7 @@ return 0; } - BitmapObj = BITMAPOBJ_LockBitmap(dc->w.hBitmap); + BitmapObj = BITMAPOBJ_LockBitmap(DC_BITMAP(dc)); if (BitmapObj == NULL) { DC_UnlockDc(dc); @@ -104,7 +104,7 @@ return 0; } - BitmapObj = BITMAPOBJ_LockBitmap(dc->w.hBitmap); + BitmapObj = BITMAPOBJ_LockBitmap(DC_BITMAP(dc)); if (BitmapObj == NULL) { DC_UnlockDc(dc); @@ -382,7 +382,7 @@ DC_UnlockDc(Dc); return 0; } - hSourcePalette = Dc->w.hPalette; + hSourcePalette = DC_PALETTE(Dc); /* FIXME: This is incorrect. hDestPalette should be something other. */ hDestPalette = Dc->DevInfo->hpalDefault; DC_UnlockDc(Dc); @@ -1105,7 +1105,7 @@ USHORT *lpIndex; PPALGDI palGDI; - palGDI = PALETTE_LockPalette(dc->w.hPalette); + palGDI = PALETTE_LockPalette(DC_PALETTE(dc)); if (NULL == palGDI) { Index: objects/gdiobj.c =================================================================== --- objects/gdiobj.c (revision 16731) +++ objects/gdiobj.c (working copy) @@ -497,7 +497,9 @@ if(PrevProcId == ProcessId) { if(Entry->Type != 0 && Entry->KernelData != NULL && - (ExpectedType == 0 || ((Entry->Type << 16) == ExpectedType))) + (ExpectedType == 0 || ((Entry->Type << 16) == ExpectedType)) && + (Entry->Type & (GDI_HANDLE_TYPE_MASK | GDI_HANDLE_REUSE_MASK)) == + ((ULONG_PTR)hObj & (GDI_HANDLE_TYPE_MASK | GDI_HANDLE_REUSE_MASK))) { PGDIOBJHDR GdiHdr; @@ -554,10 +556,12 @@ if((Entry->Type & ~GDI_HANDLE_REUSE_MASK) != 0) { DPRINT1("Attempted to delete object 0x%x, type mismatch (0x%x : 0x%x)\n", hObj, ObjectType, ExpectedType); + KeRosDumpStackFrames(NULL, 20); } else { DPRINT1("Attempted to delete object 0x%x which was already deleted!\n", hObj); + KeRosDumpStackFrames(NULL, 20); } InterlockedExchangePointer(&Entry->ProcessId, PrevProcId); } @@ -583,10 +587,12 @@ if(((ULONG_PTR)PrevProcId & ~0x1) == 0) { DPRINT1("Attempted to free global gdi handle 0x%x, caller needs to get ownership first!!!\n", hObj); + KeRosDumpStackFrames(NULL, 20); } else { DPRINT1("Attempted to free foreign handle: 0x%x Owner: 0x%x from Caller: 0x%x\n", hObj, (ULONG_PTR)PrevProcId & ~0x1, (ULONG_PTR)ProcessId & ~0x1); + KeRosDumpStackFrames(NULL, 20); } #ifdef GDI_DEBUG DPRINT1("-> called from %s:%i\n", file, line); @@ -800,17 +806,13 @@ if ((HandleType & ~GDI_HANDLE_REUSE_MASK) == 0) { DPRINT1("Attempted to lock object 0x%x that is deleted!\n", hObj); -#ifdef GDI_DEBUG KeRosDumpStackFrames(NULL, 20); -#endif } else { DPRINT1("Attempted to lock object 0x%x, type mismatch (0x%x : 0x%x)\n", hObj, HandleType & ~GDI_HANDLE_REUSE_MASK, ObjectType & ~GDI_HANDLE_REUSE_MASK); -#ifdef GDI_DEBUG KeRosDumpStackFrames(NULL, 20); -#endif } #ifdef GDI_DEBUG DPRINT1("-> called from %s:%i\n", file, line); @@ -937,17 +939,13 @@ if ((HandleType & ~GDI_HANDLE_REUSE_MASK) == 0) { DPRINT1("Attempted to lock object 0x%x that is deleted!\n", hObj); -#ifdef GDI_DEBUG KeRosDumpStackFrames(NULL, 20); -#endif } else { DPRINT1("Attempted to lock object 0x%x, type mismatch (0x%x : 0x%x)\n", hObj, HandleType & ~GDI_HANDLE_REUSE_MASK, ObjectType & ~GDI_HANDLE_REUSE_MASK); -#ifdef GDI_DEBUG KeRosDumpStackFrames(NULL, 20); -#endif } #ifdef GDI_DEBUG DPRINT1("-> called from %s:%i\n", file, line); @@ -997,7 +995,6 @@ #endif } - BOOL INTERNAL_CALL GDIOBJ_OwnedByCurrentProcess(HGDIOBJ ObjectHandle) { Index: objects/bitmaps.c =================================================================== --- objects/bitmaps.c (revision 16731) +++ objects/bitmaps.c (working copy) @@ -121,13 +121,13 @@ BrushOrigin.y = 0; /* Determine surfaces to be used in the bitblt */ - BitmapDest = BITMAPOBJ_LockBitmap(DCDest->w.hBitmap); + BitmapDest = BITMAPOBJ_LockBitmap(DC_BITMAP(DCDest)); if (UsesSource) { - if (DCSrc->w.hBitmap == DCDest->w.hBitmap) + if (DC_BITMAP(DCSrc) == DC_BITMAP(DCDest)) BitmapSrc = BitmapDest; else - BitmapSrc = BITMAPOBJ_LockBitmap(DCSrc->w.hBitmap); + BitmapSrc = BITMAPOBJ_LockBitmap(DC_BITMAP(DCSrc)); } else { @@ -166,11 +166,11 @@ /* Create the XLATEOBJ. */ if (UsesSource) { - if (DCDest->w.hPalette != 0) - DestPalette = DCDest->w.hPalette; + if (DC_PALETTE(DCDest) != 0) + DestPalette = DC_PALETTE(DCDest); - if (DCSrc->w.hPalette != 0) - SourcePalette = DCSrc->w.hPalette; + if (DC_PALETTE(DCSrc) != 0) + SourcePalette = DC_PALETTE(DCSrc); /* KB41464 details how to convert between mono and color */ if (DCDest->w.bitsPerPixel == 1 && DCSrc->w.bitsPerPixel == 1) @@ -312,11 +312,11 @@ xSrc += DCSrc->w.DCOrgX; ySrc += DCSrc->w.DCOrgY; - if(DCDest->w.hPalette) - DestPalette = DCDest->w.hPalette; + if(DC_PALETTE(DCDest)) + DestPalette = DC_PALETTE(DCDest); - if(DCSrc->w.hPalette) - SourcePalette = DCSrc->w.hPalette; + if(DC_PALETTE(DCSrc)) + SourcePalette = DC_PALETTE(DCSrc); if(!(PalSourceGDI = PALETTE_LockPalette(SourcePalette))) { @@ -355,10 +355,10 @@ /* Create the XLATE object to convert colors between source and destination */ XlateObj = (XLATEOBJ*)IntEngCreateXlate(PalDestMode, PalSrcMode, DestPalette, SourcePalette); - BitmapDest = BITMAPOBJ_LockBitmap(DCDest->w.hBitmap); + BitmapDest = BITMAPOBJ_LockBitmap(DC_BITMAP(DCDest)); /* FIXME - BitmapDest can be NULL!!!! Don't assert here! */ ASSERT(BitmapDest); - BitmapSrc = BITMAPOBJ_LockBitmap(DCSrc->w.hBitmap); + BitmapSrc = BITMAPOBJ_LockBitmap(DC_BITMAP(DCSrc)); /* FIXME - BitmapSrc can be NULL!!!! Don't assert here! */ ASSERT(BitmapSrc); @@ -633,12 +633,12 @@ if ( IN_RECT(dc->CombinedClip->rclBounds,XPos,YPos) ) { bInRect = TRUE; - BitmapObject = BITMAPOBJ_LockBitmap(dc->w.hBitmap); + BitmapObject = BITMAPOBJ_LockBitmap(DC_BITMAP(dc)); SurfaceObject = &BitmapObject->SurfObj; if ( BitmapObject ) { - if ( dc->w.hPalette != 0 ) - Pal = dc->w.hPalette; + if ( DC_PALETTE(dc) != 0 ) + Pal = DC_PALETTE(dc); /* FIXME: Verify if it shouldn't be PAL_BGR! */ XlateObj = (XLATEOBJ*)IntEngCreateXlate ( PAL_RGB, 0, NULL, Pal ); if ( XlateObj ) @@ -1149,13 +1149,13 @@ SourceRect.bottom = YOriginSrc+HeightSrc; /* Determine surfaces to be used in the bitblt */ - BitmapDest = BITMAPOBJ_LockBitmap(DCDest->w.hBitmap); + BitmapDest = BITMAPOBJ_LockBitmap(DC_BITMAP(DCDest)); if (UsesSource) { - if (DCSrc->w.hBitmap == DCDest->w.hBitmap) + if (DC_BITMAP(DCSrc) == DC_BITMAP(DCDest)) BitmapSrc = BitmapDest; else - BitmapSrc = BITMAPOBJ_LockBitmap(DCSrc->w.hBitmap); + BitmapSrc = BITMAPOBJ_LockBitmap(DC_BITMAP(DCSrc)); } else { @@ -1238,11 +1238,11 @@ /* Create the XLATEOBJ. */ if (UsesSource) { - if (DCDest->w.hPalette != 0) - DestPalette = DCDest->w.hPalette; + if (DC_PALETTE(DCDest) != 0) + DestPalette = DC_PALETTE(DCDest); - if (DCSrc->w.hPalette != 0) - SourcePalette = DCSrc->w.hPalette; + if (DC_PALETTE(DCSrc) != 0) + SourcePalette = DC_PALETTE(DCSrc); /* FIXME: Use the same logic for create XLATEOBJ as in NtGdiBitBlt. */ XlateObj = (XLATEOBJ*)IntEngCreateXlate(0, 0, DestPalette, SourcePalette); @@ -1271,7 +1271,7 @@ BRUSHOBJ_UnlockBrush(BrushObj); } failed: - if (UsesSource && DCSrc->w.hBitmap != DCDest->w.hBitmap) + if (UsesSource && DC_BITMAP(DCSrc) != DC_BITMAP(DCDest)) { BITMAPOBJ_UnlockBitmap(BitmapSrc); } Index: objects/fillshap.c =================================================================== --- objects/fillshap.c (revision 16731) +++ objects/fillshap.c (working copy) @@ -61,7 +61,7 @@ return FALSE; } - BitmapObj = BITMAPOBJ_LockBitmap(dc->w.hBitmap); + BitmapObj = BITMAPOBJ_LockBitmap(DC_BITMAP(dc)); /* FIXME - BitmapObj can be NULL!!!! don't assert but handle this case gracefully! */ ASSERT(BitmapObj); @@ -264,7 +264,7 @@ return FALSE; } - BitmapObj = BITMAPOBJ_LockBitmap(dc->w.hBitmap); + BitmapObj = BITMAPOBJ_LockBitmap(DC_BITMAP(dc)); if (NULL == BitmapObj) { BRUSHOBJ_UnlockBrush(FillBrush); @@ -963,7 +963,7 @@ int RightRect, int BottomRect) { - BITMAPOBJ *BitmapObj = BITMAPOBJ_LockBitmap(dc->w.hBitmap); + BITMAPOBJ *BitmapObj = BITMAPOBJ_LockBitmap(DC_BITMAP(dc)); PGDIBRUSHOBJ PenBrushObj, FillBrushObj; GDIBRUSHINST PenBrushInst, FillBrushInst; BOOL ret = FALSE; // default to failure @@ -1146,7 +1146,7 @@ RectBounds.top = top; RectBounds.bottom = bottom; - BitmapObj = BITMAPOBJ_LockBitmap(dc->w.hBitmap); + BitmapObj = BITMAPOBJ_LockBitmap(DC_BITMAP(dc)); if (!BitmapObj) { /* Nothing to do, as we don't have a bitmap */ @@ -1475,17 +1475,17 @@ Extent.top += DitherOrg.y; Extent.bottom += DitherOrg.y; - BitmapObj = BITMAPOBJ_LockBitmap(dc->w.hBitmap); + BitmapObj = BITMAPOBJ_LockBitmap(DC_BITMAP(dc)); /* FIXME - BitmapObj can be NULL!!! Don't assert but handle this case gracefully! */ ASSERT(BitmapObj); - PalDestGDI = PALETTE_LockPalette(dc->w.hPalette); + PalDestGDI = PALETTE_LockPalette(DC_PALETTE(dc)); /* FIXME - PalDestGDI can be NULL!!! Don't assert but handle this case gracefully! */ ASSERT(PalDestGDI); Mode = PalDestGDI->Mode; PALETTE_UnlockPalette(PalDestGDI); - XlateObj = (XLATEOBJ*)IntEngCreateXlate(Mode, PAL_RGB, dc->w.hPalette, NULL); + XlateObj = (XLATEOBJ*)IntEngCreateXlate(Mode, PAL_RGB, DC_PALETTE(dc), NULL); ASSERT(XlateObj); Ret = IntEngGradientFill(&BitmapObj->SurfObj, Index: objects/color.c =================================================================== --- objects/color.c (revision 16731) +++ objects/color.c (working copy) @@ -114,7 +114,7 @@ dc = DC_LockDc(hDC); if (NULL != dc) { - if (dc->w.hPalette == hPal) + if (DC_PALETTE(dc) == hPal) { DC_UnlockDc(dc); NtGdiRealizePalette(hDC); @@ -210,7 +210,7 @@ dc = DC_LockDc(hDC); if (NULL != dc) { - HPALETTE hpal = dc->w.hPalette; + HPALETTE hpal = DC_PALETTE(dc); palGDI = (PPALGDI) PALETTE_LockPalette(hpal); if (!palGDI) { @@ -378,15 +378,15 @@ return 0; systemPalette = NtGdiGetStockObject((INT)DEFAULT_PALETTE); - palGDI = PALETTE_LockPalette(dc->w.hPalette); + palGDI = PALETTE_LockPalette(DC_PALETTE(dc)); palPtr = (PALOBJ*) palGDI; /* FIXME - Handle palGDI == NULL!!!! */ // Step 1: Create mapping of system palette\DC palette #ifndef NO_MAPPING realized = PALETTE_SetMapping(palPtr, 0, palGDI->NumColors, - (dc->w.hPalette != hPrimaryPalette) || - (dc->w.hPalette == NtGdiGetStockObject(DEFAULT_PALETTE))); + (DC_PALETTE(dc) != hPrimaryPalette) || + (DC_PALETTE(dc) == NtGdiGetStockObject(DEFAULT_PALETTE))); #else realized = 0; #endif @@ -422,7 +422,7 @@ if(dc->w.flags != DC_MEMORY) { // Device managed DC - palGDI->logicalToSystem = IntEngCreateXlate(sysMode, palMode, systemPalette, dc->w.hPalette); + palGDI->logicalToSystem = IntEngCreateXlate(sysMode, palMode, systemPalette, DC_PALETTE(dc)); } DC_UnlockDc(dc); @@ -493,6 +493,8 @@ HPALETTE oldPal = NULL; PPALGDI PalGDI; + /* FIXME: Check for memory DC. */ + // FIXME: mark the palette as a [fore\back]ground pal dc = DC_LockDc(hDC); if (NULL != dc) @@ -506,7 +508,7 @@ || (8 < dc->w.bitsPerPixel && PAL_INDEXED != PalGDI->Mode)) { PALETTE_UnlockPalette(PalGDI); - oldPal = dc->w.hPalette; + oldPal = DC_PALETTE(dc); dc->w.hPalette = hpal; } else Index: objects/brush.c =================================================================== --- objects/brush.c (revision 16731) +++ objects/brush.c (working copy) @@ -61,7 +61,7 @@ } else if (BrushObj->flAttrs & GDIBRUSH_IS_SOLID) { - Result = IntEngCreateXlate(0, PAL_RGB, Dc->w.hPalette, NULL); + Result = IntEngCreateXlate(0, PAL_RGB, DC_PALETTE(Dc), NULL); *Failed = FALSE; } else @@ -74,11 +74,11 @@ if (Pattern->SurfObj.iBitmapFormat == BMF_1BPP) { if (Dc->w.bitsPerPixel != 1) - Result = IntEngCreateSrcMonoXlate(Dc->w.hPalette, Dc->w.textColor, Dc->w.backgroundColor); + Result = IntEngCreateSrcMonoXlate(DC_PALETTE(Dc), Dc->w.textColor, Dc->w.backgroundColor); } else if (BrushObj->flAttrs & GDIBRUSH_IS_DIB) { - Result = IntEngCreateXlate(0, 0, Dc->w.hPalette, Pattern->hDIBPalette); + Result = IntEngCreateXlate(0, 0, DC_PALETTE(Dc), Pattern->hDIBPalette); } BITMAPOBJ_UnlockBitmap(Pattern); @@ -449,7 +449,7 @@ ASSERT(BrushObj); - BitmapObj = BITMAPOBJ_LockBitmap(dc->w.hBitmap); + BitmapObj = BITMAPOBJ_LockBitmap(DC_BITMAP(dc)); if (BitmapObj == NULL) { SetLastWin32Error(ERROR_INVALID_HANDLE); Index: objects/region.c =================================================================== --- objects/region.c (revision 16731) +++ objects/region.c (working copy) @@ -2501,7 +2501,7 @@ BrushOrigin.x = dc->w.brushOrgX; BrushOrigin.y = dc->w.brushOrgY; - BitmapObj = BITMAPOBJ_LockBitmap(dc->w.hBitmap); + BitmapObj = BITMAPOBJ_LockBitmap(DC_BITMAP(dc)); /* FIXME - Handle BitmapObj == NULL !!!! */ bRet = IntEngPaint(&BitmapObj->SurfObj, Index: objects/dc.c =================================================================== --- objects/dc.c (revision 16748) +++ objects/dc.c (working copy) @@ -414,6 +414,8 @@ wcscpy(ProfilePath + (AfterControlSet - RegistryPath.Buffer), Insert); wcscat(ProfilePath, AfterControlSet); + DevMode->dmLogPixels = 96; + RtlZeroMemory(QueryTable, sizeof(QueryTable)); QueryTable[0].QueryRoutine = DevModeCallback; QueryTable[0].Flags = 0; @@ -622,17 +624,6 @@ } } - 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; - } - PrimarySurface.Pointer.Exclude.right = -1; DPRINT("calling completePDev\n"); @@ -800,14 +791,14 @@ NewDC->PDev = PrimarySurface.PDev; NewDC->GDIDevice = (HDEV)&PrimarySurface; NewDC->DriverFunctions = PrimarySurface.DriverFunctions; - NewDC->w.hBitmap = PrimarySurface.Handle; + NewDC->w.hBitmap = NULL; NewDC->w.bitsPerPixel = NewDC->GDIInfo->cBitsPixel * NewDC->GDIInfo->cPlanes; DPRINT("Bits per pel: %u\n", NewDC->w.bitsPerPixel); if (! CreateAsIC) { - NewDC->w.hPalette = NewDC->DevInfo->hpalDefault; +// NewDC->w.hPalette = NULL; NewDC->w.ROPmode = R2_COPYPEN; DC_UnlockDc( NewDC ); @@ -1088,7 +1079,7 @@ SelObject = dc->w.hFont; break; case OBJ_BITMAP: - SelObject = dc->w.hBitmap; + SelObject = DC_BITMAP(dc); break; case OBJ_COLORSPACE: DPRINT1("FIXME: NtGdiGetCurrentObject() ObjectType OBJ_COLORSPACE not supported yet!\n"); @@ -1375,15 +1366,16 @@ NtGdiSelectClipRgn(hDC, dcs->w.hClipRgn); #endif - NtGdiSelectObject( hDC, dcs->w.hBitmap ); + if (dc->w.flags & DC_MEMORY) + NtGdiSelectObject( hDC, DC_BITMAP(dcs) ); NtGdiSelectObject( hDC, dcs->w.hBrush ); NtGdiSelectObject( hDC, dcs->w.hFont ); NtGdiSelectObject( hDC, dcs->w.hPen ); NtGdiSetBkColor( hDC, dcs->w.backgroundColor); NtGdiSetTextColor( hDC, dcs->w.textColor); + if (dcs->w.hPalette != NULL) + NtGdiSelectPalette( hDC, dcs->w.hPalette, FALSE ); - NtGdiSelectPalette( hDC, dcs->w.hPalette, FALSE ); - #if 0 GDISelectPalette16( hDC, dcs->w.hPalette, FALSE ); #endif @@ -2029,7 +2021,7 @@ DC_UnlockDc(dc); return NULL; } - objOrg = (HGDIOBJ)dc->w.hBitmap; + objOrg = DC_BITMAP(dc); /* Release the old bitmap, lock the new one and convert it to a SURF */ dc->w.hBitmap = hGDIObj; @@ -2043,7 +2035,7 @@ else { dc->w.bitsPerPixel = BitsPerFormat(pb->SurfObj.iBitmapFormat); - dc->w.hPalette = dc->DevInfo->hpalDefault; +// dc->w.hPalette = NtGdiGetStockObject(DEFAULT_PALETTE); } /* Reselect brush and pen to regenerate the XLATEOBJs. */ @@ -2571,28 +2563,100 @@ return TRUE; } -LONG -FASTCALL + +LONG FASTCALL IntChangeDisplaySettings( - IN PUNICODE_STRING pDeviceName OPTIONAL, - IN LPDEVMODEW DevMode, - IN DWORD dwflags, - IN PVOID lParam OPTIONAL) + IN PUNICODE_STRING lpDeviceName OPTIONAL, + IN LPDEVMODEW lpDevMode, + IN DWORD dwFlags, + IN PVOID lParam OPTIONAL) { - BOOLEAN Global = FALSE; - BOOLEAN NoReset = FALSE; - BOOLEAN Reset = FALSE; - BOOLEAN SetPrimary = FALSE; - LONG Ret=0; - NTSTATUS Status ; + GDIDEVICE *GdiDevice = &PrimarySurface; /* FIXME: Respect the device name! */ + GDIINFO GdiInfo; + DEVINFO DevInfo; + DHPDEV PDev, OldPDev; + HSURF NewSurface; + LONG Ret = DISP_CHANGE_FAILED; - DPRINT1("display flag : %x\n",dwflags); + /* FIXME: Interlocked */ + GdiDevice->PreparedDriver = FALSE; - if ((dwflags & CDS_UPDATEREGISTRY) == CDS_UPDATEREGISTRY) - { - /* Check global, reset and noreset flags */ - if ((dwflags & CDS_GLOBAL) == CDS_GLOBAL) - Global = TRUE; + DceEmptyCache(); + + DPRINT1("Begin mode change\n"); + DPRINT1("dmBitsPerPel %d dmDisplayFrequency %d dmPelsWidth %d dmPelsHeight %d\n", + lpDevMode->dmBitsPerPel, lpDevMode->dmDisplayFrequency, + lpDevMode->dmPelsWidth, lpDevMode->dmPelsHeight); + lpDevMode->dmDisplayFrequency = 1; + + RtlZeroMemory(&GdiInfo, sizeof(GdiInfo)); + + PDev = GdiDevice->DriverFunctions.EnablePDEV( + lpDevMode, NULL, 0, NULL, sizeof(GdiInfo), (ULONG *)&GdiInfo, + sizeof(DevInfo), &DevInfo, NULL, L"", + (HANDLE)(GdiDevice->VideoFileObject->DeviceObject)); + if (dwFlags & CDS_TEST) + { + if (PDev != NULL) + Ret = DISP_CHANGE_SUCCESSFUL; + GdiDevice->DriverFunctions.DisablePDEV(PDev); + } else + { + if (PDev != NULL) + { + OldPDev = GdiDevice->PDev; + + /* Complete initialization of the physical device */ + GdiDevice->DriverFunctions.CompletePDEV(PDev, (HDEV)&GdiDevice); + + GdiDevice->DriverFunctions.AssertMode(OldPDev, FALSE); + + NewSurface = GdiDevice->DriverFunctions.EnableSurface(PDev); + if (GdiDevice->Handle != NULL) + { + GdiDevice->DriverFunctions.DisableSurface(OldPDev); + GdiDevice->DriverFunctions.DisablePDEV(OldPDev); + + memcpy(&GdiDevice->DMW, lpDevMode, sizeof(DEVMODEW)); + memcpy(&GdiDevice->GDIInfo, &GdiInfo, sizeof(GdiInfo)); + memcpy(&GdiDevice->DevInfo, &DevInfo, sizeof(DevInfo)); + GdiDevice->PDev = PDev; + Ret = DISP_CHANGE_SUCCESSFUL; + } + else + { + GdiDevice->DriverFunctions.AssertMode(OldPDev, TRUE); + GdiDevice->DriverFunctions.DisablePDEV(PDev); + } + } + } + + GdiDevice->PreparedDriver = TRUE; + + DPRINT1("End mode change\n"); + + /* Attach monitor */ +// IntAttachMonitor(&PrimarySurface, PrimarySurface.DisplayNumber); + +// IntShowDesktop(IntGetActiveDesktop(), SurfSize.cx, SurfSize.cy); + + return Ret; + +#if 0 + BOOLEAN Global = FALSE; + BOOLEAN NoReset = FALSE; + BOOLEAN Reset = FALSE; + BOOLEAN SetPrimary = FALSE; + LONG Ret=0; + NTSTATUS Status ; + + DPRINT1("display flag : %x\n",dwflags); + + if ((dwFlags & CDS_UPDATEREGISTRY) == CDS_UPDATEREGISTRY) + { + /* Check global, reset and noreset flags */ + if ((dwflags & CDS_GLOBAL) == CDS_GLOBAL) + Global = TRUE; if ((dwflags & CDS_NORESET) == CDS_NORESET) NoReset = TRUE; dwflags &= ~(CDS_GLOBAL | CDS_NORESET); @@ -2785,6 +2849,7 @@ Ret = DISP_CHANGE_BADFLAGS; return Ret; +#endif } /* EOF */ Index: objects/line.c =================================================================== --- objects/line.c (revision 16731) +++ objects/line.c (working copy) @@ -74,7 +74,7 @@ } else { - BitmapObj = BITMAPOBJ_LockBitmap ( dc->w.hBitmap ); + BitmapObj = BITMAPOBJ_LockBitmap ( DC_BITMAP(dc) ); if (NULL == BitmapObj) { SetLastWin32Error(ERROR_INVALID_HANDLE); @@ -214,7 +214,7 @@ Points = EngAllocMem(0, Count * sizeof(POINT), TAG_COORD); if (Points != NULL) { - BitmapObj = BITMAPOBJ_LockBitmap(dc->w.hBitmap); + BitmapObj = BITMAPOBJ_LockBitmap(DC_BITMAP(dc)); /* FIXME - BitmapObj can be NULL!!!! Don't assert but handle this case gracefully! */ ASSERT(BitmapObj); Index: objects/print.c =================================================================== --- objects/print.c (revision 16731) +++ objects/print.c (working copy) @@ -111,7 +111,7 @@ INT OutSize, LPSTR OutData) { - BITMAPOBJ *BitmapObj = BITMAPOBJ_LockBitmap(dc->w.hBitmap); + BITMAPOBJ *BitmapObj = BITMAPOBJ_LockBitmap(DC_BITMAP(dc)); INT Result; /* FIXME - Handle BitmapObj == NULL !!!!!! */ Index: misc/object.c =================================================================== --- misc/object.c (revision 16731) +++ misc/object.c (working copy) @@ -43,18 +43,30 @@ /* FUNCTIONS *****************************************************************/ VOID FASTCALL +ObmpDumpObject(PUSER_OBJECT_HEADER ObjectHeader) +{ + DPRINT1("Object 0x%p [Type: %x HandleCount: %x RefCount: %x Size: %x]\n", + ObjectHeader, ObjectHeader->Type, ObjectHeader->HandleCount, + ObjectHeader->RefCount, ObjectHeader->Size); +} + +VOID FASTCALL ObmpPerformRetentionChecks(PUSER_OBJECT_HEADER ObjectHeader) { if (ObjectHeader->RefCount < 0) { DPRINT1("ObjectHeader 0x%X has invalid reference count (%d)\n", ObjectHeader, ObjectHeader->RefCount); + ObmpDumpObject(ObjectHeader); + KeRosDumpStackFrames(NULL, 20); } if (ObjectHeader->HandleCount < 0) { DPRINT1("Object 0x%X has invalid handle count (%d)\n", ObjectHeader, ObjectHeader->HandleCount); + ObmpDumpObject(ObjectHeader); + KeRosDumpStackFrames(NULL, 20); } if ((ObjectHeader->RefCount == 0) && (ObjectHeader->HandleCount == 0)) @@ -461,6 +473,8 @@ if ((ObjectType != otUnknown) && (ObjectHeader->Type != ObjectType)) { DPRINT1("Object type mismatch 0x%x 0x%x\n", ObjectType, ObjectHeader->Type); + ObmpDumpObject(ObjectHeader); + KeRosDumpStackFrames(NULL, 20); ObmDereferenceObject(ObjectBody); return STATUS_UNSUCCESSFUL; } Index: eng/bitblt.c =================================================================== --- eng/bitblt.c (revision 16731) +++ eng/bitblt.c (working copy) @@ -551,6 +551,9 @@ BITMAPOBJ *DestObj; BITMAPOBJ *SourceObj = NULL; + if (DestSurf == NULL) + return FALSE; + ASSERT(DestSurf); DestObj = CONTAINING_RECORD(DestSurf, BITMAPOBJ, SurfObj); ASSERT(DestObj); Index: w32k.h =================================================================== --- w32k.h (revision 16731) +++ w32k.h (working copy) @@ -12,6 +12,7 @@ #include #include #include +#include #include /* Win32 Headers */