Sync with trunk r58033.

svn path=/branches/ros-csrss/; revision=58034
This commit is contained in:
Hermès Bélusca-Maïto 2012-12-28 23:37:33 +00:00
commit f44e914e80
804 changed files with 56186 additions and 25131 deletions

View file

@ -71,6 +71,7 @@ list(APPEND SOURCE
gdi/eng/lineto.c
gdi/eng/ldevobj.c
gdi/eng/mapping.c
gdi/eng/math.c
gdi/eng/mem.c
gdi/eng/engmisc.c
gdi/eng/mouse.c
@ -88,11 +89,9 @@ list(APPEND SOURCE
gdi/eng/xlateobj.c
user/ntuser/main.c
user/ntuser/misc/file.c
user/ntuser/misc/math.c
user/ntuser/misc/rtlstr.c
user/ntuser/misc/copy.c
user/ntuser/misc/registry.c
user/ntuser/misc/usrheap.c
reactx/ntddraw/ddraw.c
reactx/ntddraw/dd.c
reactx/ntddraw/ddsurf.c
@ -135,6 +134,7 @@ list(APPEND SOURCE
user/ntuser/sysparams.c
user/ntuser/timer.c
user/ntuser/useratom.c
user/ntuser/usrheap.c
user/ntuser/vis.c
user/ntuser/windc.c
user/ntuser/window.c

View file

@ -472,7 +472,7 @@ leave:
PPDEVOBJ
NTAPI
EngpGetPDEV(
PUNICODE_STRING pustrDeviceName)
_In_opt_ PUNICODE_STRING pustrDeviceName)
{
UNICODE_STRING ustrCurrent;
PPDEVOBJ ppdev;
@ -481,37 +481,39 @@ EngpGetPDEV(
/* Acquire PDEV lock */
EngAcquireSemaphore(ghsemPDEV);
/* If no device name is given, ... */
if (!pustrDeviceName && gppdevPrimary)
/* Did the caller pass a device name? */
if (pustrDeviceName)
{
/* ... use the primary PDEV */
ppdev = gppdevPrimary;
/* Reference the pdev */
InterlockedIncrement(&ppdev->cPdevRefs);
goto leave;
}
/* Loop all present PDEVs */
for (ppdev = gppdevList; ppdev; ppdev = ppdev->ppdevNext)
{
/* Get a pointer to the GRAPHICS_DEVICE */
pGraphicsDevice = ppdev->pGraphicsDevice;
/* Compare the name */
RtlInitUnicodeString(&ustrCurrent, pGraphicsDevice->szWinDeviceName);
if (RtlEqualUnicodeString(pustrDeviceName, &ustrCurrent, FALSE))
/* Loop all present PDEVs */
for (ppdev = gppdevList; ppdev; ppdev = ppdev->ppdevNext)
{
/* Found! Reference the PDEV */
InterlockedIncrement(&ppdev->cPdevRefs);
break;
/* Get a pointer to the GRAPHICS_DEVICE */
pGraphicsDevice = ppdev->pGraphicsDevice;
/* Compare the name */
RtlInitUnicodeString(&ustrCurrent, pGraphicsDevice->szWinDeviceName);
if (RtlEqualUnicodeString(pustrDeviceName, &ustrCurrent, FALSE))
{
/* Found! */
break;
}
}
}
else
{
/* Otherwise use the primary PDEV */
ppdev = gppdevPrimary;
}
/* Did we find one? */
if (!ppdev)
if (ppdev)
{
/* No, create a new PDEV */
/* Yes, reference the PDEV */
InterlockedIncrement(&ppdev->cPdevRefs);
}
else
{
/* No, create a new PDEV for the given device */
ppdev = EngpCreatePDEV(pustrDeviceName, NULL);
if (ppdev)
{
@ -528,7 +530,6 @@ EngpGetPDEV(
}
}
leave:
/* Release PDEV lock */
EngReleaseSemaphore(ghsemPDEV);
@ -775,7 +776,7 @@ NtGdiGetDeviceCaps(
return 0;
}
_Success_(return!=FALSE)
BOOL
APIENTRY
NtGdiGetDeviceCapsAll(

View file

@ -160,22 +160,24 @@ extern PPDEVOBJ gppdevPrimary;
PPDEVOBJ
NTAPI
EngpGetPDEV(PUNICODE_STRING pustrDevice);
EngpGetPDEV(
_In_opt_ PUNICODE_STRING pustrDevice);
VOID
NTAPI
PDEVOBJ_vRelease(PPDEVOBJ ppdev);
PDEVOBJ_vRelease(
_Inout_ PPDEVOBJ ppdev);
PSURFACE
NTAPI
PDEVOBJ_pSurface(
PPDEVOBJ ppdev);
_In_ PPDEVOBJ ppdev);
VOID
NTAPI
PDEVOBJ_vGetDeviceCaps(
PPDEVOBJ ppdev,
PDEVCAPS pDevCaps);
_In_ PPDEVOBJ ppdev,
_Out_ PDEVCAPS pDevCaps);
INIT_FUNCTION
NTSTATUS
@ -184,6 +186,8 @@ InitPDEVImpl(VOID);
PSIZEL
FASTCALL
PDEVOBJ_sizl(PPDEVOBJ, PSIZEL);
PDEVOBJ_sizl(
_In_ PPDEVOBJ ppdev,
_Out_ PSIZEL psizl);
#endif /* !__WIN32K_PDEVOBJ_H */

View file

@ -11,6 +11,13 @@
#define NDEBUG
#include <debug.h>
_Always_(_Post_satisfies_(return==iColor))
_Function_class_(FN_XLATE)
ULONG
FASTCALL
EXLATEOBJ_iXlateTrivial(
_In_ PEXLATEOBJ pexlo,
_In_ ULONG iColor);
/** Globals *******************************************************************/
@ -31,6 +38,8 @@ static const BYTE gajXlate6to8[64] =
/** iXlate functions **********************************************************/
_Always_(_Post_satisfies_(return==iColor))
_Function_class_(FN_XLATE)
ULONG
FASTCALL
EXLATEOBJ_iXlateTrivial(PEXLATEOBJ pexlo, ULONG iColor)
@ -38,6 +47,7 @@ EXLATEOBJ_iXlateTrivial(PEXLATEOBJ pexlo, ULONG iColor)
return iColor;
}
_Function_class_(FN_XLATE)
ULONG
FASTCALL
EXLATEOBJ_iXlateToMono(PEXLATEOBJ pexlo, ULONG iColor)
@ -45,6 +55,7 @@ EXLATEOBJ_iXlateToMono(PEXLATEOBJ pexlo, ULONG iColor)
return (iColor == pexlo->xlo.pulXlate[0]);
}
_Function_class_(FN_XLATE)
ULONG
FASTCALL
EXLATEOBJ_iXlateTable(PEXLATEOBJ pexlo, ULONG iColor)
@ -53,6 +64,7 @@ EXLATEOBJ_iXlateTable(PEXLATEOBJ pexlo, ULONG iColor)
return pexlo->xlo.pulXlate[iColor];
}
_Function_class_(FN_XLATE)
ULONG
FASTCALL
EXLATEOBJ_iXlateRGBtoBGR(PEXLATEOBJ pxlo, ULONG iColor)
@ -72,6 +84,7 @@ EXLATEOBJ_iXlateRGBtoBGR(PEXLATEOBJ pxlo, ULONG iColor)
return iNewColor;
}
_Function_class_(FN_XLATE)
ULONG
FASTCALL
EXLATEOBJ_iXlateRGBto555(PEXLATEOBJ pxlo, ULONG iColor)
@ -93,6 +106,7 @@ EXLATEOBJ_iXlateRGBto555(PEXLATEOBJ pxlo, ULONG iColor)
return iNewColor;
}
_Function_class_(FN_XLATE)
ULONG
FASTCALL
EXLATEOBJ_iXlateBGRto555(PEXLATEOBJ pxlo, ULONG iColor)
@ -114,6 +128,7 @@ EXLATEOBJ_iXlateBGRto555(PEXLATEOBJ pxlo, ULONG iColor)
return iNewColor;
}
_Function_class_(FN_XLATE)
ULONG
FASTCALL
EXLATEOBJ_iXlateRGBto565(PEXLATEOBJ pxlo, ULONG iColor)
@ -135,6 +150,7 @@ EXLATEOBJ_iXlateRGBto565(PEXLATEOBJ pxlo, ULONG iColor)
return iNewColor;
}
_Function_class_(FN_XLATE)
ULONG
FASTCALL
EXLATEOBJ_iXlateBGRto565(PEXLATEOBJ pxlo, ULONG iColor)
@ -156,6 +172,7 @@ EXLATEOBJ_iXlateBGRto565(PEXLATEOBJ pxlo, ULONG iColor)
return iNewColor;
}
_Function_class_(FN_XLATE)
ULONG
FASTCALL
EXLATEOBJ_iXlateRGBtoPal(PEXLATEOBJ pexlo, ULONG iColor)
@ -163,6 +180,7 @@ EXLATEOBJ_iXlateRGBtoPal(PEXLATEOBJ pexlo, ULONG iColor)
return PALETTE_ulGetNearestPaletteIndex(pexlo->ppalDst, iColor);
}
_Function_class_(FN_XLATE)
ULONG
FASTCALL
EXLATEOBJ_iXlate555toRGB(PEXLATEOBJ pxlo, ULONG iColor)
@ -183,6 +201,7 @@ EXLATEOBJ_iXlate555toRGB(PEXLATEOBJ pxlo, ULONG iColor)
return iNewColor;
}
_Function_class_(FN_XLATE)
ULONG
FASTCALL
EXLATEOBJ_iXlate555toBGR(PEXLATEOBJ pxlo, ULONG iColor)
@ -203,6 +222,7 @@ EXLATEOBJ_iXlate555toBGR(PEXLATEOBJ pxlo, ULONG iColor)
return iNewColor;
}
_Function_class_(FN_XLATE)
ULONG
FASTCALL
EXLATEOBJ_iXlate555to565(PEXLATEOBJ pxlo, ULONG iColor)
@ -223,6 +243,7 @@ EXLATEOBJ_iXlate555to565(PEXLATEOBJ pxlo, ULONG iColor)
return iNewColor;
}
_Function_class_(FN_XLATE)
ULONG
FASTCALL
EXLATEOBJ_iXlate555toPal(PEXLATEOBJ pexlo, ULONG iColor)
@ -232,6 +253,7 @@ EXLATEOBJ_iXlate555toPal(PEXLATEOBJ pexlo, ULONG iColor)
return PALETTE_ulGetNearestPaletteIndex(pexlo->ppalDst, iColor);
}
_Function_class_(FN_XLATE)
ULONG
FASTCALL
EXLATEOBJ_iXlate565to555(PEXLATEOBJ pxlo, ULONG iColor)
@ -248,6 +270,7 @@ EXLATEOBJ_iXlate565to555(PEXLATEOBJ pxlo, ULONG iColor)
return iNewColor;
}
_Function_class_(FN_XLATE)
ULONG
FASTCALL
EXLATEOBJ_iXlate565toRGB(PEXLATEOBJ pexlo, ULONG iColor)
@ -268,6 +291,7 @@ EXLATEOBJ_iXlate565toRGB(PEXLATEOBJ pexlo, ULONG iColor)
return iNewColor;
}
_Function_class_(FN_XLATE)
ULONG
FASTCALL
EXLATEOBJ_iXlate565toBGR(PEXLATEOBJ pexlo, ULONG iColor)
@ -288,6 +312,7 @@ EXLATEOBJ_iXlate565toBGR(PEXLATEOBJ pexlo, ULONG iColor)
return iNewColor;
}
_Function_class_(FN_XLATE)
ULONG
FASTCALL
EXLATEOBJ_iXlate565toPal(EXLATEOBJ *pexlo, ULONG iColor)
@ -297,6 +322,7 @@ EXLATEOBJ_iXlate565toPal(EXLATEOBJ *pexlo, ULONG iColor)
return PALETTE_ulGetNearestPaletteIndex(pexlo->ppalDst, iColor);
}
_Function_class_(FN_XLATE)
ULONG
FASTCALL
EXLATEOBJ_iXlateShiftAndMask(PEXLATEOBJ pexlo, ULONG iColor)
@ -310,6 +336,7 @@ EXLATEOBJ_iXlateShiftAndMask(PEXLATEOBJ pexlo, ULONG iColor)
return iNewColor;
}
_Function_class_(FN_XLATE)
ULONG
FASTCALL
EXLATEOBJ_iXlateBitfieldsToPal(PEXLATEOBJ pexlo, ULONG iColor)

