[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") ); info->windowName = HeapAlloc( GetProcessHeap(), 0, sizeof(L"#65535") );
if (info->windowName != NULL) 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; info->windowNameFree = TRUE;
} }
else else

View file

@ -234,36 +234,24 @@ MsgiUMToKMMessage(PMSG UMMsg, PMSG KMMsg, BOOL Posted)
{ {
PKMDDELPARAM DdeLparam; PKMDDELPARAM DdeLparam;
DdeLparam = HeapAlloc(GetProcessHeap(), 0, sizeof(KMDDELPARAM)); 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; HGLOBAL h = DdeGetPair((HGLOBAL)(ULONG_PTR)DdeLparam->uiHi);
}
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);
if (NULL != h) if (NULL != h)
{ {
GlobalFree((HGLOBAL)(ULONG_PTR)DdeLparam->Value.Packed.uiHi); GlobalFree((HGLOBAL)(ULONG_PTR)DdeLparam->uiHi);
DdeLparam->Value.Packed.uiHi = (UINT_PTR) h; DdeLparam->uiHi = (UINT_PTR) h;
} }
} }
FreeDDElParam(UMMsg->message, UMMsg->lParam); FreeDDElParam(UMMsg->message, UMMsg->lParam);
}
else
{
DdeLparam->Packed = FALSE;
DdeLparam->Value.Unpacked = UMMsg->lParam;
}
KMMsg->lParam = (LPARAM) DdeLparam; KMMsg->lParam = (LPARAM) DdeLparam;
} }
break; break;
@ -376,16 +364,7 @@ MsgiKMToUMMessage(PMSG KMMsg, PMSG UMMsg)
case WM_DDE_ACK: case WM_DDE_ACK:
{ {
PKMDDELPARAM DdeLparam = (PKMDDELPARAM) KMMsg->lParam; PKMDDELPARAM DdeLparam = (PKMDDELPARAM) KMMsg->lParam;
if (DdeLparam->Packed) UMMsg->lParam = PackDDElParam(KMMsg->message, DdeLparam->uiLo, DdeLparam->uiHi);
{
UMMsg->lParam = PackDDElParam(KMMsg->message,
DdeLparam->Value.Packed.uiLo,
DdeLparam->Value.Packed.uiHi);
}
else
{
UMMsg->lParam = DdeLparam->Value.Unpacked;
}
} }
break; break;

View file

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