From 5ad72c914523f9d94daa8467be32b696b46ce7fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Thu, 8 Nov 2012 12:40:41 +0000 Subject: [PATCH 01/29] [WIN32K] - Work only with BITMAPINFO in GreGetDIBItsInternal and convert the structure back to BITMAPCOREINFO if needed. - Set the rgbReserved member to 0 when getting palette of a DIB section svn path=/trunk/; revision=57691 --- reactos/win32ss/gdi/ntgdi/dib.h | 5 +- reactos/win32ss/gdi/ntgdi/dibobj.c | 126 +++++++++--------------- reactos/win32ss/user/ntuser/clipboard.c | 2 +- reactos/win32ss/user/ntuser/misc/file.c | 2 +- 4 files changed, 55 insertions(+), 80 deletions(-) diff --git a/reactos/win32ss/gdi/ntgdi/dib.h b/reactos/win32ss/gdi/ntgdi/dib.h index 7eabbdf397c..2c679598750 100644 --- a/reactos/win32ss/gdi/ntgdi/dib.h +++ b/reactos/win32ss/gdi/ntgdi/dib.h @@ -7,8 +7,11 @@ int FASTCALL DIB_GetBitmapInfo( const BITMAPINFOHEADER *header, LONG *width, INT APIENTRY DIB_GetDIBImageBytes (INT width, INT height, INT depth); HPALETTE FASTCALL DIB_MapPaletteColors(PPALETTE ppal, CONST BITMAPINFO* lpbmi); HPALETTE FASTCALL BuildDIBPalette (CONST BITMAPINFO *bmi); + +/* Those functions permit to tranparently work with a BITMAPCOREINFO structure */ BITMAPINFO* FASTCALL DIB_ConvertBitmapInfo(CONST BITMAPINFO* bmi, DWORD Usage); -VOID FASTCALL DIB_FreeConvertedBitmapInfo(BITMAPINFO* converted, BITMAPINFO* orig); +/* Pass Usage = -1 if you don't want to convert the BITMAPINFO back to BITMAPCOREINFO */ +VOID FASTCALL DIB_FreeConvertedBitmapInfo(BITMAPINFO* converted, BITMAPINFO* orig, DWORD Usage); INT APIENTRY diff --git a/reactos/win32ss/gdi/ntgdi/dibobj.c b/reactos/win32ss/gdi/ntgdi/dibobj.c index ed8876f75db..f1bd2489a18 100644 --- a/reactos/win32ss/gdi/ntgdi/dibobj.c +++ b/reactos/win32ss/gdi/ntgdi/dibobj.c @@ -584,7 +584,6 @@ GreGetDIBitsInternal( DWORD compr, size ; USHORT i; int bitmap_type; - RGBTRIPLE* rgbTriples; RGBQUAD* rgbQuads; VOID* colorPtr; @@ -594,7 +593,6 @@ GreGetDIBitsInternal( return 0; colorPtr = (LPBYTE)Info + Info->bmiHeader.biSize; - rgbTriples = colorPtr; rgbQuads = colorPtr; bitmap_type = DIB_GetBitmapInfo(&Info->bmiHeader, @@ -643,15 +641,6 @@ GreGetDIBitsInternal( switch(bpp) { case 0: /* Only info */ - if(pbmci) - { - pbmci->bmciHeader.bcWidth = (WORD)psurf->SurfObj.sizlBitmap.cx; - pbmci->bmciHeader.bcHeight = (WORD)((psurf->SurfObj.fjBitmap & BMF_TOPDOWN) ? - -psurf->SurfObj.sizlBitmap.cy : - psurf->SurfObj.sizlBitmap.cy); - pbmci->bmciHeader.bcPlanes = 1; - pbmci->bmciHeader.bcBitCount = BitsPerFormat(psurf->SurfObj.iBitmapFormat); - } Info->bmiHeader.biWidth = psurf->SurfObj.sizlBitmap.cx; Info->bmiHeader.biHeight = (psurf->SurfObj.fjBitmap & BMF_TOPDOWN) ? -psurf->SurfObj.sizlBitmap.cy : @@ -702,31 +691,19 @@ GreGetDIBitsInternal( if(Usage == DIB_RGB_COLORS) { ULONG colors = min(psurf->ppal->NumColors, 256); - - if(pbmci) - { - for(i = 0; i < colors; i++) - { - rgbTriples[i].rgbtRed = psurf->ppal->IndexedColors[i].peRed; - rgbTriples[i].rgbtGreen = psurf->ppal->IndexedColors[i].peGreen; - rgbTriples[i].rgbtBlue = psurf->ppal->IndexedColors[i].peBlue; - } - } if(colors != 256) Info->bmiHeader.biClrUsed = colors; for(i = 0; i < colors; i++) { rgbQuads[i].rgbRed = psurf->ppal->IndexedColors[i].peRed; rgbQuads[i].rgbGreen = psurf->ppal->IndexedColors[i].peGreen; rgbQuads[i].rgbBlue = psurf->ppal->IndexedColors[i].peBlue; + rgbQuads[i].rgbReserved = 0; } } else { for(i = 0; i < 256; i++) - { - if(pbmci) ((WORD*)rgbTriples)[i] = i; ((WORD*)rgbQuads)[i] = i; - } } } else @@ -735,7 +712,6 @@ GreGetDIBitsInternal( { for(i = 0; i < 256; i++) { - if(pbmci) ((WORD*)rgbTriples)[i] = i; ((WORD*)rgbQuads)[i] = i; } } @@ -752,13 +728,6 @@ GreGetDIBitsInternal( } for (i = 0; i < pDcPal->NumColors; i++) { - if (pbmci) - { - rgbTriples[i].rgbtRed = pDcPal->IndexedColors[i].peRed; - rgbTriples[i].rgbtGreen = pDcPal->IndexedColors[i].peGreen; - rgbTriples[i].rgbtBlue = pDcPal->IndexedColors[i].peBlue; - } - rgbQuads[i].rgbRed = pDcPal->IndexedColors[i].peRed; rgbQuads[i].rgbGreen = pDcPal->IndexedColors[i].peGreen; rgbQuads[i].rgbBlue = pDcPal->IndexedColors[i].peBlue; @@ -771,55 +740,20 @@ GreGetDIBitsInternal( switch (bpp) { case 1: - if (pbmci) - { - rgbTriples[0].rgbtRed = rgbTriples[0].rgbtGreen = - rgbTriples[0].rgbtBlue = 0; - rgbTriples[1].rgbtRed = rgbTriples[1].rgbtGreen = - rgbTriples[1].rgbtBlue = 0xff; - } - rgbQuads[0].rgbRed = rgbQuads[0].rgbGreen = - rgbQuads[0].rgbBlue = 0; + rgbQuads[0].rgbRed = rgbQuads[0].rgbGreen = rgbQuads[0].rgbBlue = 0; rgbQuads[0].rgbReserved = 0; - rgbQuads[1].rgbRed = rgbQuads[1].rgbGreen = - rgbQuads[1].rgbBlue = 0xff; + rgbQuads[1].rgbRed = rgbQuads[1].rgbGreen = rgbQuads[1].rgbBlue = 0xff; rgbQuads[1].rgbReserved = 0; break; case 4: - if (pbmci) - RtlCopyMemory(rgbTriples, EGAColorsTriples, sizeof(EGAColorsTriples)); RtlCopyMemory(rgbQuads, EGAColorsQuads, sizeof(EGAColorsQuads)); - break; case 8: { INT r, g, b; RGBQUAD *color; - if (pbmci) - { - RGBTRIPLE *colorTriple; - - RtlCopyMemory(rgbTriples, DefLogPaletteTriples, - 10 * sizeof(RGBTRIPLE)); - RtlCopyMemory(rgbTriples + 246, DefLogPaletteTriples + 10, - 10 * sizeof(RGBTRIPLE)); - colorTriple = rgbTriples + 10; - for(r = 0; r <= 5; r++) /* FIXME */ - { - for(g = 0; g <= 5; g++) - { - for(b = 0; b <= 5; b++) - { - colorTriple->rgbtRed = (r * 0xff) / 5; - colorTriple->rgbtGreen = (g * 0xff) / 5; - colorTriple->rgbtBlue = (b * 0xff) / 5; - colorTriple++; - } - } - } - } memcpy(rgbQuads, DefLogPaletteQuads, 10 * sizeof(RGBQUAD)); memcpy(rgbQuads + 246, DefLogPaletteQuads + 10, @@ -933,11 +867,8 @@ GreGetDIBitsInternal( } psurfDest = SURFACE_ShareLockSurface(hBmpDest); - - rcDest.left = 0; - rcDest.top = 0; - rcDest.bottom = ScanLines; - rcDest.right = psurf->SurfObj.sizlBitmap.cx; + + RECTL_vSetRect(&rcDest, 0, 0, ScanLines, psurf->SurfObj.sizlBitmap.cx); srcPoint.x = 0; @@ -987,7 +918,7 @@ done: if(pDC) DC_UnlockDc(pDC); if(psurf) SURFACE_ShareUnlockSurface(psurf); - if(pbmci) DIB_FreeConvertedBitmapInfo(Info, (BITMAPINFO*)pbmci); + if(pbmci) DIB_FreeConvertedBitmapInfo(Info, (BITMAPINFO*)pbmci, Usage); return ScanLines; } @@ -1926,10 +1857,51 @@ DIB_ConvertBitmapInfo (CONST BITMAPINFO* pbmi, DWORD Usage) /* Frees a BITMAPINFO created with DIB_ConvertBitmapInfo */ VOID FASTCALL -DIB_FreeConvertedBitmapInfo(BITMAPINFO* converted, BITMAPINFO* orig) +DIB_FreeConvertedBitmapInfo(BITMAPINFO* converted, BITMAPINFO* orig, DWORD usage) { - if(converted != orig) + 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; + if(!numColors) numColors = 1 << pbmci->bmciHeader.bcBitCount; + if(usage == DIB_PAL_COLORS) + { + RtlZeroMemory(pbmci->bmciColors, (1 << pbmci->bmciHeader.bcBitCount) * sizeof(WORD)); + RtlCopyMemory(pbmci->bmciColors, converted->bmiColors, numColors * sizeof(WORD)); + } + else + { + UINT i; + RtlZeroMemory(pbmci->bmciColors, (1 << pbmci->bmciHeader.bcBitCount) * sizeof(RGBTRIPLE)); + for(i=0; ibmciColors[i].rgbtRed = converted->bmiColors[i].rgbRed; + pbmci->bmciColors[i].rgbtGreen = converted->bmiColors[i].rgbGreen; + pbmci->bmciColors[i].rgbtBlue = converted->bmiColors[i].rgbBlue; + } + } + } + /* Now free it, it's not needed anymore */ + ExFreePoolWithTag(converted, TAG_DIB); } /* EOF */ diff --git a/reactos/win32ss/user/ntuser/clipboard.c b/reactos/win32ss/user/ntuser/clipboard.c index 72bac911b0f..64b204e8eb3 100644 --- a/reactos/win32ss/user/ntuser/clipboard.c +++ b/reactos/win32ss/user/ntuser/clipboard.c @@ -276,7 +276,7 @@ cleanup: UserReleaseDC(NULL, hdc, FALSE); if (pConvertedBmi) - DIB_FreeConvertedBitmapInfo(pConvertedBmi, pBmi); + DIB_FreeConvertedBitmapInfo(pConvertedBmi, pBmi, -1); } VOID static NTAPI diff --git a/reactos/win32ss/user/ntuser/misc/file.c b/reactos/win32ss/user/ntuser/misc/file.c index abc5a0ca651..8b4d0e26b06 100644 --- a/reactos/win32ss/user/ntuser/misc/file.c +++ b/reactos/win32ss/user/ntuser/misc/file.c @@ -233,7 +233,7 @@ UserLoadImage(PCWSTR pwszName) 0); NtGdiDeleteObjectApp(hdc); - DIB_FreeConvertedBitmapInfo(pConvertedInfo, pbmi); + DIB_FreeConvertedBitmapInfo(pConvertedInfo, pbmi, -1); } else { From bd515ad606cd6a2f3972f9b3e9c42c2046c76e03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Thu, 8 Nov 2012 12:51:24 +0000 Subject: [PATCH 02/29] [WIN32SS/USER] - Start using CURSORDATA structure for passing data from user to kernel mode. - Start using the proper CURSOR structure for win32k internal represesentation of cursor and icons - Create the alpha bitmap in user mode instead of kernel mode. svn path=/trunk/; revision=57692 --- reactos/win32ss/include/ntuser.h | 49 +- reactos/win32ss/user/ntuser/cursoricon.h | 31 +- reactos/win32ss/user/ntuser/cursoricon_new.c | 392 ++++-------- reactos/win32ss/user/ntuser/msgqueue.c | 16 +- .../user/user32/windows/cursoricon_new.c | 568 ++++++++++++------ reactos/win32ss/w32ksvc.h | 5 +- 6 files changed, 592 insertions(+), 469 deletions(-) diff --git a/reactos/win32ss/include/ntuser.h b/reactos/win32ss/include/ntuser.h index 5e7bf2ca53e..93b7ee9e540 100644 --- a/reactos/win32ss/include/ntuser.h +++ b/reactos/win32ss/include/ntuser.h @@ -976,6 +976,43 @@ typedef struct tagSETCLIPBDATA BOOL fIncSerialNumber; } SETCLIPBDATA, *PSETCLIPBDATA; +// Used with NtUserSetCursorIconData, last parameter. +typedef struct tagCURSORDATA +{ + LPWSTR lpName; + LPWSTR lpModName; + USHORT rt; + USHORT dummy; + ULONG CURSORF_flags; + SHORT xHotspot; + SHORT yHotspot; + HBITMAP hbmMask; + HBITMAP hbmColor; + HBITMAP hbmAlpha; + RECT rcBounds; + HBITMAP hbmUserAlpha; // Could be in W7U, not in W2k + ULONG bpp; + ULONG cx; + ULONG cy; + INT cpcur; + INT cicur; + struct tagCURSORDATA * aspcur; + DWORD * aicur; + INT * ajifRate; + INT iicur; +} CURSORDATA, *PCURSORDATA; /* !dso CURSORDATA */ + +// CURSORF_flags: +#define CURSORF_FROMRESOURCE 0x0001 +#define CURSORF_GLOBAL 0x0002 +#define CURSORF_LRSHARED 0x0004 +#define CURSORF_ACON 0x0008 +#define CURSORF_WOWCLEANUP 0x0010 +#define CURSORF_ACONFRAME 0x0040 +#define CURSORF_SECRET 0x0080 +#define CURSORF_LINKED 0x0100 +#define CURSORF_CURRENT 0x0200 + DWORD NTAPI NtUserAssociateInputContext( @@ -2737,15 +2774,21 @@ NtUserSetCursorIconData( _In_ HCURSOR hCursor, _In_ PUNICODE_STRING pustrModule, _In_ PUNICODE_STRING puSrcName, - _In_ PICONINFO pii); + _In_ PCURSORDATA pCursorData); + +typedef struct _tagFINDEXISTINGCURICONPARAM +{ + BOOL bIcon; + LONG cx; + LONG cy; +} FINDEXISTINGCURICONPARAM; HICON NTAPI NtUserFindExistingCursorIcon( _In_ PUNICODE_STRING pustrModule, _In_ PUNICODE_STRING pustrRsrc, - _In_ LONG cxDesired, - _In_ LONG cyDesired); + _In_ FINDEXISTINGCURICONPARAM* param); #else BOOL NTAPI diff --git a/reactos/win32ss/user/ntuser/cursoricon.h b/reactos/win32ss/user/ntuser/cursoricon.h index 842392d890f..2d001778a35 100644 --- a/reactos/win32ss/user/ntuser/cursoricon.h +++ b/reactos/win32ss/user/ntuser/cursoricon.h @@ -9,26 +9,29 @@ typedef struct tagCURICON_PROCESS } CURICON_PROCESS, *PCURICON_PROCESS; #ifdef NEW_CURSORICON -typedef struct _CURICON_FRAME -{ - HBITMAP hbmMask; - HBITMAP hbmColor; - HBITMAP hbmAlpha; -} CURICON_FRAME, *PCURICON_FRAME; - typedef struct _CURICON_OBJECT { - PROCMARKHEAD head; + PROCMARKHEAD head; + struct _tagCURSOR* pcurNext; + UNICODE_STRING strName; + USHORT atomModName; + USHORT rt; + ULONG CURSORF_flags; + SHORT xHotspot; + SHORT yHotspot; + HBITMAP hbmMask; + HBITMAP hbmColor; + HBITMAP hbmAlpha; + RECT rcBounds; + HBITMAP hbmUserAlpha; + ULONG bpp; + ULONG cx; + ULONG cy; +/* ReactOS specific, to be deleted */ LIST_ENTRY ListEntry; HANDLE Self; LIST_ENTRY ProcessList; UNICODE_STRING ustrModule; - UNICODE_STRING ustrRsrc; - SIZE Size; - BYTE Shadow; - BOOL bIcon; - POINTL ptlHotspot; - CURICON_FRAME aFrame[1]; } CURICON_OBJECT, *PCURICON_OBJECT; #else diff --git a/reactos/win32ss/user/ntuser/cursoricon_new.c b/reactos/win32ss/user/ntuser/cursoricon_new.c index e5d25ba4a05..8d0c0703192 100644 --- a/reactos/win32ss/user/ntuser/cursoricon_new.c +++ b/reactos/win32ss/user/ntuser/cursoricon_new.c @@ -27,8 +27,8 @@ #include DBG_DEFAULT_CHANNEL(UserIcon); -static PPAGED_LOOKASIDE_LIST pgProcessLookasideList; static LIST_ENTRY gCurIconList; +static PAGED_LOOKASIDE_LIST *pgProcessLookasideList; SYSTEM_CURSORINFO gSysCursorInfo; @@ -48,14 +48,14 @@ InitCursorImpl() 128); InitializeListHead(&gCurIconList); - gSysCursorInfo.Enabled = FALSE; - gSysCursorInfo.ButtonsDown = 0; - gSysCursorInfo.bClipped = FALSE; - gSysCursorInfo.LastBtnDown = 0; - gSysCursorInfo.CurrentCursorObject = NULL; - gSysCursorInfo.ShowingCursor = -1; - gSysCursorInfo.ClickLockActive = FALSE; - gSysCursorInfo.ClickLockTime = 0; + gSysCursorInfo.Enabled = FALSE; + gSysCursorInfo.ButtonsDown = 0; + gSysCursorInfo.bClipped = FALSE; + gSysCursorInfo.LastBtnDown = 0; + gSysCursorInfo.CurrentCursorObject = NULL; + gSysCursorInfo.ShowingCursor = -1; + gSysCursorInfo.ClickLockActive = FALSE; + gSysCursorInfo.ClickLockTime = 0; return TRUE; } @@ -66,6 +66,13 @@ IntGetSysCursorInfo() return &gSysCursorInfo; } +FORCEINLINE +BOOL +is_icon(PCURICON_OBJECT object) +{ + return MAKEINTRESOURCE(object->rt) == RT_ICON; +} + /* This function creates a reference for the object! */ PCURICON_OBJECT FASTCALL UserGetCurIconObject(HCURSOR hCurIcon) { @@ -182,23 +189,23 @@ IntFindExistingCurIconObject( LIST_FOR_EACH(CurIcon, &gCurIconList, CURICON_OBJECT, ListEntry) { /* See if we are looking for an icon or a cursor */ - if(CurIcon->bIcon != param->bIcon) + if(MAKEINTRESOURCE(CurIcon->rt) != (param->bIcon ? RT_ICON : RT_CURSOR)) continue; /* See if module names match */ if(RtlCompareUnicodeString(pustrModule, &CurIcon->ustrModule, TRUE) == 0) { /* They do. Now see if this is the same resource */ - if(IS_INTRESOURCE(CurIcon->ustrRsrc.Buffer) && IS_INTRESOURCE(pustrRsrc->Buffer)) + if(IS_INTRESOURCE(CurIcon->strName.Buffer) && IS_INTRESOURCE(pustrRsrc->Buffer)) { - if(CurIcon->ustrRsrc.Buffer != pustrRsrc->Buffer) + if(CurIcon->strName.Buffer != pustrRsrc->Buffer) continue; } - else if(IS_INTRESOURCE(CurIcon->ustrRsrc.Buffer) || IS_INTRESOURCE(pustrRsrc->Buffer)) + else if(IS_INTRESOURCE(CurIcon->strName.Buffer) || IS_INTRESOURCE(pustrRsrc->Buffer)) continue; - else if(RtlCompareUnicodeString(pustrRsrc, &CurIcon->ustrRsrc, TRUE) != 0) + else if(RtlCompareUnicodeString(pustrRsrc, &CurIcon->strName, TRUE) != 0) continue; - if ((param->cx == CurIcon->Size.cx) &&(param->cy == CurIcon->Size.cy)) + if ((param->cx == CurIcon->cx) && (param->cy == CurIcon->cy)) { if (! ReferenceCurIconByProcess(CurIcon)) { @@ -217,13 +224,12 @@ PCURICON_OBJECT IntCreateCurIconHandle(DWORD dwNumber) { PCURICON_OBJECT CurIcon; - BOOLEAN bIcon = dwNumber == 0; HANDLE hCurIcon; if(dwNumber == 0) dwNumber = 1; - CurIcon = UserCreateObject(gHandleTable, NULL, NULL, &hCurIcon, otCursorIcon, FIELD_OFFSET(CURICON_OBJECT, aFrame[dwNumber])); + CurIcon = UserCreateObject(gHandleTable, NULL, NULL, &hCurIcon, otCursorIcon, sizeof(CURICON_OBJECT)); if (!CurIcon) { @@ -232,14 +238,13 @@ IntCreateCurIconHandle(DWORD dwNumber) } CurIcon->Self = hCurIcon; - CurIcon->bIcon = bIcon; InitializeListHead(&CurIcon->ProcessList); if (! ReferenceCurIconByProcess(CurIcon)) { ERR("Failed to add process\n"); - UserDeleteObject(hCurIcon, otCursorIcon); UserDereferenceObject(CurIcon); + UserDeleteObject(hCurIcon, otCursorIcon); return NULL; } @@ -251,11 +256,17 @@ IntCreateCurIconHandle(DWORD dwNumber) BOOLEAN FASTCALL IntDestroyCurIconObject(PCURICON_OBJECT CurIcon, PPROCESSINFO ppi, BOOLEAN bForce) { - PSYSTEM_CURSORINFO CurInfo; HBITMAP bmpMask, bmpColor, bmpAlpha; BOOLEAN Ret, bListEmpty, bFound = FALSE; PCURICON_PROCESS Current = NULL; + /* Check if this is the current cursor */ + if(CurIcon->CURSORF_flags & CURSORF_CURRENT) + { + UserDereferenceObject(CurIcon); + return FALSE; + } + /* For handles created without any data (error handling) */ if(IsListEmpty(&CurIcon->ProcessList)) goto emptyList; @@ -308,40 +319,32 @@ emptyList: /* Remove it from the list */ RemoveEntryList(&CurIcon->ListEntry); - CurInfo = IntGetSysCursorInfo(); - - if (CurInfo->CurrentCursorObject == CurIcon) - { - /* Hide the cursor if we're destroying the current cursor */ - UserSetCursor(NULL, TRUE); - } - - bmpMask = CurIcon->aFrame[0].hbmMask; - bmpColor = CurIcon->aFrame[0].hbmColor; - bmpAlpha = CurIcon->aFrame[0].hbmAlpha; + bmpMask = CurIcon->hbmMask; + bmpColor = CurIcon->hbmColor; + bmpAlpha = CurIcon->hbmAlpha; /* Delete bitmaps */ if (bmpMask) { GreSetObjectOwner(bmpMask, GDI_OBJ_HMGR_POWNED); GreDeleteObject(bmpMask); - CurIcon->aFrame[0].hbmMask = NULL; + CurIcon->hbmMask = NULL; } if (bmpColor) { GreSetObjectOwner(bmpColor, GDI_OBJ_HMGR_POWNED); GreDeleteObject(bmpColor); - CurIcon->aFrame[0].hbmColor = NULL; + CurIcon->hbmColor = NULL; } if (bmpAlpha) { GreSetObjectOwner(bmpAlpha, GDI_OBJ_HMGR_POWNED); GreDeleteObject(bmpAlpha); - CurIcon->aFrame[0].hbmAlpha = NULL; + CurIcon->hbmAlpha = NULL; } - if(!IS_INTRESOURCE(CurIcon->ustrRsrc.Buffer)) - ExFreePoolWithTag(CurIcon->ustrRsrc.Buffer, TAG_STRING); + if(!IS_INTRESOURCE(CurIcon->strName.Buffer)) + ExFreePoolWithTag(CurIcon->strName.Buffer, TAG_STRING); if(CurIcon->ustrModule.Buffer) ReleaseCapturedUnicodeString(&CurIcon->ustrModule, UserMode); @@ -408,27 +411,16 @@ NtUserGetIconInfo( if(IconInfo) { /* Fill data */ - ii.fIcon = CurIcon->bIcon; - ii.xHotspot = CurIcon->ptlHotspot.x; - ii.yHotspot = CurIcon->ptlHotspot.y; + ii.fIcon = is_icon(CurIcon); + ii.xHotspot = CurIcon->xHotspot; + ii.yHotspot = CurIcon->yHotspot; /* Copy bitmaps */ - ii.hbmMask = BITMAP_CopyBitmap(CurIcon->aFrame[0].hbmMask); + ii.hbmMask = BITMAP_CopyBitmap(CurIcon->hbmMask); GreSetObjectOwner(ii.hbmMask, GDI_OBJ_HMGR_POWNED); - ii.hbmColor = BITMAP_CopyBitmap(CurIcon->aFrame[0].hbmColor); + ii.hbmColor = BITMAP_CopyBitmap(CurIcon->hbmColor); GreSetObjectOwner(ii.hbmColor, GDI_OBJ_HMGR_POWNED); - - if (pbpp) - { - PSURFACE psurfBmp; - - psurfBmp = SURFACE_ShareLockSurface(CurIcon->aFrame[0].hbmColor); - if (psurfBmp) - { - colorBpp = BitsPerFormat(psurfBmp->SurfObj.iBitmapFormat); - SURFACE_ShareUnlockSurface(psurfBmp); - } - } + colorBpp = CurIcon->bpp; /* Copy fields */ _SEH2_TRY @@ -487,7 +479,7 @@ NtUserGetIconInfo( if(lpResName) { - if(!CurIcon->ustrRsrc.Buffer) + if(!CurIcon->strName.Buffer) { EngSetLastError(ERROR_INVALID_HANDLE); goto leave; @@ -496,15 +488,15 @@ NtUserGetIconInfo( _SEH2_TRY { ProbeForWrite(lpResName, sizeof(UNICODE_STRING), 1); - if(IS_INTRESOURCE(CurIcon->ustrRsrc.Buffer)) + if(IS_INTRESOURCE(CurIcon->strName.Buffer)) { - lpResName->Buffer = CurIcon->ustrRsrc.Buffer; + lpResName->Buffer = CurIcon->strName.Buffer; lpResName->Length = 0; } else { - lpResName->Length = min(lpResName->MaximumLength, CurIcon->ustrRsrc.Length); - RtlCopyMemory(lpResName->Buffer, CurIcon->ustrRsrc.Buffer, lpResName->Length); + lpResName->Length = min(lpResName->MaximumLength, CurIcon->strName.Length); + RtlCopyMemory(lpResName->Buffer, CurIcon->strName.Buffer, lpResName->Length); } } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) @@ -558,9 +550,9 @@ NtUserGetIconSize( _SEH2_TRY { ProbeForWrite(plcx, sizeof(LONG), 1); - RtlCopyMemory(plcx, &CurIcon->Size.cx, sizeof(LONG)); + *plcx = CurIcon->cx; ProbeForWrite(plcy, sizeof(LONG), 1); - RtlCopyMemory(plcy, &CurIcon->Size.cy, sizeof(LONG)); + *plcy = CurIcon->cy; } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { @@ -788,7 +780,7 @@ NtUserFindExistingCursorIcon( _SEH2_TRY { ProbeForRead(param, sizeof(*param), 1); - paramSafe = *param; + RtlCopyMemory(¶mSafe, param, sizeof(paramSafe)); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { @@ -882,6 +874,7 @@ NtUserSetCursor( EngSetLastError(ERROR_INVALID_CURSOR_HANDLE); goto leave; } + pcurNew->CURSORF_flags |= CURSORF_CURRENT; } else { @@ -892,6 +885,7 @@ NtUserSetCursor( if (pcurOld) { hOldCursor = (HCURSOR)pcurOld->Self; + pcurOld->CURSORF_flags &= ~CURSORF_CURRENT; UserDereferenceObject(pcurOld); } @@ -902,7 +896,7 @@ leave: /* - * @implemented + * @unimplemented */ BOOL APIENTRY @@ -910,150 +904,8 @@ NtUserSetCursorContents( HANDLE hCurIcon, PICONINFO UnsafeIconInfo) { - PCURICON_OBJECT CurIcon; - ICONINFO IconInfo; - PSURFACE psurfBmp; - NTSTATUS Status; - BOOL Ret = FALSE; - DECLARE_RETURN(BOOL); - - TRACE("Enter NtUserSetCursorContents\n"); - UserEnterExclusive(); - - if (!(CurIcon = UserGetCurIconObject(hCurIcon))) - { - RETURN(FALSE); - } - - /* Copy fields */ - Status = MmCopyFromCaller(&IconInfo, UnsafeIconInfo, sizeof(ICONINFO)); - if (!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - goto done; - } - -#if 0 - /* Check if we get valid information */ - if(IconInfo.fIcon != CurInfo->bIcon) - { - EngSetLastError(ERROR_INVALID_PARAMETER); - goto done; - } -#endif - - /* Delete old bitmaps */ - if (CurIcon->aFrame[0].hbmColor) - GreDeleteObject(CurIcon->aFrame[0].hbmColor); - if (CurIcon->aFrame[0].hbmMask) - GreDeleteObject(CurIcon->aFrame[0].hbmMask); - if(CurIcon->aFrame[0].hbmAlpha) - GreDeleteObject(CurIcon->aFrame[0].hbmAlpha); - - /* Set fields */ - CurIcon->bIcon = IconInfo.fIcon; - CurIcon->ptlHotspot.x = IconInfo.xHotspot; - CurIcon->ptlHotspot.y = IconInfo.yHotspot; - CurIcon->aFrame[0].hbmMask = IconInfo.hbmMask; - CurIcon->aFrame[0].hbmColor = IconInfo.hbmColor; - CurIcon->aFrame[0].hbmAlpha = NULL; - - if (IconInfo.hbmColor) - { - BOOLEAN bAlpha = FALSE; - psurfBmp = SURFACE_ShareLockSurface(IconInfo.hbmColor); - if (!psurfBmp) - goto done; - CurIcon->Size.cx = psurfBmp->SurfObj.sizlBitmap.cx; - CurIcon->Size.cy = psurfBmp->SurfObj.sizlBitmap.cy; - - /* 32bpp bitmap is likely to have an alpha channel */ - if(psurfBmp->SurfObj.iBitmapFormat == BMF_32BPP) - { - PFN_DIB_GetPixel fn_GetPixel = DibFunctionsForBitmapFormat[BMF_32BPP].DIB_GetPixel; - INT i, j; - - fn_GetPixel = DibFunctionsForBitmapFormat[BMF_32BPP].DIB_GetPixel; - for (i = 0; i < psurfBmp->SurfObj.sizlBitmap.cx; i++) - { - for (j = 0; j < psurfBmp->SurfObj.sizlBitmap.cy; j++) - { - bAlpha = ((BYTE)(fn_GetPixel(&psurfBmp->SurfObj, i, j) >> 24)) != 0; - if (bAlpha) - break; - } - if (bAlpha) - break; - } - } - /* We're done with this one */ - SURFACE_ShareUnlockSurface(psurfBmp); - GreSetObjectOwner(IconInfo.hbmColor, GDI_OBJ_HMGR_PUBLIC); - - if(bAlpha) - { - UCHAR Alpha; - PUCHAR ptr; - INT i, j; - /* Copy the bitmap */ - CurIcon->aFrame[0].hbmAlpha = BITMAP_CopyBitmap(IconInfo.hbmColor); - if(!CurIcon->aFrame[0].hbmAlpha) - { - ERR("BITMAP_CopyBitmap failed!"); - goto done; - } - - psurfBmp = SURFACE_ShareLockSurface(CurIcon->aFrame[0].hbmAlpha); - if(!psurfBmp) - { - ERR("SURFACE_LockSurface failed!\n"); - goto done; - } - - /* Premultiply with the alpha channel value */ - for (i = 0; i < psurfBmp->SurfObj.sizlBitmap.cy; i++) - { - ptr = (PBYTE)psurfBmp->SurfObj.pvScan0 + i*psurfBmp->SurfObj.lDelta; - for (j = 0; j < psurfBmp->SurfObj.sizlBitmap.cx; j++) - { - Alpha = ptr[3]; - ptr[0] = (ptr[0] * Alpha) / 0xff; - ptr[1] = (ptr[1] * Alpha) / 0xff; - ptr[2] = (ptr[2] * Alpha) / 0xff; - ptr += 4; - } - } - SURFACE_ShareUnlockSurface(psurfBmp); - GreSetObjectOwner(CurIcon->aFrame[0].hbmAlpha, GDI_OBJ_HMGR_PUBLIC); - } - } - else - { - psurfBmp = SURFACE_ShareLockSurface(IconInfo.hbmMask); - if (!psurfBmp) - goto done; - - CurIcon->Size.cx = psurfBmp->SurfObj.sizlBitmap.cx; - CurIcon->Size.cy = psurfBmp->SurfObj.sizlBitmap.cy / 2; - - SURFACE_ShareUnlockSurface(psurfBmp); - } - GreSetObjectOwner(IconInfo.hbmMask, GDI_OBJ_HMGR_PUBLIC); - - Ret = TRUE; - -done: - - if (CurIcon) - { - UserDereferenceObject(CurIcon); - } - RETURN(Ret); - -CLEANUP: - TRACE("Leave NtUserSetCursorContents, ret=%i\n",_ret_); - UserLeave(); - END_CLEANUP; + FIXME(" is UNIMPLEMENTED.\n"); + return FALSE; } @@ -1066,13 +918,12 @@ NtUserSetCursorIconData( _In_ HCURSOR Handle, _In_opt_ PUNICODE_STRING pustrModule, _In_opt_ PUNICODE_STRING pustrRsrc, - _In_ PICONINFO pIconInfo) + _In_ PCURSORDATA pCursorData) { PCURICON_OBJECT CurIcon; - PSURFACE psurfBmp; NTSTATUS Status = STATUS_SUCCESS; BOOL Ret = FALSE; - ICONINFO ii; + CURSORDATA dataSafe; TRACE("Enter NtUserSetCursorIconData\n"); @@ -1091,8 +942,8 @@ NtUserSetCursorIconData( _SEH2_TRY { - ProbeForRead(pIconInfo, sizeof(ICONINFO), 1); - ii = *pIconInfo; + ProbeForRead(pCursorData, sizeof(*pCursorData), 1); + RtlCopyMemory(&dataSafe, pCursorData, sizeof(dataSafe)); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { @@ -1105,60 +956,46 @@ NtUserSetCursorIconData( SetLastNtError(Status); goto done; } + + CurIcon->xHotspot = dataSafe.xHotspot; + CurIcon->yHotspot = dataSafe.yHotspot; + CurIcon->cx = dataSafe.cx; + CurIcon->cy = dataSafe.cy; + CurIcon->rt = dataSafe.rt; + CurIcon->bpp = dataSafe.bpp; - /* This is probably not what windows does, but consistency checks can't hurt */ - if(CurIcon->bIcon != ii.fIcon) + if(!dataSafe.hbmMask) { + ERR("NtUserSetCursorIconData was got no hbmMask.\n"); EngSetLastError(ERROR_INVALID_PARAMETER); goto done; } - CurIcon->ptlHotspot.x = ii.xHotspot; - CurIcon->ptlHotspot.y = ii.yHotspot; + + CurIcon->hbmMask = BITMAP_CopyBitmap(dataSafe.hbmMask); + if(!CurIcon->hbmMask) + goto done; + GreSetObjectOwner(CurIcon->hbmMask, GDI_OBJ_HMGR_PUBLIC); + + if(dataSafe.hbmColor) + { + CurIcon->hbmColor = BITMAP_CopyBitmap(dataSafe.hbmColor); + if(!CurIcon->hbmColor) + goto done; + GreSetObjectOwner(CurIcon->hbmColor, GDI_OBJ_HMGR_PUBLIC); + } - if(!ii.hbmMask) + if(dataSafe.hbmAlpha) { - EngSetLastError(ERROR_INVALID_PARAMETER); - goto done; - } - - CurIcon->aFrame[0].hbmMask = BITMAP_CopyBitmap(ii.hbmMask); - if(!CurIcon->aFrame[0].hbmMask) - goto done; - - if(ii.hbmColor) - { - CurIcon->aFrame[0].hbmColor = BITMAP_CopyBitmap(ii.hbmColor); - if(!CurIcon->aFrame[0].hbmColor) + CurIcon->hbmAlpha = BITMAP_CopyBitmap(dataSafe.hbmAlpha); + if(!CurIcon->hbmAlpha) goto done; + GreSetObjectOwner(CurIcon->hbmAlpha, GDI_OBJ_HMGR_PUBLIC); } - - if (CurIcon->aFrame[0].hbmColor) - { - psurfBmp = SURFACE_ShareLockSurface(CurIcon->aFrame[0].hbmColor); - if(!psurfBmp) - goto done; - - CurIcon->Size.cx = psurfBmp->SurfObj.sizlBitmap.cx; - CurIcon->Size.cy = psurfBmp->SurfObj.sizlBitmap.cy; - SURFACE_ShareUnlockSurface(psurfBmp); - GreSetObjectOwner(CurIcon->aFrame[0].hbmColor, GDI_OBJ_HMGR_PUBLIC); - } - else - { - psurfBmp = SURFACE_ShareLockSurface(CurIcon->aFrame[0].hbmMask); - if(!psurfBmp) - goto done; - - CurIcon->Size.cx = psurfBmp->SurfObj.sizlBitmap.cx; - CurIcon->Size.cy = psurfBmp->SurfObj.sizlBitmap.cy/2; - SURFACE_ShareUnlockSurface(psurfBmp); - } - GreSetObjectOwner(CurIcon->aFrame[0].hbmMask, GDI_OBJ_HMGR_PUBLIC); if(pustrModule) { /* We use this convenient function, because INTRESOURCEs and ATOMs are the same */ - Status = ProbeAndCaptureUnicodeStringOrAtom(&CurIcon->ustrRsrc, pustrRsrc); + Status = ProbeAndCaptureUnicodeStringOrAtom(&CurIcon->strName, pustrRsrc); if(!NT_SUCCESS(Status)) goto done; Status = ProbeAndCaptureUnicodeString(&CurIcon->ustrModule, UserMode, pustrModule); @@ -1169,27 +1006,32 @@ NtUserSetCursorIconData( Ret = TRUE; done: - UserDereferenceObject(CurIcon); if(!Ret) { - if (CurIcon->aFrame[0].hbmMask) + if (CurIcon->hbmMask) { - GreSetObjectOwner(CurIcon->aFrame[0].hbmMask, GDI_OBJ_HMGR_POWNED); - GreDeleteObject(CurIcon->aFrame[0].hbmMask); - CurIcon->aFrame[0].hbmMask = NULL; + GreSetObjectOwner(CurIcon->hbmMask, GDI_OBJ_HMGR_POWNED); + GreDeleteObject(CurIcon->hbmMask); + CurIcon->hbmMask = NULL; } - if (CurIcon->aFrame[0].hbmColor) + if (CurIcon->hbmColor) { - GreSetObjectOwner(CurIcon->aFrame[0].hbmColor, GDI_OBJ_HMGR_POWNED); - GreDeleteObject(CurIcon->aFrame[0].hbmColor); - CurIcon->aFrame[0].hbmColor = NULL; + GreSetObjectOwner(CurIcon->hbmColor, GDI_OBJ_HMGR_POWNED); + GreDeleteObject(CurIcon->hbmColor); + CurIcon->hbmColor = NULL; } - if(!IS_INTRESOURCE(CurIcon->ustrRsrc.Buffer)) - ExFreePoolWithTag(CurIcon->ustrRsrc.Buffer, TAG_STRING); + if (CurIcon->hbmAlpha) + { + GreSetObjectOwner(CurIcon->hbmAlpha, GDI_OBJ_HMGR_POWNED); + GreDeleteObject(CurIcon->hbmAlpha); + CurIcon->hbmAlpha = NULL; + } + if(!IS_INTRESOURCE(CurIcon->strName.Buffer)) + ExFreePoolWithTag(CurIcon->strName.Buffer, TAG_STRING); if(CurIcon->ustrModule.Buffer) ReleaseCapturedUnicodeString(&CurIcon->ustrModule, UserMode); } - + UserDereferenceObject(CurIcon); TRACE("Leave NtUserSetCursorIconData, ret=%i\n",Ret); UserLeave(); @@ -1232,9 +1074,9 @@ UserDrawIconEx( return FALSE; } - hbmMask = pIcon->aFrame[0].hbmMask; - hbmColor = pIcon->aFrame[0].hbmColor; - hbmAlpha = pIcon->aFrame[0].hbmAlpha; + hbmMask = pIcon->hbmMask; + hbmColor = pIcon->hbmColor; + hbmAlpha = pIcon->hbmAlpha; if (istepIfAniCur) ERR("NtUserDrawIconEx: istepIfAniCur is not supported!\n"); @@ -1254,7 +1096,7 @@ UserDrawIconEx( if(hbmColor == NULL) { /* But then the mask bitmap must have the information in it's bottom half */ - ASSERT(psurfMask->SurfObj.sizlBitmap.cy == 2*pIcon->Size.cy); + ASSERT(psurfMask->SurfObj.sizlBitmap.cy == 2*pIcon->cy); psurfColor = NULL; } else if ((psurfColor = SURFACE_ShareLockSurface(hbmColor)) == NULL) @@ -1294,26 +1136,26 @@ UserDrawIconEx( } /* Set source rect */ - RECTL_vSetRect(&rcSrc, 0, 0, pIcon->Size.cx, pIcon->Size.cy); + RECTL_vSetRect(&rcSrc, 0, 0, pIcon->cx, pIcon->cy); /* Fix width parameter, if needed */ if (!cxWidth) { if(diFlags & DI_DEFAULTSIZE) - cxWidth = pIcon->bIcon ? + cxWidth = is_icon(pIcon) ? UserGetSystemMetrics(SM_CXICON) : UserGetSystemMetrics(SM_CXCURSOR); else - cxWidth = pIcon->Size.cx; + cxWidth = pIcon->cx; } /* Fix height parameter, if needed */ if (!cyHeight) { if(diFlags & DI_DEFAULTSIZE) - cyHeight = pIcon->bIcon ? + cyHeight = is_icon(pIcon) ? UserGetSystemMetrics(SM_CYICON) : UserGetSystemMetrics(SM_CYCURSOR); else - cyHeight = pIcon->Size.cy; + cyHeight = pIcon->cy; } /* Should we render off-screen? */ @@ -1410,7 +1252,7 @@ UserDrawIconEx( } /* Now do the rendering */ - if(hbmAlpha && (diFlags & DI_IMAGE)) + if(hbmAlpha && ((diFlags & DI_NORMAL) == DI_NORMAL)) { BLENDOBJ blendobj = { {AC_SRC_OVER, 0, 255, AC_SRC_ALPHA } }; PSURFACE psurf = NULL; @@ -1501,7 +1343,7 @@ NoAlpha: { /* 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); + RECTL_vOffsetRect(&rcSrc, 0, pIcon->cy); EXLATEOBJ_vInitSrcMonoXlate(&exlo, psurfDest->ppal, 0x00FFFFFF, 0); diff --git a/reactos/win32ss/user/ntuser/msgqueue.c b/reactos/win32ss/user/ntuser/msgqueue.c index 0ae86125932..88514fa095a 100644 --- a/reactos/win32ss/user/ntuser/msgqueue.c +++ b/reactos/win32ss/user/ntuser/msgqueue.c @@ -147,10 +147,10 @@ UserSetCursor( /* Call GDI to set the new screen cursor */ #ifdef NEW_CURSORICON GreSetPointerShape(hdcScreen, - NewCursor->aFrame[0].hbmMask, - NewCursor->aFrame[0].hbmColor, - NewCursor->ptlHotspot.x, - NewCursor->ptlHotspot.y, + NewCursor->hbmMask, + NewCursor->hbmColor, + NewCursor->xHotspot, + NewCursor->yHotspot, gpsi->ptCursor.x, gpsi->ptCursor.y); #else @@ -583,10 +583,10 @@ co_MsqInsertMouseMessage(MSG* Msg, DWORD flags, ULONG_PTR dwExtraInfo, BOOL Hook /* Call GDI to set the new screen cursor */ #ifdef NEW_CURSORICON GreSetPointerShape(hdcScreen, - MessageQueue->CursorObject->aFrame[0].hbmMask, - MessageQueue->CursorObject->aFrame[0].hbmColor, - MessageQueue->CursorObject->ptlHotspot.x, - MessageQueue->CursorObject->ptlHotspot.y, + MessageQueue->CursorObject->hbmMask, + MessageQueue->CursorObject->hbmColor, + MessageQueue->CursorObject->xHotspot, + MessageQueue->CursorObject->yHotspot, gpsi->ptCursor.x, gpsi->ptCursor.y); #else diff --git a/reactos/win32ss/user/user32/windows/cursoricon_new.c b/reactos/win32ss/user/user32/windows/cursoricon_new.c index 3635dbcdbe6..8bead53c55a 100644 --- a/reactos/win32ss/user/user32/windows/cursoricon_new.c +++ b/reactos/win32ss/user/user32/windows/cursoricon_new.c @@ -1,8 +1,8 @@ /* * PROJECT: ReactOS user32.dll * COPYRIGHT: GPL - See COPYING in the top level directory - * FILE: dll/win32/user32/windows/class.c - * PURPOSE: Window classes + * FILE: dll/win32/user32/windows/cursoricon.c + * PURPOSE: cursor and icons implementation * PROGRAMMER: Jérôme Gardou (jerome.gardou@reactos.org) */ @@ -171,13 +171,144 @@ static int DIB_GetBitmapInfo( const BITMAPINFOHEADER *header, LONG *width, return -1; } +/*********************************************************************** + * bmi_has_alpha + */ +static BOOL bmi_has_alpha( const BITMAPINFO *info, const void *bits ) +{ + int i; + BOOL has_alpha = FALSE; + const unsigned char *ptr = bits; + + if (info->bmiHeader.biBitCount != 32) return FALSE; + for (i = 0; i < info->bmiHeader.biWidth * abs(info->bmiHeader.biHeight); i++, ptr += 4) + if ((has_alpha = (ptr[3] != 0))) break; + return has_alpha; +} + +/*********************************************************************** + * create_alpha_bitmap + * + * Create the alpha bitmap for a 32-bpp icon that has an alpha channel. + */ +static HBITMAP create_alpha_bitmap( + _In_ HBITMAP color, + _In_opt_ const BITMAPINFO *src_info, + _In_opt_ const void *color_bits ) +{ + HBITMAP alpha = NULL, hbmpOld; + BITMAPINFO *info = NULL; + HDC hdc = NULL, hdcScreen; + void *bits = NULL; + unsigned char *ptr; + int i; + LONG width, height; + BITMAP bm; + + if (!GetObjectW( color, sizeof(bm), &bm )) + return NULL; + if (bm.bmBitsPixel != 32) + return NULL; + + hdcScreen = CreateDCW(DISPLAYW, NULL, NULL, NULL); + if(!hdcScreen) + return NULL; + if(GetDeviceCaps(hdcScreen, BITSPIXEL) != 32) + goto done; + hdc = CreateCompatibleDC(hdcScreen); + if(!hdc) + goto done; + + if(src_info) + { + WORD bpp; + DWORD compr; + int size; + + if(!bmi_has_alpha(src_info, color_bits)) + goto done; + + if(!DIB_GetBitmapInfo(&src_info->bmiHeader, &width, &height, &bpp, &compr)) + goto done; + if(bpp != 32) + goto done; + + size = get_dib_image_size(width, height, bpp); + bits = HeapAlloc(GetProcessHeap(), 0, size); + if(!bits) + goto done; + CopyMemory(bits, color_bits, size); + } + else + { + info = HeapAlloc(GetProcessHeap(), 0, FIELD_OFFSET(BITMAPINFO, bmiColors[256])); + if(!info) + goto done; + info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + info->bmiHeader.biWidth = bm.bmWidth; + info->bmiHeader.biHeight = -bm.bmHeight; + info->bmiHeader.biPlanes = 1; + info->bmiHeader.biBitCount = 32; + info->bmiHeader.biCompression = BI_RGB; + info->bmiHeader.biSizeImage = bm.bmWidth * bm.bmHeight * 4; + info->bmiHeader.biXPelsPerMeter = 0; + info->bmiHeader.biYPelsPerMeter = 0; + info->bmiHeader.biClrUsed = 0; + info->bmiHeader.biClrImportant = 0; + + bits = HeapAlloc(GetProcessHeap(), 0, info->bmiHeader.biSizeImage); + if(!bits) + goto done; + if(!GetDIBits( hdc, color, 0, bm.bmHeight, bits, info, DIB_RGB_COLORS )) + goto done; + if (!bmi_has_alpha( info, bits )) + goto done; + width = bm.bmWidth; + height = bm.bmHeight; + } + + /* pre-multiply by alpha */ + for (i = 0, ptr = bits; i < width * height; i++, ptr += 4) + { + unsigned int alpha = ptr[3]; + ptr[0] = ptr[0] * alpha / 255; + ptr[1] = ptr[1] * alpha / 255; + ptr[2] = ptr[2] * alpha / 255; + } + + /* Create the bitmap */ + alpha = CreateCompatibleBitmap(hdcScreen, bm.bmWidth, bm.bmHeight); + if(!alpha) + goto done; + hbmpOld = SelectObject(hdc, alpha); + if(!hbmpOld) + goto done; + if(!StretchDIBits( hdc, 0, 0, bm.bmWidth, bm.bmHeight, + 0, 0, width, height, + bits, src_info ? src_info : info, DIB_RGB_COLORS, SRCCOPY )) + { + SelectObject(hdc, hbmpOld); + hbmpOld = NULL; + DeleteObject(alpha); + alpha = NULL; + } + SelectObject(hdc, hbmpOld); + +done: + DeleteDC(hdcScreen); + if(hdc) DeleteDC( hdc ); + if(info) HeapFree( GetProcessHeap(), 0, info ); + if(bits) HeapFree(GetProcessHeap(), 0, bits); + + TRACE("Returning 0x%08x.\n", alpha); + return alpha; +} + /************* IMPLEMENTATION CORE ****************/ -static BOOL CURSORICON_GetIconInfoFromBMI( - _Inout_ ICONINFO* pii, - _In_ const BITMAPINFO *pbmi, - _In_ int cxDesired, - _In_ int cyDesired +static BOOL CURSORICON_GetCursorDataFromBMI( + _Inout_ CURSORDATA* pdata, + _In_ const BITMAPINFO *pbmi ) { UINT ubmiSize = bitmap_info_size(pbmi, DIB_RGB_COLORS); @@ -201,13 +332,22 @@ static BOOL CURSORICON_GetIconInfoFromBMI( if(compr != BI_RGB) return FALSE; + /* If no dimensions were set, use the one from the icon */ + if(!pdata->cx) pdata->cx = width; + if(!pdata->cy) pdata->cy = height < 0 ? -height/2 : height/2; + /* Fix the hotspot coords */ - if(!pii->fIcon) + if(pdata->rt == (USHORT)((ULONG_PTR)RT_CURSOR)) { - if(cxDesired != pbmi->bmiHeader.biWidth) - pii->xHotspot = (pii->xHotspot * cxDesired) / pbmi->bmiHeader.biWidth; - if(cxDesired != (pbmi->bmiHeader.biHeight/2)) - pii->yHotspot = (pii->yHotspot * cyDesired * 2) / pbmi->bmiHeader.biHeight; + if(pdata->cx != width) + pdata->xHotspot = (pdata->xHotspot * pdata->cx) / width; + if(pdata->cy != height/2) + pdata->yHotspot = (pdata->yHotspot * pdata->cy * 2) / height; + } + else + { + pdata->xHotspot = pdata->cx/2; + pdata->yHotspot = pdata->cy/2; } hdcScreen = CreateDCW(DISPLAYW, NULL, NULL, NULL); @@ -230,49 +370,52 @@ static BOOL CURSORICON_GetIconInfoFromBMI( ((BITMAPCOREHEADER*)&pbmiCopy->bmiHeader)->bcHeight /= 2; else pbmiCopy->bmiHeader.biHeight /= 2; + height /= 2; pvColor = (const char*)pbmi + ubmiSize; pvMask = (const char*)pvColor + - get_dib_image_size(pbmi->bmiHeader.biWidth, pbmiCopy->bmiHeader.biHeight, pbmi->bmiHeader.biBitCount ); + get_dib_image_size(width, height, bpp ); /* Set XOR bits */ if(monochrome) { /* Create the 1bpp bitmap which will contain everything */ - pii->hbmColor = NULL; - pii->hbmMask = CreateCompatibleBitmap(hdc, cxDesired, cyDesired * 2); - if(!pii->hbmMask) + pdata->hbmColor = NULL; + pdata->hbmMask = CreateBitmap(pdata->cx, pdata->cy * 2, 1, 1, NULL); + if(!pdata->hbmMask) goto done; - hbmpOld = SelectObject(hdc, pii->hbmMask); + hbmpOld = SelectObject(hdc, pdata->hbmMask); if(!hbmpOld) goto done; - if(!StretchDIBits(hdc, 0, cyDesired, cxDesired, cyDesired, - 0, 0, pbmiCopy->bmiHeader.biWidth, pbmiCopy->bmiHeader.biHeight, + if(!StretchDIBits(hdc, 0, pdata->cy, pdata->cx, pdata->cy, + 0, 0, width, height, pvColor, pbmiCopy, DIB_RGB_COLORS, SRCCOPY)) goto done; + pdata->bpp = 1; } else { /* Create the bitmap. It has to be compatible with the screen surface */ - pii->hbmColor = CreateCompatibleBitmap(hdcScreen, cxDesired, cyDesired); - if(!pii->hbmColor) + pdata->hbmColor = CreateCompatibleBitmap(hdcScreen, pdata->cx, pdata->cy); + if(!pdata->hbmColor) goto done; /* Create the 1bpp mask bitmap */ - pii->hbmMask = CreateCompatibleBitmap(hdc, cxDesired, cyDesired); - if(!pii->hbmMask) + pdata->hbmMask = CreateBitmap(pdata->cx, pdata->cy, 1, 1, NULL); + if(!pdata->hbmMask) goto done; - hbmpOld = SelectObject(hdc, pii->hbmColor); + hbmpOld = SelectObject(hdc, pdata->hbmColor); if(!hbmpOld) goto done; - if(!StretchDIBits(hdc, 0, 0, cxDesired, cyDesired, - 0, 0, pbmiCopy->bmiHeader.biWidth, pbmiCopy->bmiHeader.biHeight, + if(!StretchDIBits(hdc, 0, 0, pdata->cx, pdata->cy, + 0, 0, width, height, pvColor, pbmiCopy, DIB_RGB_COLORS, SRCCOPY)) goto done; + pdata->bpp = GetDeviceCaps(hdcScreen, BITSPIXEL); + if(pdata->bpp == 32) + pdata->hbmAlpha = create_alpha_bitmap(pdata->hbmColor, pbmiCopy, pvColor); /* Now convert the info to monochrome for the mask bits */ - pbmiCopy->bmiHeader.biBitCount = 1; - /* Handle the CORE/INFO difference */ if (pbmiCopy->bmiHeader.biSize != sizeof(BITMAPCOREHEADER)) { RGBQUAD *rgb = pbmiCopy->bmiColors; @@ -281,6 +424,7 @@ static BOOL CURSORICON_GetIconInfoFromBMI( rgb[0].rgbBlue = rgb[0].rgbGreen = rgb[0].rgbRed = 0x00; rgb[1].rgbBlue = rgb[1].rgbGreen = rgb[1].rgbRed = 0xff; rgb[0].rgbReserved = rgb[1].rgbReserved = 0; + pbmiCopy->bmiHeader.biBitCount = 1; } else { @@ -288,14 +432,15 @@ static BOOL CURSORICON_GetIconInfoFromBMI( rgb[0].rgbtBlue = rgb[0].rgbtGreen = rgb[0].rgbtRed = 0x00; rgb[1].rgbtBlue = rgb[1].rgbtGreen = rgb[1].rgbtRed = 0xff; + ((BITMAPCOREHEADER*)&pbmiCopy->bmiHeader)->bcBitCount = 1; } } /* Set the mask bits */ - if(!SelectObject(hdc, pii->hbmMask)) + if(!SelectObject(hdc, pdata->hbmMask)) goto done; - bResult = StretchDIBits(hdc, 0, 0, cxDesired, cyDesired, - 0, 0, pbmiCopy->bmiHeader.biWidth, pbmiCopy->bmiHeader.biHeight, - pvMask, pbmiCopy, DIB_RGB_COLORS, SRCCOPY) != 0; + bResult = StretchDIBits(hdc, 0, 0, pdata->cx, pdata->cy, + 0, 0, width, height, + pvMask, pbmiCopy, DIB_RGB_COLORS, SRCCOPY) != 0; done: DeleteDC(hdcScreen); @@ -305,12 +450,65 @@ done: /* Clean up in case of failure */ if(!bResult) { - if(pii->hbmMask) DeleteObject(pii->hbmMask); - if(pii->hbmColor) DeleteObject(pii->hbmColor); + if(pdata->hbmMask) DeleteObject(pdata->hbmMask); + if(pdata->hbmColor) DeleteObject(pdata->hbmColor); + if(pdata->hbmAlpha) DeleteObject(pdata->hbmAlpha); } return bResult; } +static BOOL CURSORICON_GetCursorDataFromIconInfo( + _Out_ CURSORDATA* pCursorData, + _In_ ICONINFO* pIconInfo +) +{ + BITMAP bm; + + ZeroMemory(pCursorData, sizeof(*pCursorData)); + /* Use the CopyImage function, as it will gracefully convert our bitmap to the screen bit depth */ + if(pIconInfo->hbmColor) + { + pCursorData->hbmColor = CopyImage(pIconInfo->hbmColor, IMAGE_BITMAP, 0, 0, 0); + if(!pCursorData->hbmColor) + return FALSE; + } + pCursorData->hbmMask = CopyImage(pIconInfo->hbmMask, IMAGE_BITMAP, 0, 0, LR_MONOCHROME); + if(!pCursorData->hbmMask) + return FALSE; + + /* Now, fill some information */ + pCursorData->rt = (USHORT)((ULONG_PTR)(pIconInfo->fIcon ? RT_ICON : RT_CURSOR)); + if(pCursorData->hbmColor) + { + GetObject(pCursorData->hbmColor, sizeof(bm), &bm); + pCursorData->bpp = bm.bmBitsPixel; + pCursorData->cx = bm.bmWidth; + pCursorData->cy = bm.bmHeight; + if(pCursorData->bpp == 32) + pCursorData->hbmAlpha = create_alpha_bitmap(pCursorData->hbmColor, NULL, NULL); + } + else + { + GetObject(pCursorData->hbmMask, sizeof(bm), &bm); + pCursorData->bpp = 1; + pCursorData->cx = bm.bmWidth; + pCursorData->cy = bm.bmHeight/2; + } + + if(pIconInfo->fIcon) + { + pCursorData->xHotspot = pCursorData->cx/2; + pCursorData->yHotspot = pCursorData->cy/2; + } + else + { + pCursorData->xHotspot = pIconInfo->xHotspot; + pCursorData->yHotspot = pIconInfo->yHotspot; + } + + return TRUE; +} + static HBITMAP BITMAP_LoadImageW( @@ -324,14 +522,17 @@ BITMAP_LoadImageW( const BITMAPINFO* pbmi; BITMAPINFO* pbmiScaled = NULL; BITMAPINFO* pbmiCopy = NULL; - const VOID* pvMapping; + const VOID* pvMapping = NULL; DWORD dwOffset = 0; - HGLOBAL hgRsrc; + HGLOBAL hgRsrc = NULL; int iBMISize; PVOID pvBits; HDC hdcScreen = NULL; HDC hdc = NULL; - HBITMAP hbmpRet, hbmpOld; + HBITMAP hbmpOld, hbmpRet = NULL; + LONG width, height; + WORD bpp; + DWORD compr; /* Map the bitmap info */ if(fuLoad & LR_LOADFROMFILE) @@ -371,7 +572,18 @@ BITMAP_LoadImageW( return NULL; } - /* See if we must scale the bitmap */ + /* Fix up values */ + if(DIB_GetBitmapInfo(&pbmi->bmiHeader, &width, &height, &bpp, &compr) == -1) + goto end; + if((width > 65535) || (height > 65535)) + goto end; + if(cxDesired == 0) + cxDesired = width; + if(cyDesired == 0) + cyDesired = height; + else if(height < 0) + cyDesired = -cyDesired; + iBMISize = bitmap_info_size(pbmi, DIB_RGB_COLORS); /* Get a pointer to the image data */ @@ -492,35 +704,15 @@ create_bitmap: if(pbmiScaled->bmiHeader.biSize == sizeof(BITMAPCOREHEADER)) { BITMAPCOREHEADER* pbmch = (BITMAPCOREHEADER*)&pbmiScaled->bmiHeader; - if(cxDesired == 0) - cxDesired = pbmch->bcWidth; - if(cyDesired == 0) - cyDesired == pbmch->bcHeight; - else if(pbmch->bcHeight < 0) - cyDesired = -cyDesired; - pbmch->bcWidth = cxDesired; pbmch->bcHeight = cyDesired; } else { - if ((pbmi->bmiHeader.biHeight > 65535) || (pbmi->bmiHeader.biWidth > 65535)) { - WARN("Broken BITMAPINFO!\n"); - goto end; - } - - if(cxDesired == 0) - cxDesired = pbmi->bmiHeader.biWidth; - if(cyDesired == 0) - cyDesired = pbmi->bmiHeader.biHeight; - else if(pbmi->bmiHeader.biHeight < 0) - cyDesired = -cyDesired; - pbmiScaled->bmiHeader.biWidth = cxDesired; pbmiScaled->bmiHeader.biHeight = cyDesired; /* No compression for DIB sections */ - if(fuLoad & LR_CREATEDIBSECTION) - pbmiScaled->bmiHeader.biCompression = BI_RGB; + pbmiScaled->bmiHeader.biCompression = BI_RGB; } } @@ -574,9 +766,9 @@ end: HeapFree(GetProcessHeap(), 0, pbmiScaled); if(pbmiCopy) HeapFree(GetProcessHeap(), 0, pbmiCopy); - if (fuLoad & LR_LOADFROMFILE) + if (pvMapping) UnmapViewOfFile( pvMapping ); - else + if(hgRsrc) FreeResource(hgRsrc); return hbmpRet; @@ -621,9 +813,9 @@ CURSORICON_LoadFromFileW( CURSORICONFILEDIR *dir; DWORD filesize = 0; LPBYTE bits; - HANDLE hRet = NULL; + HANDLE hCurIcon = NULL; WORD i; - ICONINFO ii; + CURSORDATA cursorData; TRACE("loading %s\n", debugstr_w( lpszName )); @@ -696,25 +888,42 @@ CURSORICON_LoadFromFileW( /* Get our entry */ entry = &dir->idEntries[i-1]; + /* Fix dimensions */ + if(!cxDesired) cxDesired = entry->bWidth; + if(!cyDesired) cyDesired = entry->bHeight; /* A bit of preparation */ - ii.xHotspot = entry->xHotspot; - ii.yHotspot = entry->yHotspot; - ii.fIcon = bIcon; + ZeroMemory(&cursorData, sizeof(cursorData)); + if(!bIcon) + { + cursorData.xHotspot = entry->xHotspot; + cursorData.yHotspot = entry->yHotspot; + } + cursorData.rt = (USHORT)((ULONG_PTR)(bIcon ? RT_ICON : RT_CURSOR)); /* Do the dance */ - if(!CURSORICON_GetIconInfoFromBMI(&ii, (BITMAPINFO*)&bits[entry->dwDIBOffset], cxDesired, cyDesired)) + if(!CURSORICON_GetCursorDataFromBMI(&cursorData, (BITMAPINFO*)&bits[entry->dwDIBOffset])) goto end; - /* Create the icon. NOTE: there's no LR_SHARED icons if they are created from file */ - hRet = CreateIconIndirect(&ii); + hCurIcon = NtUserxCreateEmptyCurObject(bIcon ? 0 : 1); + if(!hCurIcon) + goto end_clean; + + /* Tell win32k */ + if(!NtUserSetCursorIconData(hCurIcon, NULL, NULL, &cursorData)) + { + NtUserDestroyCursor(hCurIcon, TRUE); + hCurIcon = NULL; + } /* Clean up */ - DeleteObject(ii.hbmMask); - DeleteObject(ii.hbmColor); +end_clean: + DeleteObject(cursorData.hbmMask); + if(cursorData.hbmColor) DeleteObject(cursorData.hbmColor); + if(cursorData.hbmAlpha) DeleteObject(cursorData.hbmAlpha); end: UnmapViewOfFile(bits); - return hRet; + return hCurIcon; } static @@ -733,7 +942,7 @@ CURSORICON_LoadImageW( CURSORICONDIR* dir; WORD wResId; LPBYTE bits; - ICONINFO ii; + CURSORDATA cursorData; BOOL bStatus; UNICODE_STRING ustrRsrc; UNICODE_STRING ustrModule = {0, 0, NULL}; @@ -775,7 +984,7 @@ CURSORICON_LoadImageW( /* Get it */ do { - DWORD ret = GetModuleFileName(hinst, ustrModule.Buffer, size); + DWORD ret = GetModuleFileNameW(hinst, ustrModule.Buffer, size); if(ret == 0) { HeapFree(GetProcessHeap(), 0, ustrModule.Buffer); @@ -783,8 +992,8 @@ CURSORICON_LoadImageW( } if(ret < size) { - ustrModule.Length = ret; - ustrModule.MaximumLength = size; + ustrModule.Length = ret*sizeof(WCHAR); + ustrModule.MaximumLength = size*sizeof(WCHAR); break; } size *= 2; @@ -845,27 +1054,24 @@ CURSORICON_LoadImageW( goto done; } - /* Get the hotspot */ - if(bIcon) - { - ii.xHotspot = cxDesired/2; - ii.yHotspot = cyDesired/2; - } - if(!bIcon) + ZeroMemory(&cursorData, sizeof(cursorData)); + + if(dir->idType == 2) { + /* idType == 2 for cursor resources */ SHORT* ptr = (SHORT*)bits; - ii.xHotspot = ptr[0]; - ii.yHotspot = ptr[1]; + cursorData.xHotspot = ptr[0]; + cursorData.yHotspot = ptr[1]; bits += 2*sizeof(SHORT); } - ii.fIcon = bIcon; + cursorData.cx = cxDesired; + cursorData.cy = cyDesired; + cursorData.rt = (USHORT)((ULONG_PTR)(bIcon ? RT_ICON : RT_CURSOR)); /* Get the bitmaps */ - bStatus = CURSORICON_GetIconInfoFromBMI( - &ii, - (BITMAPINFO*)bits, - cxDesired, - cyDesired); + bStatus = CURSORICON_GetCursorDataFromBMI( + &cursorData, + (BITMAPINFO*)bits); FreeResource( handle ); @@ -876,16 +1082,17 @@ CURSORICON_LoadImageW( hCurIcon = NtUserxCreateEmptyCurObject(bIcon ? 0 : 1); if(!hCurIcon) { - DeleteObject(ii.hbmMask); - if(ii.hbmColor) DeleteObject(ii.hbmColor); + DeleteObject(cursorData.hbmMask); + if(cursorData.hbmColor) DeleteObject(cursorData.hbmColor); + if(cursorData.hbmAlpha) DeleteObject(cursorData.hbmAlpha); goto done; } /* Tell win32k */ if(fuLoad & LR_SHARED) - bStatus = NtUserSetCursorIconData(hCurIcon, &ustrModule, &ustrRsrc, &ii); + bStatus = NtUserSetCursorIconData(hCurIcon, &ustrModule, &ustrRsrc, &cursorData); else - bStatus = NtUserSetCursorIconData(hCurIcon, NULL, NULL, &ii); + bStatus = NtUserSetCursorIconData(hCurIcon, NULL, NULL, &cursorData); if(!bStatus) { @@ -893,8 +1100,9 @@ CURSORICON_LoadImageW( hCurIcon = NULL; } - DeleteObject(ii.hbmMask); - if(ii.hbmColor) DeleteObject(ii.hbmColor); + DeleteObject(cursorData.hbmMask); + if(cursorData.hbmColor) DeleteObject(cursorData.hbmColor); + if(cursorData.hbmAlpha) DeleteObject(cursorData.hbmAlpha); done: if(ustrModule.Buffer) @@ -905,10 +1113,10 @@ done: static HBITMAP BITMAP_CopyImage( - _In_ HBITMAP hbmp, - _In_ int cxDesired, - _In_ int cyDesired, - _In_ UINT fuFlags + _In_ HBITMAP hnd, + _In_ int desiredx, + _In_ int desiredy, + _In_ UINT flags ) { HBITMAP res = NULL; @@ -916,22 +1124,22 @@ BITMAP_CopyImage( int objSize; BITMAPINFO * bi; - objSize = GetObjectW( hbmp, sizeof(ds), &ds ); + objSize = GetObjectW( hnd, sizeof(ds), &ds ); if (!objSize) return 0; - if ((cxDesired < 0) || (cyDesired < 0)) return 0; + if ((desiredx < 0) || (desiredy < 0)) return 0; - if (fuFlags & LR_COPYFROMRESOURCE) + if (flags & LR_COPYFROMRESOURCE) { FIXME("The flag LR_COPYFROMRESOURCE is not implemented for bitmaps\n"); } - if (fuFlags & LR_COPYRETURNORG) + if (flags & LR_COPYRETURNORG) { FIXME("The flag LR_COPYRETURNORG is not implemented for bitmaps\n"); } - if (cxDesired == 0) cxDesired = ds.dsBm.bmWidth; - if (cyDesired == 0) cyDesired = ds.dsBm.bmHeight; + if (desiredx == 0) desiredx = ds.dsBm.bmWidth; + if (desiredy == 0) desiredy = ds.dsBm.bmHeight; /* Allocate memory for a BITMAPINFOHEADER structure and a color table. The maximum number of colors in a color table @@ -945,7 +1153,7 @@ BITMAP_CopyImage( bi->bmiHeader.biBitCount = ds.dsBm.bmBitsPixel; bi->bmiHeader.biCompression = BI_RGB; - if (fuFlags & LR_CREATEDIBSECTION) + if (flags & LR_CREATEDIBSECTION) { /* Create a DIB section. LR_MONOCHROME is ignored */ void * bits; @@ -958,12 +1166,11 @@ BITMAP_CopyImage( memcpy(bi, &ds.dsBmih, sizeof(BITMAPINFOHEADER)); } - /* Get the color table or the color masks */ - GetDIBits(dc, hbmp, 0, ds.dsBm.bmHeight, NULL, bi, DIB_RGB_COLORS); + bi->bmiHeader.biWidth = desiredx; + bi->bmiHeader.biHeight = desiredy; - bi->bmiHeader.biWidth = cxDesired; - bi->bmiHeader.biHeight = cyDesired; - bi->bmiHeader.biSizeImage = 0; + /* Get the color table or the color masks */ + GetDIBits(dc, hnd, 0, ds.dsBm.bmHeight, NULL, bi, DIB_RGB_COLORS); res = CreateDIBSection(dc, bi, DIB_RGB_COLORS, &bits, NULL, 0); DeleteDC(dc); @@ -972,16 +1179,16 @@ BITMAP_CopyImage( { /* Create a device-dependent bitmap */ - BOOL monochrome = (fuFlags & LR_MONOCHROME); + BOOL monochrome = (flags & LR_MONOCHROME); if (objSize == sizeof(DIBSECTION)) { /* The source bitmap is a DIB section. Get its attributes */ HDC dc = CreateCompatibleDC(NULL); - bi->bmiHeader.biSize = sizeof(bi->bmiHeader); - bi->bmiHeader.biBitCount = ds.dsBm.bmBitsPixel; - GetDIBits(dc, hbmp, 0, ds.dsBm.bmHeight, NULL, bi, DIB_RGB_COLORS); + bi->bmiHeader.biWidth = ds.dsBm.bmWidth; + bi->bmiHeader.biHeight = ds.dsBm.bmHeight; + GetDIBits(dc, hnd, 0, ds.dsBm.bmHeight, NULL, bi, DIB_RGB_COLORS); DeleteDC(dc); if (!monochrome && ds.dsBm.bmBitsPixel == 1) @@ -1015,12 +1222,12 @@ BITMAP_CopyImage( if (monochrome) { - res = CreateBitmap(cxDesired, cyDesired, 1, 1, NULL); + res = CreateBitmap(desiredx, desiredy, 1, 1, NULL); } else { HDC screenDC = GetDC(NULL); - res = CreateCompatibleBitmap(screenDC, cxDesired, cyDesired); + res = CreateCompatibleBitmap(screenDC, desiredx, desiredy); ReleaseDC(NULL, screenDC); } } @@ -1061,7 +1268,7 @@ BITMAP_CopyImage( bi->bmiHeader.biClrImportant = 0; /* Fill in biSizeImage */ - GetDIBits(dc, hbmp, 0, ds.dsBm.bmHeight, NULL, bi, DIB_RGB_COLORS); + GetDIBits(dc, hnd, 0, ds.dsBm.bmHeight, NULL, bi, DIB_RGB_COLORS); bits = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, bi->bmiHeader.biSizeImage); if (bits) @@ -1069,11 +1276,11 @@ BITMAP_CopyImage( HBITMAP oldBmp; /* Get the image bits of the source bitmap */ - GetDIBits(dc, hbmp, 0, ds.dsBm.bmHeight, bits, bi, DIB_RGB_COLORS); + GetDIBits(dc, hnd, 0, ds.dsBm.bmHeight, bits, bi, DIB_RGB_COLORS); /* Copy it to the destination bitmap */ oldBmp = SelectObject(dc, res); - StretchDIBits(dc, 0, 0, cxDesired, cyDesired, + StretchDIBits(dc, 0, 0, desiredx, desiredy, 0, 0, ds.dsBm.bmWidth, ds.dsBm.bmHeight, bits, bi, DIB_RGB_COLORS, SRCCOPY); SelectObject(dc, oldBmp); @@ -1084,9 +1291,9 @@ BITMAP_CopyImage( DeleteDC(dc); } - if (fuFlags & LR_COPYDELETEORG) + if (flags & LR_COPYDELETEORG) { - DeleteObject(hbmp); + DeleteObject(hnd); } } HeapFree(GetProcessHeap(), 0, bi); @@ -1114,17 +1321,17 @@ CURSORICON_CopyImage( PVOID pvBuf; HMODULE hModule; - ustrModule.MaximumLength = MAX_PATH; + ustrModule.MaximumLength = MAX_PATH * sizeof(WCHAR); ustrRsrc.MaximumLength = 256; - ustrModule.Buffer = HeapAlloc(GetProcessHeap(), 0, ustrModule.MaximumLength * sizeof(WCHAR)); + ustrModule.Buffer = HeapAlloc(GetProcessHeap(), 0, ustrModule.MaximumLength); if(!ustrModule.Buffer) { SetLastError(ERROR_NOT_ENOUGH_MEMORY); return NULL; } /* Keep track of the buffer for the resource, NtUserGetIconInfo might overwrite it */ - pvBuf = HeapAlloc(GetProcessHeap(), 0, 256 * sizeof(WCHAR)); + pvBuf = HeapAlloc(GetProcessHeap(), 0, ustrRsrc.MaximumLength); if(!pvBuf) { HeapFree(GetProcessHeap(), 0, ustrModule.Buffer); @@ -1153,7 +1360,7 @@ CURSORICON_CopyImage( { PWSTR newBuffer; ustrModule.MaximumLength *= 2; - newBuffer = HeapReAlloc(GetProcessHeap(), 0, ustrModule.Buffer, ustrModule.MaximumLength * sizeof(WCHAR)); + newBuffer = HeapReAlloc(GetProcessHeap(), 0, ustrModule.Buffer, ustrModule.MaximumLength); if(!ustrModule.Buffer) { SetLastError(ERROR_NOT_ENOUGH_MEMORY); @@ -1165,7 +1372,7 @@ CURSORICON_CopyImage( if(ustrRsrc.Length == ustrRsrc.MaximumLength) { ustrRsrc.MaximumLength *= 2; - pvBuf = HeapReAlloc(GetProcessHeap(), 0, ustrRsrc.Buffer, ustrRsrc.MaximumLength * sizeof(WCHAR)); + pvBuf = HeapReAlloc(GetProcessHeap(), 0, ustrRsrc.Buffer, ustrRsrc.MaximumLength); if(!pvBuf) { SetLastError(ERROR_NOT_ENOUGH_MEMORY); @@ -1176,14 +1383,15 @@ CURSORICON_CopyImage( } while(TRUE); /* NULL-terminate our strings */ - ustrModule.Buffer[ustrModule.Length] = 0; + ustrModule.Buffer[ustrModule.Length/sizeof(WCHAR)] = 0; if(!IS_INTRESOURCE(ustrRsrc.Buffer)) - ustrRsrc.Buffer[ustrRsrc.Length] = 0; + ustrRsrc.Buffer[ustrRsrc.Length/sizeof(WCHAR)] = 0; /* Get the module handle */ if(!GetModuleHandleExW(0, ustrModule.Buffer, &hModule)) { /* This hould never happen */ + ERR("Invalid handle?.\n"); SetLastError(ERROR_INVALID_PARAMETER); goto leave; } @@ -1198,6 +1406,8 @@ CURSORICON_CopyImage( HeapFree(GetProcessHeap(), 0, ustrModule.Buffer); HeapFree(GetProcessHeap(), 0, pvBuf); + TRACE("Returning 0x%08x.\n", ret); + return ret; } @@ -1499,21 +1709,6 @@ int WINAPI LookupIconIdFromDirectoryEx( return 0; } - /* idType == 2 is for cursors, 1 for icons */ - /*if(fIcon) - { - if(dir->idType == 2) - { - WARN("An icon was asked for a cursor resource.\n"); - return 0; - } - } - else if(dir->idType == 1) - { - WARN("A cursor was asked for an icon resource.\n"); - return 0; - }*/ - if(Flags & LR_MONOCHROME) bppDesired = 1; else @@ -1526,6 +1721,11 @@ int WINAPI LookupIconIdFromDirectoryEx( bppDesired = GetDeviceCaps(icScreen, BITSPIXEL); DeleteDC(icScreen); } + + if(!cxDesired) + cxDesired = GetSystemMetrics(fIcon ? SM_CXICON : SM_CXCURSOR); + if(!cyDesired) + cyDesired = GetSystemMetrics(fIcon ? SM_CYICON : SM_CYCURSOR); /* Find the best match for the desired size */ cxyDiff = 0xFFFFFFFF; @@ -1658,7 +1858,7 @@ HICON WINAPI CreateIconFromResource( _In_ DWORD dwVer ) { - return CreateIconFromResourceEx( presbits, dwResSize, fIcon, dwVer, 0,0,0); + return CreateIconFromResourceEx( presbits, dwResSize, fIcon, dwVer, 0, 0, LR_DEFAULTSIZE | LR_SHARED); } HICON WINAPI CreateIconFromResourceEx( @@ -1671,34 +1871,60 @@ HICON WINAPI CreateIconFromResourceEx( _In_ UINT uFlags ) { - ICONINFO ii; + CURSORDATA cursorData; HICON hIcon; - if(uFlags) - FIXME("uFlags 0x%08x ignored.\n", uFlags); + TRACE("%p, %lu, %lu, %lu, %i, %i, %lu.\n", pbIconBits, cbIconBits, fIcon, dwVersion, cxDesired, cyDesired, uFlags); - if(fIcon) + if(uFlags & ~LR_DEFAULTSIZE) + FIXME("uFlags 0x%08x ignored.\n", uFlags & ~LR_DEFAULTSIZE); + + if(uFlags & LR_DEFAULTSIZE) { - ii.xHotspot = cxDesired/2; - ii.yHotspot = cyDesired/2; + if(!cxDesired) cxDesired = GetSystemMetrics(fIcon ? SM_CXICON : SM_CXCURSOR); + if(!cyDesired) cyDesired = GetSystemMetrics(fIcon ? SM_CYICON : SM_CYCURSOR); } - else + + /* Check if this is an animated cursor */ + if(!memcmp(pbIconBits, "RIFF", 4)) + { + UNIMPLEMENTED; + return NULL; + } + + ZeroMemory(&cursorData, sizeof(cursorData)); + cursorData.cx = cxDesired; + cursorData.cy = cyDesired; + cursorData.rt = (USHORT)((ULONG_PTR)(fIcon ? RT_ICON : RT_CURSOR)); + if(!fIcon) { WORD* pt = (WORD*)pbIconBits; - ii.xHotspot = *pt++; - ii.yHotspot = *pt++; + cursorData.xHotspot = *pt++; + cursorData.yHotspot = *pt++; pbIconBits = (PBYTE)pt; } - ii.fIcon = fIcon; - if(!CURSORICON_GetIconInfoFromBMI(&ii, (BITMAPINFO*)pbIconBits, cxDesired, cyDesired)) + if(!CURSORICON_GetCursorDataFromBMI(&cursorData, (BITMAPINFO*)pbIconBits)) + { + ERR("Couldn't fill the CURSORDATA structure.\n"); + return NULL; + } + + hIcon = NtUserxCreateEmptyCurObject(fIcon ? 0 : 1); + if(!hIcon) return NULL; - hIcon = CreateIconIndirect(&ii); + if(!NtUserSetCursorIconData(hIcon, NULL, NULL, &cursorData)) + { + ERR("NtUserSetCursorIconData failed.\n"); + NtUserDestroyCursor(hIcon, TRUE); + hIcon = NULL; + } /* Clean up */ - DeleteObject(ii.hbmMask); - if(ii.hbmColor) DeleteObject(ii.hbmColor); + DeleteObject(cursorData.hbmMask); + if(cursorData.hbmColor) DeleteObject(cursorData.hbmColor); + if(cursorData.hbmAlpha) DeleteObject(cursorData.hbmAlpha); return hIcon; } @@ -1709,19 +1935,28 @@ HICON WINAPI CreateIconIndirect( { /* As simple as creating a handle, and let win32k deal with the bitmaps */ HICON hiconRet; + CURSORDATA cursorData; TRACE("%p.\n", piconinfo); + if(!CURSORICON_GetCursorDataFromIconInfo(&cursorData, piconinfo)) + return NULL; + hiconRet = NtUserxCreateEmptyCurObject(piconinfo->fIcon ? 0 : 1); if(!hiconRet) return NULL; - if(!NtUserSetCursorIconData(hiconRet, NULL, NULL, piconinfo)) + if(!NtUserSetCursorIconData(hiconRet, NULL, NULL, &cursorData)) { NtUserDestroyCursor(hiconRet, FALSE); hiconRet = NULL; } + /* Clean up */ + DeleteObject(cursorData.hbmMask); + if(cursorData.hbmColor) DeleteObject(cursorData.hbmColor); + if(cursorData.hbmAlpha) DeleteObject(cursorData.hbmAlpha); + TRACE("Returning 0x%08x.\n", hiconRet); return hiconRet; @@ -1768,8 +2003,7 @@ BOOL WINAPI SetCursorPos( _In_ int Y ) { - UNIMPLEMENTED; - return FALSE; + return NtUserxSetCursorPos(X,Y); } BOOL WINAPI GetCursorPos( @@ -1783,14 +2017,12 @@ int WINAPI ShowCursor( _In_ BOOL bShow ) { - UNIMPLEMENTED; - return -1; + return NtUserxShowCursor(bShow); } HCURSOR WINAPI GetCursor(void) { - UNIMPLEMENTED; - return NULL; + return (HCURSOR)NtUserGetThreadState(THREADSTATE_GETCURSOR); } BOOL WINAPI DestroyCursor( diff --git a/reactos/win32ss/w32ksvc.h b/reactos/win32ss/w32ksvc.h index dd80587c696..daf987312c7 100644 --- a/reactos/win32ss/w32ksvc.h +++ b/reactos/win32ss/w32ksvc.h @@ -380,8 +380,11 @@ SVC_(UserEnumDisplaySettings, 4) SVC_(UserEvent, 1) SVC_(UserExcludeUpdateRgn, 2) SVC_(UserFillWindow, 4) -// SVC_(UserFindExistingCursorIcon, 3, Wrong, number, of, param, ?) +#ifdef NEW_CURSORICON +SVC_(UserFindExistingCursorIcon, 3) +#else SVC_(UserFindExistingCursorIcon, 4) +#endif SVC_(UserFindWindowEx, 5) SVC_(UserFlashWindowEx, 1) SVC_(UserGetAltTabInfo, 6) From cde9a5f8956228ea6bda3f63f77ba20ec0beadea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Thu, 8 Nov 2012 14:46:47 +0000 Subject: [PATCH 03/29] [GDI32_APITEST] - Add test showing that a bitmap created using CreateDIBItmap can be selected into a DC despite a different bits depth svn path=/trunk/; revision=57693 --- rostests/apitests/gdi32/CreateDIBitmap.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/rostests/apitests/gdi32/CreateDIBitmap.c b/rostests/apitests/gdi32/CreateDIBitmap.c index f2ce391f992..4a3d4cd748f 100644 --- a/rostests/apitests/gdi32/CreateDIBitmap.c +++ b/rostests/apitests/gdi32/CreateDIBitmap.c @@ -415,7 +415,7 @@ void Test_CreateDIBitmap_RLE8() void Test_CreateDIBitmap_CBM_CREATDIB(void) { - HBITMAP hbmp; + HBITMAP hbmp, hbmpOld; HDC hdc; BITMAPINFO bmi = {{sizeof(BITMAPINFOHEADER), 4, 4, 1, 8, BI_RGB, 0, 1, 1, 1, 0}, {{0,0,0,0}}}; @@ -437,6 +437,11 @@ Test_CreateDIBitmap_CBM_CREATDIB(void) ok_int(bitmap.bmBitsPixel, 8); ok_ptr(bitmap.bmBits, 0); + hbmpOld = SelectObject(hdc, hbmp); + ok(hbmpOld != NULL, "Couldn't select the bitmap.\n"); + SelectObject(hdc, hbmpOld); + DeleteObject(hbmp); + DeleteDC(hdc); } START_TEST(CreateDIBitmap) From 6f481467d59cea3a6842bdf96c2a61e580384d3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Sat, 10 Nov 2012 15:56:42 +0000 Subject: [PATCH 04/29] [WIN32K] - Implement usage of alpha cursors (does not work yet due to a bug in windres) - Directly use bitmaps passed to NtUserSetCursorIconData instead of copying them svn path=/trunk/; revision=57695 --- reactos/win32ss/gdi/eng/mouse.c | 87 +++++++++++++------ reactos/win32ss/gdi/eng/mouse.h | 3 +- reactos/win32ss/gdi/eng/pdevobj.h | 1 + reactos/win32ss/user/ntuser/cursoricon_new.c | 80 ++++++----------- reactos/win32ss/user/ntuser/msgqueue.c | 30 ++++--- .../user/user32/windows/cursoricon_new.c | 66 ++++++++------ 6 files changed, 149 insertions(+), 118 deletions(-) diff --git a/reactos/win32ss/gdi/eng/mouse.c b/reactos/win32ss/gdi/eng/mouse.c index ecc18e2f110..0600f266fb7 100644 --- a/reactos/win32ss/gdi/eng/mouse.c +++ b/reactos/win32ss/gdi/eng/mouse.c @@ -232,29 +232,51 @@ IntShowMousePointer(PDEVOBJ *ppdev, SURFOBJ *psoDest) /* Blt the pointer on the screen. */ if (pgp->psurfColor) { - IntEngBitBlt(psoDest, - &pgp->psurfMask->SurfObj, - NULL, - NULL, - NULL, - &rclSurf, - (POINTL*)&rclPointer, - NULL, - NULL, - NULL, - ROP4_FROM_INDEX(R3_OPINDEX_SRCAND)); + if(!(pgp->flags & SPS_ALPHA)) + { + IntEngBitBlt(psoDest, + &pgp->psurfMask->SurfObj, + NULL, + NULL, + NULL, + &rclSurf, + (POINTL*)&rclPointer, + NULL, + NULL, + NULL, + ROP4_SRCAND); - IntEngBitBlt(psoDest, - &pgp->psurfColor->SurfObj, - NULL, - NULL, - NULL, - &rclSurf, - (POINTL*)&rclPointer, - NULL, - NULL, - NULL, - ROP4_FROM_INDEX(R3_OPINDEX_SRCINVERT)); + IntEngBitBlt(psoDest, + &pgp->psurfColor->SurfObj, + NULL, + NULL, + NULL, + &rclSurf, + (POINTL*)&rclPointer, + NULL, + NULL, + NULL, + ROP4_SRCINVERT); + } + else + { + BLENDOBJ blendobj = { {AC_SRC_OVER, 0, 255, AC_SRC_ALPHA } }; + EXLATEOBJ exlo; + EXLATEOBJ_vInitialize(&exlo, + pgp->psurfColor->ppal, + ppdev->ppalSurf, + 0xFFFFFFFF, + 0xFFFFFFFF, + 0); + IntEngAlphaBlend(psoDest, + &pgp->psurfColor->SurfObj, + NULL, + &exlo.xlo, + &rclSurf, + &rclPointer, + &blendobj); + EXLATEOBJ_vCleanup(&exlo); + } } else { @@ -352,7 +374,15 @@ EngSetPointerShape( if (psoColor) { /* Color bitmap must have the same format as the dest surface */ - if (psoColor->iBitmapFormat != pso->iBitmapFormat) goto failure; + if (psoColor->iBitmapFormat != pso->iBitmapFormat) + { + /* It's OK if we have an alpha bitmap */ + if(!(fl & SPS_ALPHA)) + { + DPRINT1("Screen surface and cursor color bitmap format don't match!.\n"); + goto failure; + } + } /* Create a bitmap to copy the color bitmap to */ hbmColor = EngCreateBitmap(psoColor->sizlBitmap, @@ -452,6 +482,7 @@ EngSetPointerShape( pgp->HotSpot.x = xHot; pgp->HotSpot.y = yHot; pgp->Size = sizel; + pgp->flags = fl; if (x != -1) { @@ -598,12 +629,12 @@ GreSetPointerShape( LONG xHot, LONG yHot, LONG x, - LONG y) + LONG y, + FLONG fl) { PDC pdc; PSURFACE psurf, psurfMask, psurfColor; EXLATEOBJ exlo; - FLONG fl = 0; ULONG ulResult = 0; pdc = DC_LockDc(hdc); @@ -629,7 +660,10 @@ GreSetPointerShape( if (hbmMask) psurfMask = SURFACE_ShareLockSurface(hbmMask); else + { + ASSERT(fl & SPS_ALPHA); psurfMask = NULL; + } /* Check for color bitmap */ if (hbmColor) @@ -645,6 +679,9 @@ GreSetPointerShape( } else psurfColor = NULL; + + /* We must have a valid surface in case of alpha bitmap */ + ASSERT(((fl & SPS_ALPHA) && psurfColor) || !(fl & SPS_ALPHA)); /* Call the driver or eng function */ ulResult = IntEngSetPointerShape(&psurf->SurfObj, diff --git a/reactos/win32ss/gdi/eng/mouse.h b/reactos/win32ss/gdi/eng/mouse.h index 414f49c24c3..719be1e77bc 100644 --- a/reactos/win32ss/gdi/eng/mouse.h +++ b/reactos/win32ss/gdi/eng/mouse.h @@ -12,7 +12,8 @@ GreSetPointerShape( LONG xHot, LONG yHot, LONG x, - LONG y); + LONG y, + FLONG fl); VOID NTAPI diff --git a/reactos/win32ss/gdi/eng/pdevobj.h b/reactos/win32ss/gdi/eng/pdevobj.h index 77f315b65ab..4f3a6496858 100644 --- a/reactos/win32ss/gdi/eng/pdevobj.h +++ b/reactos/win32ss/gdi/eng/pdevobj.h @@ -34,6 +34,7 @@ typedef struct _GDIPOINTER /* should stay private to ENG? No, part of PDEVOBJ ak SURFACE *psurfColor; SURFACE *psurfMask; SURFACE *psurfSave; + FLONG flags; /* Public pointer information */ RECTL Exclude; /* Required publicly for SPS_ACCEPT_EXCLUDE */ diff --git a/reactos/win32ss/user/ntuser/cursoricon_new.c b/reactos/win32ss/user/ntuser/cursoricon_new.c index 8d0c0703192..c80df050dd8 100644 --- a/reactos/win32ss/user/ntuser/cursoricon_new.c +++ b/reactos/win32ss/user/ntuser/cursoricon_new.c @@ -923,7 +923,6 @@ NtUserSetCursorIconData( PCURICON_OBJECT CurIcon; NTSTATUS Status = STATUS_SUCCESS; BOOL Ret = FALSE; - CURSORDATA dataSafe; TRACE("Enter NtUserSetCursorIconData\n"); @@ -943,7 +942,15 @@ NtUserSetCursorIconData( _SEH2_TRY { ProbeForRead(pCursorData, sizeof(*pCursorData), 1); - RtlCopyMemory(&dataSafe, pCursorData, sizeof(dataSafe)); + CurIcon->xHotspot = pCursorData->xHotspot; + CurIcon->yHotspot = pCursorData->yHotspot; + CurIcon->cx = pCursorData->cx; + CurIcon->cy = pCursorData->cy; + CurIcon->rt = pCursorData->rt; + CurIcon->bpp = pCursorData->bpp; + CurIcon->hbmMask = pCursorData->hbmMask; + CurIcon->hbmColor = pCursorData->hbmColor; + CurIcon->hbmAlpha = pCursorData->hbmAlpha; } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { @@ -956,41 +963,6 @@ NtUserSetCursorIconData( SetLastNtError(Status); goto done; } - - CurIcon->xHotspot = dataSafe.xHotspot; - CurIcon->yHotspot = dataSafe.yHotspot; - CurIcon->cx = dataSafe.cx; - CurIcon->cy = dataSafe.cy; - CurIcon->rt = dataSafe.rt; - CurIcon->bpp = dataSafe.bpp; - - if(!dataSafe.hbmMask) - { - ERR("NtUserSetCursorIconData was got no hbmMask.\n"); - EngSetLastError(ERROR_INVALID_PARAMETER); - goto done; - } - - CurIcon->hbmMask = BITMAP_CopyBitmap(dataSafe.hbmMask); - if(!CurIcon->hbmMask) - goto done; - GreSetObjectOwner(CurIcon->hbmMask, GDI_OBJ_HMGR_PUBLIC); - - if(dataSafe.hbmColor) - { - CurIcon->hbmColor = BITMAP_CopyBitmap(dataSafe.hbmColor); - if(!CurIcon->hbmColor) - goto done; - GreSetObjectOwner(CurIcon->hbmColor, GDI_OBJ_HMGR_PUBLIC); - } - - if(dataSafe.hbmAlpha) - { - CurIcon->hbmAlpha = BITMAP_CopyBitmap(dataSafe.hbmAlpha); - if(!CurIcon->hbmAlpha) - goto done; - GreSetObjectOwner(CurIcon->hbmAlpha, GDI_OBJ_HMGR_PUBLIC); - } if(pustrModule) { @@ -1002,30 +974,28 @@ NtUserSetCursorIconData( if(!NT_SUCCESS(Status)) goto done; } + + + if(!CurIcon->hbmMask) + { + ERR("NtUserSetCursorIconData was got no hbmMask.\n"); + EngSetLastError(ERROR_INVALID_PARAMETER); + goto done; + } + + GreSetObjectOwner(CurIcon->hbmMask, GDI_OBJ_HMGR_PUBLIC); + + if(CurIcon->hbmColor) + GreSetObjectOwner(CurIcon->hbmColor, GDI_OBJ_HMGR_PUBLIC); + + if(CurIcon->hbmAlpha) + GreSetObjectOwner(CurIcon->hbmAlpha, GDI_OBJ_HMGR_PUBLIC); Ret = TRUE; done: if(!Ret) { - if (CurIcon->hbmMask) - { - GreSetObjectOwner(CurIcon->hbmMask, GDI_OBJ_HMGR_POWNED); - GreDeleteObject(CurIcon->hbmMask); - CurIcon->hbmMask = NULL; - } - if (CurIcon->hbmColor) - { - GreSetObjectOwner(CurIcon->hbmColor, GDI_OBJ_HMGR_POWNED); - GreDeleteObject(CurIcon->hbmColor); - CurIcon->hbmColor = NULL; - } - if (CurIcon->hbmAlpha) - { - GreSetObjectOwner(CurIcon->hbmAlpha, GDI_OBJ_HMGR_POWNED); - GreDeleteObject(CurIcon->hbmAlpha); - CurIcon->hbmAlpha = NULL; - } if(!IS_INTRESOURCE(CurIcon->strName.Buffer)) ExFreePoolWithTag(CurIcon->strName.Buffer, TAG_STRING); if(CurIcon->ustrModule.Buffer) diff --git a/reactos/win32ss/user/ntuser/msgqueue.c b/reactos/win32ss/user/ntuser/msgqueue.c index 88514fa095a..ef090e1b80e 100644 --- a/reactos/win32ss/user/ntuser/msgqueue.c +++ b/reactos/win32ss/user/ntuser/msgqueue.c @@ -147,12 +147,13 @@ UserSetCursor( /* Call GDI to set the new screen cursor */ #ifdef NEW_CURSORICON GreSetPointerShape(hdcScreen, - NewCursor->hbmMask, - NewCursor->hbmColor, + NewCursor->hbmAlpha ? NULL : NewCursor->hbmMask, + NewCursor->hbmAlpha ? NewCursor->hbmAlpha : NewCursor->hbmColor, NewCursor->xHotspot, NewCursor->yHotspot, gpsi->ptCursor.x, - gpsi->ptCursor.y); + gpsi->ptCursor.y, + NewCursor->hbmAlpha ? SPS_ALPHA : 0); #else GreSetPointerShape(hdcScreen, NewCursor->IconInfo.hbmMask, @@ -160,7 +161,8 @@ UserSetCursor( NewCursor->IconInfo.xHotspot, NewCursor->IconInfo.yHotspot, gpsi->ptCursor.x, - gpsi->ptCursor.y); + gpsi->ptCursor.y, + 0); #endif } else /* Note: OldCursor != NewCursor so we have to hide cursor */ @@ -582,13 +584,16 @@ co_MsqInsertMouseMessage(MSG* Msg, DWORD flags, ULONG_PTR dwExtraInfo, BOOL Hook { /* Call GDI to set the new screen cursor */ #ifdef NEW_CURSORICON - GreSetPointerShape(hdcScreen, - MessageQueue->CursorObject->hbmMask, - MessageQueue->CursorObject->hbmColor, - MessageQueue->CursorObject->xHotspot, - MessageQueue->CursorObject->yHotspot, - gpsi->ptCursor.x, - gpsi->ptCursor.y); + GreSetPointerShape(hdcScreen, + MessageQueue->CursorObject->hbmAlpha ? + NULL : MessageQueue->CursorObject->hbmMask, + MessageQueue->CursorObject->hbmAlpha ? + MessageQueue->CursorObject->hbmAlpha : MessageQueue->CursorObject->hbmColor, + MessageQueue->CursorObject->xHotspot, + MessageQueue->CursorObject->yHotspot, + gpsi->ptCursor.x, + gpsi->ptCursor.y, + MessageQueue->CursorObject->hbmAlpha ? SPS_ALPHA : 0); #else GreSetPointerShape(hdcScreen, MessageQueue->CursorObject->IconInfo.hbmMask, @@ -596,7 +601,8 @@ co_MsqInsertMouseMessage(MSG* Msg, DWORD flags, ULONG_PTR dwExtraInfo, BOOL Hook MessageQueue->CursorObject->IconInfo.xHotspot, MessageQueue->CursorObject->IconInfo.yHotspot, gpsi->ptCursor.x, - gpsi->ptCursor.y); + gpsi->ptCursor.y, + 0); #endif } else GreMovePointer(hdcScreen, Msg->pt.x, Msg->pt.y); diff --git a/reactos/win32ss/user/user32/windows/cursoricon_new.c b/reactos/win32ss/user/user32/windows/cursoricon_new.c index 8bead53c55a..f79d6a1b731 100644 --- a/reactos/win32ss/user/user32/windows/cursoricon_new.c +++ b/reactos/win32ss/user/user32/windows/cursoricon_new.c @@ -906,24 +906,26 @@ CURSORICON_LoadFromFileW( hCurIcon = NtUserxCreateEmptyCurObject(bIcon ? 0 : 1); if(!hCurIcon) - goto end_clean; + goto end_error; /* Tell win32k */ if(!NtUserSetCursorIconData(hCurIcon, NULL, NULL, &cursorData)) { NtUserDestroyCursor(hCurIcon, TRUE); - hCurIcon = NULL; + goto end_error; } - /* Clean up */ -end_clean: - DeleteObject(cursorData.hbmMask); - if(cursorData.hbmColor) DeleteObject(cursorData.hbmColor); - if(cursorData.hbmAlpha) DeleteObject(cursorData.hbmAlpha); - end: UnmapViewOfFile(bits); return hCurIcon; + + /* Clean up */ +end_error: + DeleteObject(cursorData.hbmMask); + if(cursorData.hbmColor) DeleteObject(cursorData.hbmColor); + if(cursorData.hbmAlpha) DeleteObject(cursorData.hbmAlpha); + + return NULL; } static @@ -1078,36 +1080,44 @@ CURSORICON_LoadImageW( if(!bStatus) goto done; + /* This is from resource */ + cursorData.CURSORF_flags = CURSORF_FROMRESOURCE; + /* Create the handle */ hCurIcon = NtUserxCreateEmptyCurObject(bIcon ? 0 : 1); if(!hCurIcon) { - DeleteObject(cursorData.hbmMask); - if(cursorData.hbmColor) DeleteObject(cursorData.hbmColor); - if(cursorData.hbmAlpha) DeleteObject(cursorData.hbmAlpha); - goto done; + goto end_error; } /* Tell win32k */ if(fuLoad & LR_SHARED) + { + cursorData.CURSORF_flags |= CURSORF_LRSHARED; bStatus = NtUserSetCursorIconData(hCurIcon, &ustrModule, &ustrRsrc, &cursorData); + } else bStatus = NtUserSetCursorIconData(hCurIcon, NULL, NULL, &cursorData); if(!bStatus) { NtUserDestroyCursor(hCurIcon, TRUE); - hCurIcon = NULL; + goto end_error; } - - DeleteObject(cursorData.hbmMask); - if(cursorData.hbmColor) DeleteObject(cursorData.hbmColor); - if(cursorData.hbmAlpha) DeleteObject(cursorData.hbmAlpha); done: if(ustrModule.Buffer) HeapFree(GetProcessHeap(), 0, ustrModule.Buffer); return hCurIcon; + +end_error: + if(ustrModule.Buffer) + HeapFree(GetProcessHeap(), 0, ustrModule.Buffer); + DeleteObject(cursorData.hbmMask); + if(cursorData.hbmColor) DeleteObject(cursorData.hbmColor); + if(cursorData.hbmAlpha) DeleteObject(cursorData.hbmAlpha); + + return NULL; } static @@ -1912,21 +1922,24 @@ HICON WINAPI CreateIconFromResourceEx( hIcon = NtUserxCreateEmptyCurObject(fIcon ? 0 : 1); if(!hIcon) - return NULL; + goto end_error; if(!NtUserSetCursorIconData(hIcon, NULL, NULL, &cursorData)) { ERR("NtUserSetCursorIconData failed.\n"); NtUserDestroyCursor(hIcon, TRUE); - hIcon = NULL; + goto end_error; } + return hIcon; + /* Clean up */ +end_error: DeleteObject(cursorData.hbmMask); if(cursorData.hbmColor) DeleteObject(cursorData.hbmColor); if(cursorData.hbmAlpha) DeleteObject(cursorData.hbmAlpha); - return hIcon; + return NULL; } HICON WINAPI CreateIconIndirect( @@ -1944,22 +1957,25 @@ HICON WINAPI CreateIconIndirect( hiconRet = NtUserxCreateEmptyCurObject(piconinfo->fIcon ? 0 : 1); if(!hiconRet) - return NULL; + goto end_error; if(!NtUserSetCursorIconData(hiconRet, NULL, NULL, &cursorData)) { NtUserDestroyCursor(hiconRet, FALSE); - hiconRet = NULL; + goto end_error; } + TRACE("Returning 0x%08x.\n", hiconRet); + + return hiconRet; + +end_error: /* Clean up */ DeleteObject(cursorData.hbmMask); if(cursorData.hbmColor) DeleteObject(cursorData.hbmColor); if(cursorData.hbmAlpha) DeleteObject(cursorData.hbmAlpha); - TRACE("Returning 0x%08x.\n", hiconRet); - - return hiconRet; + return NULL; } HCURSOR WINAPI CreateCursor( From 86683a28ff15f111fba6cd7987b21a5b0aea7672 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sat, 10 Nov 2012 23:45:08 +0000 Subject: [PATCH 05/29] [MSGINA] Introduce a new logon image. Resizing the dialog boxes remains to do. svn path=/trunk/; revision=57696 --- .../dll/win32/msgina/resources/reactos.bmp | Bin 72920 -> 109174 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/reactos/dll/win32/msgina/resources/reactos.bmp b/reactos/dll/win32/msgina/resources/reactos.bmp index b5775aebecc7499818e52a1a82c803d1c409544b..7fd0563b79ec5a1ea99a7cc6b0bd9bcd076c61bc 100644 GIT binary patch literal 109174 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

b+UR)3$V=xRM# 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 literal 72920 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 Date: Sun, 11 Nov 2012 01:54:11 +0000 Subject: [PATCH 06/29] [MSGINA] Resize the dialogs to fit the ReactOS image, and add the logo to the "Please wait..." dialog (which is displayed when a user is logging-on or quitting his session and the "Save your parameters..." message is displayed). Now ReactOS looks perfect. svn path=/trunk/; revision=57697 --- reactos/dll/win32/msgina/lang/bg-BG.rc | 11 ++++++----- reactos/dll/win32/msgina/lang/cs-CZ.rc | 11 ++++++----- reactos/dll/win32/msgina/lang/de-DE.rc | 11 ++++++----- reactos/dll/win32/msgina/lang/en-US.rc | 11 ++++++----- reactos/dll/win32/msgina/lang/es-ES.rc | 11 ++++++----- reactos/dll/win32/msgina/lang/fr-FR.rc | 11 ++++++----- reactos/dll/win32/msgina/lang/id-ID.rc | 11 ++++++----- reactos/dll/win32/msgina/lang/it-IT.rc | 11 ++++++----- reactos/dll/win32/msgina/lang/ja-JP.rc | 11 ++++++----- reactos/dll/win32/msgina/lang/no-NO.rc | 11 ++++++----- reactos/dll/win32/msgina/lang/pl-PL.rc | 11 ++++++----- reactos/dll/win32/msgina/lang/ro-RO.rc | 11 ++++++----- reactos/dll/win32/msgina/lang/ru-RU.rc | 9 +++++---- reactos/dll/win32/msgina/lang/sk-SK.rc | 11 ++++++----- reactos/dll/win32/msgina/lang/uk-UA.rc | 11 ++++++----- 15 files changed, 89 insertions(+), 74 deletions(-) diff --git a/reactos/dll/win32/msgina/lang/bg-BG.rc b/reactos/dll/win32/msgina/lang/bg-BG.rc index b67ddc26239..8e327a3d256 100644 --- a/reactos/dll/win32/msgina/lang/bg-BG.rc +++ b/reactos/dll/win32/msgina/lang/bg-BG.rc @@ -1,11 +1,12 @@ LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT -IDD_STATUSWINDOW_DLG DIALOGEX 0,0,274,26 +IDD_STATUSWINDOW_DLG DIALOGEX 0,0,275,80 STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP CAPTION "Почакайте..." FONT 8,"MS Shell Dlg",400,0,1 BEGIN - LTEXT "",IDC_STATUSLABEL,7,8,234,12,SS_WORDELLIPSIS + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 + LTEXT "",IDC_STATUSLABEL,7,62,261,12,SS_WORDELLIPSIS END IDD_NOTICE_DLG DIALOGEX 0, 0, 186, 32 @@ -22,7 +23,7 @@ STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS CAPTION "Вход" FONT 8,"MS Shell Dlg",400,0,1 BEGIN - CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,59 + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 LTEXT "Потребител:",IDC_STATIC,36,75,45,8 EDITTEXT IDC_USERNAME,84,72,119,14,ES_AUTOHSCROLL LTEXT "Парола:",IDC_STATIC,36,93,42,8 @@ -32,12 +33,12 @@ BEGIN PUSHBUTTON "Изключване",IDC_SHUTDOWN,179,122,50,14 END -IDD_LOGGEDON_DLG DIALOGEX 0,0,247,116 +IDD_LOGGEDON_DLG DIALOGEX 0,0,275,116 STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU CAPTION "Сигурност" FONT 8,"MS Shell Dlg",400,0,1 BEGIN - CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,247,53 + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 LTEXT "Какво желаете?",IDC_STATIC,86,60,87,8 PUSHBUTTON "Заключване на компютъра",IDC_LOCK,25,95,99,14 PUSHBUTTON "Изход",IDC_LOGOFF,90,76,75,14 diff --git a/reactos/dll/win32/msgina/lang/cs-CZ.rc b/reactos/dll/win32/msgina/lang/cs-CZ.rc index 2d65defeee0..e43ff0f458d 100644 --- a/reactos/dll/win32/msgina/lang/cs-CZ.rc +++ b/reactos/dll/win32/msgina/lang/cs-CZ.rc @@ -5,12 +5,13 @@ LANGUAGE LANG_CZECH, SUBLANG_DEFAULT -IDD_STATUSWINDOW_DLG DIALOGEX 0,0,274,26 +IDD_STATUSWINDOW_DLG DIALOGEX 0,0,275,80 STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP CAPTION "Prosím čekejte..." FONT 8,"MS Shell Dlg",400,0,1 BEGIN - LTEXT "",IDC_STATUSLABEL,7,8,234,12,SS_WORDELLIPSIS + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 + LTEXT "",IDC_STATUSLABEL,7,62,261,12,SS_WORDELLIPSIS END IDD_NOTICE_DLG DIALOGEX 0, 0, 186, 32 @@ -27,7 +28,7 @@ STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS CAPTION "Přihlášení" FONT 8,"MS Shell Dlg",400,0,1 BEGIN - CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,59 + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 LTEXT "Jméno:",IDC_STATIC,36,75,40,8 EDITTEXT IDC_USERNAME,84,72,119,14,ES_AUTOHSCROLL LTEXT "Heslo:",IDC_STATIC,36,93,42,8 @@ -37,12 +38,12 @@ BEGIN PUSHBUTTON "Vypnout",IDC_SHUTDOWN,179,122,50,14 END -IDD_LOGGEDON_DLG DIALOGEX 0,0,247,116 +IDD_LOGGEDON_DLG DIALOGEX 0,0,275,116 STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU CAPTION "Bezpečnost" FONT 8,"MS Shell Dlg",400,0,1 BEGIN - CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,247,53 + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 LTEXT "Co chcete udělat?",IDC_STATIC,86,60,87,8 PUSHBUTTON "Uzamknout počítač",IDC_LOCK,10,76,70,14 PUSHBUTTON "Odhlásit",IDC_LOGOFF,90,76,70,14 diff --git a/reactos/dll/win32/msgina/lang/de-DE.rc b/reactos/dll/win32/msgina/lang/de-DE.rc index cd35f0ac846..fc74a035347 100644 --- a/reactos/dll/win32/msgina/lang/de-DE.rc +++ b/reactos/dll/win32/msgina/lang/de-DE.rc @@ -1,11 +1,12 @@ LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL -IDD_STATUSWINDOW_DLG DIALOGEX 0,0,274,26 +IDD_STATUSWINDOW_DLG DIALOGEX 0,0,275,80 STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP CAPTION "Bitte warten..." FONT 8,"MS Shell Dlg",400,0,1 BEGIN - LTEXT "",IDC_STATUSLABEL,7,8,234,12,SS_WORDELLIPSIS + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 + LTEXT "",IDC_STATUSLABEL,7,62,261,12,SS_WORDELLIPSIS END IDD_NOTICE_DLG DIALOGEX 0, 0, 186, 32 @@ -22,7 +23,7 @@ STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS CAPTION "Logon" FONT 8,"MS Shell Dlg",400,0,1 BEGIN - CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,59 + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 LTEXT "Benutzername:",IDC_STATIC,26, 75, 54, 8 EDITTEXT IDC_USERNAME,84,72,119,14,ES_AUTOHSCROLL LTEXT "Passwort:",IDC_STATIC,43, 93, 38, 8 @@ -32,12 +33,12 @@ BEGIN PUSHBUTTON "Herunterfahren",IDC_SHUTDOWN,165, 122, 64, 14 END -IDD_LOGGEDON_DLG DIALOGEX 0,0,247,116 +IDD_LOGGEDON_DLG DIALOGEX 0,0,275,116 STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU CAPTION "Sicherheit" FONT 8,"MS Shell Dlg",400,0,1 BEGIN - CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,247,53 + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 LTEXT "Was wollen Sie tun?",IDC_STATIC,86,60,87,8 PUSHBUTTON "Computer sperren",IDC_LOCK,10,76,70,14 PUSHBUTTON "Abmelden",IDC_LOGOFF,90,76,70,14 diff --git a/reactos/dll/win32/msgina/lang/en-US.rc b/reactos/dll/win32/msgina/lang/en-US.rc index 4324b99098c..27a2d634587 100644 --- a/reactos/dll/win32/msgina/lang/en-US.rc +++ b/reactos/dll/win32/msgina/lang/en-US.rc @@ -1,11 +1,12 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -IDD_STATUSWINDOW_DLG DIALOGEX 0,0,274,26 +IDD_STATUSWINDOW_DLG DIALOGEX 0,0,275,80 STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP CAPTION "Please wait..." FONT 8,"MS Shell Dlg",400,0,1 BEGIN - LTEXT "",IDC_STATUSLABEL,7,8,234,12,SS_WORDELLIPSIS + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 + LTEXT "",IDC_STATUSLABEL,7,62,261,12,SS_WORDELLIPSIS END IDD_NOTICE_DLG DIALOGEX 0, 0, 186, 32 @@ -22,7 +23,7 @@ STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS CAPTION "Logon" FONT 8,"MS Shell Dlg",400,0,1 BEGIN - CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,59 + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 LTEXT "Username:",IDC_STATIC,36,75,40,8 EDITTEXT IDC_USERNAME,84,72,119,14,ES_AUTOHSCROLL LTEXT "Password:",IDC_STATIC,36,93,42,8 @@ -32,12 +33,12 @@ BEGIN PUSHBUTTON "Shutdown",IDC_SHUTDOWN,179,122,50,14 END -IDD_LOGGEDON_DLG DIALOGEX 0,0,247,116 +IDD_LOGGEDON_DLG DIALOGEX 0,0,275,116 STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU CAPTION "Security" FONT 8,"MS Shell Dlg",400,0,1 BEGIN - CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,247,53 + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 LTEXT "What do you want to do?",IDC_STATIC,86,60,87,8 PUSHBUTTON "Lock computer",IDC_LOCK,10,76,70,14 PUSHBUTTON "Log off",IDC_LOGOFF,90,76,70,14 diff --git a/reactos/dll/win32/msgina/lang/es-ES.rc b/reactos/dll/win32/msgina/lang/es-ES.rc index e09c41c75bc..ef9081caf8c 100644 --- a/reactos/dll/win32/msgina/lang/es-ES.rc +++ b/reactos/dll/win32/msgina/lang/es-ES.rc @@ -5,12 +5,13 @@ LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL -IDD_STATUSWINDOW_DLG DIALOGEX 0,0,274,26 +IDD_STATUSWINDOW_DLG DIALOGEX 0,0,275,80 STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP CAPTION "Por favor espere..." FONT 8,"MS Shell Dlg",400,0,1 BEGIN - LTEXT "",IDC_STATUSLABEL,7,8,234,12,SS_WORDELLIPSIS + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 + LTEXT "",IDC_STATUSLABEL,7,62,261,12,SS_WORDELLIPSIS END IDD_NOTICE_DLG DIALOGEX 0, 0, 186, 32 @@ -27,7 +28,7 @@ STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS CAPTION "Acceder" FONT 8,"MS Shell Dlg",400,0,1 BEGIN - CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,59 + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 LTEXT "Usuario:",IDC_STATIC,36,75,40,8 EDITTEXT IDC_USERNAME,84,72,119,14,ES_AUTOHSCROLL LTEXT "Contraseña:",IDC_STATIC,36,93,42,8 @@ -37,12 +38,12 @@ BEGIN PUSHBUTTON "Cerrar",IDC_SHUTDOWN,179,122,50,14 END -IDD_LOGGEDON_DLG DIALOGEX 0, 0, 261, 116 +IDD_LOGGEDON_DLG DIALOGEX 0, 0, 275, 116 STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU CAPTION "Seguridad" FONT 8,"MS Shell Dlg",400,0,1 BEGIN - CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,247,53 + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 LTEXT "¿Qué quieres hacer?",IDC_STATIC, 94, 60, 87, 8 PUSHBUTTON "Bloquear computadora",IDC_LOCK, 4, 76, 83, 14 PUSHBUTTON "Salir",IDC_LOGOFF, 92, 76, 88, 14 diff --git a/reactos/dll/win32/msgina/lang/fr-FR.rc b/reactos/dll/win32/msgina/lang/fr-FR.rc index 34590cd0cad..67a2214684c 100644 --- a/reactos/dll/win32/msgina/lang/fr-FR.rc +++ b/reactos/dll/win32/msgina/lang/fr-FR.rc @@ -1,11 +1,12 @@ LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL -IDD_STATUSWINDOW_DLG DIALOGEX 0,0,274,26 +IDD_STATUSWINDOW_DLG DIALOGEX 0,0,275,80 STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP CAPTION "Veuillez patienter..." FONT 8,"MS Shell Dlg",400,0,1 BEGIN - LTEXT "",IDC_STATUSLABEL,7,8,234,12,SS_WORDELLIPSIS + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 + LTEXT "",IDC_STATUSLABEL,7,62,261,12,SS_WORDELLIPSIS END IDD_NOTICE_DLG DIALOGEX 0, 0, 186, 32 @@ -22,7 +23,7 @@ STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS CAPTION "Connexion" FONT 8,"MS Shell Dlg",400,0,1 BEGIN - CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,59 + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 LTEXT "Utilisateur:",IDC_STATIC,36,75,40,8 EDITTEXT IDC_USERNAME,84,72,119,14,ES_AUTOHSCROLL LTEXT "Mot de passe:",IDC_STATIC,36,93,42,8 @@ -32,12 +33,12 @@ BEGIN PUSHBUTTON "Éteindre",IDC_SHUTDOWN,179,122,50,14 END -IDD_LOGGEDON_DLG DIALOGEX 0, 0, 258, 116 +IDD_LOGGEDON_DLG DIALOGEX 0, 0, 275, 116 STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU CAPTION "Sécurité" FONT 8,"MS Shell Dlg",400,0,1 BEGIN - CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,247,53 + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 LTEXT "Que voulez vous faire?",IDC_STATIC, 94, 60, 87, 8 PUSHBUTTON "Verrouiller l'ordinateur",IDC_LOCK, 4, 76, 82, 14 PUSHBUTTON "Déconnecter",IDC_LOGOFF, 93, 76, 85, 14 diff --git a/reactos/dll/win32/msgina/lang/id-ID.rc b/reactos/dll/win32/msgina/lang/id-ID.rc index c73970da164..42352671ec3 100644 --- a/reactos/dll/win32/msgina/lang/id-ID.rc +++ b/reactos/dll/win32/msgina/lang/id-ID.rc @@ -1,11 +1,12 @@ LANGUAGE LANG_INDONESIAN, SUBLANG_DEFAULT -IDD_STATUSWINDOW_DLG DIALOGEX 0,0,274,26 +IDD_STATUSWINDOW_DLG DIALOGEX 0,0,275,80 STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP CAPTION "Harap menunggu..." FONT 8,"MS Shell Dlg",400,0,1 BEGIN - LTEXT "",IDC_STATUSLABEL,7,8,234,12,SS_WORDELLIPSIS + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 + LTEXT "",IDC_STATUSLABEL,7,62,261,12,SS_WORDELLIPSIS END IDD_NOTICE_DLG DIALOGEX 0, 0, 186, 32 @@ -22,7 +23,7 @@ STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS CAPTION "Masuk" FONT 8,"MS Shell Dlg",400,0,1 BEGIN - CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,59 + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 LTEXT "Nama pengguna:",IDC_STATIC,22, 75, 61, 8 EDITTEXT IDC_USERNAME,84,72,119,14,ES_AUTOHSCROLL LTEXT "Kata sandi:",IDC_STATIC, 40, 93, 42, 8 @@ -32,12 +33,12 @@ BEGIN PUSHBUTTON "Matikan",IDC_SHUTDOWN,179,122,50,14 END -IDD_LOGGEDON_DLG DIALOGEX 0,0,247,116 +IDD_LOGGEDON_DLG DIALOGEX 0,0,275,116 STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU CAPTION "Keamanan" FONT 8,"MS Shell Dlg",400,0,1 BEGIN - CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,247,53 + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 LTEXT "Apa yang ingin anda lakukan?",IDC_STATIC,86,60,87,8 PUSHBUTTON "Kunci komputer",IDC_LOCK,10,76,70,14 PUSHBUTTON "Keluar",IDC_LOGOFF,90,76,70,14 diff --git a/reactos/dll/win32/msgina/lang/it-IT.rc b/reactos/dll/win32/msgina/lang/it-IT.rc index 3d2526e07c9..911360511be 100644 --- a/reactos/dll/win32/msgina/lang/it-IT.rc +++ b/reactos/dll/win32/msgina/lang/it-IT.rc @@ -8,12 +8,13 @@ LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL -IDD_STATUSWINDOW_DLG DIALOGEX 0,0,274,26 +IDD_STATUSWINDOW_DLG DIALOGEX 0,0,275,80 STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP CAPTION "Attendere..." FONT 8,"MS Shell Dlg",400,0,1 BEGIN - LTEXT "",IDC_STATUSLABEL,7,8,234,12,SS_WORDELLIPSIS + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 + LTEXT "",IDC_STATUSLABEL,7,62,261,12,SS_WORDELLIPSIS END IDD_NOTICE_DLG DIALOGEX 0, 0, 186, 32 @@ -30,7 +31,7 @@ STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS CAPTION "Logon" FONT 8,"MS Shell Dlg",400,0,1 BEGIN - CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,59 + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 LTEXT "Utente:",IDC_STATIC,36,75,40,8 EDITTEXT IDC_USERNAME,84,72,119,14,ES_AUTOHSCROLL LTEXT "Password:",IDC_STATIC,36,93,42,8 @@ -40,12 +41,12 @@ BEGIN PUSHBUTTON "Spegnimento",IDC_SHUTDOWN,179,122,50,14 END -IDD_LOGGEDON_DLG DIALOGEX 0,0,247,116 +IDD_LOGGEDON_DLG DIALOGEX 0,0,275,116 STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU CAPTION "Sicurezza" FONT 8,"MS Shell Dlg",400,0,1 BEGIN - CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,247,53 + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 LTEXT "Cosa volete fare?",IDC_STATIC,86,60,87,8 PUSHBUTTON "Bloccare il computer",IDC_LOCK,10,76,70,14 PUSHBUTTON "Fine sessione",IDC_LOGOFF,90,76,70,14 diff --git a/reactos/dll/win32/msgina/lang/ja-JP.rc b/reactos/dll/win32/msgina/lang/ja-JP.rc index 05a1dd7ee66..187a3b164bd 100644 --- a/reactos/dll/win32/msgina/lang/ja-JP.rc +++ b/reactos/dll/win32/msgina/lang/ja-JP.rc @@ -1,11 +1,12 @@ LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT -IDD_STATUSWINDOW_DLG DIALOGEX 0,0,274,26 +IDD_STATUSWINDOW_DLG DIALOGEX 0,0,275,80 STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP CAPTION "お待ちください..." FONT 9, "MS UI Gothic",400,0,1 BEGIN - LTEXT "",IDC_STATUSLABEL,7,8,234,12,SS_WORDELLIPSIS + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 + LTEXT "",IDC_STATUSLABEL,7,62,261,12,SS_WORDELLIPSIS END IDD_NOTICE_DLG DIALOGEX 0, 0, 186, 32 @@ -22,7 +23,7 @@ STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS CAPTION "ログオン" FONT 9, "MS UI Gothic",400,0,1 BEGIN - CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,59 + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 LTEXT "ユーザー名:",IDC_STATIC,36,75,40,8 EDITTEXT IDC_USERNAME,84,72,119,14,ES_AUTOHSCROLL LTEXT "パスワード:",IDC_STATIC,36,93,42,8 @@ -32,12 +33,12 @@ BEGIN PUSHBUTTON "シャットダウン",IDC_SHUTDOWN,179,122,50,14 END -IDD_LOGGEDON_DLG DIALOGEX 0,0,247,116 +IDD_LOGGEDON_DLG DIALOGEX 0,0,275,116 STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU CAPTION "セキュリティ" FONT 9, "MS UI Gothic",400,0,1 BEGIN - CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,247,53 + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 LTEXT "何をしますか?",IDC_STATIC,86,60,87,8 PUSHBUTTON "コンピュータのロック",IDC_LOCK,10,76,70,14 PUSHBUTTON "ログオフ",IDC_LOGOFF,90,76,70,14 diff --git a/reactos/dll/win32/msgina/lang/no-NO.rc b/reactos/dll/win32/msgina/lang/no-NO.rc index bf230ac6601..46b827e0793 100644 --- a/reactos/dll/win32/msgina/lang/no-NO.rc +++ b/reactos/dll/win32/msgina/lang/no-NO.rc @@ -1,11 +1,12 @@ LANGUAGE LANG_NORWEGIAN, SUBLANG_NEUTRAL -IDD_STATUSWINDOW_DLG DIALOGEX 0,0,274,26 +IDD_STATUSWINDOW_DLG DIALOGEX 0,0,275,80 STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP CAPTION "Vent litt..." FONT 8,"MS Shell Dlg",400,0,1 BEGIN - LTEXT "",IDC_STATUSLABEL,7,8,234,12,SS_WORDELLIPSIS + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 + LTEXT "",IDC_STATUSLABEL,7,62,261,12,SS_WORDELLIPSIS END IDD_NOTICE_DLG DIALOGEX 0, 0, 186, 32 @@ -22,7 +23,7 @@ STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS CAPTION "Logg på ReactOS" FONT 8,"MS Shell Dlg",400,0,1 BEGIN - CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,59 + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 LTEXT "Brukernavn:",IDC_STATIC,36,75,40,8 EDITTEXT IDC_USERNAME,84,72,119,14,ES_AUTOHSCROLL LTEXT "Passord:",IDC_STATIC,36,93,42,8 @@ -32,12 +33,12 @@ BEGIN PUSHBUTTON "Avslutt",IDC_SHUTDOWN,179,122,50,14 END -IDD_LOGGEDON_DLG DIALOGEX 0, 0, 247, 116 +IDD_LOGGEDON_DLG DIALOGEX 0, 0, 275, 116 STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU CAPTION "ReactOS-sikkerhet" FONT 8,"MS Shell Dlg",400,0,1 BEGIN - CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,247,53 + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 LTEXT "Hva vil du gjøre?",IDC_STATIC, 92, 60, 87, 8 PUSHBUTTON "Lås datamaskinen...",IDC_LOCK, 7, 76, 74, 14 PUSHBUTTON "Logg av...",IDC_LOGOFF, 86, 76, 78, 14 diff --git a/reactos/dll/win32/msgina/lang/pl-PL.rc b/reactos/dll/win32/msgina/lang/pl-PL.rc index e84685e5ce8..a539dc39a06 100644 --- a/reactos/dll/win32/msgina/lang/pl-PL.rc +++ b/reactos/dll/win32/msgina/lang/pl-PL.rc @@ -8,12 +8,13 @@ LANGUAGE LANG_POLISH, SUBLANG_DEFAULT -IDD_STATUSWINDOW_DLG DIALOGEX 0,0,274,26 +IDD_STATUSWINDOW_DLG DIALOGEX 0,0,275,80 STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP CAPTION "Proszę czekać..." FONT 8,"MS Shell Dlg",400,0,1 BEGIN - LTEXT "",IDC_STATUSLABEL,7,8,234,12,SS_WORDELLIPSIS + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 + LTEXT "",IDC_STATUSLABEL,7,62,261,12,SS_WORDELLIPSIS END IDD_NOTICE_DLG DIALOGEX 0, 0, 186, 32 @@ -30,7 +31,7 @@ STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS CAPTION "Logon" FONT 8,"MS Shell Dlg",400,0,1 BEGIN - CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,59 + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 LTEXT "Nazwa użytkownika:",IDC_STATIC, 11, 75, 70, 8 EDITTEXT IDC_USERNAME,84,72,119,14,ES_AUTOHSCROLL LTEXT "Hasło:",IDC_STATIC, 56, 93, 27, 8 @@ -40,12 +41,12 @@ BEGIN PUSHBUTTON "Wyłącz",IDC_SHUTDOWN,179,122,50,14 END -IDD_LOGGEDON_DLG DIALOGEX 0,0,247,116 +IDD_LOGGEDON_DLG DIALOGEX 0,0,275,116 STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU CAPTION "Bezpieczeństwo" FONT 8,"MS Shell Dlg",400,0,1 BEGIN - CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,247,53 + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 LTEXT "Co chcesz teraz zrobić?",IDC_STATIC,86,60,87,8 PUSHBUTTON "Blokada komputera",IDC_LOCK,10,76,70,14 PUSHBUTTON "Wyloguj",IDC_LOGOFF,90,76,70,14 diff --git a/reactos/dll/win32/msgina/lang/ro-RO.rc b/reactos/dll/win32/msgina/lang/ro-RO.rc index 09aa598a212..06aa1215c8d 100644 --- a/reactos/dll/win32/msgina/lang/ro-RO.rc +++ b/reactos/dll/win32/msgina/lang/ro-RO.rc @@ -1,12 +1,13 @@ //2011.12.10 - Fulea Ștefan: minor changes (corrections) LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL -IDD_STATUSWINDOW_DLG DIALOGEX 0,0,274,26 +IDD_STATUSWINDOW_DLG DIALOGEX 0,0,275,80 STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP CAPTION "Așteptați…" FONT 8,"MS Shell Dlg",400,0,1 BEGIN - LTEXT "",IDC_STATUSLABEL,7,8,234,12,SS_WORDELLIPSIS + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 + LTEXT "",IDC_STATUSLABEL,7,62,261,12,SS_WORDELLIPSIS END IDD_NOTICE_DLG DIALOGEX 0, 0, 186, 32 @@ -23,7 +24,7 @@ STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS CAPTION "Autentificare" FONT 8,"MS Shell Dlg",400,0,1 BEGIN - CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,59 + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 LTEXT "Nume utilizator:", IDC_STATIC,36,75,40,8 EDITTEXT IDC_USERNAME,84,72,119,14,ES_AUTOHSCROLL LTEXT "Parolă:", IDC_STATIC,36,93,42,8 @@ -33,12 +34,12 @@ BEGIN PUSHBUTTON "&Oprește", IDC_SHUTDOWN,179,122,50,14 END -IDD_LOGGEDON_DLG DIALOGEX 0,0,247,116 +IDD_LOGGEDON_DLG DIALOGEX 0,0,275,116 STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU CAPTION "Securitate" FONT 8,"MS Shell Dlg",400,0,1 BEGIN - CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,247,53 + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 LTEXT "Ce acțiune preferați?", IDC_STATIC,86,60,87,8 PUSHBUTTON "&Blochează calculatorul", IDC_LOCK,10,76,70,14 PUSHBUTTON "&Deautentifică-mă", IDC_LOGOFF,90,76,70,14 diff --git a/reactos/dll/win32/msgina/lang/ru-RU.rc b/reactos/dll/win32/msgina/lang/ru-RU.rc index 9c25b94d9fc..38b1e6907a0 100644 --- a/reactos/dll/win32/msgina/lang/ru-RU.rc +++ b/reactos/dll/win32/msgina/lang/ru-RU.rc @@ -2,12 +2,13 @@ LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT -IDD_STATUSWINDOW_DLG DIALOGEX 0,0,274,26 +IDD_STATUSWINDOW_DLG DIALOGEX 0,0,275,80 STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP CAPTION "Пожалуйста подождите..." FONT 8,"MS Shell Dlg",400,0,1 BEGIN - LTEXT "",IDC_STATUSLABEL,7,8,234,12,SS_WORDELLIPSIS + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 + LTEXT "",IDC_STATUSLABEL,7,62,261,12,SS_WORDELLIPSIS END IDD_NOTICE_DLG DIALOGEX 0, 0, 186, 32 @@ -24,7 +25,7 @@ STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS CAPTION "Вход" FONT 8,"MS Shell Dlg",400,0,1 BEGIN - CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,59 + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 RTEXT "Имя пользователя:", IDC_STATIC, 6, 75, 70, 8 EDITTEXT IDC_USERNAME,84,72,119,14,ES_AUTOHSCROLL RTEXT "Пароль:", IDC_STATIC, 6, 93, 70, 8 @@ -39,7 +40,7 @@ STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS CAPTION "Безопасность" FONT 8,"MS Shell Dlg",400,0,1 BEGIN - CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,247,53 + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 LTEXT "Выберите необходимое действие:", IDC_STATIC, 7, 60, 123, 8 PUSHBUTTON "Заблокировать", IDC_LOCK, 7, 76, 86, 14 PUSHBUTTON "Завершение сеанса", IDC_LOGOFF, 102, 76, 86, 14 diff --git a/reactos/dll/win32/msgina/lang/sk-SK.rc b/reactos/dll/win32/msgina/lang/sk-SK.rc index 790a6925448..2266f5acb76 100644 --- a/reactos/dll/win32/msgina/lang/sk-SK.rc +++ b/reactos/dll/win32/msgina/lang/sk-SK.rc @@ -4,12 +4,13 @@ LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT -IDD_STATUSWINDOW_DLG DIALOGEX 0,0,274,26 +IDD_STATUSWINDOW_DLG DIALOGEX 0,0,275,80 STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP CAPTION "Počkajte, prosím ..." FONT 8,"MS Shell Dlg",400,0,1 BEGIN - LTEXT "",IDC_STATUSLABEL,7,8,234,12,SS_WORDELLIPSIS + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 + LTEXT "",IDC_STATUSLABEL,7,62,261,12,SS_WORDELLIPSIS END IDD_NOTICE_DLG DIALOGEX 0, 0, 186, 32 @@ -26,7 +27,7 @@ STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS CAPTION "Prihlásenie" FONT 8,"MS Shell Dlg",400,0,1 BEGIN - CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,59 + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 LTEXT "Meno používateľa:",IDC_STATIC,18, 75, 64, 8 EDITTEXT IDC_USERNAME,84,72,119,14,ES_AUTOHSCROLL LTEXT "Heslo:",IDC_STATIC,56, 93, 24, 8 @@ -36,12 +37,12 @@ BEGIN PUSHBUTTON "Vypnúť",IDC_SHUTDOWN,179,122,50,14 END -IDD_LOGGEDON_DLG DIALOGEX 0,0,247,116 +IDD_LOGGEDON_DLG DIALOGEX 0,0,275,116 STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU CAPTION "Bezpečnosť" FONT 8,"MS Shell Dlg",400,0,1 BEGIN - CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,247,53 + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 LTEXT "Čo chcete urobiť?",IDC_STATIC,86,60,87,8 PUSHBUTTON "Uzamknúť počítač",IDC_LOCK,10,76,70,14 PUSHBUTTON "Odhlásiť",IDC_LOGOFF,90,76,70,14 diff --git a/reactos/dll/win32/msgina/lang/uk-UA.rc b/reactos/dll/win32/msgina/lang/uk-UA.rc index ffffcb84511..31de3767d77 100644 --- a/reactos/dll/win32/msgina/lang/uk-UA.rc +++ b/reactos/dll/win32/msgina/lang/uk-UA.rc @@ -8,12 +8,13 @@ LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT -IDD_STATUSWINDOW_DLG DIALOGEX 0,0,274,26 +IDD_STATUSWINDOW_DLG DIALOGEX 0,0,275,80 STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP CAPTION "Зачекайте..." FONT 8,"MS Shell Dlg",400,0,1 BEGIN - LTEXT "",IDC_STATUSLABEL,7,8,234,12,SS_WORDELLIPSIS + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 + LTEXT "",IDC_STATUSLABEL,7,62,261,12,SS_WORDELLIPSIS END IDD_NOTICE_DLG DIALOGEX 0, 0, 186, 32 @@ -30,7 +31,7 @@ STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS CAPTION "Вхід" FONT 8,"MS Shell Dlg",400,0,1 BEGIN - CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,59 + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 LTEXT "Користувач:",IDC_STATIC,33, 75, 48, 8 EDITTEXT IDC_USERNAME,84,72,119,14,ES_AUTOHSCROLL LTEXT "Пароль:",IDC_STATIC,48, 93, 34, 8 @@ -40,12 +41,12 @@ BEGIN PUSHBUTTON "Завершення роботи...",IDC_SHUTDOWN,148, 122, 86, 14 END -IDD_LOGGEDON_DLG DIALOGEX 0, 0, 257, 116 +IDD_LOGGEDON_DLG DIALOGEX 0, 0, 275, 116 STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU CAPTION "Безпека" FONT 8,"MS Shell Dlg",400,0,1 BEGIN - CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,247,53 + CONTROL IDI_ROSLOGO,IDC_ROSLOGO,"Static",SS_BITMAP,0,0,275,54 LTEXT "Що Ви хочете зробити?",IDC_STATIC, 86, 60, 87, 8 PUSHBUTTON "Блокування",IDC_LOCK, 6, 76, 70, 14 PUSHBUTTON "Вихід із системи...",IDC_LOGOFF, 80, 76, 80, 14 From 5b39db6a1e271a4df9e2e8c0425bd4236a619e75 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sun, 11 Nov 2012 03:01:58 +0000 Subject: [PATCH 07/29] [Win32k] - Fix api test crash. svn path=/trunk/; revision=57698 --- reactos/win32ss/user/ntuser/cursoricon.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/reactos/win32ss/user/ntuser/cursoricon.c b/reactos/win32ss/user/ntuser/cursoricon.c index 84d8c76b4e3..f5086951d57 100644 --- a/reactos/win32ss/user/ntuser/cursoricon.c +++ b/reactos/win32ss/user/ntuser/cursoricon.c @@ -1154,6 +1154,12 @@ UserDrawIconEx( return FALSE; } + if (!psurfColor) + { + ERR("Attention HAX FIX API DrawIconEx TEST Line 37: psurfColor is NULL going with Mask!\n"); + psurfColor = SURFACE_ShareLockSurface(hbmMask); + } + psurfOffScreen = SURFACE_AllocSurface(STYPE_BITMAP, cxWidth, cyHeight, psurfColor->SurfObj.iBitmapFormat, 0, 0, NULL); From 22bcb6ceafb193c9bbb11c5b1b99dfb0097fc460 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sun, 11 Nov 2012 03:18:21 +0000 Subject: [PATCH 08/29] [Win32k] - Implement Gdi32 counterpart SetStretchBltMode for Win32k. svn path=/trunk/; revision=57699 --- reactos/win32ss/gdi/ntgdi/dc.h | 1 + reactos/win32ss/gdi/ntgdi/dcutil.c | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/reactos/win32ss/gdi/ntgdi/dc.h b/reactos/win32ss/gdi/ntgdi/dc.h index c5f7cf54362..6817f6f0ee5 100644 --- a/reactos/win32ss/gdi/ntgdi/dc.h +++ b/reactos/win32ss/gdi/ntgdi/dc.h @@ -173,6 +173,7 @@ UINT FASTCALL IntGdiSetTextAlign(HDC hDC, UINT Mode); VOID FASTCALL DCU_SetDcUndeletable(HDC); BOOL FASTCALL IntSetDefaultRegion(PDC); ULONG TranslateCOLORREF(PDC pdc, COLORREF crColor); +int FASTCALL GreSetStretchBltMode(HDC hdc, int iStretchMode); diff --git a/reactos/win32ss/gdi/ntgdi/dcutil.c b/reactos/win32ss/gdi/ntgdi/dcutil.c index 5fe2f52491a..d7f05af8cad 100644 --- a/reactos/win32ss/gdi/ntgdi/dcutil.c +++ b/reactos/win32ss/gdi/ntgdi/dcutil.c @@ -96,6 +96,29 @@ IntGdiSetTextColor(HDC hDC, return crOldColor; } +int +FASTCALL +GreSetStretchBltMode(HDC hDC, int iStretchMode) +{ + PDC pdc; + PDC_ATTR pdcattr; + INT oSMode = 0; + + pdc = DC_LockDc(hDC); + if (pdc) + { + pdcattr = pdc->pdcattr; + oSMode = pdcattr->lStretchBltMode; + pdcattr->lStretchBltMode = iStretchMode; + + // Wine returns an error here. We set the default. + if ((iStretchMode <= 0) || (iStretchMode > MAXSTRETCHBLTMODE)) iStretchMode = WHITEONBLACK; + + pdcattr->jStretchBltMode = iStretchMode; + } + return oSMode; +} + VOID FASTCALL DCU_SetDcUndeletable(HDC hDC) From 809352b8d8e8625fac46258e5ee94e04dbafa778 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 11 Nov 2012 22:28:08 +0000 Subject: [PATCH 09/29] [NETAPI32] NetLocalGroupEnum: Add code to return information about a single alias to the caller. Now, the user account control panel enumerates the built-in groups. ;-) svn path=/trunk/; revision=57700 --- reactos/dll/win32/netapi32/local_group.c | 96 +++++++++++++++++++++--- 1 file changed, 84 insertions(+), 12 deletions(-) diff --git a/reactos/dll/win32/netapi32/local_group.c b/reactos/dll/win32/netapi32/local_group.c index a02d1cceb84..546eed45a87 100644 --- a/reactos/dll/win32/netapi32/local_group.c +++ b/reactos/dll/win32/netapi32/local_group.c @@ -246,14 +246,17 @@ NET_API_STATUS WINAPI NetLocalGroupEnum( PSAM_RID_ENUMERATION CurrentAlias; PENUM_CONTEXT EnumContext = NULL; PSID DomainSid = NULL; + PLOCALGROUP_INFO_0 LocalInfo0; + PLOCALGROUP_INFO_1 LocalInfo1; + LPWSTR Ptr; ULONG i; + ULONG Size; SAM_HANDLE AliasHandle = NULL; PALIAS_GENERAL_INFORMATION AliasInfo = NULL; - + LPVOID Buffer = NULL; NET_API_STATUS ApiStatus = NERR_Success; NTSTATUS Status = STATUS_SUCCESS; - FIXME("(%s %d %p %d %p %p %p) stub!\n", debugstr_w(servername), level, bufptr, prefmaxlen, entriesread, totalentries, resumehandle); @@ -263,7 +266,7 @@ NET_API_STATUS WINAPI NetLocalGroupEnum( if (resumehandle != NULL && *resumehandle != 0) { - EnumContext = (PENUM_CONTEXT)resumehandle; + EnumContext = (PENUM_CONTEXT)*resumehandle; } else { @@ -334,16 +337,18 @@ NET_API_STATUS WINAPI NetLocalGroupEnum( } - while (TRUE) - { +// while (TRUE) +// { + TRACE("EnumContext->Index: %lu\n", EnumContext->Index); + TRACE("EnumContext->Returned: %lu\n", EnumContext->Returned); if (EnumContext->Index >= EnumContext->Returned) { - if (EnumContext->BuiltinDone == TRUE) - { - ApiStatus = NERR_Success; - goto done; - } +// if (EnumContext->BuiltinDone == TRUE) +// { +// ApiStatus = NERR_Success; +// goto done; +// } TRACE("Calling SamEnumerateAliasesInDomain\n"); @@ -408,6 +413,62 @@ NET_API_STATUS WINAPI NetLocalGroupEnum( TRACE("Name: %S\n", AliasInfo->Name.Buffer); TRACE("Comment: %S\n", AliasInfo->AdminComment.Buffer); + switch (level) + { + case 0: + Size = sizeof(LOCALGROUP_INFO_0) + + AliasInfo->Name.Length + sizeof(WCHAR); + break; + + case 1: + Size = sizeof(LOCALGROUP_INFO_1) + + AliasInfo->Name.Length + sizeof(WCHAR) + + AliasInfo->AdminComment.Length + sizeof(WCHAR); + break; + + default: + ApiStatus = ERROR_INVALID_LEVEL; + goto done; + } + + ApiStatus = NetApiBufferAllocate(Size, &Buffer); + if (ApiStatus != NERR_Success) + goto done; + + switch (level) + { + case 0: + LocalInfo0 = (PLOCALGROUP_INFO_0)Buffer; + + Ptr = (LPWSTR)LocalInfo0++; + LocalInfo0->lgrpi0_name = Ptr; + + memcpy(LocalInfo0->lgrpi0_name, + AliasInfo->Name.Buffer, + AliasInfo->Name.Length); + LocalInfo0->lgrpi0_name[AliasInfo->Name.Length / sizeof(WCHAR)] = UNICODE_NULL; + break; + + case 1: + LocalInfo1 = (PLOCALGROUP_INFO_1)Buffer; + + Ptr = (LPWSTR)((ULONG_PTR)LocalInfo1 + sizeof(LOCALGROUP_INFO_1)); + LocalInfo1->lgrpi1_name = Ptr; + + memcpy(LocalInfo1->lgrpi1_name, + AliasInfo->Name.Buffer, + AliasInfo->Name.Length); + LocalInfo1->lgrpi1_name[AliasInfo->Name.Length / sizeof(WCHAR)] = UNICODE_NULL; + + Ptr = (LPWSTR)((ULONG_PTR)Ptr + AliasInfo->Name.Length + sizeof(WCHAR)); + LocalInfo1->lgrpi1_comment = Ptr; + + memcpy(LocalInfo1->lgrpi1_comment, + AliasInfo->AdminComment.Buffer, + AliasInfo->AdminComment.Length); + LocalInfo1->lgrpi1_comment[AliasInfo->AdminComment.Length / sizeof(WCHAR)] = UNICODE_NULL; + break; + } if (AliasInfo != NULL) { @@ -421,12 +482,19 @@ NET_API_STATUS WINAPI NetLocalGroupEnum( AliasInfo = NULL; } - EnumContext->Index++; - } + (*entriesread)++; + +// } done: + if (ApiStatus == NERR_Success && EnumContext->Index < EnumContext->Returned) + ApiStatus = ERROR_MORE_DATA; + + if (EnumContext != NULL) + *totalentries = EnumContext->Returned; + if (resumehandle == NULL || ApiStatus != ERROR_MORE_DATA) { if (EnumContext != NULL) @@ -472,6 +540,10 @@ done: if (resumehandle != NULL) *resumehandle = (DWORD_PTR)EnumContext; + *bufptr = (LPBYTE)Buffer; + + TRACE ("return %lu\n", ApiStatus); + return ApiStatus; } From f6f71e3fd19dc10984eddf90f5156da42f85173e Mon Sep 17 00:00:00 2001 From: James Tabor Date: Wed, 14 Nov 2012 03:45:55 +0000 Subject: [PATCH 10/29] [Win32k] - Rewrite message events to use posting to queues instead of sending them. See CORE-6551. svn path=/trunk/; revision=57704 --- reactos/win32ss/user/ntuser/keyboard.c | 6 +++--- reactos/win32ss/user/ntuser/message.c | 4 ++-- reactos/win32ss/user/ntuser/msgqueue.c | 20 +++++++++++++++----- reactos/win32ss/user/ntuser/msgqueue.h | 5 ++++- reactos/win32ss/user/ntuser/timer.c | 2 +- reactos/win32ss/user/ntuser/windc.c | 1 - 6 files changed, 25 insertions(+), 13 deletions(-) diff --git a/reactos/win32ss/user/ntuser/keyboard.c b/reactos/win32ss/user/ntuser/keyboard.c index d374e004254..4c906ed44a6 100644 --- a/reactos/win32ss/user/ntuser/keyboard.c +++ b/reactos/win32ss/user/ntuser/keyboard.c @@ -900,7 +900,7 @@ ProcessKeyEvent(WORD wVk, WORD wScanCode, DWORD dwFlags, BOOL bInjected, DWORD d /* Post a keyboard message */ TRACE("Posting keyboard msg %u wParam 0x%x lParam 0x%x\n", Msg.message, Msg.wParam, Msg.lParam); - MsqPostMessage(pFocusQueue, &Msg, TRUE, QS_KEY); + MsqPostMessage(pFocusQueue, &Msg, TRUE, QS_KEY, 0); } return TRUE; @@ -1121,7 +1121,7 @@ IntTranslateKbdMessage(LPMSG lpMsg, NewMsg.message = (lpMsg->message == WM_KEYDOWN) ? WM_CHAR : WM_SYSCHAR; NewMsg.wParam = HIWORD(lpMsg->lParam); NewMsg.lParam = LOWORD(lpMsg->lParam); - MsqPostMessage(pti->MessageQueue, &NewMsg, FALSE, QS_KEY); + MsqPostMessage(pti->MessageQueue, &NewMsg, FALSE, QS_KEY, 0); return TRUE; } @@ -1150,7 +1150,7 @@ IntTranslateKbdMessage(LPMSG lpMsg, { TRACE("Msg: %x '%lc' (%04x) %08x\n", NewMsg.message, wch[i], wch[i], NewMsg.lParam); NewMsg.wParam = wch[i]; - MsqPostMessage(pti->MessageQueue, &NewMsg, FALSE, QS_KEY); + MsqPostMessage(pti->MessageQueue, &NewMsg, FALSE, QS_KEY, 0); } bResult = TRUE; } diff --git a/reactos/win32ss/user/ntuser/message.c b/reactos/win32ss/user/ntuser/message.c index e39057fe177..5423442ce5d 100644 --- a/reactos/win32ss/user/ntuser/message.c +++ b/reactos/win32ss/user/ntuser/message.c @@ -1105,7 +1105,7 @@ UserPostThreadMessage( DWORD idThread, KeQueryTickCount(&LargeTickCount); Message.time = MsqCalculateMessageTime(&LargeTickCount); - MsqPostMessage(pThread->MessageQueue, &Message, FALSE, QS_POSTMESSAGE); + MsqPostMessage(pThread->MessageQueue, &Message, FALSE, QS_POSTMESSAGE, 0); ObDereferenceObject( peThread ); return TRUE; } @@ -1228,7 +1228,7 @@ UserPostMessage( HWND Wnd, } else { - MsqPostMessage(Window->head.pti->MessageQueue, &Message, FALSE, QS_POSTMESSAGE); + MsqPostMessage(Window->head.pti->MessageQueue, &Message, FALSE, QS_POSTMESSAGE, 0); } } return TRUE; diff --git a/reactos/win32ss/user/ntuser/msgqueue.c b/reactos/win32ss/user/ntuser/msgqueue.c index ef090e1b80e..b6bbfdf534d 100644 --- a/reactos/win32ss/user/ntuser/msgqueue.c +++ b/reactos/win32ss/user/ntuser/msgqueue.c @@ -622,7 +622,7 @@ co_MsqInsertMouseMessage(MSG* Msg, DWORD flags, ULONG_PTR dwExtraInfo, BOOL Hook else { TRACE("Posting mouse message to hwnd=0x%x!\n", UserHMGetHandle(pwnd)); - MsqPostMessage(MessageQueue, Msg, TRUE, QS_MOUSEBUTTON); + MsqPostMessage(MessageQueue, Msg, TRUE, QS_MOUSEBUTTON, 0); } } else if (hdcScreen) @@ -675,7 +675,7 @@ MsqPostHotKeyMessage(PVOID Thread, HWND hWnd, WPARAM wParam, LPARAM lParam) KeQueryTickCount(&LargeTickCount); Mesg.time = MsqCalculateMessageTime(&LargeTickCount); Mesg.pt = gpsi->ptCursor; - MsqPostMessage(Window->head.pti->MessageQueue, &Mesg, FALSE, Type); + MsqPostMessage(Window->head.pti->MessageQueue, &Mesg, FALSE, Type, 0); UserDereferenceObject(Window); ObDereferenceObject (Thread); @@ -1252,8 +1252,11 @@ co_MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue, } VOID FASTCALL -MsqPostMessage(PUSER_MESSAGE_QUEUE MessageQueue, MSG* Msg, BOOLEAN HardwareMessage, - DWORD MessageBits) +MsqPostMessage(PUSER_MESSAGE_QUEUE MessageQueue, + MSG* Msg, + BOOLEAN HardwareMessage, + DWORD MessageBits, + DWORD dwQEvent) { PUSER_MESSAGE Message; @@ -1262,7 +1265,12 @@ MsqPostMessage(PUSER_MESSAGE_QUEUE MessageQueue, MSG* Msg, BOOLEAN HardwareMessa return; } - if(!HardwareMessage) + if (dwQEvent) + { + InsertHeadList(&MessageQueue->PostedMessagesListHead, + &Message->ListEntry); + } + else if (!HardwareMessage) { InsertTailList(&MessageQueue->PostedMessagesListHead, &Message->ListEntry); @@ -1273,7 +1281,9 @@ MsqPostMessage(PUSER_MESSAGE_QUEUE MessageQueue, MSG* Msg, BOOLEAN HardwareMessa &Message->ListEntry); } + Message->dwQEvent = dwQEvent; Message->QS_Flags = MessageBits; + //Message->pti = pti; Fixed in ATI changes. See CORE-6551 MsqWakeQueue(MessageQueue, MessageBits, (MessageBits & QS_TIMER ? FALSE : TRUE)); } diff --git a/reactos/win32ss/user/ntuser/msgqueue.h b/reactos/win32ss/user/ntuser/msgqueue.h index e20d1028417..2708aabcaac 100644 --- a/reactos/win32ss/user/ntuser/msgqueue.h +++ b/reactos/win32ss/user/ntuser/msgqueue.h @@ -23,6 +23,9 @@ typedef struct _USER_MESSAGE LIST_ENTRY ListEntry; MSG Msg; DWORD QS_Flags; + LONG_PTR ExtraInfo; + DWORD dwQEvent; + PTHREADINFO pti; } USER_MESSAGE, *PUSER_MESSAGE; struct _USER_MESSAGE_QUEUE; @@ -156,7 +159,7 @@ NTSTATUS FASTCALL co_MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue, UINT uTimeout, BOOL Block, INT HookMessage, ULONG_PTR *uResult); PUSER_MESSAGE FASTCALL MsqCreateMessage(LPMSG Msg); VOID FASTCALL MsqDestroyMessage(PUSER_MESSAGE Message); -VOID FASTCALL MsqPostMessage(PUSER_MESSAGE_QUEUE MessageQueue, MSG* Msg, BOOLEAN HardwareMessage, DWORD MessageBits); +VOID FASTCALL MsqPostMessage(PUSER_MESSAGE_QUEUE, MSG*, BOOLEAN, DWORD, DWORD); VOID FASTCALL MsqPostQuitMessage(PUSER_MESSAGE_QUEUE MessageQueue, ULONG ExitCode); BOOLEAN APIENTRY MsqPeekMessage(IN PUSER_MESSAGE_QUEUE MessageQueue, diff --git a/reactos/win32ss/user/ntuser/timer.c b/reactos/win32ss/user/ntuser/timer.c index 8e679d30f4d..8b43dd3b1a3 100644 --- a/reactos/win32ss/user/ntuser/timer.c +++ b/reactos/win32ss/user/ntuser/timer.c @@ -409,7 +409,7 @@ PostTimerMessages(PWND Window) Msg.wParam = (WPARAM) pTmr->nID; Msg.lParam = (LPARAM) pTmr->pfn; - MsqPostMessage(ThreadQueue, &Msg, FALSE, QS_TIMER); + MsqPostMessage(ThreadQueue, &Msg, FALSE, QS_TIMER, 0); pTmr->flags &= ~TMRF_READY; pti->cTimersReady++; Hit = TRUE; diff --git a/reactos/win32ss/user/ntuser/windc.c b/reactos/win32ss/user/ntuser/windc.c index 8921d0c6913..756b453e29c 100644 --- a/reactos/win32ss/user/ntuser/windc.c +++ b/reactos/win32ss/user/ntuser/windc.c @@ -462,7 +462,6 @@ UserGetDCEx(PWND Wnd OPTIONAL, HANDLE ClipRegion, ULONG Flags) ((Dce->DCXFlags & DCX_CACHECOMPAREMASK) == DcxFlags)) { UpdateClipOrigin = TRUE; - //bUpdateVisRgn = FALSE; break; } } From edee22de3619fc82b8994d9e818e94509eb61942 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Fri, 16 Nov 2012 23:23:49 +0000 Subject: [PATCH 11/29] [PSDK|User32] - Fix error return for future wine Win.c test_map_points tests. - Add missing error code. svn path=/trunk/; revision=57716 --- reactos/include/psdk/winerror.h | 1 + reactos/win32ss/user/user32/misc/misc.c | 13 ++++--------- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/reactos/include/psdk/winerror.h b/reactos/include/psdk/winerror.h index e83050d1f18..e6b397818bb 100644 --- a/reactos/include/psdk/winerror.h +++ b/reactos/include/psdk/winerror.h @@ -838,6 +838,7 @@ #define ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION 1459 #define ERROR_TIMEOUT 1460 #define ERROR_INVALID_MONITOR_HANDLE 1461 +#define ERROR_INCORRECT_SIZE 1462 #define ERROR_EVENTLOG_FILE_CORRUPT 1500 #define ERROR_EVENTLOG_CANT_START 1501 #define ERROR_LOG_FILE_FULL 1502 diff --git a/reactos/win32ss/user/user32/misc/misc.c b/reactos/win32ss/user/user32/misc/misc.c index 8059f4cef3c..6763a613340 100644 --- a/reactos/win32ss/user/user32/misc/misc.c +++ b/reactos/win32ss/user/user32/misc/misc.c @@ -282,6 +282,8 @@ GetUser32Handle(HANDLE handle) INT Index; USHORT generation; + if (!handle) return NULL; + Index = (((UINT_PTR)handle & 0xffff) - FIRST_USER_HANDLE) >> 1; if (Index < 0 || Index >= gHandleTable->nb_handles) @@ -435,21 +437,14 @@ PWND FASTCALL ValidateHwnd(HWND hwnd) { - PWND Wnd; PCLIENTINFO ClientInfo = GetWin32ClientInfo(); ASSERT(ClientInfo != NULL); /* See if the window is cached */ - if (hwnd == ClientInfo->CallbackWnd.hWnd) + if (hwnd && hwnd == ClientInfo->CallbackWnd.hWnd) return ClientInfo->CallbackWnd.pWnd; - Wnd = ValidateHandle((HANDLE)hwnd, otWindow); - if (Wnd != NULL) - { - return Wnd; - } - - return NULL; + return ValidateHandle((HANDLE)hwnd, otWindow); } // From 38b84d3f653d5fc5fc048b8a8373c833eb4f2b5f Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Sat, 17 Nov 2012 15:50:39 +0000 Subject: [PATCH 12/29] - Don't compile apps with Unicode as ReactOS console screenbuffer is not supporting this yet - fixes #CORE-6495, #CORE-6786 svn path=/trunk/; revision=57718 --- reactos/base/applications/cmdutils/doskey/CMakeLists.txt | 2 +- reactos/base/applications/sc/CMakeLists.txt | 2 +- reactos/base/system/diskpart/CMakeLists.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/base/applications/cmdutils/doskey/CMakeLists.txt b/reactos/base/applications/cmdutils/doskey/CMakeLists.txt index fc8aa68f73d..ba73cec5c5f 100644 --- a/reactos/base/applications/cmdutils/doskey/CMakeLists.txt +++ b/reactos/base/applications/cmdutils/doskey/CMakeLists.txt @@ -3,6 +3,6 @@ set_rc_compiler() add_executable(doskey doskey.c doskey.rc) -set_module_type(doskey win32cui UNICODE) +set_module_type(doskey win32cui) add_importlibs(doskey user32 msvcrt kernel32) add_cd_file(TARGET doskey DESTINATION reactos/system32 FOR all) diff --git a/reactos/base/applications/sc/CMakeLists.txt b/reactos/base/applications/sc/CMakeLists.txt index 16fb5a0e1d8..cdfe3f289f5 100644 --- a/reactos/base/applications/sc/CMakeLists.txt +++ b/reactos/base/applications/sc/CMakeLists.txt @@ -14,7 +14,7 @@ list(APPEND SOURCE add_executable(sc ${SOURCE}) -set_module_type(sc win32cui UNICODE) +set_module_type(sc win32cui) add_importlibs(sc advapi32 msvcrt kernel32) add_pch(sc sc.h) add_cd_file(TARGET sc DESTINATION reactos/system32 FOR all) diff --git a/reactos/base/system/diskpart/CMakeLists.txt b/reactos/base/system/diskpart/CMakeLists.txt index 38ecfa5230f..333625fadeb 100644 --- a/reactos/base/system/diskpart/CMakeLists.txt +++ b/reactos/base/system/diskpart/CMakeLists.txt @@ -41,7 +41,7 @@ add_executable(diskpart uniqueid.c diskpart.rc) -set_module_type(diskpart win32cui UNICODE) +set_module_type(diskpart win32cui) add_importlibs(diskpart user32 msvcrt kernel32) if(MSVC) add_importlibs(diskpart ntdll) From 59ce999f959d6c365e3d84c640435a29579b4fb5 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Sat, 17 Nov 2012 16:01:29 +0000 Subject: [PATCH 13/29] - Fix build - Partly revert 57718 svn path=/trunk/; revision=57719 --- .../applications/cmdutils/doskey/CMakeLists.txt | 2 +- reactos/base/applications/cmdutils/doskey/doskey.c | 14 +++++++------- reactos/base/system/diskpart/CMakeLists.txt | 2 +- reactos/base/system/diskpart/diskpart.c | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/reactos/base/applications/cmdutils/doskey/CMakeLists.txt b/reactos/base/applications/cmdutils/doskey/CMakeLists.txt index ba73cec5c5f..fc8aa68f73d 100644 --- a/reactos/base/applications/cmdutils/doskey/CMakeLists.txt +++ b/reactos/base/applications/cmdutils/doskey/CMakeLists.txt @@ -3,6 +3,6 @@ set_rc_compiler() add_executable(doskey doskey.c doskey.rc) -set_module_type(doskey win32cui) +set_module_type(doskey win32cui UNICODE) add_importlibs(doskey user32 msvcrt kernel32) add_cd_file(TARGET doskey DESTINATION reactos/system32 FOR all) diff --git a/reactos/base/applications/cmdutils/doskey/doskey.c b/reactos/base/applications/cmdutils/doskey/doskey.c index 5a73dc07f94..b22cdd883ed 100644 --- a/reactos/base/applications/cmdutils/doskey/doskey.c +++ b/reactos/base/applications/cmdutils/doskey/doskey.c @@ -72,19 +72,19 @@ static INT SetMacro(LPWSTR definition) temp = *nameend; *nameend = L'\0'; /* Don't allow spaces in the name, since such a macro would be unusable */ - if (!wcschr(name, L' ') && AddConsoleAlias(name, text, pszExeName)) + if (!wcschr(name, L' ') && AddConsoleAliasW(name, text, pszExeName)) return 0; *nameend = temp; } - LoadString(GetModuleHandle(NULL), IDS_INVALID_MACRO_DEF, szStringBuf, MAX_STRING); + LoadStringW(GetModuleHandle(NULL), IDS_INVALID_MACRO_DEF, szStringBuf, MAX_STRING); wprintf(szStringBuf, definition); return 1; } static VOID PrintMacros(LPWSTR pszExeName, LPWSTR Indent) { - DWORD Length = GetConsoleAliasesLength(pszExeName); + DWORD Length = GetConsoleAliasesLengthW(pszExeName); PBYTE AliasBuf; WCHAR *Alias; WCHAR *AliasEnd; @@ -96,7 +96,7 @@ static VOID PrintMacros(LPWSTR pszExeName, LPWSTR Indent) Alias = (WCHAR *)AliasBuf; AliasEnd = (WCHAR *)&AliasBuf[Length]; - if (GetConsoleAliases(Alias, Length * sizeof(BYTE), pszExeName)) + if (GetConsoleAliasesW(Alias, Length * sizeof(BYTE), pszExeName)) for (; Alias < AliasEnd; Alias += wcslen(Alias) + 1) wprintf(L"%s%s\n", Indent, Alias); @@ -117,7 +117,7 @@ static VOID PrintAllMacros(VOID) ExeName = (WCHAR *)ExeNameBuf; ExeNameEnd = (WCHAR *)&ExeNameBuf[Length]; - if (GetConsoleAliasExes(ExeName, Length * sizeof(BYTE))) + if (GetConsoleAliasExesW(ExeName, Length * sizeof(BYTE))) { for (; ExeName < ExeNameEnd; ExeName += wcslen(ExeName) + 1) { @@ -199,7 +199,7 @@ wmain(VOID) /* Get the full command line using GetCommandLine(). We can't just use argv, * because then a parameter like "gotoroot=cd \" wouldn't be passed completely. */ - pArgEnd = GetCommandLine(); + pArgEnd = GetCommandLineW(); hKernel32 = LoadLibraryW(L"kernel32.dll"); /* Get function pointers */ @@ -222,7 +222,7 @@ wmain(VOID) if (!wcscmp(pArgStart, L"/?")) { - LoadString(GetModuleHandle(NULL), IDS_HELP, szStringBuf, MAX_STRING); + LoadStringW(GetModuleHandle(NULL), IDS_HELP, szStringBuf, MAX_STRING); wprintf(szStringBuf); break; } diff --git a/reactos/base/system/diskpart/CMakeLists.txt b/reactos/base/system/diskpart/CMakeLists.txt index 333625fadeb..38ecfa5230f 100644 --- a/reactos/base/system/diskpart/CMakeLists.txt +++ b/reactos/base/system/diskpart/CMakeLists.txt @@ -41,7 +41,7 @@ add_executable(diskpart uniqueid.c diskpart.rc) -set_module_type(diskpart win32cui) +set_module_type(diskpart win32cui UNICODE) add_importlibs(diskpart user32 msvcrt kernel32) if(MSVC) add_importlibs(diskpart ntdll) diff --git a/reactos/base/system/diskpart/diskpart.c b/reactos/base/system/diskpart/diskpart.c index a22c967d82b..b44ad600b5e 100644 --- a/reactos/base/system/diskpart/diskpart.c +++ b/reactos/base/system/diskpart/diskpart.c @@ -31,7 +31,7 @@ ShowHeader(VOID) DWORD comp_size = MAX_STRING_SIZE; /* Get the name of the computer for us and change the value of comp_name */ - GetComputerName(szComputerName, &comp_size); + GetComputerNameW(szComputerName, &comp_size); /* TODO: Remove this section of code when program becomes stable enough for production use. */ wprintf(L"\n*WARNING*: This program is incomplete and may not work properly.\n"); From 4a3e29dc6c198510101cacaaa72abb05157ba414 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 18 Nov 2012 15:19:14 +0000 Subject: [PATCH 14/29] [LSASRV] Create a security descriptor for the policy object and store as attribute "SecDesc". svn path=/trunk/; revision=57733 --- reactos/dll/win32/lsasrv/database.c | 272 +++++++++++++++++++++++++++- 1 file changed, 271 insertions(+), 1 deletion(-) diff --git a/reactos/dll/win32/lsasrv/database.c b/reactos/dll/win32/lsasrv/database.c index 2ea60f6b3dc..a196800432d 100644 --- a/reactos/dll/win32/lsasrv/database.c +++ b/reactos/dll/win32/lsasrv/database.c @@ -233,6 +233,260 @@ LsapCreateRandomDomainSid(OUT PSID *Sid) } +static NTSTATUS +LsapCreatePolicySd(PSECURITY_DESCRIPTOR *PolicySd, + PULONG PolicySdSize) +{ + SECURITY_DESCRIPTOR AbsoluteSd; + PSECURITY_DESCRIPTOR RelativeSd = NULL; + ULONG RelativeSdSize = 0; + PSID AnonymousSid = NULL; + PSID AdministratorsSid = NULL; + PSID EveryoneSid = NULL; + PSID LocalServiceSid = NULL; + PSID NetworkServiceSid = NULL; + PSID LocalSystemSid = NULL; + PACL Dacl = NULL; + ULONG DaclSize; + NTSTATUS Status; + + if (PolicySd == NULL || PolicySdSize == NULL) + return STATUS_INVALID_PARAMETER; + + *PolicySd = NULL; + *PolicySdSize = 0; + + /* Initialize the SD */ + Status = RtlCreateSecurityDescriptor(&AbsoluteSd, + SECURITY_DESCRIPTOR_REVISION); + if (!NT_SUCCESS(Status)) + return Status; + + Status = RtlAllocateAndInitializeSid(&NtAuthority, + 1, + SECURITY_ANONYMOUS_LOGON_RID, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + &AnonymousSid); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlAllocateAndInitializeSid(&NtAuthority, + 2, + SECURITY_BUILTIN_DOMAIN_RID, + DOMAIN_ALIAS_RID_ADMINS, + 0, + 0, + 0, + 0, + 0, + 0, + &AdministratorsSid); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlAllocateAndInitializeSid(&WorldSidAuthority, + 1, + SECURITY_WORLD_RID, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + &EveryoneSid); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlAllocateAndInitializeSid(&NtAuthority, + 1, + SECURITY_LOCAL_SERVICE_RID, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + &LocalServiceSid); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlAllocateAndInitializeSid(&NtAuthority, + 1, + SECURITY_NETWORK_SERVICE_RID, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + &NetworkServiceSid); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlAllocateAndInitializeSid(&NtAuthority, + 1, + SECURITY_LOCAL_SYSTEM_RID, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + &LocalSystemSid); + if (!NT_SUCCESS(Status)) + goto done; + + /* Allocate and initialize the DACL */ + DaclSize = sizeof(ACL) + + sizeof(ACCESS_DENIED_ACE) - sizeof(ULONG) + RtlLengthSid(AnonymousSid) + + sizeof(ACCESS_ALLOWED_ACE) - sizeof(ULONG) + RtlLengthSid(AdministratorsSid) + + sizeof(ACCESS_ALLOWED_ACE) - sizeof(ULONG) + RtlLengthSid(EveryoneSid) + + sizeof(ACCESS_ALLOWED_ACE) - sizeof(ULONG) + RtlLengthSid(AnonymousSid) + + sizeof(ACCESS_ALLOWED_ACE) - sizeof(ULONG) + RtlLengthSid(LocalServiceSid) + + sizeof(ACCESS_ALLOWED_ACE) - sizeof(ULONG) + RtlLengthSid(NetworkServiceSid); + + Dacl = RtlAllocateHeap(RtlGetProcessHeap(), + HEAP_ZERO_MEMORY, + DaclSize); + if (Dacl == NULL) + { + Status = STATUS_INSUFFICIENT_RESOURCES; + goto done; + } + + Status = RtlCreateAcl(Dacl, + DaclSize, + ACL_REVISION); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlAddAccessDeniedAce(Dacl, + ACL_REVISION, + POLICY_LOOKUP_NAMES, + AnonymousSid); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlAddAccessAllowedAce(Dacl, + ACL_REVISION, + POLICY_ALL_ACCESS | POLICY_NOTIFICATION, + AdministratorsSid); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlAddAccessAllowedAce(Dacl, + ACL_REVISION, + POLICY_EXECUTE, + EveryoneSid); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlAddAccessAllowedAce(Dacl, + ACL_REVISION, + POLICY_LOOKUP_NAMES | POLICY_VIEW_LOCAL_INFORMATION, + AnonymousSid); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlAddAccessAllowedAce(Dacl, + ACL_REVISION, + POLICY_NOTIFICATION, + LocalServiceSid); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlAddAccessAllowedAce(Dacl, + ACL_REVISION, + POLICY_NOTIFICATION, + NetworkServiceSid); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlSetDaclSecurityDescriptor(&AbsoluteSd, + TRUE, + Dacl, + FALSE); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlSetGroupSecurityDescriptor(&AbsoluteSd, + LocalSystemSid, + FALSE); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlSetOwnerSecurityDescriptor(&AbsoluteSd, + AdministratorsSid, + FALSE); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlAbsoluteToSelfRelativeSD(&AbsoluteSd, + RelativeSd, + &RelativeSdSize); + if (Status != STATUS_BUFFER_TOO_SMALL) + goto done; + + RelativeSd = RtlAllocateHeap(RtlGetProcessHeap(), + HEAP_ZERO_MEMORY, + RelativeSdSize); + if (RelativeSd == NULL) + { + Status = STATUS_INSUFFICIENT_RESOURCES; + goto done; + } + + Status = RtlAbsoluteToSelfRelativeSD(&AbsoluteSd, + RelativeSd, + &RelativeSdSize); + if (!NT_SUCCESS(Status)) + goto done; + + *PolicySd = RelativeSd; + *PolicySdSize = RelativeSdSize; + +done: + if (Dacl != NULL) + RtlFreeHeap(RtlGetProcessHeap(), 0, Dacl); + + if (AnonymousSid != NULL) + RtlFreeHeap(RtlGetProcessHeap(), 0, AnonymousSid); + + if (AdministratorsSid != NULL) + RtlFreeHeap(RtlGetProcessHeap(), 0, AdministratorsSid); + + if (EveryoneSid != NULL) + RtlFreeHeap(RtlGetProcessHeap(), 0, EveryoneSid); + + if (LocalServiceSid != NULL) + RtlFreeHeap(RtlGetProcessHeap(), 0, LocalServiceSid); + + if (NetworkServiceSid != NULL) + RtlFreeHeap(RtlGetProcessHeap(), 0, NetworkServiceSid); + + if (LocalSystemSid != NULL) + RtlFreeHeap(RtlGetProcessHeap(), 0, LocalSystemSid); + + if (!NT_SUCCESS(Status)) + { + if (RelativeSd != NULL) + RtlFreeHeap(RtlGetProcessHeap(), 0, RelativeSd); + } + + return Status; +} + + static NTSTATUS LsapCreateDatabaseObjects(VOID) { @@ -244,6 +498,8 @@ LsapCreateDatabaseObjects(VOID) GUID DnsDomainGuid; PLSA_DB_OBJECT PolicyObject = NULL; PSID AccountDomainSid = NULL; + PSECURITY_DESCRIPTOR PolicySd = NULL; + ULONG PolicySdSize = 0; ULONG AuditEventsCount; ULONG AuditEventsSize; ULONG i; @@ -269,7 +525,7 @@ LsapCreateDatabaseObjects(VOID) AuditEventsCount = AuditCategoryAccountLogon - AuditCategorySystem + 1; AuditEventsSize = sizeof(LSAP_POLICY_AUDIT_EVENTS_DATA) + AuditEventsCount * sizeof(DWORD); AuditEventsInfo = RtlAllocateHeap(RtlGetProcessHeap(), - 0, + HEAP_ZERO_MEMORY, AuditEventsSize); if (AuditEventsInfo == NULL) return STATUS_INSUFFICIENT_RESOURCES; @@ -291,6 +547,11 @@ LsapCreateDatabaseObjects(VOID) if (!NT_SUCCESS(Status)) goto done; + Status = LsapCreatePolicySd(&PolicySd, + &PolicySdSize); + if (!NT_SUCCESS(Status)) + goto done; + /* Open the 'Policy' object */ Status = LsapOpenDbObject(NULL, NULL, @@ -369,6 +630,12 @@ LsapCreateDatabaseObjects(VOID) &DnsDomainGuid, sizeof(GUID)); + /* Set the Sceurity Descriptor */ + LsapSetObjectAttribute(PolicyObject, + L"SecDesc", + PolicySd, + PolicySdSize); + done: if (AuditEventsInfo != NULL) RtlFreeHeap(RtlGetProcessHeap(), 0, AuditEventsInfo); @@ -379,6 +646,9 @@ done: if (AccountDomainSid != NULL) RtlFreeSid(AccountDomainSid); + if (PolicySd != NULL) + RtlFreeHeap(RtlGetProcessHeap(), 0, PolicySd); + return Status; } From 8a858bc0d15cd28e78af7d324bb7a9c7709bf102 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 18 Nov 2012 21:42:14 +0000 Subject: [PATCH 15/29] [LSASRV] Implement LsarQuerySecurityObject. svn path=/trunk/; revision=57735 --- reactos/dll/win32/lsasrv/lsarpc.c | 76 ++++++++++++++++++++++++++++++- 1 file changed, 74 insertions(+), 2 deletions(-) diff --git a/reactos/dll/win32/lsasrv/lsarpc.c b/reactos/dll/win32/lsasrv/lsarpc.c index ac4c86b5ee0..19f077cce8f 100644 --- a/reactos/dll/win32/lsasrv/lsarpc.c +++ b/reactos/dll/win32/lsasrv/lsarpc.c @@ -138,8 +138,80 @@ NTSTATUS WINAPI LsarQuerySecurityObject( SECURITY_INFORMATION SecurityInformation, PLSAPR_SR_SECURITY_DESCRIPTOR *SecurityDescriptor) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + PLSA_DB_OBJECT DbObject = NULL; + PSECURITY_DESCRIPTOR RelativeSd = NULL; + PLSAPR_SR_SECURITY_DESCRIPTOR SdData = NULL; + ACCESS_MASK DesiredAccess = 0; + ULONG RelativeSdSize = 0; + NTSTATUS Status; + + if (SecurityDescriptor == NULL) + return STATUS_INVALID_PARAMETER; + + if ((SecurityInformation & OWNER_SECURITY_INFORMATION) || + (SecurityInformation & GROUP_SECURITY_INFORMATION) || + (SecurityInformation & DACL_SECURITY_INFORMATION)) + DesiredAccess |= READ_CONTROL; + + if (SecurityInformation & SACL_SECURITY_INFORMATION) + DesiredAccess |= ACCESS_SYSTEM_SECURITY; + + /* Validate the ObjectHandle */ + Status = LsapValidateDbObject(ObjectHandle, + LsaDbIgnoreObject, + DesiredAccess, + &DbObject); + if (!NT_SUCCESS(Status)) + return Status; + + /* Get the size of the SD */ + Status = LsapGetObjectAttribute(DbObject, + L"SecDesc", + NULL, + &RelativeSdSize); + if (!NT_SUCCESS(Status)) + return Status; + + /* Allocate a buffer for the SD */ + RelativeSd = MIDL_user_allocate(RelativeSdSize); + if (RelativeSd == NULL) + return STATUS_INSUFFICIENT_RESOURCES; + + /* Get the SD */ + Status = LsapGetObjectAttribute(DbObject, + L"SecDesc", + RelativeSd, + &RelativeSdSize); + if (!NT_SUCCESS(Status)) + goto done; + + /* + * FIXME: Invalidate the SD information that was not requested. + * (see SecurityInformation) + */ + + /* Allocate the SD data buffer */ + SdData = MIDL_user_allocate(sizeof(LSAPR_SR_SECURITY_DESCRIPTOR)); + if (SdData == NULL) + { + Status = STATUS_INSUFFICIENT_RESOURCES; + goto done; + } + + /* Fill the SD data buffer and return it to the caller */ + SdData->Length = RelativeSdSize; + SdData->SecurityDescriptor = (PBYTE)RelativeSd; + + *SecurityDescriptor = SdData; + +done: + if (!NT_SUCCESS(Status)) + { + if (RelativeSd != NULL) + MIDL_user_free(RelativeSd); + } + + return Status; } From 4874b78fd41dd21abfce9559077f887f92cb2e31 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Mon, 19 Nov 2012 17:28:36 +0000 Subject: [PATCH 16/29] [INCLUDE] Add generic rights for account and secret objects. svn path=/trunk/; revision=57736 --- reactos/include/psdk/ntlsa.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/reactos/include/psdk/ntlsa.h b/reactos/include/psdk/ntlsa.h index 188c696ae28..60c41d6459a 100644 --- a/reactos/include/psdk/ntlsa.h +++ b/reactos/include/psdk/ntlsa.h @@ -30,9 +30,20 @@ extern "C" { #define ACCOUNT_ADJUST_QUOTAS 4 #define ACCOUNT_ADJUST_SYSTEM_ACCESS 8 +#define ACCOUNT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 15) +#define ACCOUNT_READ (STANDARD_RIGHTS_READ | 1) +#define ACCOUNT_WRITE (STANDARD_RIGHTS_WRITE | 14) +#define ACCOUNT_EXECUTE (STANDARD_RIGHTS_EXECUTE) + #define SECRET_SET_VALUE 1 #define SECRET_QUERY_VALUE 2 +#define SECRET_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 3) +#define SECRET_READ (STANDARD_RIGHTS_READ | 2) +#define SECRET_WRITE (STANDARD_RIGHTS_WRITE | 1) +#define SECRET_EXECUTE (STANDARD_RIGHTS_EXECUTE) + + /* System Access Flags */ #define SECURITY_ACCESS_INTERACTIVE_LOGON 0x00000001 #define SECURITY_ACCESS_NETWORK_LOGON 0x00000002 From bf98c11bae1726dadfe73520c804b23071ea5580 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Mon, 19 Nov 2012 21:33:07 +0000 Subject: [PATCH 17/29] [LSASRV] - Move LsapCreatePolicySd into a separate file. - Create and set a security descriptor to newly created accounts. svn path=/trunk/; revision=57737 --- reactos/dll/win32/lsasrv/CMakeLists.txt | 1 + reactos/dll/win32/lsasrv/database.c | 254 -------------- reactos/dll/win32/lsasrv/lsarpc.c | 22 ++ reactos/dll/win32/lsasrv/lsasrv.h | 9 + reactos/dll/win32/lsasrv/security.c | 439 ++++++++++++++++++++++++ 5 files changed, 471 insertions(+), 254 deletions(-) create mode 100644 reactos/dll/win32/lsasrv/security.c diff --git a/reactos/dll/win32/lsasrv/CMakeLists.txt b/reactos/dll/win32/lsasrv/CMakeLists.txt index 28d55339657..71b4d0a0265 100644 --- a/reactos/dll/win32/lsasrv/CMakeLists.txt +++ b/reactos/dll/win32/lsasrv/CMakeLists.txt @@ -18,6 +18,7 @@ list(APPEND SOURCE lsasrv.c policy.c privileges.c + security.c lsasrv.rc ${CMAKE_CURRENT_BINARY_DIR}/lsasrv_stubs.c ${CMAKE_CURRENT_BINARY_DIR}/lsasrv.def diff --git a/reactos/dll/win32/lsasrv/database.c b/reactos/dll/win32/lsasrv/database.c index a196800432d..9303636a3f4 100644 --- a/reactos/dll/win32/lsasrv/database.c +++ b/reactos/dll/win32/lsasrv/database.c @@ -233,260 +233,6 @@ LsapCreateRandomDomainSid(OUT PSID *Sid) } -static NTSTATUS -LsapCreatePolicySd(PSECURITY_DESCRIPTOR *PolicySd, - PULONG PolicySdSize) -{ - SECURITY_DESCRIPTOR AbsoluteSd; - PSECURITY_DESCRIPTOR RelativeSd = NULL; - ULONG RelativeSdSize = 0; - PSID AnonymousSid = NULL; - PSID AdministratorsSid = NULL; - PSID EveryoneSid = NULL; - PSID LocalServiceSid = NULL; - PSID NetworkServiceSid = NULL; - PSID LocalSystemSid = NULL; - PACL Dacl = NULL; - ULONG DaclSize; - NTSTATUS Status; - - if (PolicySd == NULL || PolicySdSize == NULL) - return STATUS_INVALID_PARAMETER; - - *PolicySd = NULL; - *PolicySdSize = 0; - - /* Initialize the SD */ - Status = RtlCreateSecurityDescriptor(&AbsoluteSd, - SECURITY_DESCRIPTOR_REVISION); - if (!NT_SUCCESS(Status)) - return Status; - - Status = RtlAllocateAndInitializeSid(&NtAuthority, - 1, - SECURITY_ANONYMOUS_LOGON_RID, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - &AnonymousSid); - if (!NT_SUCCESS(Status)) - goto done; - - Status = RtlAllocateAndInitializeSid(&NtAuthority, - 2, - SECURITY_BUILTIN_DOMAIN_RID, - DOMAIN_ALIAS_RID_ADMINS, - 0, - 0, - 0, - 0, - 0, - 0, - &AdministratorsSid); - if (!NT_SUCCESS(Status)) - goto done; - - Status = RtlAllocateAndInitializeSid(&WorldSidAuthority, - 1, - SECURITY_WORLD_RID, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - &EveryoneSid); - if (!NT_SUCCESS(Status)) - goto done; - - Status = RtlAllocateAndInitializeSid(&NtAuthority, - 1, - SECURITY_LOCAL_SERVICE_RID, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - &LocalServiceSid); - if (!NT_SUCCESS(Status)) - goto done; - - Status = RtlAllocateAndInitializeSid(&NtAuthority, - 1, - SECURITY_NETWORK_SERVICE_RID, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - &NetworkServiceSid); - if (!NT_SUCCESS(Status)) - goto done; - - Status = RtlAllocateAndInitializeSid(&NtAuthority, - 1, - SECURITY_LOCAL_SYSTEM_RID, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - &LocalSystemSid); - if (!NT_SUCCESS(Status)) - goto done; - - /* Allocate and initialize the DACL */ - DaclSize = sizeof(ACL) + - sizeof(ACCESS_DENIED_ACE) - sizeof(ULONG) + RtlLengthSid(AnonymousSid) + - sizeof(ACCESS_ALLOWED_ACE) - sizeof(ULONG) + RtlLengthSid(AdministratorsSid) + - sizeof(ACCESS_ALLOWED_ACE) - sizeof(ULONG) + RtlLengthSid(EveryoneSid) + - sizeof(ACCESS_ALLOWED_ACE) - sizeof(ULONG) + RtlLengthSid(AnonymousSid) + - sizeof(ACCESS_ALLOWED_ACE) - sizeof(ULONG) + RtlLengthSid(LocalServiceSid) + - sizeof(ACCESS_ALLOWED_ACE) - sizeof(ULONG) + RtlLengthSid(NetworkServiceSid); - - Dacl = RtlAllocateHeap(RtlGetProcessHeap(), - HEAP_ZERO_MEMORY, - DaclSize); - if (Dacl == NULL) - { - Status = STATUS_INSUFFICIENT_RESOURCES; - goto done; - } - - Status = RtlCreateAcl(Dacl, - DaclSize, - ACL_REVISION); - if (!NT_SUCCESS(Status)) - goto done; - - Status = RtlAddAccessDeniedAce(Dacl, - ACL_REVISION, - POLICY_LOOKUP_NAMES, - AnonymousSid); - if (!NT_SUCCESS(Status)) - goto done; - - Status = RtlAddAccessAllowedAce(Dacl, - ACL_REVISION, - POLICY_ALL_ACCESS | POLICY_NOTIFICATION, - AdministratorsSid); - if (!NT_SUCCESS(Status)) - goto done; - - Status = RtlAddAccessAllowedAce(Dacl, - ACL_REVISION, - POLICY_EXECUTE, - EveryoneSid); - if (!NT_SUCCESS(Status)) - goto done; - - Status = RtlAddAccessAllowedAce(Dacl, - ACL_REVISION, - POLICY_LOOKUP_NAMES | POLICY_VIEW_LOCAL_INFORMATION, - AnonymousSid); - if (!NT_SUCCESS(Status)) - goto done; - - Status = RtlAddAccessAllowedAce(Dacl, - ACL_REVISION, - POLICY_NOTIFICATION, - LocalServiceSid); - if (!NT_SUCCESS(Status)) - goto done; - - Status = RtlAddAccessAllowedAce(Dacl, - ACL_REVISION, - POLICY_NOTIFICATION, - NetworkServiceSid); - if (!NT_SUCCESS(Status)) - goto done; - - Status = RtlSetDaclSecurityDescriptor(&AbsoluteSd, - TRUE, - Dacl, - FALSE); - if (!NT_SUCCESS(Status)) - goto done; - - Status = RtlSetGroupSecurityDescriptor(&AbsoluteSd, - LocalSystemSid, - FALSE); - if (!NT_SUCCESS(Status)) - goto done; - - Status = RtlSetOwnerSecurityDescriptor(&AbsoluteSd, - AdministratorsSid, - FALSE); - if (!NT_SUCCESS(Status)) - goto done; - - Status = RtlAbsoluteToSelfRelativeSD(&AbsoluteSd, - RelativeSd, - &RelativeSdSize); - if (Status != STATUS_BUFFER_TOO_SMALL) - goto done; - - RelativeSd = RtlAllocateHeap(RtlGetProcessHeap(), - HEAP_ZERO_MEMORY, - RelativeSdSize); - if (RelativeSd == NULL) - { - Status = STATUS_INSUFFICIENT_RESOURCES; - goto done; - } - - Status = RtlAbsoluteToSelfRelativeSD(&AbsoluteSd, - RelativeSd, - &RelativeSdSize); - if (!NT_SUCCESS(Status)) - goto done; - - *PolicySd = RelativeSd; - *PolicySdSize = RelativeSdSize; - -done: - if (Dacl != NULL) - RtlFreeHeap(RtlGetProcessHeap(), 0, Dacl); - - if (AnonymousSid != NULL) - RtlFreeHeap(RtlGetProcessHeap(), 0, AnonymousSid); - - if (AdministratorsSid != NULL) - RtlFreeHeap(RtlGetProcessHeap(), 0, AdministratorsSid); - - if (EveryoneSid != NULL) - RtlFreeHeap(RtlGetProcessHeap(), 0, EveryoneSid); - - if (LocalServiceSid != NULL) - RtlFreeHeap(RtlGetProcessHeap(), 0, LocalServiceSid); - - if (NetworkServiceSid != NULL) - RtlFreeHeap(RtlGetProcessHeap(), 0, NetworkServiceSid); - - if (LocalSystemSid != NULL) - RtlFreeHeap(RtlGetProcessHeap(), 0, LocalSystemSid); - - if (!NT_SUCCESS(Status)) - { - if (RelativeSd != NULL) - RtlFreeHeap(RtlGetProcessHeap(), 0, RelativeSd); - } - - return Status; -} - - static NTSTATUS LsapCreateDatabaseObjects(VOID) { diff --git a/reactos/dll/win32/lsasrv/lsarpc.c b/reactos/dll/win32/lsasrv/lsarpc.c index 19f077cce8f..b0b8699d62a 100644 --- a/reactos/dll/win32/lsasrv/lsarpc.c +++ b/reactos/dll/win32/lsasrv/lsarpc.c @@ -513,6 +513,8 @@ NTSTATUS WINAPI LsarCreateAccount( PLSA_DB_OBJECT PolicyObject; PLSA_DB_OBJECT AccountObject = NULL; LPWSTR SidString = NULL; + PSECURITY_DESCRIPTOR AccountSd = NULL; + ULONG AccountSdSize; NTSTATUS Status = STATUS_SUCCESS; /* Validate the AccountSid */ @@ -539,6 +541,15 @@ NTSTATUS WINAPI LsarCreateAccount( goto done; } + /* Create a security descriptor for the account */ + Status = LsapCreateAccountSd(&AccountSd, + &AccountSdSize); + if (!NT_SUCCESS(Status)) + { + ERR("LsapCreateAccountSd returned 0x%08lx\n", Status); + return Status; + } + /* Create the Account object */ Status = LsapCreateDbObject(PolicyObject, L"Accounts", @@ -557,11 +568,22 @@ NTSTATUS WINAPI LsarCreateAccount( L"Sid", (PVOID)AccountSid, GetLengthSid(AccountSid)); + if (!NT_SUCCESS(Status)) + goto done; + + /* Set the SecDesc attribute */ + Status = LsapSetObjectAttribute(AccountObject, + L"SecDesc", + AccountSd, + AccountSdSize); done: if (SidString != NULL) LocalFree(SidString); + if (AccountSd != NULL) + RtlFreeHeap(RtlGetProcessHeap(), 0, AccountSd); + if (!NT_SUCCESS(Status)) { if (AccountObject != NULL) diff --git a/reactos/dll/win32/lsasrv/lsasrv.h b/reactos/dll/win32/lsasrv/lsasrv.h index 5f18e5a12f8..3239376c81f 100644 --- a/reactos/dll/win32/lsasrv/lsasrv.h +++ b/reactos/dll/win32/lsasrv/lsasrv.h @@ -227,4 +227,13 @@ LsarpEnumeratePrivileges(DWORD *EnumerationContext, PLSAPR_PRIVILEGE_ENUM_BUFFER EnumerationBuffer, DWORD PreferedMaximumLength); +/* security.c */ +NTSTATUS +LsapCreatePolicySd(PSECURITY_DESCRIPTOR *PolicySd, + PULONG PolicySdSize); + +NTSTATUS +LsapCreateAccountSd(PSECURITY_DESCRIPTOR *AccountSd, + PULONG AccountSdSize); + /* EOF */ diff --git a/reactos/dll/win32/lsasrv/security.c b/reactos/dll/win32/lsasrv/security.c new file mode 100644 index 00000000000..b8173b5f0bb --- /dev/null +++ b/reactos/dll/win32/lsasrv/security.c @@ -0,0 +1,439 @@ +/* + * PROJECT: Local Security Authority Server DLL + * LICENSE: GPL - See COPYING in the top level directory + * FILE: dll/win32/lsasrv/security.c + * PURPOSE: LSA object security functions + * COPYRIGHT: Copyright 2012 Eric Kohl + */ + +/* INCLUDES ****************************************************************/ + +#include "lsasrv.h" + +WINE_DEFAULT_DEBUG_CHANNEL(lsasrv); + + +/* FUNCTIONS ***************************************************************/ + +NTSTATUS +LsapCreatePolicySd(PSECURITY_DESCRIPTOR *PolicySd, + PULONG PolicySdSize) +{ + SECURITY_DESCRIPTOR AbsoluteSd; + PSECURITY_DESCRIPTOR RelativeSd = NULL; + ULONG RelativeSdSize = 0; + PSID AnonymousSid = NULL; + PSID AdministratorsSid = NULL; + PSID EveryoneSid = NULL; + PSID LocalServiceSid = NULL; + PSID NetworkServiceSid = NULL; + PSID LocalSystemSid = NULL; + PACL Dacl = NULL; + ULONG DaclSize; + NTSTATUS Status; + + if (PolicySd == NULL || PolicySdSize == NULL) + return STATUS_INVALID_PARAMETER; + + *PolicySd = NULL; + *PolicySdSize = 0; + + /* Initialize the SD */ + Status = RtlCreateSecurityDescriptor(&AbsoluteSd, + SECURITY_DESCRIPTOR_REVISION); + if (!NT_SUCCESS(Status)) + return Status; + + Status = RtlAllocateAndInitializeSid(&NtAuthority, + 1, + SECURITY_ANONYMOUS_LOGON_RID, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + &AnonymousSid); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlAllocateAndInitializeSid(&NtAuthority, + 2, + SECURITY_BUILTIN_DOMAIN_RID, + DOMAIN_ALIAS_RID_ADMINS, + 0, + 0, + 0, + 0, + 0, + 0, + &AdministratorsSid); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlAllocateAndInitializeSid(&WorldSidAuthority, + 1, + SECURITY_WORLD_RID, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + &EveryoneSid); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlAllocateAndInitializeSid(&NtAuthority, + 1, + SECURITY_LOCAL_SERVICE_RID, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + &LocalServiceSid); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlAllocateAndInitializeSid(&NtAuthority, + 1, + SECURITY_NETWORK_SERVICE_RID, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + &NetworkServiceSid); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlAllocateAndInitializeSid(&NtAuthority, + 1, + SECURITY_LOCAL_SYSTEM_RID, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + &LocalSystemSid); + if (!NT_SUCCESS(Status)) + goto done; + + /* Allocate and initialize the DACL */ + DaclSize = sizeof(ACL) + + sizeof(ACCESS_DENIED_ACE) - sizeof(ULONG) + RtlLengthSid(AnonymousSid) + + sizeof(ACCESS_ALLOWED_ACE) - sizeof(ULONG) + RtlLengthSid(AdministratorsSid) + + sizeof(ACCESS_ALLOWED_ACE) - sizeof(ULONG) + RtlLengthSid(EveryoneSid) + + sizeof(ACCESS_ALLOWED_ACE) - sizeof(ULONG) + RtlLengthSid(AnonymousSid) + + sizeof(ACCESS_ALLOWED_ACE) - sizeof(ULONG) + RtlLengthSid(LocalServiceSid) + + sizeof(ACCESS_ALLOWED_ACE) - sizeof(ULONG) + RtlLengthSid(NetworkServiceSid); + + Dacl = RtlAllocateHeap(RtlGetProcessHeap(), + HEAP_ZERO_MEMORY, + DaclSize); + if (Dacl == NULL) + { + Status = STATUS_INSUFFICIENT_RESOURCES; + goto done; + } + + Status = RtlCreateAcl(Dacl, + DaclSize, + ACL_REVISION); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlAddAccessDeniedAce(Dacl, + ACL_REVISION, + POLICY_LOOKUP_NAMES, + AnonymousSid); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlAddAccessAllowedAce(Dacl, + ACL_REVISION, + POLICY_ALL_ACCESS | POLICY_NOTIFICATION, + AdministratorsSid); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlAddAccessAllowedAce(Dacl, + ACL_REVISION, + POLICY_EXECUTE, + EveryoneSid); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlAddAccessAllowedAce(Dacl, + ACL_REVISION, + POLICY_LOOKUP_NAMES | POLICY_VIEW_LOCAL_INFORMATION, + AnonymousSid); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlAddAccessAllowedAce(Dacl, + ACL_REVISION, + POLICY_NOTIFICATION, + LocalServiceSid); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlAddAccessAllowedAce(Dacl, + ACL_REVISION, + POLICY_NOTIFICATION, + NetworkServiceSid); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlSetDaclSecurityDescriptor(&AbsoluteSd, + TRUE, + Dacl, + FALSE); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlSetGroupSecurityDescriptor(&AbsoluteSd, + LocalSystemSid, + FALSE); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlSetOwnerSecurityDescriptor(&AbsoluteSd, + AdministratorsSid, + FALSE); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlAbsoluteToSelfRelativeSD(&AbsoluteSd, + RelativeSd, + &RelativeSdSize); + if (Status != STATUS_BUFFER_TOO_SMALL) + goto done; + + RelativeSd = RtlAllocateHeap(RtlGetProcessHeap(), + HEAP_ZERO_MEMORY, + RelativeSdSize); + if (RelativeSd == NULL) + { + Status = STATUS_INSUFFICIENT_RESOURCES; + goto done; + } + + Status = RtlAbsoluteToSelfRelativeSD(&AbsoluteSd, + RelativeSd, + &RelativeSdSize); + if (!NT_SUCCESS(Status)) + goto done; + + *PolicySd = RelativeSd; + *PolicySdSize = RelativeSdSize; + +done: + if (Dacl != NULL) + RtlFreeHeap(RtlGetProcessHeap(), 0, Dacl); + + if (AnonymousSid != NULL) + RtlFreeHeap(RtlGetProcessHeap(), 0, AnonymousSid); + + if (AdministratorsSid != NULL) + RtlFreeHeap(RtlGetProcessHeap(), 0, AdministratorsSid); + + if (EveryoneSid != NULL) + RtlFreeHeap(RtlGetProcessHeap(), 0, EveryoneSid); + + if (LocalServiceSid != NULL) + RtlFreeHeap(RtlGetProcessHeap(), 0, LocalServiceSid); + + if (NetworkServiceSid != NULL) + RtlFreeHeap(RtlGetProcessHeap(), 0, NetworkServiceSid); + + if (LocalSystemSid != NULL) + RtlFreeHeap(RtlGetProcessHeap(), 0, LocalSystemSid); + + if (!NT_SUCCESS(Status)) + { + if (RelativeSd != NULL) + RtlFreeHeap(RtlGetProcessHeap(), 0, RelativeSd); + } + + return Status; +} + + +NTSTATUS +LsapCreateAccountSd(PSECURITY_DESCRIPTOR *AccountSd, + PULONG AccountSdSize) +{ + SECURITY_DESCRIPTOR AbsoluteSd; + PSECURITY_DESCRIPTOR RelativeSd = NULL; + ULONG RelativeSdSize = 0; + PSID AdministratorsSid = NULL; + PSID EveryoneSid = NULL; + PSID LocalSystemSid = NULL; + PACL Dacl = NULL; + ULONG DaclSize; + NTSTATUS Status; + + if (AccountSd == NULL || AccountSdSize == NULL) + return STATUS_INVALID_PARAMETER; + + *AccountSd = NULL; + *AccountSdSize = 0; + + /* Initialize the SD */ + Status = RtlCreateSecurityDescriptor(&AbsoluteSd, + SECURITY_DESCRIPTOR_REVISION); + if (!NT_SUCCESS(Status)) + return Status; + + Status = RtlAllocateAndInitializeSid(&NtAuthority, + 2, + SECURITY_BUILTIN_DOMAIN_RID, + DOMAIN_ALIAS_RID_ADMINS, + 0, + 0, + 0, + 0, + 0, + 0, + &AdministratorsSid); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlAllocateAndInitializeSid(&WorldSidAuthority, + 1, + SECURITY_WORLD_RID, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + &EveryoneSid); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlAllocateAndInitializeSid(&NtAuthority, + 1, + SECURITY_LOCAL_SYSTEM_RID, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + &LocalSystemSid); + if (!NT_SUCCESS(Status)) + goto done; + + /* Allocate and initialize the DACL */ + DaclSize = sizeof(ACL) + + sizeof(ACCESS_ALLOWED_ACE) - sizeof(ULONG) + RtlLengthSid(AdministratorsSid) + + sizeof(ACCESS_ALLOWED_ACE) - sizeof(ULONG) + RtlLengthSid(EveryoneSid); + + Dacl = RtlAllocateHeap(RtlGetProcessHeap(), + HEAP_ZERO_MEMORY, + DaclSize); + if (Dacl == NULL) + { + Status = STATUS_INSUFFICIENT_RESOURCES; + goto done; + } + + Status = RtlCreateAcl(Dacl, + DaclSize, + ACL_REVISION); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlAddAccessAllowedAce(Dacl, + ACL_REVISION, + ACCOUNT_ALL_ACCESS, + AdministratorsSid); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlAddAccessAllowedAce(Dacl, + ACL_REVISION, + ACCOUNT_EXECUTE, + EveryoneSid); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlSetDaclSecurityDescriptor(&AbsoluteSd, + TRUE, + Dacl, + FALSE); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlSetGroupSecurityDescriptor(&AbsoluteSd, + LocalSystemSid, + FALSE); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlSetOwnerSecurityDescriptor(&AbsoluteSd, + AdministratorsSid, + FALSE); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlAbsoluteToSelfRelativeSD(&AbsoluteSd, + RelativeSd, + &RelativeSdSize); + if (Status != STATUS_BUFFER_TOO_SMALL) + goto done; + + RelativeSd = RtlAllocateHeap(RtlGetProcessHeap(), + HEAP_ZERO_MEMORY, + RelativeSdSize); + if (RelativeSd == NULL) + { + Status = STATUS_INSUFFICIENT_RESOURCES; + goto done; + } + + Status = RtlAbsoluteToSelfRelativeSD(&AbsoluteSd, + RelativeSd, + &RelativeSdSize); + if (!NT_SUCCESS(Status)) + goto done; + + *AccountSd = RelativeSd; + *AccountSdSize = RelativeSdSize; + +done: + if (Dacl != NULL) + RtlFreeHeap(RtlGetProcessHeap(), 0, Dacl); + + if (AdministratorsSid != NULL) + RtlFreeHeap(RtlGetProcessHeap(), 0, AdministratorsSid); + + if (EveryoneSid != NULL) + RtlFreeHeap(RtlGetProcessHeap(), 0, EveryoneSid); + + if (LocalSystemSid != NULL) + RtlFreeHeap(RtlGetProcessHeap(), 0, LocalSystemSid); + + if (!NT_SUCCESS(Status)) + { + if (RelativeSd != NULL) + RtlFreeHeap(RtlGetProcessHeap(), 0, RelativeSd); + } + + return Status; +} + +/* EOF */ From 949d0c4bed6ffac9d9f787605f6da4eb2ecaa04a Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Tue, 20 Nov 2012 22:34:00 +0000 Subject: [PATCH 18/29] [LSASRV] - Create and set a security descriptor for newly created secrets. svn path=/trunk/; revision=57742 --- reactos/dll/win32/lsasrv/lsarpc.c | 25 +++++ reactos/dll/win32/lsasrv/lsasrv.h | 4 + reactos/dll/win32/lsasrv/security.c | 168 ++++++++++++++++++++++++++++ 3 files changed, 197 insertions(+) diff --git a/reactos/dll/win32/lsasrv/lsarpc.c b/reactos/dll/win32/lsasrv/lsarpc.c index b0b8699d62a..8cf1c5c7f70 100644 --- a/reactos/dll/win32/lsasrv/lsarpc.c +++ b/reactos/dll/win32/lsasrv/lsarpc.c @@ -767,6 +767,8 @@ NTSTATUS WINAPI LsarCreateSecret( PLSA_DB_OBJECT PolicyObject; PLSA_DB_OBJECT SecretObject = NULL; LARGE_INTEGER Time; + PSECURITY_DESCRIPTOR SecretSd = NULL; + ULONG SecretSdSize; NTSTATUS Status = STATUS_SUCCESS; /* Validate the PolicyHandle */ @@ -788,6 +790,15 @@ NTSTATUS WINAPI LsarCreateSecret( goto done; } + /* Create a security descriptor for the secret */ + Status = LsapCreateSecretSd(&SecretSd, + &SecretSdSize); + if (!NT_SUCCESS(Status)) + { + ERR("LsapCreateAccountSd returned 0x%08lx\n", Status); + return Status; + } + /* Create the Secret object */ Status = LsapCreateDbObject(PolicyObject, L"Secrets", @@ -817,8 +828,22 @@ NTSTATUS WINAPI LsarCreateSecret( L"OldTime", (PVOID)&Time, sizeof(LARGE_INTEGER)); + if (!NT_SUCCESS(Status)) + { + ERR("LsapSetObjectAttribute (OldTime) failed (Status 0x%08lx)\n", Status); + goto done; + } + + /* Set the SecDesc attribute */ + Status = LsapSetObjectAttribute(SecretObject, + L"SecDesc", + SecretSd, + SecretSdSize); done: + if (SecretSd != NULL) + RtlFreeHeap(RtlGetProcessHeap(), 0, SecretSd); + if (!NT_SUCCESS(Status)) { if (SecretObject != NULL) diff --git a/reactos/dll/win32/lsasrv/lsasrv.h b/reactos/dll/win32/lsasrv/lsasrv.h index 3239376c81f..be20c694e51 100644 --- a/reactos/dll/win32/lsasrv/lsasrv.h +++ b/reactos/dll/win32/lsasrv/lsasrv.h @@ -236,4 +236,8 @@ NTSTATUS LsapCreateAccountSd(PSECURITY_DESCRIPTOR *AccountSd, PULONG AccountSdSize); +NTSTATUS +LsapCreateSecretSd(PSECURITY_DESCRIPTOR *SecretSd, + PULONG SecretSdSize); + /* EOF */ diff --git a/reactos/dll/win32/lsasrv/security.c b/reactos/dll/win32/lsasrv/security.c index b8173b5f0bb..7112470eb50 100644 --- a/reactos/dll/win32/lsasrv/security.c +++ b/reactos/dll/win32/lsasrv/security.c @@ -436,4 +436,172 @@ done: return Status; } + +NTSTATUS +LsapCreateSecretSd(PSECURITY_DESCRIPTOR *SecretSd, + PULONG SecretSdSize) +{ + SECURITY_DESCRIPTOR AbsoluteSd; + PSECURITY_DESCRIPTOR RelativeSd = NULL; + ULONG RelativeSdSize = 0; + PSID AdministratorsSid = NULL; + PSID EveryoneSid = NULL; + PSID LocalSystemSid = NULL; + PACL Dacl = NULL; + ULONG DaclSize; + NTSTATUS Status; + + if (SecretSd == NULL || SecretSdSize == NULL) + return STATUS_INVALID_PARAMETER; + + *SecretSd = NULL; + *SecretSdSize = 0; + + /* Initialize the SD */ + Status = RtlCreateSecurityDescriptor(&AbsoluteSd, + SECURITY_DESCRIPTOR_REVISION); + if (!NT_SUCCESS(Status)) + return Status; + + Status = RtlAllocateAndInitializeSid(&NtAuthority, + 2, + SECURITY_BUILTIN_DOMAIN_RID, + DOMAIN_ALIAS_RID_ADMINS, + 0, + 0, + 0, + 0, + 0, + 0, + &AdministratorsSid); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlAllocateAndInitializeSid(&WorldSidAuthority, + 1, + SECURITY_WORLD_RID, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + &EveryoneSid); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlAllocateAndInitializeSid(&NtAuthority, + 1, + SECURITY_LOCAL_SYSTEM_RID, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + &LocalSystemSid); + if (!NT_SUCCESS(Status)) + goto done; + + /* Allocate and initialize the DACL */ + DaclSize = sizeof(ACL) + + sizeof(ACCESS_ALLOWED_ACE) - sizeof(ULONG) + RtlLengthSid(AdministratorsSid) + + sizeof(ACCESS_ALLOWED_ACE) - sizeof(ULONG) + RtlLengthSid(EveryoneSid); + + Dacl = RtlAllocateHeap(RtlGetProcessHeap(), + HEAP_ZERO_MEMORY, + DaclSize); + if (Dacl == NULL) + { + Status = STATUS_INSUFFICIENT_RESOURCES; + goto done; + } + + Status = RtlCreateAcl(Dacl, + DaclSize, + ACL_REVISION); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlAddAccessAllowedAce(Dacl, + ACL_REVISION, + SECRET_ALL_ACCESS, + AdministratorsSid); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlAddAccessAllowedAce(Dacl, + ACL_REVISION, + SECRET_EXECUTE, + EveryoneSid); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlSetDaclSecurityDescriptor(&AbsoluteSd, + TRUE, + Dacl, + FALSE); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlSetGroupSecurityDescriptor(&AbsoluteSd, + LocalSystemSid, + FALSE); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlSetOwnerSecurityDescriptor(&AbsoluteSd, + AdministratorsSid, + FALSE); + if (!NT_SUCCESS(Status)) + goto done; + + Status = RtlAbsoluteToSelfRelativeSD(&AbsoluteSd, + RelativeSd, + &RelativeSdSize); + if (Status != STATUS_BUFFER_TOO_SMALL) + goto done; + + RelativeSd = RtlAllocateHeap(RtlGetProcessHeap(), + HEAP_ZERO_MEMORY, + RelativeSdSize); + if (RelativeSd == NULL) + { + Status = STATUS_INSUFFICIENT_RESOURCES; + goto done; + } + + Status = RtlAbsoluteToSelfRelativeSD(&AbsoluteSd, + RelativeSd, + &RelativeSdSize); + if (!NT_SUCCESS(Status)) + goto done; + + *SecretSd = RelativeSd; + *SecretSdSize = RelativeSdSize; + +done: + if (Dacl != NULL) + RtlFreeHeap(RtlGetProcessHeap(), 0, Dacl); + + if (AdministratorsSid != NULL) + RtlFreeHeap(RtlGetProcessHeap(), 0, AdministratorsSid); + + if (EveryoneSid != NULL) + RtlFreeHeap(RtlGetProcessHeap(), 0, EveryoneSid); + + if (LocalSystemSid != NULL) + RtlFreeHeap(RtlGetProcessHeap(), 0, LocalSystemSid); + + if (!NT_SUCCESS(Status)) + { + if (RelativeSd != NULL) + RtlFreeHeap(RtlGetProcessHeap(), 0, RelativeSd); + } + + return Status; +} + /* EOF */ From 1cbb837c1ab30f08374fd24c1e29d84a28a6210e Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Thu, 22 Nov 2012 21:25:15 +0000 Subject: [PATCH 19/29] [LSASRV] LsarSetInformationPolicy: Add labels for unimplemented cases. svn path=/trunk/; revision=57745 --- reactos/dll/win32/lsasrv/lsarpc.c | 38 +++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/reactos/dll/win32/lsasrv/lsarpc.c b/reactos/dll/win32/lsasrv/lsarpc.c index 8cf1c5c7f70..61e7106f6f6 100644 --- a/reactos/dll/win32/lsasrv/lsarpc.c +++ b/reactos/dll/win32/lsasrv/lsarpc.c @@ -462,26 +462,54 @@ NTSTATUS WINAPI LsarSetInformationPolicy( switch (InformationClass) { - case PolicyAuditEventsInformation: + case PolicyAuditLogInformation: /* 1 */ Status = STATUS_NOT_IMPLEMENTED; break; - case PolicyPrimaryDomainInformation: + case PolicyAuditEventsInformation: /* 2 */ + Status = STATUS_NOT_IMPLEMENTED; + break; + + case PolicyPrimaryDomainInformation: /* 3 */ Status = LsarSetPrimaryDomain(PolicyHandle, (PLSAPR_POLICY_PRIMARY_DOM_INFO)PolicyInformation); break; - case PolicyAccountDomainInformation: + case PolicyAccountDomainInformation: /* 5 */ Status = LsarSetAccountDomain(PolicyHandle, (PLSAPR_POLICY_ACCOUNT_DOM_INFO)PolicyInformation); break; - case PolicyDnsDomainInformation: + case PolicyLsaServerRoleInformation: /* 6 */ + Status = STATUS_NOT_IMPLEMENTED; + break; + + case PolicyReplicaSourceInformation: /* 7 */ + Status = STATUS_NOT_IMPLEMENTED; + break; + + case PolicyDefaultQuotaInformation: /* 8 */ + Status = STATUS_NOT_IMPLEMENTED; + break; + + case PolicyModificationInformation: /* 9 */ + Status = STATUS_NOT_IMPLEMENTED; + break; + + case PolicyAuditFullSetInformation: /* 10 (0xA) */ + Status = STATUS_NOT_IMPLEMENTED; + break; + + case PolicyDnsDomainInformation: /* 12 (0xC) */ Status = LsarSetDnsDomain(PolicyHandle, (PLSAPR_POLICY_DNS_DOMAIN_INFO)PolicyInformation); break; - case PolicyLsaServerRoleInformation: + case PolicyDnsDomainInformationInt: /* 13 (0xD) */ + Status = STATUS_NOT_IMPLEMENTED; + break; + + case PolicyLocalAccountDomainInformation: /* 14 (0xE) */ Status = STATUS_NOT_IMPLEMENTED; break; From 392231efa4b815dad25e0aeceb16d3e05c85d7cb Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Thu, 22 Nov 2012 22:09:59 +0000 Subject: [PATCH 20/29] [LSASRV] Move set functions to the end of the file. No code changes! svn path=/trunk/; revision=57746 --- reactos/dll/win32/lsasrv/policy.c | 207 +++++++++++++++--------------- 1 file changed, 104 insertions(+), 103 deletions(-) diff --git a/reactos/dll/win32/lsasrv/policy.c b/reactos/dll/win32/lsasrv/policy.c index fe8137235d8..a71691217d1 100644 --- a/reactos/dll/win32/lsasrv/policy.c +++ b/reactos/dll/win32/lsasrv/policy.c @@ -38,109 +38,6 @@ LsaIOpenPolicyTrusted(OUT LSAPR_HANDLE *PolicyHandle) } -NTSTATUS -LsarSetPrimaryDomain(PLSA_DB_OBJECT PolicyObject, - PLSAPR_POLICY_PRIMARY_DOM_INFO Info) -{ - PUNICODE_STRING Buffer; - ULONG Length = 0; - NTSTATUS Status; - LPWSTR Ptr; - - TRACE("(%p %p)\n", PolicyObject, Info); - - Length = sizeof(UNICODE_STRING) + Info->Name.MaximumLength; - Buffer = RtlAllocateHeap(RtlGetProcessHeap(), - 0, - Length); - if (Buffer == NULL) - return STATUS_INSUFFICIENT_RESOURCES; - - Buffer->Length = Info->Name.Length; - Buffer->MaximumLength = Info->Name.MaximumLength; - Buffer->Buffer = (LPWSTR)sizeof(UNICODE_STRING); - Ptr = (LPWSTR)((ULONG_PTR)Buffer + sizeof(UNICODE_STRING)); - memcpy(Ptr, Info->Name.Buffer, Info->Name.MaximumLength); - - Status = LsapSetObjectAttribute(PolicyObject, - L"PolPrDmN", - Buffer, - Length); - - RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer); - - if (!NT_SUCCESS(Status)) - return Status; - - Length = 0; - if (Info->Sid != NULL) - Length = RtlLengthSid(Info->Sid); - - Status = LsapSetObjectAttribute(PolicyObject, - L"PolPrDmS", - (LPBYTE)Info->Sid, - Length); - - return Status; -} - - -NTSTATUS -LsarSetAccountDomain(PLSA_DB_OBJECT PolicyObject, - PLSAPR_POLICY_ACCOUNT_DOM_INFO Info) -{ - PUNICODE_STRING Buffer; - ULONG Length = 0; - NTSTATUS Status; - LPWSTR Ptr; - - TRACE("(%p %p)\n", PolicyObject, Info); - - Length = sizeof(UNICODE_STRING) + Info->DomainName.MaximumLength; - Buffer = RtlAllocateHeap(RtlGetProcessHeap(), - 0, - Length); - if (Buffer == NULL) - return STATUS_INSUFFICIENT_RESOURCES; - - Buffer->Length = Info->DomainName.Length; - Buffer->MaximumLength = Info->DomainName.MaximumLength; - Buffer->Buffer = (LPWSTR)sizeof(UNICODE_STRING); - Ptr = (LPWSTR)((ULONG_PTR)Buffer + sizeof(UNICODE_STRING)); - memcpy(Ptr, Info->DomainName.Buffer, Info->DomainName.MaximumLength); - - Status = LsapSetObjectAttribute(PolicyObject, - L"PolAcDmN", - Buffer, - Length); - - RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer); - - if (!NT_SUCCESS(Status)) - return Status; - - Length = 0; - if (Info->Sid != NULL) - Length = RtlLengthSid(Info->Sid); - - Status = LsapSetObjectAttribute(PolicyObject, - L"PolAcDmS", - (LPBYTE)Info->Sid, - Length); - - return Status; -} - - -NTSTATUS -LsarSetDnsDomain(PLSA_DB_OBJECT PolicyObject, - PLSAPR_POLICY_DNS_DOMAIN_INFO Info) -{ - - return STATUS_NOT_IMPLEMENTED; -} - - NTSTATUS LsarQueryAuditLog(PLSA_DB_OBJECT PolicyObject, PLSAPR_POLICY_INFORMATION *PolicyInformation) @@ -867,4 +764,108 @@ LsarQueryLocalAccountDomain(PLSA_DB_OBJECT PolicyObject, return STATUS_NOT_IMPLEMENTED; } + +NTSTATUS +LsarSetPrimaryDomain(PLSA_DB_OBJECT PolicyObject, + PLSAPR_POLICY_PRIMARY_DOM_INFO Info) +{ + PUNICODE_STRING Buffer; + ULONG Length = 0; + NTSTATUS Status; + LPWSTR Ptr; + + TRACE("(%p %p)\n", PolicyObject, Info); + + Length = sizeof(UNICODE_STRING) + Info->Name.MaximumLength; + Buffer = RtlAllocateHeap(RtlGetProcessHeap(), + 0, + Length); + if (Buffer == NULL) + return STATUS_INSUFFICIENT_RESOURCES; + + Buffer->Length = Info->Name.Length; + Buffer->MaximumLength = Info->Name.MaximumLength; + Buffer->Buffer = (LPWSTR)sizeof(UNICODE_STRING); + Ptr = (LPWSTR)((ULONG_PTR)Buffer + sizeof(UNICODE_STRING)); + memcpy(Ptr, Info->Name.Buffer, Info->Name.MaximumLength); + + Status = LsapSetObjectAttribute(PolicyObject, + L"PolPrDmN", + Buffer, + Length); + + RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer); + + if (!NT_SUCCESS(Status)) + return Status; + + Length = 0; + if (Info->Sid != NULL) + Length = RtlLengthSid(Info->Sid); + + Status = LsapSetObjectAttribute(PolicyObject, + L"PolPrDmS", + (LPBYTE)Info->Sid, + Length); + + return Status; +} + + +NTSTATUS +LsarSetAccountDomain(PLSA_DB_OBJECT PolicyObject, + PLSAPR_POLICY_ACCOUNT_DOM_INFO Info) +{ + PUNICODE_STRING Buffer; + ULONG Length = 0; + NTSTATUS Status; + LPWSTR Ptr; + + TRACE("(%p %p)\n", PolicyObject, Info); + + Length = sizeof(UNICODE_STRING) + Info->DomainName.MaximumLength; + Buffer = RtlAllocateHeap(RtlGetProcessHeap(), + 0, + Length); + if (Buffer == NULL) + return STATUS_INSUFFICIENT_RESOURCES; + + Buffer->Length = Info->DomainName.Length; + Buffer->MaximumLength = Info->DomainName.MaximumLength; + Buffer->Buffer = (LPWSTR)sizeof(UNICODE_STRING); + Ptr = (LPWSTR)((ULONG_PTR)Buffer + sizeof(UNICODE_STRING)); + memcpy(Ptr, Info->DomainName.Buffer, Info->DomainName.MaximumLength); + + Status = LsapSetObjectAttribute(PolicyObject, + L"PolAcDmN", + Buffer, + Length); + + RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer); + + if (!NT_SUCCESS(Status)) + return Status; + + Length = 0; + if (Info->Sid != NULL) + Length = RtlLengthSid(Info->Sid); + + Status = LsapSetObjectAttribute(PolicyObject, + L"PolAcDmS", + (LPBYTE)Info->Sid, + Length); + + return Status; +} + + +NTSTATUS +LsarSetDnsDomain(PLSA_DB_OBJECT PolicyObject, + PLSAPR_POLICY_DNS_DOMAIN_INFO Info) +{ + + return STATUS_NOT_IMPLEMENTED; +} + + /* EOF */ From 80a52b6aa4c75feac878356617af7bad5620454b Mon Sep 17 00:00:00 2001 From: Colin Finck Date: Fri, 23 Nov 2012 11:18:28 +0000 Subject: [PATCH 21/29] Fix Unicode output on the console, broken in 33866, fixed in 34042, broken again in 38185, fixed again in 51058 and finally broken yet another time since 54651... I think this history deserves champagne and forceful warning comments, which have been added. Simple solution: Don't blindly sync Wine code! #resolve #CORE-6495 svn path=/trunk/; revision=57747 --- reactos/lib/sdk/crt/stdio/file.c | 43 ++++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/reactos/lib/sdk/crt/stdio/file.c b/reactos/lib/sdk/crt/stdio/file.c index 7c063754606..e1e045f94fb 100644 --- a/reactos/lib/sdk/crt/stdio/file.c +++ b/reactos/lib/sdk/crt/stdio/file.c @@ -7,6 +7,14 @@ * Ported to ReactOS by Aleksey Bragin (aleksey@reactos.org) */ +/********************************************* + * This file contains ReactOS changes!! + * Don't blindly sync it with Wine code! + * + * If you break Unicode output on the console again, please update this counter: + * int hours_wasted_on_this = 42; + *********************************************/ + /* * msvcrt.dll file functions * @@ -2505,13 +2513,38 @@ size_t CDECL fwrite(const void *ptr, size_t size, size_t nmemb, FILE* file) /********************************************************************* * fputwc (MSVCRT.@) + * FORKED for ReactOS, don't sync with Wine! + * References: + * - http://jira.reactos.org/browse/CORE-6495 + * - http://bugs.winehq.org/show_bug.cgi?id=8598 */ -wint_t CDECL fputwc(wint_t wc, FILE* file) +wint_t CDECL fputwc(wchar_t c, FILE* stream) { - wchar_t mwc=wc; - if (fwrite( &mwc, sizeof(mwc), 1, file) != 1) - return WEOF; - return wc; + /* If this is a real file stream (and not some temporary one for + sprintf-like functions), check whether it is opened in text mode. + In this case, we have to perform an implicit conversion to ANSI. */ + if (!(stream->_flag & _IOSTRG) && get_ioinfo(stream->_file)->wxflag & WX_TEXT) + { + /* Convert to multibyte in text mode */ + char mbc[MB_LEN_MAX]; + int mb_return; + + mb_return = wctomb(mbc, c); + + if(mb_return == -1) + return WEOF; + + /* Output all characters */ + if (fwrite(mbc, mb_return, 1, stream) != 1) + return WEOF; + } + else + { + if (fwrite(&c, sizeof(c), 1, stream) != 1) + return WEOF; + } + + return c; } /********************************************************************* From 010dd80061fc8635e4abe924ee24728773212685 Mon Sep 17 00:00:00 2001 From: Colin Finck Date: Fri, 23 Nov 2012 11:22:46 +0000 Subject: [PATCH 22/29] Revert 57718 svn path=/trunk/; revision=57748 --- reactos/base/applications/sc/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/base/applications/sc/CMakeLists.txt b/reactos/base/applications/sc/CMakeLists.txt index cdfe3f289f5..16fb5a0e1d8 100644 --- a/reactos/base/applications/sc/CMakeLists.txt +++ b/reactos/base/applications/sc/CMakeLists.txt @@ -14,7 +14,7 @@ list(APPEND SOURCE add_executable(sc ${SOURCE}) -set_module_type(sc win32cui) +set_module_type(sc win32cui UNICODE) add_importlibs(sc advapi32 msvcrt kernel32) add_pch(sc sc.h) add_cd_file(TARGET sc DESTINATION reactos/system32 FOR all) From 7cdac802e3462905d961498e0b26a1f29d482933 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Fri, 23 Nov 2012 20:05:35 +0000 Subject: [PATCH 23/29] The console boot switch is really named CONSOLE, not CMDCONS, since r29948. svn path=/trunk/; revision=57750 --- reactos/base/services/umpnpmgr/umpnpmgr.c | 2 +- reactos/base/system/userinit/userinit.c | 2 +- reactos/dll/win32/msgina/msgina.c | 2 +- reactos/dll/win32/syssetup/install.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/reactos/base/services/umpnpmgr/umpnpmgr.c b/reactos/base/services/umpnpmgr/umpnpmgr.c index 2a5697315d9..6acefa85f9f 100644 --- a/reactos/base/services/umpnpmgr/umpnpmgr.c +++ b/reactos/base/services/umpnpmgr/umpnpmgr.c @@ -3025,7 +3025,7 @@ IsConsoleBoot(VOID) if (rc != ERROR_SUCCESS) goto cleanup; - /* Check for CMDCONS in SystemStartOptions */ + /* Check for CONSOLE switch in SystemStartOptions */ CurrentOption = SystemStartOptions; while (CurrentOption) { diff --git a/reactos/base/system/userinit/userinit.c b/reactos/base/system/userinit/userinit.c index 77d81eda7a7..d19dda51cf7 100644 --- a/reactos/base/system/userinit/userinit.c +++ b/reactos/base/system/userinit/userinit.c @@ -114,7 +114,7 @@ BOOL IsConsoleShell(VOID) goto cleanup; } - /* Check for CONSOLE in SystemStartOptions */ + /* Check for CONSOLE switch in SystemStartOptions */ CurrentOption = SystemStartOptions; while (CurrentOption) { diff --git a/reactos/dll/win32/msgina/msgina.c b/reactos/dll/win32/msgina/msgina.c index 9ae65d5091f..1760da70023 100644 --- a/reactos/dll/win32/msgina/msgina.c +++ b/reactos/dll/win32/msgina/msgina.c @@ -108,7 +108,7 @@ ChooseGinaUI(VOID) if (rc != ERROR_SUCCESS) goto cleanup; - /* Check for CMDCONS in SystemStartOptions */ + /* Check for CONSOLE switch in SystemStartOptions */ CurrentOption = SystemStartOptions; while (CurrentOption) { diff --git a/reactos/dll/win32/syssetup/install.c b/reactos/dll/win32/syssetup/install.c index 8b1450cc67d..7e671bbc24b 100644 --- a/reactos/dll/win32/syssetup/install.c +++ b/reactos/dll/win32/syssetup/install.c @@ -558,7 +558,7 @@ IsConsoleBoot(VOID) if (rc != ERROR_SUCCESS) goto cleanup; - /* Check for CMDCONS in SystemStartOptions */ + /* Check for CONSOLE switch in SystemStartOptions */ pwszCurrentOption = pwszSystemStartOptions; while (pwszCurrentOption) { From 0981cdc21604188eeddd29b731695b1b31965ef9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Fri, 23 Nov 2012 20:41:28 +0000 Subject: [PATCH 24/29] [NTOSKRNL] SystemBootDevice should be the ARC-formatted boot device (see what Windows does). svn path=/trunk/; revision=57751 --- reactos/ntoskrnl/config/cmsysini.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/config/cmsysini.c b/reactos/ntoskrnl/config/cmsysini.c index d917dfbd6b9..dc03e96fdb8 100644 --- a/reactos/ntoskrnl/config/cmsysini.c +++ b/reactos/ntoskrnl/config/cmsysini.c @@ -359,9 +359,9 @@ CmpSetSystemValues(IN PLOADER_PARAMETER_BLOCK LoaderBlock) CmpLoadOptions.Length); if (!NT_SUCCESS(Status)) goto Quickie; - /* Setup value name for system boot device */ + /* Setup value name for system boot device in ARC format */ RtlInitUnicodeString(&KeyName, L"SystemBootDevice"); - RtlCreateUnicodeStringFromAsciiz(&ValueName, LoaderBlock->NtBootPathName); + RtlCreateUnicodeStringFromAsciiz(&ValueName, LoaderBlock->ArcBootDeviceName); Status = NtSetValueKey(KeyHandle, &KeyName, 0, From 3f75d107259e249ce03de6145225ad7d96d7037f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Fri, 23 Nov 2012 22:39:12 +0000 Subject: [PATCH 25/29] [FREELDR] When filling LoadOptions, strip the '/' commutator symbol in front of each option. Now we fully comply with Windows when holding LoaderBlock->LoadOptions, and the content of the registry value SystemStartOptions under HKLM\CurrentControlSet\Control display the options without their / symbol. [WIN32K] Now, the SystemStartOptions value doesn't contain / anymore. svn path=/trunk/; revision=57752 --- reactos/boot/freeldr/freeldr/windows/winldr.c | 24 +++++++++++++------ reactos/win32ss/user/ntuser/display.c | 2 +- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/reactos/boot/freeldr/freeldr/windows/winldr.c b/reactos/boot/freeldr/freeldr/windows/winldr.c index 25eaa15ed12..e9d03cfb146 100644 --- a/reactos/boot/freeldr/freeldr/windows/winldr.c +++ b/reactos/boot/freeldr/freeldr/windows/winldr.c @@ -85,9 +85,10 @@ WinLdrInitializePhase1(PLOADER_PARAMETER_BLOCK LoaderBlock, //CHAR SystemRoot[] = "\\WINNT\\"; //CHAR ArcBoot[] = "multi(0)disk(0)rdisk(0)partition(1)"; - CHAR HalPath[] = "\\"; - CHAR ArcBoot[256]; - CHAR MiscFiles[256]; + LPSTR LoadOptions, NewLoadOptions; + CHAR HalPath[] = "\\"; + CHAR ArcBoot[256]; + CHAR MiscFiles[256]; ULONG i; ULONG_PTR PathSeparator; PLOADER_PARAMETER_EXTENSION Extension; @@ -120,9 +121,18 @@ WinLdrInitializePhase1(PLOADER_PARAMETER_BLOCK LoaderBlock, strncpy(LoaderBlock->NtHalPathName, HalPath, MAX_PATH); LoaderBlock->NtHalPathName = PaToVa(LoaderBlock->NtHalPathName); - /* Fill load options */ - LoaderBlock->LoadOptions = WinLdrSystemBlock->LoadOptions; + /* Fill LoadOptions and strip the '/' commutator symbol in front of each option */ + NewLoadOptions = LoadOptions = LoaderBlock->LoadOptions = WinLdrSystemBlock->LoadOptions; strncpy(LoaderBlock->LoadOptions, Options, MAX_OPTIONS_LENGTH); + + do + { + while (*LoadOptions == '/') + ++LoadOptions; + + *NewLoadOptions++ = *LoadOptions; + } while (*LoadOptions++); + LoaderBlock->LoadOptions = PaToVa(LoaderBlock->LoadOptions); /* Arc devices */ @@ -136,8 +146,8 @@ WinLdrInitializePhase1(PLOADER_PARAMETER_BLOCK LoaderBlock, /* Allocate the ARC structure */ ArcDiskSig = HeapAllocate(FrLdrDefaultHeap, - sizeof(ARC_DISK_SIGNATURE_EX), - 'giSD'); + sizeof(ARC_DISK_SIGNATURE_EX), + 'giSD'); /* Copy the data over */ ArcDiskSig->DiskSignature.Signature = reactos_arc_disk_info[i].Signature; diff --git a/reactos/win32ss/user/ntuser/display.c b/reactos/win32ss/user/ntuser/display.c index eb3cdbc7c14..350f49717ff 100644 --- a/reactos/win32ss/user/ntuser/display.c +++ b/reactos/win32ss/user/ntuser/display.c @@ -173,7 +173,7 @@ InitVideo() if (NT_SUCCESS(Status)) { /* Check if VGA mode is requested. */ - if (wcsstr(awcBuffer, L"/BASEVIDEO") != 0) + if (wcsstr(awcBuffer, L"BASEVIDEO") != 0) { ERR("VGA mode requested.\n"); gbBaseVideo = TRUE; From ba30f8c018e8af2d6b55f02d53c5824d576c3f10 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 24 Nov 2012 00:13:10 +0000 Subject: [PATCH 26/29] [LSASRV] - LsarSetInformationPolicy: Add stubs for all missing case. - Implement LsarSetAuditLog and LsarSetDefaultQuota. svn path=/trunk/; revision=57753 --- reactos/dll/win32/lsasrv/lsarpc.c | 67 ++++++++++-------- reactos/dll/win32/lsasrv/lsasrv.h | 36 ++++++++++ reactos/dll/win32/lsasrv/policy.c | 114 ++++++++++++++++++++++++++---- 3 files changed, 175 insertions(+), 42 deletions(-) diff --git a/reactos/dll/win32/lsasrv/lsarpc.c b/reactos/dll/win32/lsasrv/lsarpc.c index 61e7106f6f6..4bb17cedbd9 100644 --- a/reactos/dll/win32/lsasrv/lsarpc.c +++ b/reactos/dll/win32/lsasrv/lsarpc.c @@ -278,7 +278,7 @@ NTSTATUS WINAPI LsarQueryInformationPolicy( POLICY_INFORMATION_CLASS InformationClass, PLSAPR_POLICY_INFORMATION *PolicyInformation) { - PLSA_DB_OBJECT DbObject; + PLSA_DB_OBJECT PolicyObject; ACCESS_MASK DesiredAccess = 0; NTSTATUS Status; @@ -322,74 +322,74 @@ NTSTATUS WINAPI LsarQueryInformationPolicy( Status = LsapValidateDbObject(PolicyHandle, LsaDbPolicyObject, DesiredAccess, - &DbObject); + &PolicyObject); if (!NT_SUCCESS(Status)) return Status; switch (InformationClass) { case PolicyAuditLogInformation: /* 1 */ - Status = LsarQueryAuditLog(PolicyHandle, + Status = LsarQueryAuditLog(PolicyObject, PolicyInformation); break; case PolicyAuditEventsInformation: /* 2 */ - Status = LsarQueryAuditEvents(PolicyHandle, + Status = LsarQueryAuditEvents(PolicyObject, PolicyInformation); break; case PolicyPrimaryDomainInformation: /* 3 */ - Status = LsarQueryPrimaryDomain(PolicyHandle, + Status = LsarQueryPrimaryDomain(PolicyObject, PolicyInformation); break; case PolicyPdAccountInformation: /* 4 */ - Status = LsarQueryPdAccount(PolicyHandle, + Status = LsarQueryPdAccount(PolicyObject, PolicyInformation); break; case PolicyAccountDomainInformation: /* 5 */ - Status = LsarQueryAccountDomain(PolicyHandle, + Status = LsarQueryAccountDomain(PolicyObject, PolicyInformation); break; case PolicyLsaServerRoleInformation: /* 6 */ - Status = LsarQueryServerRole(PolicyHandle, + Status = LsarQueryServerRole(PolicyObject, PolicyInformation); break; case PolicyReplicaSourceInformation: /* 7 */ - Status = LsarQueryReplicaSource(PolicyHandle, + Status = LsarQueryReplicaSource(PolicyObject, PolicyInformation); break; case PolicyDefaultQuotaInformation: /* 8 */ - Status = LsarQueryDefaultQuota(PolicyHandle, + Status = LsarQueryDefaultQuota(PolicyObject, PolicyInformation); break; case PolicyModificationInformation: /* 9 */ - Status = LsarQueryModification(PolicyHandle, + Status = LsarQueryModification(PolicyObject, PolicyInformation); break; case PolicyAuditFullQueryInformation: /* 11 (0xB) */ - Status = LsarQueryAuditFull(PolicyHandle, + Status = LsarQueryAuditFull(PolicyObject, PolicyInformation); break; case PolicyDnsDomainInformation: /* 12 (0xC) */ - Status = LsarQueryDnsDomain(PolicyHandle, + Status = LsarQueryDnsDomain(PolicyObject, PolicyInformation); break; case PolicyDnsDomainInformationInt: /* 13 (0xD) */ - Status = LsarQueryDnsDomainInt(PolicyHandle, + Status = LsarQueryDnsDomainInt(PolicyObject, PolicyInformation); break; case PolicyLocalAccountDomainInformation: /* 14 (0xE) */ - Status = LsarQueryLocalAccountDomain(PolicyHandle, + Status = LsarQueryLocalAccountDomain(PolicyObject, PolicyInformation); break; @@ -408,7 +408,7 @@ NTSTATUS WINAPI LsarSetInformationPolicy( POLICY_INFORMATION_CLASS InformationClass, PLSAPR_POLICY_INFORMATION PolicyInformation) { - PLSA_DB_OBJECT DbObject; + PLSA_DB_OBJECT PolicyObject; ACCESS_MASK DesiredAccess = 0; NTSTATUS Status; @@ -456,61 +456,70 @@ NTSTATUS WINAPI LsarSetInformationPolicy( Status = LsapValidateDbObject(PolicyHandle, LsaDbPolicyObject, DesiredAccess, - &DbObject); + &PolicyObject); if (!NT_SUCCESS(Status)) return Status; switch (InformationClass) { case PolicyAuditLogInformation: /* 1 */ - Status = STATUS_NOT_IMPLEMENTED; + Status = LsarSetAuditLog(PolicyObject, + (PPOLICY_AUDIT_LOG_INFO)PolicyInformation); break; case PolicyAuditEventsInformation: /* 2 */ - Status = STATUS_NOT_IMPLEMENTED; + Status = LsarSetAuditEvents(PolicyObject, + (PLSAPR_POLICY_AUDIT_EVENTS_INFO)PolicyInformation); break; case PolicyPrimaryDomainInformation: /* 3 */ - Status = LsarSetPrimaryDomain(PolicyHandle, + Status = LsarSetPrimaryDomain(PolicyObject, (PLSAPR_POLICY_PRIMARY_DOM_INFO)PolicyInformation); break; case PolicyAccountDomainInformation: /* 5 */ - Status = LsarSetAccountDomain(PolicyHandle, + Status = LsarSetAccountDomain(PolicyObject, (PLSAPR_POLICY_ACCOUNT_DOM_INFO)PolicyInformation); break; case PolicyLsaServerRoleInformation: /* 6 */ - Status = STATUS_NOT_IMPLEMENTED; + Status = LsarSetServerRole(PolicyObject, + (PPOLICY_LSA_SERVER_ROLE_INFO)PolicyInformation); break; case PolicyReplicaSourceInformation: /* 7 */ - Status = STATUS_NOT_IMPLEMENTED; + Status = LsarSetReplicaSource(PolicyObject, + (PPOLICY_LSA_REPLICA_SRCE_INFO)PolicyInformation); break; case PolicyDefaultQuotaInformation: /* 8 */ - Status = STATUS_NOT_IMPLEMENTED; + Status = LsarSetDefaultQuota(PolicyObject, + (PPOLICY_DEFAULT_QUOTA_INFO)PolicyInformation); break; case PolicyModificationInformation: /* 9 */ - Status = STATUS_NOT_IMPLEMENTED; + Status = LsarSetModification(PolicyObject, + (PPOLICY_MODIFICATION_INFO)PolicyInformation); break; case PolicyAuditFullSetInformation: /* 10 (0xA) */ - Status = STATUS_NOT_IMPLEMENTED; + Status = LsarSetAuditFull(PolicyObject, + (PPOLICY_AUDIT_FULL_QUERY_INFO)PolicyInformation); break; case PolicyDnsDomainInformation: /* 12 (0xC) */ - Status = LsarSetDnsDomain(PolicyHandle, + Status = LsarSetDnsDomain(PolicyObject, (PLSAPR_POLICY_DNS_DOMAIN_INFO)PolicyInformation); break; case PolicyDnsDomainInformationInt: /* 13 (0xD) */ - Status = STATUS_NOT_IMPLEMENTED; + Status = LsarSetDnsDomainInt(PolicyObject, + (PLSAPR_POLICY_DNS_DOMAIN_INFO)PolicyInformation); break; case PolicyLocalAccountDomainInformation: /* 14 (0xE) */ - Status = STATUS_NOT_IMPLEMENTED; + Status = LsarSetLocalAccountDomain(PolicyObject, + (PLSAPR_POLICY_ACCOUNT_DOM_INFO)PolicyInformation); break; default: diff --git a/reactos/dll/win32/lsasrv/lsasrv.h b/reactos/dll/win32/lsasrv/lsasrv.h index be20c694e51..8849448f3f4 100644 --- a/reactos/dll/win32/lsasrv/lsasrv.h +++ b/reactos/dll/win32/lsasrv/lsasrv.h @@ -201,6 +201,14 @@ NTSTATUS LsarQueryLocalAccountDomain(PLSA_DB_OBJECT PolicyObject, PLSAPR_POLICY_INFORMATION *PolicyInformation); +NTSTATUS +LsarSetAuditLog(PLSA_DB_OBJECT PolicyObject, + PPOLICY_AUDIT_LOG_INFO Info); + +NTSTATUS +LsarSetAuditEvents(PLSA_DB_OBJECT PolicyObject, + PLSAPR_POLICY_AUDIT_EVENTS_INFO Info); + NTSTATUS LsarSetPrimaryDomain(PLSA_DB_OBJECT PolicyObject, PLSAPR_POLICY_PRIMARY_DOM_INFO Info); @@ -209,10 +217,38 @@ NTSTATUS LsarSetAccountDomain(PLSA_DB_OBJECT PolicyObject, PLSAPR_POLICY_ACCOUNT_DOM_INFO Info); +NTSTATUS +LsarSetServerRole(PLSA_DB_OBJECT PolicyObject, + PPOLICY_LSA_SERVER_ROLE_INFO Info); + +NTSTATUS +LsarSetReplicaSource(PLSA_DB_OBJECT PolicyObject, + PPOLICY_LSA_REPLICA_SRCE_INFO Info); + +NTSTATUS +LsarSetDefaultQuota(PLSA_DB_OBJECT PolicyObject, + PPOLICY_DEFAULT_QUOTA_INFO Info); + +NTSTATUS +LsarSetModification(PLSA_DB_OBJECT PolicyObject, + PPOLICY_MODIFICATION_INFO Info); + +NTSTATUS +LsarSetAuditFull(PLSA_DB_OBJECT PolicyObject, + PPOLICY_AUDIT_FULL_QUERY_INFO Info); + NTSTATUS LsarSetDnsDomain(PLSA_DB_OBJECT PolicyObject, PLSAPR_POLICY_DNS_DOMAIN_INFO Info); +NTSTATUS +LsarSetDnsDomainInt(PLSA_DB_OBJECT PolicyObject, + PLSAPR_POLICY_DNS_DOMAIN_INFO Info); + +NTSTATUS +LsarSetLocalAccountDomain(PLSA_DB_OBJECT PolicyObject, + PLSAPR_POLICY_ACCOUNT_DOM_INFO Info); + /* privileges.c */ NTSTATUS LsarpLookupPrivilegeName(PLUID Value, diff --git a/reactos/dll/win32/lsasrv/policy.c b/reactos/dll/win32/lsasrv/policy.c index a71691217d1..8fe0735e19f 100644 --- a/reactos/dll/win32/lsasrv/policy.c +++ b/reactos/dll/win32/lsasrv/policy.c @@ -422,6 +422,16 @@ LsarQueryServerRole(PLSA_DB_OBJECT PolicyObject, } +NTSTATUS +LsarQueryReplicaSource(PLSA_DB_OBJECT PolicyObject, + PLSAPR_POLICY_INFORMATION *PolicyInformation) +{ + FIXME("\n"); + *PolicyInformation = NULL; + return STATUS_NOT_IMPLEMENTED; +} + + NTSTATUS LsarQueryDefaultQuota(PLSA_DB_OBJECT PolicyObject, PLSAPR_POLICY_INFORMATION *PolicyInformation) @@ -454,16 +464,6 @@ LsarQueryDefaultQuota(PLSA_DB_OBJECT PolicyObject, } -NTSTATUS -LsarQueryReplicaSource(PLSA_DB_OBJECT PolicyObject, - PLSAPR_POLICY_INFORMATION *PolicyInformation) -{ - FIXME("\n"); - *PolicyInformation = NULL; - return STATUS_NOT_IMPLEMENTED; -} - - NTSTATUS LsarQueryModification(PLSA_DB_OBJECT PolicyObject, PLSAPR_POLICY_INFORMATION *PolicyInformation) @@ -765,6 +765,28 @@ LsarQueryLocalAccountDomain(PLSA_DB_OBJECT PolicyObject, } +NTSTATUS +LsarSetAuditLog(PLSA_DB_OBJECT PolicyObject, + PPOLICY_AUDIT_LOG_INFO Info) +{ + TRACE("(%p %p)\n", PolicyObject, Info); + + return LsapSetObjectAttribute(PolicyObject, + L"PolAdtLg", + Info, + sizeof(POLICY_AUDIT_LOG_INFO)); +} + + +NTSTATUS +LsarSetAuditEvents(PLSA_DB_OBJECT PolicyObject, + PLSAPR_POLICY_AUDIT_EVENTS_INFO Info) +{ + FIXME("\n"); + return STATUS_NOT_IMPLEMENTED; +} + + NTSTATUS LsarSetPrimaryDomain(PLSA_DB_OBJECT PolicyObject, PLSAPR_POLICY_PRIMARY_DOM_INFO Info) @@ -860,12 +882,78 @@ LsarSetAccountDomain(PLSA_DB_OBJECT PolicyObject, NTSTATUS -LsarSetDnsDomain(PLSA_DB_OBJECT PolicyObject, - PLSAPR_POLICY_DNS_DOMAIN_INFO Info) +LsarSetServerRole(PLSA_DB_OBJECT PolicyObject, + PPOLICY_LSA_SERVER_ROLE_INFO Info) { - + FIXME("\n"); return STATUS_NOT_IMPLEMENTED; } +NTSTATUS +LsarSetReplicaSource(PLSA_DB_OBJECT PolicyObject, + PPOLICY_LSA_REPLICA_SRCE_INFO Info) +{ + FIXME("\n"); + return STATUS_NOT_IMPLEMENTED; +} + + +NTSTATUS +LsarSetDefaultQuota(PLSA_DB_OBJECT PolicyObject, + PPOLICY_DEFAULT_QUOTA_INFO Info) +{ + TRACE("(%p %p)\n", PolicyObject, Info); + + return LsapSetObjectAttribute(PolicyObject, + L"DefQuota", + Info, + sizeof(POLICY_DEFAULT_QUOTA_INFO)); +} + + +NTSTATUS +LsarSetModification(PLSA_DB_OBJECT PolicyObject, + PPOLICY_MODIFICATION_INFO Info) +{ + FIXME("\n"); + return STATUS_NOT_IMPLEMENTED; +} + + +NTSTATUS +LsarSetAuditFull(PLSA_DB_OBJECT PolicyObject, + PPOLICY_AUDIT_FULL_QUERY_INFO Info) +{ + FIXME("\n"); + return STATUS_NOT_IMPLEMENTED; +} + + +NTSTATUS +LsarSetDnsDomain(PLSA_DB_OBJECT PolicyObject, + PLSAPR_POLICY_DNS_DOMAIN_INFO Info) +{ + FIXME("\n"); + return STATUS_NOT_IMPLEMENTED; +} + + +NTSTATUS +LsarSetDnsDomainInt(PLSA_DB_OBJECT PolicyObject, + PLSAPR_POLICY_DNS_DOMAIN_INFO Info) +{ + FIXME("\n"); + return STATUS_NOT_IMPLEMENTED; +} + + +NTSTATUS +LsarSetLocalAccountDomain(PLSA_DB_OBJECT PolicyObject, + PLSAPR_POLICY_ACCOUNT_DOM_INFO Info) +{ + FIXME("\n"); + return STATUS_NOT_IMPLEMENTED; +} + /* EOF */ From da5ab71deddc54cbf7fa7ebc451ca1b114245938 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sat, 24 Nov 2012 00:53:01 +0000 Subject: [PATCH 27/29] [SERVICES] - (Re-)implement acquiring/releasing driver-loading and unloading privilege (Note: the two privileges have the same name SE_LOAD_DRIVER_NAME). - Rework the SCM initialization code. In particular, acquiring the starting lock MUST BE done BEFORE starting the RPC server, otherwise, a program can try to start a service (and during this operation, the global start lock is acquired by the SCM) DURING the initialization of SCM, and in particular between the call to ScmStartRpcServer and ScmAcquireServiceStartLock. The SCM would then see an already-acquired start lock at this point and would fail to initialize. ==> This commit corrects this behaviour. svn path=/trunk/; revision=57754 --- reactos/base/system/services/driver.c | 73 +++++++++++++++++++++++-- reactos/base/system/services/services.c | 59 ++++++-------------- 2 files changed, 86 insertions(+), 46 deletions(-) diff --git a/reactos/base/system/services/driver.c b/reactos/base/system/services/driver.c index 236657d408f..b8023dcedb9 100644 --- a/reactos/base/system/services/driver.c +++ b/reactos/base/system/services/driver.c @@ -16,6 +16,50 @@ /* FUNCTIONS ****************************************************************/ +static DWORD EnablePrivilege(LPCWSTR lpszPrivilegeName, BOOL bEnablePrivilege) +{ + DWORD dwRet = ERROR_SUCCESS; + HANDLE hToken = NULL; + + if (OpenProcessToken(GetCurrentProcess(), + TOKEN_ADJUST_PRIVILEGES, + &hToken)) + { + TOKEN_PRIVILEGES tp; + + tp.PrivilegeCount = 1; + tp.Privileges[0].Attributes = (bEnablePrivilege ? SE_PRIVILEGE_ENABLED : 0); + + if (LookupPrivilegeValueW(NULL, + lpszPrivilegeName, + &tp.Privileges[0].Luid)) + { + if (AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, NULL)) + { + if (GetLastError() == ERROR_NOT_ALL_ASSIGNED) + dwRet = ERROR_NOT_ALL_ASSIGNED; + } + else + { + dwRet = GetLastError(); + } + } + else + { + dwRet = GetLastError(); + } + + CloseHandle(hToken); + } + else + { + dwRet = GetLastError(); + } + + return dwRet; +} + + DWORD ScmLoadDriver(PSERVICE lpService) { @@ -40,18 +84,28 @@ ScmLoadDriver(PSERVICE lpService) RtlInitUnicodeString(&DriverPath, pszDriverPath); - /* FIXME: Acquire privilege */ - DPRINT(" Path: %wZ\n", &DriverPath); + + /* Acquire driver-loading privilege */ + dwError = EnablePrivilege(SE_LOAD_DRIVER_NAME, TRUE); + if (dwError != ERROR_SUCCESS) + { + /* We encountered a failure, exit properly */ + DPRINT1("SERVICES: Cannot acquire driver-loading privilege, error = %lu\n", dwError); + goto done; + } + Status = NtLoadDriver(&DriverPath); - /* FIXME: Release privilege */ + /* Release driver-loading privilege */ + EnablePrivilege(SE_LOAD_DRIVER_NAME, FALSE); if (!NT_SUCCESS(Status)) { dwError = RtlNtStatusToDosError(Status); } +done: HeapFree(GetProcessHeap(), 0, pszDriverPath); return dwError; @@ -82,17 +136,26 @@ ScmUnloadDriver(PSERVICE lpService) RtlInitUnicodeString(&DriverPath, pszDriverPath); - /* FIXME: Acquire privilege */ + /* Acquire driver-unloading privilege */ + dwError = EnablePrivilege(SE_LOAD_DRIVER_NAME, TRUE); + if (dwError != ERROR_SUCCESS) + { + /* We encountered a failure, exit properly */ + DPRINT1("SERVICES: Cannot acquire driver-unloading privilege, error = %lu\n", dwError); + goto done; + } Status = NtUnloadDriver(&DriverPath); - /* FIXME: Release privilege */ + /* Release driver-unloading privilege */ + EnablePrivilege(SE_LOAD_DRIVER_NAME, FALSE); if (!NT_SUCCESS(Status)) { dwError = RtlNtStatusToDosError(Status); } +done: HeapFree(GetProcessHeap(), 0, pszDriverPath); return dwError; diff --git a/reactos/base/system/services/services.c b/reactos/base/system/services/services.c index ca7401e5fc0..982e0fbdeb3 100644 --- a/reactos/base/system/services/services.c +++ b/reactos/base/system/services/services.c @@ -327,28 +327,6 @@ StartScmNamedPipeThreadListener(VOID) } -VOID FASTCALL -AcquireLoadDriverPrivilege(VOID) -{ - HANDLE hToken; - TOKEN_PRIVILEGES tkp; - - /* Get a token for this process */ - if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) - { - /* Get the LUID for the debug privilege */ - LookupPrivilegeValue(NULL, SE_LOAD_DRIVER_NAME, &tkp.Privileges[0].Luid); - - /* One privilege to set */ - tkp.PrivilegeCount = 1; - tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; - - /* Get the debug privilege for this process */ - AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0); - } -} - - BOOL WINAPI ShutdownHandlerRoutine(DWORD dwCtrlType) { @@ -378,7 +356,7 @@ wWinMain(HINSTANCE hInstance, { HANDLE hScmStartEvent = NULL; SC_RPC_LOCK Lock = NULL; - BOOL bDeleteCriticalSection = FALSE; + BOOL bCanDeleteNamedPipeCriticalSection = FALSE; DWORD dwError; DPRINT("SERVICES: Service Control Manager\n"); @@ -400,6 +378,10 @@ wWinMain(HINSTANCE hInstance, goto done; } + /* Initialize our communication named pipe's critical section */ + ScmInitNamedPipeCriticalSection(); + bCanDeleteNamedPipeCriticalSection = TRUE; + // ScmInitThreadManager(); /* FIXME: more initialization */ @@ -422,12 +404,20 @@ wWinMain(HINSTANCE hInstance, /* Update service database */ ScmGetBootAndSystemDriverState(); - /* Start the RPC server */ - ScmStartRpcServer(); - /* Register service process with CSRSS */ RegisterServicesProcess(GetCurrentProcessId()); + /* Acquire the service start lock until autostart services have been started */ + dwError = ScmAcquireServiceStartLock(TRUE, &Lock); + if (dwError != ERROR_SUCCESS) + { + DPRINT1("SERVICES: failed to acquire the service start lock (Error %lu)\n", dwError); + goto done; + } + + /* Start the RPC server */ + ScmStartRpcServer(); + DPRINT("SERVICES: Initialized.\n"); /* Signal start event */ @@ -439,20 +429,6 @@ wWinMain(HINSTANCE hInstance, /* Wait for the LSA server */ ScmWaitForLsa(); - /* Acquire privileges to load drivers */ - AcquireLoadDriverPrivilege(); - - ScmInitNamedPipeCriticalSection(); - bDeleteCriticalSection = TRUE; - - /* Acquire the service start lock until autostart services have been started */ - dwError = ScmAcquireServiceStartLock(TRUE, &Lock); - if (dwError != ERROR_SUCCESS) - { - DPRINT1("SERVICES: failed to acquire the service start lock (Error %lu)\n", dwError); - goto done; - } - /* Start auto-start services */ ScmAutoStartServices(); @@ -467,7 +443,8 @@ wWinMain(HINSTANCE hInstance, WaitForSingleObject(hScmShutdownEvent, INFINITE); done: - if (bDeleteCriticalSection == TRUE) + /* Delete our communication named pipe's critical section */ + if (bCanDeleteNamedPipeCriticalSection == TRUE) ScmDeleteNamedPipeCriticalSection(); /* Close the shutdown event */ From 3e532bda01534490fcb8c958fce09e46bd584cfd Mon Sep 17 00:00:00 2001 From: Sylvain Petreolle Date: Sat, 24 Nov 2012 01:23:13 +0000 Subject: [PATCH 28/29] Install the vga fonts needed for the Blue driver. svn path=/trunk/; revision=57755 --- reactos/media/vgafonts/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/reactos/media/vgafonts/CMakeLists.txt b/reactos/media/vgafonts/CMakeLists.txt index 9ca1ccac40c..a0987bca31c 100644 --- a/reactos/media/vgafonts/CMakeLists.txt +++ b/reactos/media/vgafonts/CMakeLists.txt @@ -16,4 +16,5 @@ add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/vgafonts.cab add_custom_target(vgafonts DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/vgafonts.cab) -add_cd_file(TARGET vgafonts FILE ${CMAKE_CURRENT_BINARY_DIR}/vgafonts.cab DESTINATION reactos NO_CAB FOR all) \ No newline at end of file +add_cd_file(TARGET vgafonts FILE ${CMAKE_CURRENT_BINARY_DIR}/vgafonts.cab DESTINATION reactos NO_CAB FOR all) +add_cd_file(TARGET vgafonts FILE ${CMAKE_CURRENT_BINARY_DIR}/vgafonts.cab DESTINATION reactos FOR all) \ No newline at end of file From 1279ab0e128e0cf8be143813624c9fbb18b6bd01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sat, 24 Nov 2012 12:40:56 +0000 Subject: [PATCH 29/29] [WIN32CSR] Correct the initialization of text-mode console. svn path=/trunk/; revision=57756 --- reactos/win32ss/user/win32csr/console.c | 34 ++++++++++++++++++------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/reactos/win32ss/user/win32csr/console.c b/reactos/win32ss/user/win32csr/console.c index cfb1eba4d5f..d4a1d7993e8 100644 --- a/reactos/win32ss/user/win32csr/console.c +++ b/reactos/win32ss/user/win32csr/console.c @@ -82,11 +82,11 @@ CsrInitConsole(PCSRSS_CONSOLE Console, int ShowCmd) hInst = GetModuleHandleW(L"win32csr"); if (LoadStringW(hInst,IDS_COMMAND_PROMPT,Title,sizeof(Title)/sizeof(Title[0]))) { - RtlCreateUnicodeString(&Console->Title, Title); + RtlCreateUnicodeString(&Console->Title, Title); } else { - RtlCreateUnicodeString(&Console->Title, L"Command Prompt"); + RtlCreateUnicodeString(&Console->Title, L"Command Prompt"); } Console->ReferenceCount = 0; @@ -131,31 +131,47 @@ CsrInitConsole(PCSRSS_CONSOLE Console, int ShowCmd) /* make console active, and insert into console list */ Console->ActiveBuffer = (PCSRSS_SCREEN_BUFFER) NewBuffer; - if (! GuiMode) + /* + * If we are not in GUI-mode, start the text-mode console. If we fail, + * try to start the GUI-mode console (win32k will automatically switch + * to graphical mode, therefore no additional code is needed). + */ + if (!GuiMode) { + DPRINT1("WIN32CSR: Opening text-mode console\n"); Status = TuiInitConsole(Console); - if (! NT_SUCCESS(Status)) + if (!NT_SUCCESS(Status)) { - DPRINT1("Failed to open text-mode console, switching to gui-mode\n"); + DPRINT1("Failed to open text-mode console, switching to gui-mode, Status = 0x%08lx\n", Status); GuiMode = TRUE; } } - else /* GuiMode */ + + /* + * Try to open the GUI-mode console. Two cases are possible: + * - We are in GUI-mode, therefore GuiMode == TRUE, the previous test-case + * failed and we start GUI-mode console. + * - We are in text-mode, therefore GuiMode == FALSE, the previous test-case + * succeeded BUT we failed at starting text-mode console. Then GuiMode + * was switched to TRUE in order to try to open the console in GUI-mode. + */ + if (GuiMode) { + DPRINT1("WIN32CSR: Opening GUI-mode console\n"); Status = GuiInitConsole(Console, ShowCmd); - if (! NT_SUCCESS(Status)) + if (!NT_SUCCESS(Status)) { HeapFree(Win32CsrApiHeap,0, NewBuffer); RtlFreeUnicodeString(&Console->Title); DeleteCriticalSection(&Console->Lock); CloseHandle(Console->ActiveEvent); - DPRINT1("GuiInitConsole: failed\n"); + DPRINT1("GuiInitConsole: failed, Status = 0x%08lx\n", Status); return Status; } } Status = CsrInitConsoleScreenBuffer(Console, NewBuffer); - if (! NT_SUCCESS(Status)) + if (!NT_SUCCESS(Status)) { ConioCleanupConsole(Console); RtlFreeUnicodeString(&Console->Title);