View file

@ -9,7 +9,12 @@
struct _EXLATEOBJ;
typedef ULONG (FASTCALL *PFN_XLATE)(struct _EXLATEOBJ *pexlo, ULONG iColor);
_Function_class_(FN_XLATE)
typedef
ULONG
(FASTCALL *PFN_XLATE)(
_In_ struct _EXLATEOBJ *pexlo,
_In_ ULONG iColor);
typedef struct _EXLATEOBJ
{
@ -38,23 +43,44 @@ typedef struct _EXLATEOBJ
};
} EXLATEOBJ, *PEXLATEOBJ;
extern EXLATEOBJ gexloTrivial;
_Notnull_
PFN_XLATE
FORCEINLINE
XLATEOBJ_pfnXlate(XLATEOBJ *pxlo)
XLATEOBJ_pfnXlate(
_In_ XLATEOBJ *pxlo)
{
return ((PEXLATEOBJ)pxlo)->pfnXlate;
}
extern EXLATEOBJ gexloTrivial;
VOID
NTAPI
EXLATEOBJ_vInitialize(
_Out_ PEXLATEOBJ pexlo,
_In_ PPALETTE ppalSrc,
_In_ PPALETTE ppalDst,
_In_ COLORREF crSrcBackColor,
_In_ COLORREF crDstBackColor,
_In_ COLORREF crDstForeColor);
ULONG
FASTCALL
EXLATEOBJ_iXlateTrivial(PEXLATEOBJ pexlo, ULONG iColor);
VOID
NTAPI
EXLATEOBJ_vInitXlateFromDCs(
_Out_ PEXLATEOBJ pexlo,
_In_ PDC pdcSrc,
_In_ PDC pdcDst);
void
DbgCmpXlate(XLATEOBJ *pxlo1, XLATEOBJ *pxlo2);
VOID
NTAPI
EXLATEOBJ_vInitSrcMonoXlate(
_Out_ PEXLATEOBJ pexlo,
_In_ PPALETTE ppalDst,
_In_ COLORREF crBackgroundClr,
_In_ COLORREF crForegroundClr);
VOID
NTAPI
EXLATEOBJ_vCleanup(
_Inout_ PEXLATEOBJ pexlo);
VOID NTAPI EXLATEOBJ_vInitialize(PEXLATEOBJ pexlo, PPALETTE ppalSrc, PPALETTE ppalDst, ULONG, ULONG, ULONG);
VOID NTAPI EXLATEOBJ_vInitXlateFromDCs(PEXLATEOBJ pexlo, PDC pdcSrc, PDC pdcDst);
VOID NTAPI EXLATEOBJ_vInitSrcMonoXlate(PEXLATEOBJ pexlo, PPALETTE ppalDst, ULONG Color0, ULONG Color1);
VOID NTAPI EXLATEOBJ_vCleanup(PEXLATEOBJ pexlo);

View file

