[Win32k|User32]

- Patch by Shinobu Maehara: fix for kernel-mode/user-mode marshalling of WM_DDE_ACK.

svn path=/trunk/; revision=54396
This commit is contained in:
James Tabor 2011-11-16 16:24:18 +00:00
parent 2e7cf798a9
commit cf1e809fa2
3 changed files with 31 additions and 50 deletions

View file

@ -288,7 +288,7 @@ static const WORD *DIALOG_GetControl32( const WORD *p, DLG_CONTROL_INFO *info,
info->windowName = HeapAlloc( GetProcessHeap(), 0, sizeof(L"#65535") );
if (info->windowName != NULL)
{
swprintf((LPWSTR)info->windowName, L"#%d", GET_WORD(p + 1));
wsprintf((LPWSTR)info->windowName, L"#%d", GET_WORD(p + 1));
info->windowNameFree = TRUE;
}
else

View file

@ -234,36 +234,24 @@ MsgiUMToKMMessage(PMSG UMMsg, PMSG KMMsg, BOOL Posted)
{
PKMDDELPARAM DdeLparam;
DdeLparam = HeapAlloc(GetProcessHeap(), 0, sizeof(KMDDELPARAM));
if (NULL == DdeLparam)
if (NULL == DdeLparam || !UnpackDDElParam(
UMMsg->message, UMMsg->lParam,
&DdeLparam->uiLo, &DdeLparam->uiHi)) return FALSE;
/*
If this is a reply to WM_DDE_EXECUTE then
uiHi will contain a hMem, hence >= 0x10000.
Otherwise, it will be be an atom, a 16-bit value.
*/
if(DdeLparam->uiHi >= 0x10000)
{
return FALSE;
}
if (Posted)
{
DdeLparam->Packed = TRUE;
if (! UnpackDDElParam(UMMsg->message, UMMsg->lParam,
&DdeLparam->Value.Packed.uiLo,
&DdeLparam->Value.Packed.uiHi))
{
return FALSE;
}
if (0 != HIWORD(DdeLparam->Value.Packed.uiHi))
{
/* uiHi should contain a hMem from WM_DDE_EXECUTE */
HGLOBAL h = DdeGetPair((HGLOBAL)(ULONG_PTR)DdeLparam->Value.Packed.uiHi);
HGLOBAL h = DdeGetPair((HGLOBAL)(ULONG_PTR)DdeLparam->uiHi);
if (NULL != h)
{
GlobalFree((HGLOBAL)(ULONG_PTR)DdeLparam->Value.Packed.uiHi);
DdeLparam->Value.Packed.uiHi = (UINT_PTR) h;
GlobalFree((HGLOBAL)(ULONG_PTR)DdeLparam->uiHi);
DdeLparam->uiHi = (UINT_PTR) h;
}
}
FreeDDElParam(UMMsg->message, UMMsg->lParam);
}
else
{
DdeLparam->Packed = FALSE;
DdeLparam->Value.Unpacked = UMMsg->lParam;
}
KMMsg->lParam = (LPARAM) DdeLparam;
}
break;
@ -376,17 +364,8 @@ MsgiKMToUMMessage(PMSG KMMsg, PMSG UMMsg)
case WM_DDE_ACK:
{
PKMDDELPARAM DdeLparam = (PKMDDELPARAM) KMMsg->lParam;
if (DdeLparam->Packed)
{
UMMsg->lParam = PackDDElParam(KMMsg->message,
DdeLparam->Value.Packed.uiLo,
DdeLparam->Value.Packed.uiHi);
UMMsg->lParam = PackDDElParam(KMMsg->message, DdeLparam->uiLo, DdeLparam->uiHi);
}
else
{
UMMsg->lParam = DdeLparam->Value.Unpacked;
}
}
break;
case WM_DDE_EXECUTE:

View file

@ -488,7 +488,7 @@ typedef struct _SBINFOEX
#define WNDS_HASCREATESTRUCTNAME 0X00020000
#define WNDS_SERVERSIDEWINDOWPROC 0x00040000 // Call proc inside win32k.
#define WNDS_ANSIWINDOWPROC 0x00080000
#define WNDS_BEGINGACTIVATED 0x00100000
#define WNDS_BEINGACTIVATED 0x00100000
#define WNDS_HASPALETTE 0x00200000
#define WNDS_PAINTNOTPROCESSED 0x00400000
#define WNDS_SYNCPAINTPENDING 0x00800000
@ -2692,15 +2692,15 @@ NtUserSetCursorContents(
HANDLE Handle,
PICONINFO IconInfo);
#if 0 // Correct type.
BOOL
NTAPI
NtUserSetCursorIconData(
HANDLE Handle,
PBOOL fIcon,
POINT *Hotspot,
HMODULE hModule,
HRSRC hRsrc,
HRSRC hGroupRsrc);
HCURSOR hCursor,
PUNICODE_STRING ModuleName,
PUNICODE_STRING ResourceName,
PCURSORDATA pCursorData);
#endif
DWORD
NTAPI
@ -3178,16 +3178,8 @@ typedef struct tagKMDDEEXECUTEDATA
typedef struct tagKMDDELPARAM
{
BOOL Packed;
union
{
struct
{
UINT_PTR uiLo;
UINT_PTR uiHi;
} Packed;
LPARAM Unpacked;
} Value;
} KMDDELPARAM, *PKMDDELPARAM;
@ -3329,6 +3321,16 @@ NtUserMonitorFromWindow(
IN HWND hWnd,
IN DWORD dwFlags);
BOOL
NTAPI
NtUserSetCursorIconData(
HANDLE Handle,
PBOOL fIcon,
POINT *Hotspot,
HMODULE hModule,
HRSRC hRsrc,
HRSRC hGroupRsrc);
typedef struct _SETSCROLLBARINFO
{
int nTrackPos;