@ -142,57 +142,56 @@ BRUSH_Cleanup(PVOID ObjectBody)
INT
FASTCALL
BRUSH_GetObject(PBRUSH pbrush, INT Count, LPLOGBRUSH Buffer)
BRUSH_GetObject(PBRUSH pbrush, INT cjSize, LPLOGBRUSH plogbrush)
{
if (Buffer == NULL) return sizeof(LOGBRUSH);
if (Count == 0) return 0;
/* Check if only size is requested */
if (plogbrush == NULL) return sizeof(LOGBRUSH);
/* Check if size is ok */
if (cjSize == 0) return 0;
/* Set colour */
Buffer->lbColor = pbrush->BrushAttr.lbColor;
plogbrush->lbColor = pbrush->BrushAttr.lbColor;
/* Set Hatch */
if ((pbrush->flAttrs & BR_IS_HATCH)!=0)
/* Default to 0 */
plogbrush->lbHatch = 0;
/* Get the type of style */
if (pbrush->flAttrs & BR_IS_SOLID)
{
/* FIXME: This is not the right value */
Buffer->lbHatch = (LONG)pbrush->hbmPattern;
plogbrush->lbStyle = BS_SOLID;
}
else if (pbrush->flAttrs & BR_IS_NULL)
{
plogbrush->lbStyle = BS_NULL; // BS_HOLLOW
}
else if (pbrush->flAttrs & BR_IS_HATCH)
{
plogbrush->lbStyle = BS_HATCHED;
plogbrush->lbHatch = pbrush->ulStyle;
}
else if (pbrush->flAttrs & BR_IS_DIB)
{
plogbrush->lbStyle = BS_DIBPATTERN;
plogbrush->lbHatch = (ULONG_PTR)pbrush->hbmClient;
}
else if (pbrush->flAttrs & BR_IS_BITMAP)
{
plogbrush->lbStyle = BS_PATTERN;
}
else
{
Buffer->lbHatch = 0;
}
Buffer->lbStyle = 0;
/* Get the type of style */
if ((pbrush->flAttrs & BR_IS_SOLID)!=0)
{
Buffer->lbStyle = BS_SOLID;
}
else if ((pbrush->flAttrs & BR_IS_NULL)!=0)
{
Buffer->lbStyle = BS_NULL; // BS_HOLLOW
}
else if ((pbrush->flAttrs & BR_IS_HATCH)!=0)
{
Buffer->lbStyle = BS_HATCHED;
}
else if ((pbrush->flAttrs & BR_IS_BITMAP)!=0)
{
Buffer->lbStyle = BS_PATTERN;
}
else if ((pbrush->flAttrs & BR_IS_DIB)!=0)
{
Buffer->lbStyle = BS_DIBPATTERN;
plogbrush->lbStyle = 0; // ???
}
/* FIXME
else if ((pbrush->flAttrs & )!=0)
else if (pbrush->flAttrs & )
{
Buffer->lbStyle = BS_INDEXED;
plogbrush->lbStyle = BS_INDEXED;
}
else if ((pbrush->flAttrs & )!=0)
else if (pbrush->flAttrs & )
{
Buffer->lbStyle = BS_DIBPATTERNPT;
plogbrush->lbStyle = BS_DIBPATTERNPT;
}
*/
@ -245,6 +244,7 @@ IntGdiCreateDIBBrush(
pbrush->flAttrs |= BR_IS_BITMAP | BR_IS_DIB;
pbrush->hbmPattern = hPattern;
pbrush->hbmClient = (HBITMAP)PackedDIB;
/* FIXME: Fill in the rest of fields!!! */
GreSetObjectOwner(hPattern, GDI_OBJ_HMGR_PUBLIC);

View file

@ -555,6 +555,11 @@ NEW_CLIPPING_UpdateGCRegion(PDC pDC)
pDC->prgnRao = IntSysCreateRectpRgn(0,0,0,0);
}
if (!pDC->prgnRao)
{
return ERROR;
}
if (pDC->dclevel.prgnMeta && pDC->dclevel.prgnClip)
{
IntGdiCombineRgn( pDC->prgnAPI,
@ -585,7 +590,6 @@ NEW_CLIPPING_UpdateGCRegion(PDC pDC)
pDC->prgnAPI,
RGN_AND);
// FIXME: pDC->prgnRao may be NULL
RtlCopyMemory(&pDC->erclClip,
&pDC->prgnRao->rdh.rcBound,
sizeof(RECTL));
@ -599,8 +603,8 @@ NEW_CLIPPING_UpdateGCRegion(PDC pDC)
// With pDC->co.pClipRgn->Buffer,
// pDC->co.pClipRgn = pDC->prgnRao ? pDC->prgnRao : pDC->prgnVis;
co = IntEngCreateClipRegion( ((PROSRGNDATA)pDC->prgnRao)->rdh.nCount,
((PROSRGNDATA)pDC->prgnRao)->Buffer,
co = IntEngCreateClipRegion(pDC->prgnRao->rdh.nCount,
pDC->prgnRao->Buffer,
&pDC->erclClip);
if (co)
{

View file

@ -430,6 +430,7 @@ NtGdiTransformPoints(
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
/* Do not set last error */
ret = 0;
}
_SEH2_END;
@ -1232,7 +1233,6 @@ NtGdiGetDCPoint(
POINTL SafePoint;
SIZE Size;
PSIZEL pszlViewportExt;
NTSTATUS Status = STATUS_SUCCESS;
if (!Point)
{
@ -1293,15 +1293,9 @@ NtGdiGetDCPoint(
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
Status = _SEH2_GetExceptionCode();
}
_SEH2_END;
if (!NT_SUCCESS(Status))
{
SetLastNtError(Status);
Ret = FALSE;
}
_SEH2_END;
}
DC_UnlockDc(pdc);

View file

@ -113,7 +113,7 @@ GreSetStretchBltMode(HDC hDC, int iStretchMode)
// Wine returns an error here. We set the default.
if ((iStretchMode <= 0) || (iStretchMode > MAXSTRETCHBLTMODE)) iStretchMode = WHITEONBLACK;
pdcattr->jStretchBltMode = iStretchMode;
}
return oSMode;
@ -355,7 +355,8 @@ NtGdiGetDCDword(
return Ret;
}
BOOL _Success_(return != FALSE)
_Success_(return != FALSE)
BOOL
APIENTRY
NtGdiGetAndSetDCDword(
_In_ HDC hdc,

View file

@ -867,7 +867,7 @@ GreGetDIBitsInternal(
}
psurfDest = SURFACE_ShareLockSurface(hBmpDest);
RECTL_vSetRect(&rcDest, 0, 0, ScanLines, psurf->SurfObj.sizlBitmap.cx);
srcPoint.x = 0;
@ -1014,7 +1014,7 @@ NtGdiGetDIBitsInternal(
_SEH2_TRY
{
/* Copy the data back */
ProbeForWrite(pbmiUser, cjMaxInfo, 1);
ProbeForWrite(pbmiUser, cjMaxInfo, 1);
RtlCopyMemory(pbmiUser, pbmi, cjMaxInfo);
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
@ -1646,7 +1646,7 @@ cleanup:
GreDeleteObject(res);
res = 0;
}
if(ppalDIB)
{
PALETTE_ShareUnlockPalette(ppalDIB);
@ -1862,23 +1862,23 @@ DIB_FreeConvertedBitmapInfo(BITMAPINFO* converted, BITMAPINFO* orig, DWORD usage
BITMAPCOREINFO* pbmci;
if(converted == orig)
return;
if(usage == -1)
{
/* Caller don't want any conversion */
ExFreePoolWithTag(converted, TAG_DIB);
return;
}
/* Perform inverse conversion */
pbmci = (BITMAPCOREINFO*)orig;
ASSERT(pbmci->bmciHeader.bcSize == sizeof(BITMAPCOREHEADER));
pbmci->bmciHeader.bcBitCount = converted->bmiHeader.biBitCount;
pbmci->bmciHeader.bcWidth = converted->bmiHeader.biWidth;
pbmci->bmciHeader.bcHeight = converted->bmiHeader.biHeight;
pbmci->bmciHeader.bcPlanes = converted->bmiHeader.biPlanes;
if(pbmci->bmciHeader.bcBitCount <= 8)
{
UINT numColors = converted->bmiHeader.biClrUsed;

View file

@ -1237,6 +1237,11 @@ GDIOBJ_AllocObjWithHandle(ULONG ObjectType, ULONG cjSize)
}
pobj = GDIOBJ_AllocateObject(objt, cjSize, fl);
if (!pobj)
{
return NULL;
}
if (!GDIOBJ_hInsertObject(pobj, GDI_OBJ_HMGR_POWNED))
{
GDIOBJ_vFreeObject(pobj);

View file

@ -155,6 +155,8 @@ GdiPoolAllocate(
/* Yes, remove it from the empty list */
ple = RemoveHeadList(&pPool->leEmptyList);
pSection = CONTAINING_RECORD(ple, GDI_POOL_SECTION, leInUseLink);
pPool->cEmptySections--;
ASSERT(pSection->cAllocCount == 0);
}
else
{
@ -166,13 +168,11 @@ GdiPoolAllocate(
pvAlloc = NULL;
goto done;
}
/* Insert it into the ready list */
InsertHeadList(&pPool->leReadyList, &pSection->leReadyLink);
}
/* Insert it into the in-use list */
/* Insert it into the in-use and ready list */
InsertHeadList(&pPool->leInUseList, &pSection->leInUseLink);
InsertHeadList(&pPool->leReadyList, &pSection->leReadyLink);
}
/* Find and set a single bit */
@ -203,6 +203,7 @@ GdiPoolAllocate(
/* Increase alloc count */
pSection->cAllocCount++;
ASSERT(RtlNumberOfSetBits(&pSection->bitmap) == pSection->cAllocCount);
DBG_LOGEVENT(&pPool->slhLog, EVENT_ALLOCATE, pvAlloc);
/* Check if section is now busy */
@ -260,6 +261,7 @@ GdiPoolFree(
/* Decrease allocation count */
pSection->cAllocCount--;
ASSERT(RtlNumberOfSetBits(&pSection->bitmap) == pSection->cAllocCount);
DBG_LOGEVENT(&pPool->slhLog, EVENT_FREE, pvAlloc);
/* Check if the section got valid now */
@ -275,7 +277,7 @@ GdiPoolFree(
RemoveEntryList(&pSection->leInUseLink);
RemoveEntryList(&pSection->leReadyLink);
if (pPool->cEmptySections > 1)
if (pPool->cEmptySections >= 1)
{
/* Delete the section */
GdiPoolDeleteSection(pPool, pSection);

View file

@ -540,7 +540,8 @@ NtGdiPolyDraw(
/*
* @implemented
*/
BOOL _Success_(return != FALSE)
_Success_(return != FALSE)
BOOL
APIENTRY
NtGdiMoveTo(
IN HDC hdc,

View file

@ -9,6 +9,7 @@
*/
#include <win32k.h>
#include <suppress.h>
#define NDEBUG
#include <debug.h>
@ -1166,11 +1167,11 @@ PATH_PathToRegion ( PPATH pPath, INT nPolyFillMode, HRGN *pHrgn )
if((pPath->pFlags[i] & ~PT_CLOSEFIGURE) == PT_MOVETO)
{
iStroke++;
_PRAGMA_WARNING_SUPPRESS(6386)
_PRAGMA_WARNING_SUPPRESS(__WARNING_WRITE_OVERRUN)
pNumPointsInStroke[iStroke]=0;
}
_PRAGMA_WARNING_SUPPRESS(6385)
_PRAGMA_WARNING_SUPPRESS(__WARNING_READ_OVERRUN)
pNumPointsInStroke[iStroke]++;
}
@ -2584,7 +2585,7 @@ NtGdiSetMiterLimit(
{
DC *pDc;
gxf_long worker, worker1;
NTSTATUS Status = STATUS_SUCCESS;
BOOL bResult = TRUE;
if (!(pDc = DC_LockDc(hdc)))
{
@ -2600,26 +2601,19 @@ NtGdiSetMiterLimit(
{
_SEH2_TRY
{
ProbeForWrite(pdwOut,
sizeof(DWORD),
1);
ProbeForWrite(pdwOut, sizeof(DWORD), 1);
*pdwOut = worker1.l;
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
Status = _SEH2_GetExceptionCode();
SetLastNtError(_SEH2_GetExceptionCode());
bResult = FALSE;
}
_SEH2_END;
if (!NT_SUCCESS(Status))
{
SetLastNtError(Status);
DC_UnlockDc(pDc);
return FALSE;
}
}
DC_UnlockDc(pDc);
return TRUE;
return bResult;
}
BOOL

View file

@ -114,6 +114,7 @@ SOFTWARE.
*/
#include <win32k.h>
#include <suppress.h>
#define NDEBUG
#include <debug.h>
@ -1841,7 +1842,7 @@ REGION_CreateSimpleFrameRgn(
return FALSE;
}
_PRAGMA_WARNING_SUPPRESS(28199) // rc is initialized
_PRAGMA_WARNING_SUPPRESS(__WARNING_MAYBE_UNINIT_VAR) // rc is initialized
COPY_RECTS(rgn->Buffer, rc, rgn->rdh.nCount);
}
}
@ -3987,51 +3988,60 @@ NtGdiUnionRectWithRgn(
*
* If the function fails, the return value is zero."
*/
DWORD APIENTRY
_Success_(return!=0)
ULONG
APIENTRY
NtGdiGetRegionData(
HRGN hrgn,
DWORD count,
LPRGNDATA rgndata
)
_In_ HRGN hrgn,
_In_ ULONG cjBuffer,
_Out_opt_bytecap_(cjBuffer) LPRGNDATA lpRgnData)
{
DWORD size;
PROSRGNDATA obj = RGNOBJAPI_Lock(hrgn, NULL);
NTSTATUS Status = STATUS_SUCCESS;
ULONG cjRects, cjSize;
PREGION prgn;
if (!obj)
return 0;
size = obj->rdh.nCount * sizeof(RECT);
if (count < (size + sizeof(RGNDATAHEADER)) || rgndata == NULL)
/* Lock the region */
prgn = RGNOBJAPI_Lock(hrgn, NULL);
if (!prgn)
{
RGNOBJAPI_Unlock(obj);
if (rgndata) /* Buffer is too small, signal it by return 0 */
return 0;
else /* User requested buffer size with rgndata NULL */
return size + sizeof(RGNDATAHEADER);
}
_SEH2_TRY
{
ProbeForWrite(rgndata, count, 1);
RtlCopyMemory(rgndata, &obj->rdh, sizeof(RGNDATAHEADER));
RtlCopyMemory(rgndata->Buffer, obj->Buffer, size);
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
Status = _SEH2_GetExceptionCode();
}
_SEH2_END;
if (!NT_SUCCESS(Status))
{
SetLastNtError(Status);
RGNOBJAPI_Unlock(obj);
EngSetLastError(ERROR_INVALID_HANDLE);
return 0;
}
RGNOBJAPI_Unlock(obj);
return size + sizeof(RGNDATAHEADER);
/* Calculate the region sizes */
cjRects = prgn->rdh.nCount * sizeof(RECT);
cjSize = cjRects + sizeof(RGNDATAHEADER);
/* Check if region data is requested */
if (lpRgnData)
{
/* Check if the buffer is large enough */
if (cjBuffer >= cjSize)
{
/* Probe the buffer and copy the data */
_SEH2_TRY
{
ProbeForWrite(lpRgnData, cjSize, sizeof(ULONG));
RtlCopyMemory(lpRgnData, &prgn->rdh, sizeof(RGNDATAHEADER));
RtlCopyMemory(lpRgnData->Buffer, prgn->Buffer, cjRects);
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
EngSetLastError(ERROR_INVALID_PARAMETER);
cjSize = 0;
}
_SEH2_END;
}
else
{
/* Buffer is too small */
EngSetLastError(ERROR_INVALID_PARAMETER);
cjSize = 0;
}
}
/* Unlock the region and return the size */
RGNOBJAPI_Unlock(prgn);
return cjSize;
}
/* EOF */

View file

@ -62,40 +62,39 @@ static LOGPEN NullPen =
{ PS_NULL, { 0, 0 }, 0 };
static LOGFONTW OEMFixedFont =
{ 11, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, OEM_CHARSET,
0, 0, DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, L"Courier New"
}; // Bitstream Vera Sans Mono
{ 12, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, OEM_CHARSET,
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_DONTCARE | FIXED_PITCH, L"Terminal"
};
static LOGFONTW AnsiFixedFont =
{ 11, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
0, 0, DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, L"Courier New"
}; // Bitstream Vera Sans Mono
{ 14, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
OUT_DEFAULT_PRECIS, /*CLIP_DEFAULT_PRECIS*/ CLIP_STROKE_PRECIS, /*DEFAULT_QUALITY*/ PROOF_QUALITY, FF_DONTCARE | FIXED_PITCH, L"Courier"
};
static LOGFONTW AnsiVarFont =
{ 11, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, L"MS Sans Serif"
OUT_DEFAULT_PRECIS, /*CLIP_DEFAULT_PRECIS*/ CLIP_STROKE_PRECIS, /*DEFAULT_QUALITY*/ PROOF_QUALITY, FF_DONTCARE | VARIABLE_PITCH, L"MS Sans Serif"
};
static LOGFONTW SystemFont =
{ 11, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, L"Courier New"
}; // Bitstream Vera Sans
{ 12, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, ANSI_CHARSET,
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_DONTCARE | VARIABLE_PITCH, L"System"
};
static LOGFONTW DeviceDefaultFont =
{ 11, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, L"MS Sans Serif"
}; // Bitstream Vera Sans
{ 12, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, ANSI_CHARSET,
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_DONTCARE | VARIABLE_PITCH, L"System"
};
static LOGFONTW SystemFixedFont =
{ 11, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
0, 0, DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, L"Courier New"
}; // Bitstream Vera Sans Mono
{ 16, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_DONTCARE | FIXED_PITCH, L"Fixedsys"
};
/* FIXME: Is this correct? */
static LOGFONTW DefaultGuiFont =
{ 11, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, L"MS Sans Serif"
}; // Bitstream Vera Sans
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, /*DEFAULT_QUALITY*/ PROOF_QUALITY, VARIABLE_PITCH | FF_SWISS, L"MS Shell Dlg"
};
HGDIOBJ StockObjects[NB_STOCK_OBJECTS];

View file

@ -1893,11 +1893,13 @@ NTAPI
NtUserGetAsyncKeyState(
INT Key);
DWORD
NTAPI
_Success_(return!=0)
_At_(pustrName->Buffer, _Out_z_bytecap_post_bytecount_(pustrName->MaximumLength, return*2+2))
ULONG
APIENTRY
NtUserGetAtomName(
ATOM nAtom,
PUNICODE_STRING pBuffer);
_In_ ATOM atom,
_Inout_ PUNICODE_STRING pustrName);
UINT
NTAPI
@ -2024,13 +2026,14 @@ NtUserGetGUIThreadInfo(
DWORD idThread,
LPGUITHREADINFO lpgui);
_Success_(return!=FALSE)
BOOL
NTAPI
NtUserGetIconInfo(
_In_ HANDLE hCurIcon,
_Out_opt_ PICONINFO IconInfo,
_Out_opt_ PUNICODE_STRING lpInstName,
_Out_opt_ PUNICODE_STRING lpResName,
_Inout_opt_ PUNICODE_STRING lpInstName,
_Inout_opt_ PUNICODE_STRING lpResName,
_Out_opt_ LPDWORD pbpp,
_In_ BOOL bInternal);
@ -2782,7 +2785,7 @@ typedef struct _tagFINDEXISTINGCURICONPARAM
LONG cx;
LONG cy;
} FINDEXISTINGCURICONPARAM;
HICON
NTAPI
NtUserFindExistingCursorIcon(
@ -2799,7 +2802,7 @@ NtUserSetCursorIconData(
HMODULE hModule,
HRSRC hRsrc,
HRSRC hGroupRsrc);
HICON
NTAPI
NtUserFindExistingCursorIcon(

View file

@ -125,7 +125,7 @@ _Must_inspect_result_
NTSTATUS
NTAPI
ProbeAndCaptureUnicodeStringOrAtom(
_Out_ PUNICODE_STRING pustrOut,
_Out_ _When_(return>=0, _At_(pustrOut->Buffer, _Post_ _Notnull_)) PUNICODE_STRING pustrOut,
__in_data_source(USER_MODE) _In_ PUNICODE_STRING pustrUnsafe)
{
NTSTATUS Status = STATUS_SUCCESS;

View file

@ -63,7 +63,7 @@ _Must_inspect_result_
NTSTATUS
NTAPI
ProbeAndCaptureUnicodeStringOrAtom(
_Out_ PUNICODE_STRING pustrOut,
_Out_ _When_(return>=0, _At_(pustrOut->Buffer, _Post_ _Notnull_)) PUNICODE_STRING pustrOut,
__in_data_source(USER_MODE) _In_ PUNICODE_STRING pustrUnsafe);
/* EOF */

View file

@ -240,7 +240,7 @@ IntDestroyCurIconObject(PCURICON_OBJECT CurIcon, PPROCESSINFO ppi)
HBITMAP bmpMask, bmpColor;
BOOLEAN Ret, bListEmpty, bFound = FALSE;
PCURICON_PROCESS Current = NULL;
/* For handles created without any data (error handling) */
if(IsListEmpty(&CurIcon->ProcessList))
goto emptyList;
@ -256,7 +256,7 @@ IntDestroyCurIconObject(PCURICON_OBJECT CurIcon, PPROCESSINFO ppi)
break;
}
}
if(!bFound)
{
/* This object doesn't belong to this process */
@ -386,6 +386,18 @@ NtUserGetIconInfo(
ProbeForWrite(IconInfo, sizeof(ICONINFO), 1);
RtlCopyMemory(IconInfo, &ii, sizeof(ICONINFO));
/// @todo Implement support for lpInstName
if (lpInstName)
{
RtlInitEmptyUnicodeString(lpInstName, NULL, 0);
}
/// @todo Implement support for lpResName
if (lpResName)
{
RtlInitEmptyUnicodeString(lpResName, NULL, 0);
}
if (pbpp)
{
ProbeForWrite(pbpp, sizeof(DWORD), 1);
@ -1049,7 +1061,7 @@ UserDrawIconEx(
RECTL rcDest, rcSrc;
CLIPOBJ* pdcClipObj = NULL;
EXLATEOBJ exlo;
/* Stupid case */
if((diFlags & DI_NORMAL) == 0)
{
@ -1059,12 +1071,12 @@ UserDrawIconEx(
hbmMask = pIcon->IconInfo.hbmMask;
hbmColor = pIcon->IconInfo.hbmColor;
if (istepIfAniCur)
ERR("NtUserDrawIconEx: istepIfAniCur is not supported!\n");
/*
* Get our objects.
* Get our objects.
* Shared locks are enough, we are only reading those bitmaps
*/
psurfMask = SURFACE_ShareLockSurface(hbmMask);
@ -1073,7 +1085,7 @@ UserDrawIconEx(
ERR("Unable to lock the mask surface.\n");
return FALSE;
}
/* Color bitmap is not mandatory */
if(hbmColor == NULL)
{
@ -1087,7 +1099,7 @@ UserDrawIconEx(
SURFACE_ShareUnlockSurface(psurfMask);
return FALSE;
}
/* Set source rect */
RECTL_vSetRect(&rcSrc, 0, 0, pIcon->Size.cx, pIcon->Size.cy);
@ -1119,17 +1131,17 @@ UserDrawIconEx(
if (!cxWidth)
{
if(diFlags & DI_DEFAULTSIZE)
cxWidth = pIcon->IconInfo.fIcon ?
cxWidth = pIcon->IconInfo.fIcon ?
UserGetSystemMetrics(SM_CXICON) : UserGetSystemMetrics(SM_CXCURSOR);
else
cxWidth = pIcon->Size.cx;
}
/* Fix height parameter, if needed */
if (!cyHeight)
{
if(diFlags & DI_DEFAULTSIZE)
cyHeight = pIcon->IconInfo.fIcon ?
cyHeight = pIcon->IconInfo.fIcon ?
UserGetSystemMetrics(SM_CYICON) : UserGetSystemMetrics(SM_CYCURSOR);
else
cyHeight = pIcon->Size.cy;
@ -1143,9 +1155,9 @@ UserDrawIconEx(
/* Yes: Allocate and paint the offscreen surface */
EBRUSHOBJ eboFill;
PBRUSH pbrush = BRUSH_ShareLockBrush(hbrFlickerFreeDraw);
TRACE("Performing off-screen rendering.\n");
if(!pbrush)
{
ERR("Failed to get brush object.\n");
@ -1171,11 +1183,11 @@ UserDrawIconEx(
BRUSH_ShareUnlockBrush(pbrush);
return FALSE;
}
/* Paint the brush */
EBRUSHOBJ_vInit(&eboFill, pbrush, psurfOffScreen, 0x00FFFFFF, 0, NULL);
RECTL_vSetRect(&rcDest, 0, 0, cxWidth, cyHeight);
Ret = IntEngBitBlt(&psurfOffScreen->SurfObj,
NULL,
NULL,
@ -1191,7 +1203,7 @@ UserDrawIconEx(
/* Clean up everything */
EBRUSHOBJ_vCleanup(&eboFill);
BRUSH_ShareUnlockBrush(pbrush);
if(!Ret)
{
ERR("Failed to paint the off-screen surface.\n");
@ -1200,7 +1212,7 @@ UserDrawIconEx(
GDIOBJ_vDeleteObject(&psurfOffScreen->BaseObject);
return FALSE;
}
/* We now have our destination surface */
psurfDest = psurfOffScreen;
}
@ -1208,7 +1220,7 @@ UserDrawIconEx(
{
/* We directly draw to the DC */
TRACE("Performing on screen rendering.\n");
psurfOffScreen = NULL;
pdc = DC_LockDc(hDc);
if(!pdc)
@ -1222,16 +1234,16 @@ UserDrawIconEx(
RECTL_vSetRect(&rcDest, xLeft, yTop, xLeft + cxWidth, yTop + cyHeight);
IntLPtoDP(pdc, (LPPOINT)&rcDest, 2);
RECTL_vOffsetRect(&rcDest, pdc->ptlDCOrig.x, pdc->ptlDCOrig.y);
/* Prepare the underlying surface */
DC_vPrepareDCsForBlit(pdc, rcDest, NULL, rcDest);
/* Get the clip object */
pdcClipObj = pdc->rosdc.CombinedClip;
/* We now have our destination surface and rectangle */
psurfDest = pdc->dclevel.pSurface;
if(psurfDest == NULL)
{
/* Empty DC */
@ -1281,10 +1293,10 @@ UserDrawIconEx(
ptr += 4;
}
}
/* Initialize color translation object */
EXLATEOBJ_vInitialize(&exlo, psurf->ppal, psurfDest->ppal, 0xFFFFFFFF, 0xFFFFFFFF, 0);
/* Now do it */
Ret = IntEngAlphaBlend(&psurfDest->SurfObj,
&psurf->SurfObj,
@ -1293,9 +1305,9 @@ UserDrawIconEx(
&rcDest,
&rcSrc,
&blendobj);
EXLATEOBJ_vCleanup(&exlo);
CleanupAlpha:
if(psurf) SURFACE_ShareUnlockSurface(psurf);
if(hsurfCopy) NtGdiDeleteObjectApp(hsurfCopy);
@ -1306,9 +1318,9 @@ UserDrawIconEx(
if (diFlags & DI_MASK)
{
DWORD rop4 = (diFlags & DI_IMAGE) ? ROP4_SRCAND : ROP4_SRCCOPY;
EXLATEOBJ_vInitSrcMonoXlate(&exlo, psurfDest->ppal, 0x00FFFFFF, 0);
Ret = IntEngStretchBlt(&psurfDest->SurfObj,
&psurfMask->SurfObj,
NULL,
@ -1321,7 +1333,7 @@ UserDrawIconEx(
NULL,
NULL,
rop4);
EXLATEOBJ_vCleanup(&exlo);
if(!Ret)
@ -1336,9 +1348,9 @@ UserDrawIconEx(
if (psurfColor)
{
DWORD rop4 = (diFlags & DI_MASK) ? ROP4_SRCINVERT : ROP4_SRCCOPY ;
EXLATEOBJ_vInitialize(&exlo, psurfColor->ppal, psurfDest->ppal, 0x00FFFFFF, 0x00FFFFFF, 0);
Ret = IntEngStretchBlt(&psurfDest->SurfObj,
&psurfColor->SurfObj,
NULL,
@ -1351,7 +1363,7 @@ UserDrawIconEx(
NULL,
NULL,
rop4);
EXLATEOBJ_vCleanup(&exlo);
if(!Ret)
@ -1365,9 +1377,9 @@ UserDrawIconEx(
/* Mask bitmap holds the information in its bottom half */
DWORD rop4 = (diFlags & DI_MASK) ? ROP4_SRCINVERT : ROP4_SRCCOPY;
RECTL_vOffsetRect(&rcSrc, 0, pIcon->Size.cy);
EXLATEOBJ_vInitSrcMonoXlate(&exlo, psurfDest->ppal, 0x00FFFFFF, 0);
Ret = IntEngStretchBlt(&psurfDest->SurfObj,
&psurfMask->SurfObj,
NULL,
@ -1380,7 +1392,7 @@ UserDrawIconEx(
NULL,
NULL,
rop4);
EXLATEOBJ_vCleanup(&exlo);
if(!Ret)
@ -1407,13 +1419,13 @@ done:
RECTL_vSetRect(&rcDest, xLeft, yTop, xLeft + cxWidth, yTop + cyHeight);
IntLPtoDP(pdc, (LPPOINT)&rcDest, 2);
RECTL_vOffsetRect(&rcDest, pdc->ptlDCOrig.x, pdc->ptlDCOrig.y);
/* Prepare the underlying surface */
DC_vPrepareDCsForBlit(pdc, rcDest, NULL, rcDest);
/* Get the clip object */
pdcClipObj = pdc->rosdc.CombinedClip;
/* We now have our destination surface and rectangle */
psurfDest = pdc->dclevel.pSurface;
if(!psurfDest)
@ -1422,10 +1434,10 @@ done:
DC_UnlockDc(pdc);
goto Cleanup2;
}
/* Color translation */
EXLATEOBJ_vInitialize(&exlo, psurfOffScreen->ppal, psurfDest->ppal, 0x00FFFFFF, 0x00FFFFFF, 0);
/* Blt it! */
Ret = IntEngBitBlt(&psurfDest->SurfObj,
&psurfOffScreen->SurfObj,
@ -1438,7 +1450,7 @@ done:
NULL,
NULL,
ROP4_SRCCOPY);
EXLATEOBJ_vCleanup(&exlo);
}
Cleanup:
@ -1447,12 +1459,12 @@ Cleanup:
DC_vFinishBlit(pdc, NULL);
DC_UnlockDc(pdc);
}
Cleanup2:
/* Delete off screen rendering surface */
if(psurfOffScreen)
GDIOBJ_vDeleteObject(&psurfOffScreen->BaseObject);
/* Unlock other surfaces */
SURFACE_ShareUnlockSurface(psurfMask);
if(psurfColor) SURFACE_ShareUnlockSurface(psurfColor);

View file

@ -65,7 +65,9 @@ IntDesktopObjectParse(IN PVOID ParseObject,
/* Get the current desktop */
Desktop = CONTAINING_RECORD(NextEntry, DESKTOP, ListEntry);
/// @todo Don't mess around with the object headers!
/* Get its name */
_PRAGMA_WARNING_SUPPRESS(__WARNING_DEREF_NULL_PTR)
DesktopName = GET_DESKTOP_NAME(Desktop);
if (DesktopName)
{
@ -971,7 +973,7 @@ IntPaintDesktop(HDC hDC)
}
else
{
/* Find the upper left corner, can be negtive if the bitmap is bigger then the screen */
/* Find the upper left corner, can be negative if the bitmap is bigger then the screen */
x = (sz.cx / 2) - (gspv.cxWallpaper / 2);
y = (sz.cy / 2) - (gspv.cyWallpaper / 2);
}
@ -985,14 +987,14 @@ IntPaintDesktop(HDC hDC)
if (x > 0 || y > 0)
{
/* FIXME: Clip out the bitmap
can be replaced with "NtGdiPatBlt(hDC, x, y, WinSta->cxWallpaper, WinSta->cyWallpaper, PATCOPY | DSTINVERT);"
once we support DSTINVERT */
can be replaced with "NtGdiPatBlt(hDC, x, y, WinSta->cxWallpaper, WinSta->cyWallpaper, PATCOPY | DSTINVERT);"
once we support DSTINVERT */
PreviousBrush = NtGdiSelectBrush(hDC, DesktopBrush);
NtGdiPatBlt(hDC, Rect.left, Rect.top, Rect.right, Rect.bottom, PATCOPY);
NtGdiSelectBrush(hDC, PreviousBrush);
}
/*Do not fill the background after it is painted no matter the size of the picture */
/* Do not fill the background after it is painted no matter the size of the picture */
doPatBlt = FALSE;
hOldBitmap = NtGdiSelectBitmap(hWallpaperDC, gspv.hbmWallpaper);
@ -1001,17 +1003,17 @@ IntPaintDesktop(HDC hDC)
{
if(Rect.right && Rect.bottom)
NtGdiStretchBlt(hDC,
x,
y,
sz.cx,
sz.cy,
hWallpaperDC,
0,
0,
gspv.cxWallpaper,
gspv.cyWallpaper,
SRCCOPY,
0);
x,
y,
sz.cx,
sz.cy,
hWallpaperDC,
0,
0,
gspv.cxWallpaper,
gspv.cyWallpaper,
SRCCOPY,
0);
}
else if (gspv.WallpaperMode == wmTile)
@ -1071,7 +1073,7 @@ IntPaintDesktop(HDC hDC)
* Display system version on the desktop background
*/
if (g_PaintDesktopVersion||UserGetSystemMetrics(SM_CLEANBOOT))
if (g_PaintDesktopVersion || UserGetSystemMetrics(SM_CLEANBOOT))
{
static WCHAR s_wszVersion[256] = {0};
RECTL rect;
@ -1099,24 +1101,26 @@ IntPaintDesktop(HDC hDC)
if(!UserGetSystemMetrics(SM_CLEANBOOT))
{
GreExtTextOutW(hDC, rect.right-16, rect.bottom-48, 0, NULL, s_wszVersion, len, NULL, 0);
GreExtTextOutW(hDC, rect.right - 16, rect.bottom - 48, 0, NULL, s_wszVersion, len, NULL, 0);
}
else
{
/* Safe Mode */
/* Version information text in top center */
IntGdiSetTextAlign(hDC, TA_CENTER|TA_TOP);
GreExtTextOutW(hDC, (rect.right+rect.left)/2, rect.top, 0, NULL, s_wszVersion, len, NULL, 0);
IntGdiSetTextAlign(hDC, TA_CENTER | TA_TOP);
GreExtTextOutW(hDC, (rect.right + rect.left)/2, rect.top + 3, 0, NULL, s_wszVersion, len, NULL, 0);
/* Safe Mode text in corners */
len = wcslen(s_wszSafeMode);
IntGdiSetTextAlign(hDC, TA_RIGHT|TA_TOP);
GreExtTextOutW(hDC, rect.right, rect.top, 0, NULL, s_wszSafeMode, len, NULL, 0);
IntGdiSetTextAlign(hDC, TA_RIGHT|TA_BASELINE);
GreExtTextOutW(hDC, rect.right, rect.bottom, 0, NULL, s_wszSafeMode, len, NULL, 0);
IntGdiSetTextAlign(hDC, TA_LEFT|TA_TOP);
GreExtTextOutW(hDC, rect.left, rect.top, 0, NULL, s_wszSafeMode, len, NULL, 0);
IntGdiSetTextAlign(hDC, TA_LEFT|TA_BASELINE);
GreExtTextOutW(hDC, rect.left, rect.bottom, 0, NULL, s_wszSafeMode, len, NULL, 0);
IntGdiSetTextAlign(hDC, TA_LEFT | TA_TOP);
GreExtTextOutW(hDC, rect.left, rect.top + 3, 0, NULL, s_wszSafeMode, len, NULL, 0);
IntGdiSetTextAlign(hDC, TA_RIGHT | TA_TOP);
GreExtTextOutW(hDC, rect.right, rect.top + 3, 0, NULL, s_wszSafeMode, len, NULL, 0);
IntGdiSetTextAlign(hDC, TA_LEFT | TA_BASELINE);
GreExtTextOutW(hDC, rect.left, rect.bottom - 5, 0, NULL, s_wszSafeMode, len, NULL, 0);
IntGdiSetTextAlign(hDC, TA_RIGHT | TA_BASELINE);
GreExtTextOutW(hDC, rect.right, rect.bottom - 5, 0, NULL, s_wszSafeMode, len, NULL, 0);
}
IntGdiSetBkMode(hDC, mode_old);
@ -1262,7 +1266,7 @@ NtUserCreateDesktop(
dwDesiredAccess,
(PVOID)&Context,
(HANDLE*)&hdesk);
if (!NT_SUCCESS(Status))
if (!NT_SUCCESS(Status))
{
ERR("ObOpenObjectByName failed to open/create desktop\n");
SetLastNtError(Status);
@ -1294,7 +1298,7 @@ NtUserCreateDesktop(
/* Get the desktop window class. The thread desktop does not belong to any desktop
* so the classes created there (including the desktop class) are allocated in the shared heap
* It would cause problems if we used a class that belongs to the caller
* It would cause problems if we used a class that belongs to the caller
*/
ClassName.Buffer = WC_DESKTOP;
ClassName.Length = 0;
@ -1327,7 +1331,7 @@ NtUserCreateDesktop(
pdesk->DesktopWindow = pWnd->head.h;
pdesk->pDeskInfo->spwnd = pWnd;
pWnd->fnid = FNID_DESKTOP;
ClassName.Buffer = MAKEINTATOM(gpsi->atomSysClass[ICLS_HWNDMESSAGE]);
ClassName.Length = 0;
pcls = IntGetAndReferenceClass(&ClassName, 0, TRUE);

View file

@ -358,15 +358,20 @@ CanForceFG(PPROCESSINFO ppi)
*/
static BOOL FASTCALL
co_IntSetForegroundAndFocusWindow(PWND Wnd, BOOL MouseActivate)
co_IntSetForegroundAndFocusWindow(
_In_ PWND Wnd,
_In_ BOOL MouseActivate)
{
HWND hWnd = UserHMGetHandle(Wnd);
HWND hWnd;
HWND hWndPrev = NULL;
PUSER_MESSAGE_QUEUE PrevForegroundQueue;
PTHREADINFO pti;
BOOL fgRet = FALSE, Ret = FALSE;
ASSERT_REFS_CO(Wnd);
NT_ASSERT(Wnd != NULL);
hWnd = UserHMGetHandle(Wnd);
TRACE("SetForegroundAndFocusWindow(%x, %s)\n", hWnd, (MouseActivate ? "TRUE" : "FALSE"));

View file

@ -1050,6 +1050,8 @@ IntRemoveHook(PHOOK Hook)
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
/* Do nothing */
(void)0;
}
_SEH2_END;
}
@ -1241,6 +1243,8 @@ co_HOOK_CallHooks( INT HookId,
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
/* Do nothing */
(void)0;
}
_SEH2_END;
}

View file

@ -254,9 +254,10 @@ UserLoadKbdLayout(PUNICODE_STRING pwszKLID, HKL hKL)
*/
static
VOID
UnloadKbdFile(PKBDFILE pkf)
UnloadKbdFile(_In_ PKBDFILE pkf)
{
PKBDFILE *ppkfLink = &gpkfList;
NT_ASSERT(pkf != NULL);
/* Find previous object */
while (*ppkfLink)

View file

@ -385,7 +385,7 @@ IntTranslateChar(WORD wVirtKey,
/* If nothing has been found in layout, check if this is ASCII control character.
Note: we could add it to layout table, but windows does not have it there */
if (wVirtKey >= 'A' && wVirtKey <= 'Z' &&
IS_KEY_DOWN(pKeyState, VK_CONTROL) &&
pKeyState && IS_KEY_DOWN(pKeyState, VK_CONTROL) &&
!IS_KEY_DOWN(pKeyState, VK_MENU))
{
*pwcTranslatedChar = (wVirtKey - 'A') + 1; /* ASCII control character */
@ -1097,7 +1097,7 @@ IntTranslateKbdMessage(LPMSG lpMsg,
{
pti->KeyboardLayout = W32kGetDefaultKeyLayout();
pti->pClientInfo->hKL = pti->KeyboardLayout ? pti->KeyboardLayout->hkl : NULL;
pKbdTbl = pti->KeyboardLayout->spkf->pKbdTbl;
pKbdTbl = pti->KeyboardLayout ? pti->KeyboardLayout->spkf->pKbdTbl : NULL;
}
else
pKbdTbl = pti->KeyboardLayout->spkf->pKbdTbl;

View file

@ -226,16 +226,16 @@ Win32kProcessCallback(struct _EPROCESS *Process,
*pppi = ppiCurrent->ppiNext;
TRACE_CH(UserProcess,"Freeing ppi 0x%p\n", ppiCurrent);
/* Ftee the PROCESSINFO */
PsSetProcessWin32Process(Process, NULL);
ExFreePoolWithTag(ppiCurrent, USERTAG_PROCESSINFO);
#if DBG
if (DBG_IS_CHANNEL_ENABLED(ppiCurrent, DbgChUserObj, WARN_LEVEL))
{
DbgUserDumpHandleTable();
}
#endif
/* Free the PROCESSINFO */
PsSetProcessWin32Process(Process, NULL);
ExFreePoolWithTag(ppiCurrent, USERTAG_PROCESSINFO);
}
RETURN( STATUS_SUCCESS);

View file

@ -249,8 +249,8 @@ IntCreateMenu(PHANDLE Handle, BOOL IsMenuBar)
PPROCESSINFO CurrentWin32Process;
Menu = (PMENU_OBJECT)UserCreateObject( gHandleTable,
NULL,
NULL,
NULL,
NULL,
Handle,
otMenu,
sizeof(MENU_OBJECT));
@ -361,8 +361,8 @@ IntCloneMenu(PMENU_OBJECT Source)
return NULL;
Menu = (PMENU_OBJECT)UserCreateObject( gHandleTable,
NULL,
NULL,
NULL,
NULL,
&hMenu,
otMenu,
sizeof(MENU_OBJECT));
@ -803,13 +803,18 @@ IntSetMenuItemInfo(PMENU_OBJECT MenuObject, PMENU_ITEM MenuItem, PROSMENUITEMINF
}
BOOL FASTCALL
IntInsertMenuItem(PMENU_OBJECT MenuObject, UINT uItem, BOOL fByPosition,
PROSMENUITEMINFO ItemInfo)
IntInsertMenuItem(
_In_ PMENU_OBJECT MenuObject,
UINT uItem,
BOOL fByPosition,
PROSMENUITEMINFO ItemInfo)
{
int pos;
PMENU_ITEM MenuItem;
PMENU_OBJECT SubMenu = NULL;
NT_ASSERT(MenuObject != NULL);
if (MAX_MENU_ITEMS <= MenuObject->MenuInfo.MenuItemCount)
{
EngSetLastError(ERROR_NOT_ENOUGH_MEMORY);

View file

@ -64,7 +64,7 @@ BOOL FASTCALL
IntCleanupMenus(struct _EPROCESS *Process, PPROCESSINFO Win32Process);
BOOL FASTCALL
IntInsertMenuItem(PMENU_OBJECT MenuObject, UINT uItem, BOOL fByPosition,
IntInsertMenuItem(_In_ PMENU_OBJECT MenuObject, UINT uItem, BOOL fByPosition,
PROSMENUITEMINFO ItemInfo);
PMENU_OBJECT FASTCALL

View file

@ -116,7 +116,7 @@ typedef struct tagMSGMEMORY
}
MSGMEMORY, *PMSGMEMORY;
static MSGMEMORY MsgMemory[] =
static MSGMEMORY g_MsgMemory[] =
{
{ WM_CREATE, MMS_SIZE_SPECIAL, MMS_FLAG_READWRITE },
{ WM_DDE_ACK, sizeof(KMDDELPARAM), MMS_FLAG_READ },
@ -140,8 +140,8 @@ FindMsgMemory(UINT Msg)
PMSGMEMORY MsgMemoryEntry;
/* See if this message type is present in the table */
for (MsgMemoryEntry = MsgMemory;
MsgMemoryEntry < MsgMemory + sizeof(MsgMemory) / sizeof(MSGMEMORY);
for (MsgMemoryEntry = g_MsgMemory;
MsgMemoryEntry < g_MsgMemory + sizeof(g_MsgMemory) / sizeof(MSGMEMORY);
MsgMemoryEntry++)
{
if (Msg == MsgMemoryEntry->Message)
@ -225,9 +225,9 @@ MsgMemorySize(PMSGMEMORY MsgMemoryEntry, WPARAM wParam, LPARAM lParam)
UINT lParamMemorySize(UINT Msg, WPARAM wParam, LPARAM lParam)
{
PMSGMEMORY MsgMemory = FindMsgMemory(Msg);
if(MsgMemory == NULL) return 0;
return MsgMemorySize(MsgMemory, wParam, lParam);
PMSGMEMORY MsgMemoryEntry = FindMsgMemory(Msg);
if(MsgMemoryEntry == NULL) return 0;
return MsgMemorySize(MsgMemoryEntry, wParam, lParam);
}
static NTSTATUS
@ -388,9 +388,9 @@ UnpackParam(LPARAM lParamPacked, UINT Msg, WPARAM wParam, LPARAM lParam, BOOL No
return STATUS_INVALID_PARAMETER;
}
if (MsgMemory->Flags == MMS_FLAG_READWRITE)
if (MsgMemoryEntry->Flags == MMS_FLAG_READWRITE)
{
//RtlCopyMemory((PVOID)lParam, (PVOID)lParamPacked, MsgMemory->Size);
//RtlCopyMemory((PVOID)lParam, (PVOID)lParamPacked, MsgMemoryEntry->Size);
}
ExFreePool((PVOID) lParamPacked);
return STATUS_SUCCESS;

View file

@ -1 +0,0 @@

View file

@ -139,7 +139,7 @@ UserAttachMonitor(IN HDEV hDev)
TRACE("Couldnt create monitor object\n");
return STATUS_INSUFFICIENT_RESOURCES;
}
pMonitor->hDev = hDev;
pMonitor->cWndStack = 0;
@ -185,7 +185,7 @@ UserDetachMonitor(IN HDEV hDev)
{
if (pMonitor->hDev == hDev)
break;
pLink = &pMonitor->pMonitorNext;
pMonitor = pMonitor->pMonitorNext;
}

View file

@ -704,7 +704,7 @@ MsqDestroyMessage(PUSER_MESSAGE Message)
}
BOOLEAN FASTCALL
co_MsqDispatchOneSentMessage(PUSER_MESSAGE_QUEUE MessageQueue)
co_MsqDispatchOneSentMessage(_In_ PUSER_MESSAGE_QUEUE MessageQueue)
{
PUSER_SENT_MESSAGE SaveMsg, Message;
PLIST_ENTRY Entry;
@ -1331,7 +1331,7 @@ FASTCALL
IntTrackMouseMove(PWND pwndTrack, PDESKTOP pDesk, PMSG msg, USHORT hittest)
{
// PWND pwndTrack = IntChildrenWindowFromPoint(pwndMsg, msg->pt.x, msg->pt.y);
hittest = GetNCHitEx(pwndTrack, msg->pt);
hittest = (USHORT)GetNCHitEx(pwndTrack, msg->pt); /// @todo WTF is this???
if ( pDesk->spwndTrack != pwndTrack || // Change with tracking window or
msg->message != WM_MOUSEMOVE || // Mouse click changes or

View file

@ -188,7 +188,7 @@ BOOLEAN FASTCALL MsqInitializeMessageQueue(PTHREADINFO, PUSER_MESSAGE_QUEUE);
PUSER_MESSAGE_QUEUE FASTCALL MsqCreateMessageQueue(PTHREADINFO);
VOID FASTCALL MsqDestroyMessageQueue(PTHREADINFO);
INIT_FUNCTION NTSTATUS NTAPI MsqInitializeImpl(VOID);
BOOLEAN FASTCALL co_MsqDispatchOneSentMessage(PUSER_MESSAGE_QUEUE MessageQueue);
BOOLEAN FASTCALL co_MsqDispatchOneSentMessage(_In_ PUSER_MESSAGE_QUEUE MessageQueue);
NTSTATUS FASTCALL
co_MsqWaitForNewMessages(PUSER_MESSAGE_QUEUE MessageQueue, PWND WndFilter,
UINT MsgFilterMin, UINT MsgFilterMax);

View file

@ -345,7 +345,7 @@ co_IntSetScrollInfo(PWND Window, INT nBar, LPCSCROLLINFO lpsi, BOOL bRedraw)
UINT new_flags;
INT action = 0;
PSBDATA pSBData;
DWORD OldPos;
DWORD OldPos = 0;
BOOL bChangeParams = FALSE; /* Don't show/hide scrollbar if params don't change */
ASSERT_REFS_CO(Window);

View file

@ -25,9 +25,16 @@ BOOL g_PaintDesktopVersion = FALSE;
#define METRIC2REG(met) (-((((met) * 1440)- 0) / dpi))
#define REQ_INTERACTIVE_WINSTA(err) \
if ( GetW32ProcessInfo()->prpwinsta != InputWindowStation) \
if (GetW32ProcessInfo()->prpwinsta != InputWindowStation) \
{ \
ERR("NtUserSystemParametersInfo requires interactive window station (current is %wZ)\n", &GetW32ProcessInfo()->prpwinsta->Name); \
if (GetW32ProcessInfo()->prpwinsta == NULL) \
{ \
ERR("NtUserSystemParametersInfo called without active window station, and it requires an interactive one\n"); \
} \
else \
{ \
ERR("NtUserSystemParametersInfo requires interactive window station (current is %wZ)\n", &GetW32ProcessInfo()->prpwinsta->Name); \
} \
EngSetLastError(err); \
return 0; \
}
@ -610,7 +617,7 @@ SpiSetWallpaper(PVOID pvParam, FLONG fl)
}
/* Capture UNICODE_STRING */
bResult = SpiMemCopy(&ustr, pvParam, sizeof(UNICODE_STRING), fl & SPIF_PROTECT, 0);
bResult = SpiMemCopy(&ustr, pvParam, sizeof(ustr), fl & SPIF_PROTECT, 0);
if (!bResult) return 0;
if (ustr.Length > MAX_PATH * sizeof(WCHAR))
return 0;
@ -1568,7 +1575,7 @@ UserSystemParametersInfo(
/* Get a pointer to the current Windowstation */
if (!ppi->prpwinsta)
{
ERR("UserSystemParametersInfo called without active windowstation.\n");
ERR("UserSystemParametersInfo called without active window station.\n");
//ASSERT(FALSE);
//return FALSE;
}

View file

@ -141,7 +141,7 @@ typedef struct _SPIVALUES
ULONG cxWallpaper, cyWallpaper;
WALLPAPER_MODE WallpaperMode;
UNICODE_STRING ustrWallpaper;
WCHAR awcWallpaper[MAX_PATH];
WCHAR awcWallpaper[MAX_PATH + 1];
BOOL bHandHeld;
BOOL bFastTaskSwitch;

View file

@ -359,7 +359,7 @@ FASTCALL
StartTheTimers(VOID)
{
// Need to start gdi syncro timers then start timer with Hang App proc
// that calles Idle process so the screen savers will know to run......
// that calles Idle process so the screen savers will know to run......
IntSetTimer(NULL, 0, 1000, HungAppSysTimerProc, TMRF_RIT);
// Test Timers
// IntSetTimer(NULL, 0, 1000, SystemTimerProc, TMRF_RIT);
@ -584,9 +584,14 @@ NTAPI
InitTimerImpl(VOID)
{
ULONG BitmapBytes;
/* Allocate FAST_MUTEX from non paged pool */
Mutex = ExAllocatePoolWithTag(NonPagedPool, sizeof(FAST_MUTEX), TAG_INTERNAL_SYNC);
if (!Mutex)
{
return STATUS_INSUFFICIENT_RESOURCES;
}
ExInitializeFastMutex(Mutex);
BitmapBytes = ROUND_UP(NUM_WINDOW_LESS_TIMERS, sizeof(ULONG) * 8) / 8;

View file

@ -34,11 +34,11 @@ IntAddAtom(LPWSTR AtomName)
}
ULONG FASTCALL
IntGetAtomName(RTL_ATOM nAtom, LPWSTR lpBuffer, ULONG nSize)
IntGetAtomName(RTL_ATOM nAtom, LPWSTR lpBuffer, ULONG cjBufSize)
{
NTSTATUS Status = STATUS_SUCCESS;
PTHREADINFO pti;
ULONG Size = nSize;
ULONG Size = cjBufSize;
pti = PsGetCurrentThreadWin32Thread();
if (pti->rpdesk == NULL)
@ -49,13 +49,12 @@ IntGetAtomName(RTL_ATOM nAtom, LPWSTR lpBuffer, ULONG nSize)
Status = RtlQueryAtomInAtomTable(gAtomTable, nAtom, NULL, NULL, lpBuffer, &Size);
if (Size < nSize)
*(lpBuffer + Size/sizeof(WCHAR)) = 0;
if (!NT_SUCCESS(Status))
{
SetLastNtError(Status);
return 0;
}
return Size;
}
@ -78,30 +77,67 @@ IntAddGlobalAtom(LPWSTR lpBuffer, BOOL PinAtom)
return Atom;
}
DWORD
/*!
* \brief Returns the name of an atom.
*
* \param atom - The atom to be queried.
* \param pustrName - Pointer to an initialized UNICODE_STRING that receives
* the name of the atom. The function does not update the
Length member. The string is always NULL-terminated.
*
* \return The length of the name in characters, or 0 if the function fails.
*
* \note The function does not aquire any global lock, since synchronisation is
* handled by the RtlAtom function.
*/
_Success_(return!=0)
_At_(pustrName->Buffer, _Out_z_bytecap_post_bytecount_(pustrName->MaximumLength, return*2+2))
ULONG
APIENTRY
NtUserGetAtomName(
ATOM nAtom,
PUNICODE_STRING pBuffer)
_In_ ATOM atom,
_Inout_ PUNICODE_STRING pustrName)
{
DWORD Ret;
WCHAR Buffer[256];
UNICODE_STRING CapturedName = {0};
UserEnterShared();
CapturedName.Buffer = (LPWSTR)&Buffer;
CapturedName.MaximumLength = sizeof(Buffer);
Ret = IntGetAtomName((RTL_ATOM)nAtom, CapturedName.Buffer, (ULONG)CapturedName.Length);
_SEH2_TRY
{
RtlCopyMemory(pBuffer->Buffer, &Buffer, pBuffer->MaximumLength);
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
Ret = 0;
}
_SEH2_END
UserLeave();
return Ret;
WCHAR awcBuffer[256];
ULONG cjLength;
/* Retrieve the atom name into a local buffer (max length is 255 chars) */
cjLength = IntGetAtomName((RTL_ATOM)atom, awcBuffer, sizeof(awcBuffer));
if (cjLength != 0)
{
_SEH2_TRY
{
/* Probe the unicode string and the buffer */
ProbeForRead(pustrName, sizeof(*pustrName), 1);
ProbeForWrite(pustrName->Buffer, pustrName->MaximumLength, 1);
/* Check if we have enough space to write the NULL termination */
if (pustrName->MaximumLength >= sizeof(UNICODE_NULL))
{
/* Limit the length to the buffer size */
cjLength = min(pustrName->MaximumLength - sizeof(UNICODE_NULL),
cjLength);
/* Copy the string and NULL terminate it */
RtlCopyMemory(pustrName->Buffer, awcBuffer, cjLength);
pustrName->Buffer[cjLength / sizeof(WCHAR)] = L'\0';
}
else
{
cjLength = 0;
}
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
/* On exception, set last error and fail */
SetLastNtError(_SEH2_GetExceptionCode());
cjLength = 0;
}
_SEH2_END
}
/* Return the length in characters */
return cjLength / sizeof(WCHAR);
}
/* EOF */

View file

@ -852,7 +852,7 @@ DceResetActiveDCEs(PWND Window)
{
if (!pDCE->hwndCurrent)
CurrentWindow = NULL;
else
else
CurrentWindow = UserGetWindowObject(pDCE->hwndCurrent);
if (NULL == CurrentWindow)
{

View file

@ -497,6 +497,7 @@ static LRESULT co_UserFreeWindow(PWND Window,
/* flush the message queue */
MsqRemoveWindowMessagesFromQueue(Window);
NT_ASSERT(Window->head.pti);
IntDereferenceMessageQueue(Window->head.pti->MessageQueue);
/* from now on no messages can be sent to this window anymore */
@ -1987,7 +1988,7 @@ co_UserCreateWindowEx(CREATESTRUCTW* Cs,
PWINSTATION_OBJECT WinSta;
PCLS Class = NULL;
SIZE Size;
POINT MaxPos;
POINT MaxSize, MaxPos, MinTrack, MaxTrack;
CBT_CREATEWNDW * pCbtCreate;
LRESULT Result;
USER_REFERENCE_ENTRY ParentRef, Ref;
@ -2190,8 +2191,6 @@ co_UserCreateWindowEx(CREATESTRUCTW* Cs,
if ((Cs->style & WS_THICKFRAME) || !(Cs->style & (WS_POPUP | WS_CHILD)))
{
POINT MaxSize, MaxPos, MinTrack, MaxTrack;
co_WinPosGetMinMaxInfo(Window, &MaxSize, &MaxPos, &MinTrack, &MaxTrack);
if (Size.cx > MaxTrack.x) Size.cx = MaxTrack.x;
if (Size.cy > MaxTrack.y) Size.cy = MaxTrack.y;
@ -2542,7 +2541,7 @@ BOOLEAN FASTCALL co_UserDestroyWindow(PWND Window)
TRACE("co_UserDestroyWindow \n");
/* Check for owner thread */
/* Check for owner thread */
if ( Window->head.pti != PsGetCurrentThreadWin32Thread())
{
/* Check if we are destroying the desktop window */
@ -2627,7 +2626,7 @@ BOOLEAN FASTCALL co_UserDestroyWindow(PWND Window)
* Check if this window is the Shell's Desktop Window. If so set hShellWindow to NULL
*/
if ((ti != NULL) & (ti->pDeskInfo != NULL))
if ((ti != NULL) && (ti->pDeskInfo != NULL))
{
if (ti->pDeskInfo->hShellWindow == hWnd)
{
@ -3074,8 +3073,6 @@ PWND FASTCALL UserGetAncestor(PWND Wnd, UINT Type)
for (;;)
{
PWND Parent;
Parent = IntGetParent(WndAncestor);
if (!Parent)

View file

@ -57,7 +57,10 @@ UserCreateWinstaDirectoy()
Peb = NtCurrentPeb();
if(Peb->SessionId == 0)
{
RtlCreateUnicodeString(&gustrWindowStationsDir, WINSTA_OBJ_DIR);
if (!RtlCreateUnicodeString(&gustrWindowStationsDir, WINSTA_OBJ_DIR))
{
return STATUS_INSUFFICIENT_RESOURCES;
}
}
else
{
@ -67,7 +70,10 @@ UserCreateWinstaDirectoy()
Peb->SessionId,
WINSTA_OBJ_DIR);
RtlCreateUnicodeString( &gustrWindowStationsDir, wstrWindowStationsDir);
if (!RtlCreateUnicodeString(&gustrWindowStationsDir, wstrWindowStationsDir))
{
return STATUS_INSUFFICIENT_RESOURCES;
}
}
InitializeObjectAttributes(&ObjectAttributes,
@ -1024,27 +1030,30 @@ BuildWindowStationNameList(
&ReturnLength);
if (STATUS_BUFFER_TOO_SMALL == Status)
{
BufferSize = ReturnLength;
Buffer = ExAllocatePoolWithTag(PagedPool, BufferSize, TAG_WINSTA);
if (NULL == Buffer)
{
ObDereferenceObject(DirectoryHandle);
return STATUS_NO_MEMORY;
}
ObDereferenceObject(DirectoryHandle);
return STATUS_NO_MEMORY;
}
/* We should have a sufficiently large buffer now */
Context = 0;
Status = ZwQueryDirectoryObject(DirectoryHandle, Buffer, BufferSize,
FALSE, TRUE, &Context, &ReturnLength);
if (! NT_SUCCESS(Status) ||
STATUS_NO_MORE_ENTRIES != ZwQueryDirectoryObject(DirectoryHandle, NULL, 0, FALSE,
FALSE, &Context, NULL))
{
/* Something went wrong, maybe someone added a directory entry? Just give up. */
ExFreePoolWithTag(Buffer, TAG_WINSTA);
ObDereferenceObject(DirectoryHandle);
return NT_SUCCESS(Status) ? STATUS_INTERNAL_ERROR : Status;
}
BufferSize = ReturnLength;
Buffer = ExAllocatePoolWithTag(PagedPool, BufferSize, TAG_WINSTA);
if (NULL == Buffer)
{
ObDereferenceObject(DirectoryHandle);
return STATUS_NO_MEMORY;
}
/* We should have a sufficiently large buffer now */
Context = 0;
Status = ZwQueryDirectoryObject(DirectoryHandle, Buffer, BufferSize,
FALSE, TRUE, &Context, &ReturnLength);
if (! NT_SUCCESS(Status) ||
STATUS_NO_MORE_ENTRIES != ZwQueryDirectoryObject(DirectoryHandle, NULL, 0, FALSE,
FALSE, &Context, NULL))
{
/* Something went wrong, maybe someone added a directory entry? Just give up. */
ExFreePoolWithTag(Buffer, TAG_WINSTA);
ObDereferenceObject(DirectoryHandle);
return NT_SUCCESS(Status) ? STATUS_INTERNAL_ERROR : Status;
}
}
@ -1130,7 +1139,7 @@ BuildWindowStationNameList(
/*
* Clean up
*/
if (NULL != Buffer && Buffer != InitialBuffer)
if (Buffer != InitialBuffer)
{
ExFreePoolWithTag(Buffer, TAG_WINSTA);
}
@ -1153,6 +1162,7 @@ BuildDesktopNameList(
DWORD EntryCount;
ULONG ReturnLength;
WCHAR NullWchar;
PUNICODE_STRING DesktopName;
Status = IntValidateWindowStationHandle(hWindowStation,
KernelMode,
@ -1175,7 +1185,8 @@ BuildDesktopNameList(
DesktopEntry = DesktopEntry->Flink)
{
DesktopObject = CONTAINING_RECORD(DesktopEntry, DESKTOP, ListEntry);
ReturnLength += ((PUNICODE_STRING)GET_DESKTOP_NAME(DesktopObject))->Length + sizeof(WCHAR);
DesktopName = GET_DESKTOP_NAME(DesktopObject);
if (DesktopName) ReturnLength += DesktopName->Length + sizeof(WCHAR);
EntryCount++;
}
TRACE("Required size: %d Entry count: %d\n", ReturnLength, EntryCount);
@ -1218,14 +1229,18 @@ BuildDesktopNameList(
DesktopEntry = DesktopEntry->Flink)
{
DesktopObject = CONTAINING_RECORD(DesktopEntry, DESKTOP, ListEntry);
Status = MmCopyToCaller(lpBuffer, ((PUNICODE_STRING)GET_DESKTOP_NAME(DesktopObject))->Buffer, ((PUNICODE_STRING)GET_DESKTOP_NAME(DesktopObject))->Length);
_PRAGMA_WARNING_SUPPRESS(__WARNING_DEREF_NULL_PTR)
DesktopName = GET_DESKTOP_NAME(DesktopObject);/// @todo Don't mess around with the object headers!
if (!DesktopName) continue;
Status = MmCopyToCaller(lpBuffer, DesktopName->Buffer, DesktopName->Length);
if (! NT_SUCCESS(Status))
{
KeReleaseSpinLock(&WindowStation->Lock, OldLevel);
ObDereferenceObject(WindowStation);
return Status;
}
lpBuffer = (PVOID) ((PCHAR) lpBuffer + ((PUNICODE_STRING)GET_DESKTOP_NAME(DesktopObject))->Length);
lpBuffer = (PVOID) ((PCHAR)lpBuffer + DesktopName->Length);
Status = MmCopyToCaller(lpBuffer, &NullWchar, sizeof(WCHAR));
if (! NT_SUCCESS(Status))
{

View file

@ -7,8 +7,6 @@ include_directories(
include
${REACTOS_SOURCE_DIR}/win32ss/include)
set_rc_compiler()
list(APPEND SOURCE
controls/appswitch.c
controls/button.c
@ -71,16 +69,8 @@ else()
endif()
add_library(user32 SHARED ${SOURCE})
set_module_type(user32
win32dll
ENTRYPOINT DllMain 12
UNICODE)
target_link_libraries(user32
user32_wsprintf
wine
win32ksys
${PSEH_LIB})
set_module_type(user32 win32dll ENTRYPOINT DllMain 12 UNICODE)
target_link_libraries(user32 user32_wsprintf wine win32ksys ${PSEH_LIB})
if(MSVC)
# for __ftol2_sse, float to int cast helper
@ -91,4 +81,3 @@ add_delay_importlibs(user32 imm32 usp10)
add_importlibs(user32 gdi32 advapi32 kernel32 ntdll)
add_pch(user32 include/user32.h)
add_cd_file(TARGET user32 DESTINATION reactos/system32 FOR all)

View file

@ -26,7 +26,7 @@ FONT 8, "MS Shell Dlg"
BEGIN
DEFPUSHBUTTON "Отказ",IDCANCEL,142,98,43,17
PUSHBUTTON "&Прекратяване веднага",IDC_END_NOW,150,71,60,17
LTEXT "Приложението не отговаря",IDC_STATIC,7,7,178,8
LTEXT "Приложението не отговаря.",IDC_STATIC,7,7,178,8
LTEXT "За да се върнете в РеактОС и да проверите състоянието на приложението, натиснете „Отказ“.",
IDC_STATIC,7,26,178,16
LTEXT "Ако решите да затворите приложението веднага, ще изгубите всички незаписани данни. За да прекратите приложението веднага, натиснете „Прекратяване веднага“.",

View file

@ -25,8 +25,8 @@ FONT 8, "MS Shell Dlg"
BEGIN
DEFPUSHBUTTON "Storno",IDCANCEL,142,98,43,17
PUSHBUTTON "&Ukončit okamžitě",IDC_END_NOW,78,98,43,17
LTEXT "Tento program neodpovídá",IDC_STATIC,7,7,178,8
LTEXT "Kliknutím na Storno se lze vrátit do systému ReactOS a ověřit stav programu",
LTEXT "Tento program neodpovídá.",IDC_STATIC,7,7,178,8
LTEXT "Kliknutím na Storno se lze vrátit do systému ReactOS a ověřit stav programu.",
IDC_STATIC,7,26,178,16
LTEXT "Pokud zvolíte okamžité ukončení programu, všechna neuložená data budou ztracena. Kliknutím na Ukončit okamžitě ukončíte program.",
IDC_STATIC,7,53,178,26

View file

@ -20,7 +20,7 @@ FONT 8, "MS Shell Dlg"
BEGIN
DEFPUSHBUTTON "Abbechen",IDCANCEL,142,98,43,17
PUSHBUTTON "J&etzt beenden",IDC_END_NOW,78,98,43,17
LTEXT "Das Programm reagiert nicht",IDC_STATIC,7,7,178,8
LTEXT "Das Programm reagiert nicht.",IDC_STATIC,7,7,178,8
LTEXT "Um zu ReactOS zurückzukehren und den Status der Anwendung zu überprüfen, wählen Sie Abbrechen.",
IDC_STATIC,7,26,178,16
LTEXT "Wenn Sie das Programm sofort beenden, werden Sie eventuell ungespeicherte Daten verlieren. Um das Programm zu beenden, wählen Sie Jetzt beenden.",

View file

@ -20,8 +20,8 @@ FONT 8, "MS Shell Dlg"
BEGIN
DEFPUSHBUTTON "’κυρο",IDCANCEL,142,98,43,17
PUSHBUTTON "&Κλείσιμο Τώρα",IDC_END_NOW,78,98,43,17
LTEXT "Το πρόγραμμα δεν αποκρίνεται",IDC_STATIC,7,7,178,8
LTEXT "Για να επιστρέψετε στο ReactOS και να ελέγξετε την κατάσταση του προγράμματος, πατήστε '’κυρο'",
LTEXT "Το πρόγραμμα δεν αποκρίνεται.",IDC_STATIC,7,7,178,8
LTEXT "Για να επιστρέψετε στο ReactOS και να ελέγξετε την κατάσταση του προγράμματος, πατήστε '’κυρο'.",
IDC_STATIC,7,26,178,16
LTEXT "Αν κλείσετε την εφαρμογή τώρα , θα χάσετε όλα τα μη αποθηκευμένα δεδομένα. Για να κλείσετε το πρόγραμμα τώρα, πατήστε 'Κλείσιμο Τώρα'.",
IDC_STATIC,7,53,178,26

View file

@ -20,10 +20,10 @@ FONT 8, "MS Shell Dlg"
BEGIN
DEFPUSHBUTTON "Cancel",IDCANCEL,142,98,43,17
PUSHBUTTON "&End Now",IDC_END_NOW,78,98,43,17
LTEXT "This program is not responding",IDC_STATIC,7,7,178,8
LTEXT "To return to ReactOS and check the status of the program, click Cancel",
LTEXT "This program is not responding.",IDC_STATIC,7,7,178,8
LTEXT "To return to ReactOS and check the status of the program, click Cancel.",
IDC_STATIC,7,26,178,16
LTEXT "If you choose to end the program immediately, you will loose any unsaved data. To end the program now, click End Now",
LTEXT "If you choose to end the program immediately, you will lose any unsaved data. To end the program now, click End Now.",
IDC_STATIC,7,53,178,26
END

View file

@ -25,8 +25,8 @@ FONT 8, "MS Shell Dlg"
BEGIN
DEFPUSHBUTTON "Cancelar",IDCANCEL,142,98,43,17
PUSHBUTTON "&Finalizar ahora",IDC_END_NOW,78,98,43,17
LTEXT "Este programa no responde",IDC_STATIC,7,7,178,8
LTEXT "Para volver a ReactOS y ver el estado del programa, haga clic en Cancelar",
LTEXT "Este programa no responde.",IDC_STATIC,7,7,178,8
LTEXT "Para volver a ReactOS y ver el estado del programa, haga clic en Cancelar.",
IDC_STATIC,7,26,178,16
LTEXT "Si elige finalizar el programa ahora, perderá todos los datos no guardados. Para finalizar el programa ahora, haga clic en Finalizar ahora.",
IDC_STATIC,7,53,178,26

View file

@ -20,10 +20,10 @@ FONT 8, "MS Shell Dlg"
BEGIN
DEFPUSHBUTTON "Annuler",IDCANCEL,142,98,43,17
PUSHBUTTON "T&erminer maintenant",IDC_END_NOW,78,98,43,17
LTEXT "Ce programme ne répond pas",IDC_STATIC,7,7,178,8
LTEXT "Pour retourner à ReactOS et vérifier l'état du programme, cliquez sur Annuler",
LTEXT "Ce programme ne répond pas.",IDC_STATIC,7,7,178,8
LTEXT "Pour retourner à ReactOS et vérifier l'état du programme, cliquez sur Annuler.",
IDC_STATIC,7,26,178,16
LTEXT "Si vous choisissez de terminer le programme immédiatement, vous perdrez toutes les données non sauvegardées. Pour terminer le programme maintenant, cliquez sur Terminer maintenant",
LTEXT "Si vous choisissez de terminer le programme immédiatement, vous perdrez toutes les données non sauvegardées. Pour terminer le programme maintenant, cliquez sur Terminer maintenant.",
IDC_STATIC,7,53,178,26
END

View file

@ -20,8 +20,8 @@ FONT 8, "MS Shell Dlg"
BEGIN
DEFPUSHBUTTON "Batal",IDCANCEL,142,98,43,17
PUSHBUTTON "&Akhiri Sekarang",IDC_END_NOW,78,98,43,17
LTEXT "Program ini tidak merespon",IDC_STATIC,7,7,178,8
LTEXT "Untuk kembali ke ReactOS dan memeriksa status program, klik Batal",
LTEXT "Program ini tidak merespon.",IDC_STATIC,7,7,178,8
LTEXT "Untuk kembali ke ReactOS dan memeriksa status program, klik Batal.",
IDC_STATIC,7,26,178,16
LTEXT "Jika anda memilih untuk segera mengakhiri program, anda akan kehilangan data yang belum disimpan. Untuk mengakhiri program sekarang, klik Akhiri Sekarang.",
IDC_STATIC,7,53,178,26

View file

@ -29,8 +29,8 @@ FONT 8, "MS Shell Dlg"
BEGIN
DEFPUSHBUTTON "Annulla",IDCANCEL,142,98,43,17
PUSHBUTTON "T&ermina ora",IDC_END_NOW,78,98,43,17
LTEXT "Il programma non risponde",IDC_STATIC,7,7,178,8
LTEXT "Per tornare a ReactOS e controllare lo stato del programma, selezionare Annulla",
LTEXT "Il programma non risponde.",IDC_STATIC,7,7,178,8
LTEXT "Per tornare a ReactOS e controllare lo stato del programma, selezionare Annulla.",
IDC_STATIC,7,26,178,16
LTEXT "Se si sceglie di terminare il programma immediatamente, si perderanno tutti i dati non salvati. Per terminare il programma ora, selezionare Termina ora.",
IDC_STATIC,7,53,178,26

View file

@ -20,10 +20,10 @@ FONT 8, "MS Shell Dlg"
BEGIN
DEFPUSHBUTTON "Avbryt",IDCANCEL,142,98,43,17
PUSHBUTTON "&Avslutt nå",IDC_END_NOW,78,98,43,17
LTEXT "Programmet svarer ikke",IDC_STATIC,7,7,178,8
LTEXT "For å returnere til ReactOS for å sjekke statusen på programmet, trykk på avbryt",
LTEXT "Programmet svarer ikke.",IDC_STATIC,7,7,178,8
LTEXT "For å returnere til ReactOS for å sjekke statusen på programmet, trykk på avbryt.",
IDC_STATIC,7,26,178,16
LTEXT "Hvis du velger å avslutte programmet øyeblikkelig, vil du miste alt data som ikke er lagret. For å avslutte programmet nå, Trykk på Avslutt nå",
LTEXT "Hvis du velger å avslutte programmet øyeblikkelig, vil du miste alt data som ikke er lagret. For å avslutte programmet nå, Trykk på Avslutt nå.",
IDC_STATIC,7,53,178,26
END

View file

@ -28,8 +28,8 @@ FONT 8, "MS Shell Dlg"
BEGIN
DEFPUSHBUTTON "Anuluj",IDCANCEL,142,98,43,17
PUSHBUTTON "&Zakończ teraz",IDC_END_NOW,78,98,43,17
LTEXT "Wybrany program nie odpowiada",IDC_STATIC,7,7,178,8
LTEXT "Aby powrócić do ReactOS i sprawdzić status programu, kliknij Anuluj",
LTEXT "Wybrany program nie odpowiada.",IDC_STATIC,7,7,178,8
LTEXT "Aby powrócić do ReactOS i sprawdzić status programu, kliknij Anuluj.",
IDC_STATIC,7,26,178,16
LTEXT "Jeśli zdecydujesz się zamknąć program natychmiastowo, utracisz wszelkie niezapisane dane. Aby zakończyć program, wciśnij Zakończ teraz.",
IDC_STATIC,7,53,178,26

View file

@ -22,10 +22,10 @@ FONT 8, "MS Shell Dlg"
BEGIN
DEFPUSHBUTTON "Cancelar",IDCANCEL,142,98,43,17
PUSHBUTTON "&Finalizar Agora",IDC_END_NOW,78,98,43,17
LTEXT "O programa não está respondendo",IDC_STATIC,7,7,178,8
LTEXT "Parar retornar ao ReactOS e verificar o estado do programa, pressione Cancelar",
LTEXT "O programa não está respondendo.",IDC_STATIC,7,7,178,8
LTEXT "Parar retornar ao ReactOS e verificar o estado do programa, pressione Cancelar.",
IDC_STATIC,7,26,178,16
LTEXT "Se você finalizar o programa imediatamente, você irá perder qualquer alteração não salva. Para finalizar o programa agora, pressione Finalizar Agora",
LTEXT "Se você finalizar o programa imediatamente, você irá perder qualquer alteração não salva. Para finalizar o programa agora, pressione Finalizar Agora.",
IDC_STATIC,7,53,178,26
END

View file

@ -27,8 +27,8 @@ FONT 8, "MS Shell Dlg"
BEGIN
DEFPUSHBUTTON "A&nulează", IDCANCEL,142,98,43,17
PUSHBUTTON "Termină &forțat",IDC_END_NOW,78,98,43,17
LTEXT "Acest program nu răspunde",IDC_STATIC,7,7,178,8
LTEXT "Pentru a vă întoarce în ReactOS și a verifica starea programului, apăsați „Anulează”",
LTEXT "Acest program nu răspunde.",IDC_STATIC,7,7,178,8
LTEXT "Pentru a vă întoarce în ReactOS și a verifica starea programului, apăsați „Anulează”.",
IDC_STATIC,7,26,178,16
LTEXT "Dacă alegeți închiderea imediată a programului, riscați pierderi de date. Pentru a forța închiderea, apăsați „Termină forțat”.",
IDC_STATIC,7,53,178,26

View file

@ -20,10 +20,10 @@ FONT 8, "MS Shell Dlg"
BEGIN
DEFPUSHBUTTON "Отмена",IDCANCEL,142,98,43,17
PUSHBUTTON "&Завершить",IDC_END_NOW,78,98,43,17
LTEXT "Эта программа не отвечает",IDC_STATIC,7,7,178,8
LTEXT "Для возврата в ReactOS и сохранения данных нажмите ""Отмена""",
LTEXT "Эта программа не отвечает.",IDC_STATIC,7,7,178,8
LTEXT "Для возврата в ReactOS и сохранения данных нажмите ""Отмена"".",
IDC_STATIC,7,26,178,16
LTEXT "Если вы завершите программу сейчас, то вы можете потерять несохраненные данные. Чтобы завешить программу сейчас нажмите ""Завершить""",
LTEXT "Если вы завершите программу сейчас, то вы можете потерять несохраненные данные. Чтобы завешить программу сейчас нажмите ""Завершить"".",
IDC_STATIC,7,53,178,26
END

View file

@ -27,8 +27,8 @@ FONT 8, "MS Shell Dlg"
BEGIN
DEFPUSHBUTTON "Avbryt",IDCANCEL,142,98,43,17
PUSHBUTTON "&Avsluta Nu",IDC_END_NOW,78,98,43,17
LTEXT "Detta programmet svarar inte",IDC_STATIC,7,7,178,8
LTEXT "För att återgå till ReactOS och undersöka programmets status klicka Avbryt",
LTEXT "Detta programmet svarar inte.",IDC_STATIC,7,7,178,8
LTEXT "För att återgå till ReactOS och undersöka programmets status klicka Avbryt.",
IDC_STATIC,7,26,178,16
LTEXT "m du väljer att avsluta programmet omedelbart kommer du att förlora all osparad data. För att avsluta programmet, klicka Avsluta nu.",
IDC_STATIC,7,53,178,26

View file

@ -28,10 +28,10 @@ FONT 8, "MS Shell Dlg"
BEGIN
DEFPUSHBUTTON "Скасувати",IDCANCEL,142,98,43,17
PUSHBUTTON "&Завершити зараз",IDC_END_NOW,78,98,43,17
LTEXT "Ця програма не відповідає",IDC_STATIC,7,7,178,8
LTEXT "Щоб повернутися у ReactOS і перевірити стан програми, натисніть 'Скасувати'",
LTEXT "Ця програма не відповідає.",IDC_STATIC,7,7,178,8
LTEXT "Щоб повернутися у ReactOS і перевірити стан програми, натисніть 'Скасувати'.",
IDC_STATIC,7,26,178,16
LTEXT "Якщо завершити програму негайно, то можна втратити всі незбережені дані. Щоб завершити програму зараз, натисніть 'Завершити зараз'",
LTEXT "Якщо завершити програму негайно, то можна втратити всі незбережені дані. Щоб завершити програму зараз, натисніть 'Завершити зараз'.",
IDC_STATIC,7,53,178,26
END