Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

8113 lines
216 KiB

/****************************** Module Header ******************************\
* Module Name: ntcb.h
*
* Copyright (c) 1985 - 1999, Microsoft Corporation
*
* Kernel mode sending stubs
*
* 07-06-91 ScottLu Created.
\***************************************************************************/
/*
* Reserved bit in the Drive Letter bit mask of a
* WM_DEVICECHANGE message for the following wParam
* (DBT_DEVICEREMOVECOMPLETE or DBT_DEVICEARRIVAL)
* If this bit is set, then this message describes a change with
* global drive letters and we should check if the drive letters
* already exist in the receiver's LUID DosDevices.
* If drive letter exists in the user's LUID DosDevices, then
* un-set this drive letter in the msg's bitmask.
*/
#define DBV_FILTER_MSG 0x40000000
// If SERVER is UNICODE
// Copy UNICODE -> UNICODE
// or Copy ANSI -> UNICODE
// prototypes to client side functions only called by these stubs
// ddetrack.c
DWORD _ClientCopyDDEIn1(HANDLE hClient, PINTDDEINFO pi);
VOID _ClientCopyDDEIn2(PINTDDEINFO pi);
HANDLE _ClientCopyDDEOut1(PINTDDEINFO pi);
BOOL xxxClientCopyDDEIn2(PINTDDEINFO pi);
BOOL FixupDdeExecuteIfNecessary(HGLOBAL *phCommands, BOOL fNeedUnicode);
BOOL _ClientCopyDDEOut2(PINTDDEINFO pi);
BOOL _ClientFreeDDEHandle(HANDLE hDDE, DWORD flags);
DWORD _ClientGetDDEFlags(HANDLE hDDE, DWORD flags);
/*
* prototype for checking the drive letters used in the LUID DosDevice
* map. Does not check if the drive letters are used in the Global
* DosDevices
*/
#ifdef RECVSIDE
DWORD GetLUIDDosDrivesOnly();
#endif // RECVSIDE
typedef struct _GENERICHOOKHEADER {
DWORD nCode;
WPARAM wParam;
ULONG_PTR xParam;
PROC xpfnProc;
} GENERICHOOKHEADER, * LPGENERICHOOKHEADER;
#ifdef RECVSIDE
ULONG_PTR CallHookWithSEH(GENERICHOOKHEADER *pmsg, LPVOID pData, LPDWORD pFlags, ULONG_PTR retval) {
try {
retval = (ULONG_PTR)CALLPROC(pmsg->xpfnProc)(
pmsg->nCode,
pmsg->wParam,
pData,
pmsg->xParam);
} except ((*pFlags & HF_GLOBAL) ? W32ExceptionHandler(FALSE, RIP_WARNING) : EXCEPTION_CONTINUE_SEARCH) {
RIPMSG0(RIP_WARNING, "Hook Faulted");
*pFlags |= HF_HOOKFAULTED;
}
return retval;
}
#endif // RECVSIDE
/**************************************************************************\
* fnOUTDWORDDWORD
*
* 14-Aug-1992 mikeke created
\**************************************************************************/
typedef struct _FNOUTDWORDDWORDMSG {
PWND pwnd;
UINT msg;
ULONG_PTR xParam;
PROC xpfnProc;
} FNOUTDWORDDWORDMSG;
#ifdef SENDSIDE
SMESSAGECALL(OUTDWORDDWORD)
{
SETUPPWND(FNOUTDWORDDWORD)
UNREFERENCED_PARAMETER(dwSCMSFlags);
BEGINSEND(FNOUTDWORDDWORD)
LPDWORD lpdwW = (LPDWORD)wParam;
LPDWORD lpdwL = (LPDWORD)lParam;
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
MAKECALL(FNOUTDWORDDWORD);
UNLOCKPWND();
CHECKRETURN();
BEGINCOPYOUT()
try {
*lpdwW = ProbeAndReadUlong((LPDWORD)pcbs->pOutput);
*lpdwL = ProbeAndReadUlong((LPDWORD)pcbs->pOutput + 1);
} except (W32ExceptionHandler(TRUE, RIP_WARNING)) {
MSGERROR();
}
ENDCOPYOUT()
TRACECALLBACKMSG("SfnOUTDWORDDWORD");
ENDSEND(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnOUTDWORDDWORD, FNOUTDWORDDWORDMSG)
{
DWORD adwOut[2];
BEGINRECV(0, adwOut, sizeof(adwOut));
retval = (ULONG_PTR)CALLPROC(CALLDATA(xpfnProc))(
CALLDATA(pwnd),
CALLDATA(msg),
&adwOut[0],
&adwOut[1],
CALLDATA(xParam));
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* fnOUTDWORDINDWORD
*
* 04-May-1993 IanJa created (for MN_FINDMENUWINDOWFROMPOINT)
\**************************************************************************/
typedef struct _FNOUTDWORDINDWORDMSG {
PWND pwnd;
UINT msg;
WPARAM wParam;
LPARAM lParam;
ULONG_PTR xParam;
PROC xpfnProc;
} FNOUTDWORDINDWORDMSG;
#ifdef SENDSIDE
SMESSAGECALL(OUTDWORDINDWORD)
{
SETUPPWND(FNOUTDWORDINDWORD)
UNREFERENCED_PARAMETER(dwSCMSFlags);
BEGINSEND(FNOUTDWORDINDWORD)
LPDWORD lpdwW = (LPDWORD)wParam;
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->lParam = lParam;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
MAKECALL(FNOUTDWORDINDWORD);
UNLOCKPWND();
CHECKRETURN();
BEGINCOPYOUT()
try {
*lpdwW = ProbeAndReadUlong((LPDWORD)pcbs->pOutput);
} except (W32ExceptionHandler(TRUE, RIP_WARNING)) {
MSGERROR();
}
ENDCOPYOUT()
TRACECALLBACKMSG("SfnOUTDWORDINDWORD");
ENDSEND(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnOUTDWORDINDWORD, FNOUTDWORDINDWORDMSG)
{
DWORD dwOut;
BEGINRECV(0, &dwOut, sizeof(dwOut));
retval = (ULONG_PTR)CALLPROC(CALLDATA(xpfnProc))(
CALLDATA(pwnd),
CALLDATA(msg),
&dwOut,
CALLDATA(lParam),
CALLDATA(xParam));
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* fnOPTOUTLPDWORDOPTOUTLPDWORD
*
* 25-Nov-1992 JonPa created
\**************************************************************************/
typedef struct _FNOPTOUTLPDWORDOPTOUTLPDWORDMSG {
PWND pwnd;
UINT msg;
ULONG_PTR xParam;
PROC xpfnProc;
} FNOPTOUTLPDWORDOPTOUTLPDWORDMSG;
#ifdef SENDSIDE
SMESSAGECALL(OPTOUTLPDWORDOPTOUTLPDWORD)
{
SETUPPWND(FNOPTOUTLPDWORDOPTOUTLPDWORD)
UNREFERENCED_PARAMETER(dwSCMSFlags);
BEGINSEND(FNOPTOUTLPDWORDOPTOUTLPDWORD)
LPDWORD lpdwW = (LPDWORD)wParam;
LPDWORD lpdwL = (LPDWORD)lParam;
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
MAKECALL(FNOPTOUTLPDWORDOPTOUTLPDWORD);
UNLOCKPWND();
CHECKRETURN();
BEGINCOPYOUT()
try {
if (lpdwW != NULL)
*lpdwW = ProbeAndReadUlong((LPDWORD)pcbs->pOutput);
if (lpdwL != NULL)
*lpdwL = ProbeAndReadUlong((LPDWORD)pcbs->pOutput + 1);
} except (W32ExceptionHandler(TRUE, RIP_WARNING)) {
MSGERROR();
}
ENDCOPYOUT()
TRACECALLBACKMSG("SfnOPTOUTLPDWORDOPTOUTLPDWORD");
ENDSEND(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnOPTOUTLPDWORDOPTOUTLPDWORD, FNOPTOUTLPDWORDOPTOUTLPDWORDMSG)
{
DWORD adwOut[2];
BEGINRECV(0, adwOut, sizeof(adwOut));
retval = (ULONG_PTR)CALLPROC(CALLDATA(xpfnProc))(
CALLDATA(pwnd),
CALLDATA(msg),
&adwOut[0],
&adwOut[1],
CALLDATA(xParam));
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* fnDWORDOPTINLPMSG
*
* 03-30-92 scottlu Created
\**************************************************************************/
typedef struct _FNDWORDOPTINLPMSGMSG {
PWND pwnd;
UINT msg;
WPARAM wParam;
LPMSG pmsgstruct;
ULONG_PTR xParam;
PROC xpfnProc;
MSG msgstruct;
} FNDWORDOPTINLPMSGMSG;
#ifdef SENDSIDE
SMESSAGECALL(DWORDOPTINLPMSG)
{
SETUPPWND(FNDWORDOPTINLPMSG)
UNREFERENCED_PARAMETER(dwSCMSFlags);
UNREFERENCED_PARAMETER(psms);
BEGINSEND(FNDWORDOPTINLPMSG)
LPMSG pmsgstruct = (LPMSG)lParam;
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
COPYSTRUCTOPT(msgstruct);
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
MAKECALL(FNDWORDOPTINLPMSG);
UNLOCKPWND();
CHECKRETURN();
TRACECALLBACKMSG("SfnDWORDOPTINLPMSG");
ENDSEND(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnDWORDOPTINLPMSG, FNDWORDOPTINLPMSGMSG)
{
BEGINRECV(0, NULL, 0);
retval = (ULONG_PTR)CALLPROC(CALLDATA(xpfnProc))(
CALLDATA(pwnd),
CALLDATA(msg),
CALLDATA(wParam),
PCALLDATAOPT(msgstruct),
CALLDATA(xParam));
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* fnCOPYGLOBALDATA
*
* 6-20-92 Sanfords created
\**************************************************************************/
typedef struct _FNCOPYGLOBALDATAMSG {
CAPTUREBUF CaptureBuf;
DWORD cbSize;
PBYTE pData;
} FNCOPYGLOBALDATAMSG;
#ifdef SENDSIDE
SMESSAGECALL(COPYGLOBALDATA)
{
PBYTE pData = (PBYTE)lParam;
SETUPPWND(FNCOPYGLOBALDATA)
UNREFERENCED_PARAMETER(msg);
UNREFERENCED_PARAMETER(xParam);
UNREFERENCED_PARAMETER(xpfnProc);
UNREFERENCED_PARAMETER(dwSCMSFlags);
UNREFERENCED_PARAMETER(psms);
BEGINSENDCAPTURE(FNCOPYGLOBALDATA, 1, wParam, TRUE)
if (pData == 0) {
MSGERROR();
}
MSGDATA()->cbSize = (DWORD)wParam;
LARGECOPYBYTES(pData, (DWORD)wParam);
LOCKPWND();
MAKECALLCAPTURE(FNCOPYGLOBALDATA);
UNLOCKPWND();
CHECKRETURN();
TRACECALLBACKMSG("SfnCOPYGLOBALDATA");
ENDSENDCAPTURE(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnCOPYGLOBALDATA, FNCOPYGLOBALDATAMSG)
{
PBYTE p;
BEGINRECV(0, NULL, 0);
FIXUPPOINTERS();
retval = (ULONG_PTR)GlobalAlloc(GMEM_MOVEABLE, CALLDATA(cbSize));
if (p = GlobalLock((HANDLE)retval)) {
memcpy(p, (PVOID)CALLDATA(pData), CALLDATA(cbSize));
USERGLOBALUNLOCK((HANDLE)retval);
}
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* fnCOPYDATA
*
* 7-14-92 Sanfords created
\**************************************************************************/
typedef struct _FNCOPYDATAMSG {
CAPTUREBUF CaptureBuf;
PWND pwnd;
UINT msg;
HWND hwndFrom;
BOOL fDataPresent;
COPYDATASTRUCT cds;
ULONG_PTR xParam;
PROC xpfnProc;
} FNCOPYDATAMSG;
#ifdef SENDSIDE
SMESSAGECALL(COPYDATA)
{
HWND hwndFrom = (HWND)wParam;
PCOPYDATASTRUCT pcds = (PCOPYDATASTRUCT)lParam;
DWORD cCapture, cbCapture;
SETUPPWND(FNCOPYDATA)
UNREFERENCED_PARAMETER(dwSCMSFlags);
UNREFERENCED_PARAMETER(psms);
if (pcds == NULL) {
cCapture = cbCapture = 0;
} else {
cCapture = 1;
cbCapture = pcds->cbData;
}
BEGINSENDCAPTURE(FNCOPYDATA, cCapture, cbCapture, TRUE);
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->hwndFrom = hwndFrom;
if (pcds != NULL) {
MSGDATA()->fDataPresent = TRUE;
MSGDATA()->cds = *pcds;
LARGECOPYBYTES2(pcds->lpData, cbCapture, cds.lpData);
} else {
MSGDATA()->fDataPresent = FALSE;
}
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
MAKECALLCAPTURE(FNCOPYDATA);
UNLOCKPWND();
CHECKRETURN();
TRACECALLBACKMSG("SfnCOPYDATA");
ENDSENDCAPTURE(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnCOPYDATA, FNCOPYDATAMSG)
{
BEGINRECV(0, NULL, 0);
FIXUPPOINTERS();
retval = CALLPROC(CALLDATA(xpfnProc))(
CALLDATA(pwnd),
CALLDATA(msg),
CALLDATA(hwndFrom),
CALLDATA(fDataPresent) ? PCALLDATA(cds) : NULL,
CALLDATA(xParam));
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* fnSENTDDEMSG
*
* 11-5-92 Sanfords created
*
* This thunks DDE messages that SHOULD be posted. It will only work for
* WOW apps. This thunking is strictly for WOW compatability. No 32 bit
* app should be allowed to get away with this practice because it opens
* the DDE protocol up to deadlocks.
\**************************************************************************/
typedef struct _FNSENTDDEMSGMSG {
PWND pwnd;
UINT msg;
WPARAM wParam;
LPARAM lParam;
ULONG_PTR xParam;
PROC xpfnProc;
BOOL fIsUnicodeProc;
} FNSENTDDEMSGMSG;
#ifdef SENDSIDE
SMESSAGECALL(SENTDDEMSG)
{
MSG msgs;
SETUPPWND(FNSENTDDEMSG)
UNREFERENCED_PARAMETER(psms);
BEGINSEND(FNSENTDDEMSG)
msg &= ~MSGFLAG_DDE_SPECIAL_SEND;
if (msg & MSGFLAG_DDE_MID_THUNK) {
/*
* complete the thunking here.
*/
msgs.hwnd = HW(pwnd);
msgs.message = msg & ~MSGFLAG_DDE_MID_THUNK;
msgs.wParam = wParam;
msgs.lParam = lParam;
xxxDDETrackGetMessageHook((PMSG)&msgs);
MSGDATA()->pwnd = (PWND)((PBYTE)PW(msgs.hwnd) -
pti->ulClientDelta);
MSGDATA()->msg = msgs.message;
MSGDATA()->wParam = msgs.wParam;
MSGDATA()->lParam = msgs.lParam;
} else {
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
MSGDATA()->lParam = lParam;
}
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
MSGDATA()->fIsUnicodeProc = !(dwSCMSFlags & SCMS_FLAGS_ANSI);
LOCKPWND();
MAKECALL(FNSENTDDEMSG);
UNLOCKPWND();
CHECKRETURN();
TRACECALLBACKMSG("SfnSENTDDEMSG");
ENDSEND(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnSENTDDEMSG, FNSENTDDEMSGMSG)
{
BEGINRECV(0, NULL, 0);
/*
* A DDE message may have been sent via CallWindowProc due to subclassing.
* Since IsWindowUnicode() cannot properly tell what proc a message will
* ultimately reach, we make sure that the Ansi/Unicode form of any
* WM_DDE_EXECUTE data is correct for the documented convention and
* translate it as necessary.
*/
if (CALLDATA(msg) == WM_DDE_EXECUTE) {
BOOL fHandleChanged;
fHandleChanged = FixupDdeExecuteIfNecessary((HGLOBAL *)PCALLDATA(lParam),
CALLDATA(fIsUnicodeProc) &&
IsWindowUnicode((HWND)CALLDATA(wParam)));
/*
* NOTE:
* If the app didn't allocate this DDE memory GMEM_MOVEABLE,
* the fixup may require the handle value to change.
* If this happens things will fall appart when the other side
* or the tracking layer tries to free the old handle value.
*/
UserAssert(!fHandleChanged);
}
retval = (ULONG_PTR)CALLPROC(CALLDATA(xpfnProc))(
CALLDATA(pwnd),
CALLDATA(msg),
CALLDATA(wParam),
CALLDATA(lParam),
CALLDATA(xParam));
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* fnDWORD
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _FNDWORDMSG {
PWND pwnd;
UINT msg;
WPARAM wParam;
LPARAM lParam;
ULONG_PTR xParam;
PROC xpfnProc;
} FNDWORDMSG;
#ifdef SENDSIDE
SMESSAGECALL(DWORD)
{
SETUPPWND(FNDWORD)
UNREFERENCED_PARAMETER(dwSCMSFlags);
UNREFERENCED_PARAMETER(psms);
BEGINSEND(FNDWORD)
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
MSGDATA()->lParam = lParam;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
MAKECALL(FNDWORD);
UNLOCKPWND();
CHECKRETURN();
TRACECALLBACKMSG("SfnDWORD");
ENDSEND(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnDWORD, FNDWORDMSG)
{
BEGINRECV(0, NULL, 0);
retval = (ULONG_PTR)CALLPROC(CALLDATA(xpfnProc))(
CALLDATA(pwnd),
CALLDATA(msg),
CALLDATA(wParam),
CALLDATA(lParam),
CALLDATA(xParam));
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* fnNCDESTROY
*
* 07-24-00 MHamid Created
\**************************************************************************/
typedef struct _FNNCDESTROYMSG {
PWND pwnd;
UINT msg;
WPARAM wParam;
LPARAM lParam;
ULONG_PTR xParam;
PROC xpfnProc;
} FNNCDESTROYMSG;
#ifdef SENDSIDE
SMESSAGECALL(NCDESTROY)
{
SETUPPWND(FNNCDESTROY)
UNREFERENCED_PARAMETER(dwSCMSFlags);
UNREFERENCED_PARAMETER(psms);
BEGINSEND(FNNCDESTROY)
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
MSGDATA()->lParam = lParam;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
MAKECALL(FNNCDESTROY);
pwnd->pActCtx = NULL;
UNLOCKPWND();
CHECKRETURN();
TRACECALLBACKMSG("SfnNCDESTROY");
ENDSEND(LRESULT, 0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnNCDESTROY, FNNCDESTROYMSG)
{
BEGINRECV(0, NULL, 0);
retval = (ULONG_PTR)CALLPROC(CALLDATA(xpfnProc))(
CALLDATA(pwnd),
CALLDATA(msg),
CALLDATA(wParam),
CALLDATA(lParam),
CALLDATA(xParam));
if (CALLDATA(pwnd)->pActCtx) {
RtlReleaseActivationContext(CALLDATA(pwnd)->pActCtx);
}
#ifdef LAME_BUTTON
if (GetProp(HW(CALLDATA(pwnd)), MAKEINTATOM(gatomLameButton)) != NULL) {
UserLocalFree(GetProp(HW(CALLDATA(pwnd)), MAKEINTATOM(gatomLameButton)));
SetProp(HW(CALLDATA(pwnd)), MAKEINTATOM(gatomLameButton), NULL);
}
#endif // LAME_BUTTON
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* fnINWPARAMCHAR
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _FNINWPARAMCHARMSG {
PWND pwnd;
UINT msg;
WPARAM wParam;
LPARAM lParam;
ULONG_PTR xParam;
PROC xpfnProc;
} FNINWPARAMCHARMSG;
#ifdef SENDSIDE
SMESSAGECALL(INWPARAMCHAR)
{
SETUPPWND(FNINWPARAMCHAR)
UNREFERENCED_PARAMETER(psms);
BEGINSEND(FNINWPARAMCHAR)
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
/*
* WM_CHARTOITEM has an index in the hi-word of wParam
*/
if (dwSCMSFlags & SCMS_FLAGS_ANSI) {
if (msg == WM_CHARTOITEM || msg == WM_MENUCHAR) {
WPARAM dwT = wParam & 0xFFFF; // mask of caret pos
RtlWCSMessageWParamCharToMB(msg, &dwT); // convert key portion
UserAssert(HIWORD(dwT) == 0);
wParam = MAKELONG(LOWORD(dwT),HIWORD(wParam)); // rebuild pos & key wParam
} else {
RtlWCSMessageWParamCharToMB(msg, &wParam);
}
}
MSGDATA()->wParam = wParam;
MSGDATA()->lParam = lParam;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
MAKECALL(FNDWORD);
UNLOCKPWND();
CHECKRETURN();
TRACECALLBACKMSG("SfnINWPARAMCHAR");
ENDSEND(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
/*
* The fnDWORD routine is used for this message
*/
#endif // RECVSIDE
/**************************************************************************\
* fnINWPARAMDBCSCHAR
*
* 12-Feb-1996 hideyukn Created
\**************************************************************************/
typedef struct _FNINWPARAMDBCSCHARMSG {
PWND pwnd;
UINT msg;
WPARAM wParam;
LPARAM lParam;
ULONG_PTR xParam;
PROC xpfnProc;
BOOL bAnsi;
} FNINWPARAMDBCSCHARMSG;
#ifdef SENDSIDE
SMESSAGECALL(INWPARAMDBCSCHAR)
{
SETUPPWND(FNINWPARAMDBCSCHAR)
UNREFERENCED_PARAMETER(psms);
BEGINSEND(FNINWPARAMDBCSCHAR)
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->bAnsi = dwSCMSFlags & SCMS_FLAGS_ANSI;
/*
* wParam in WM_CHAR/EM_SETPASSWORDCHAR should be converted to ANSI
* ,if target is ANSI.
*/
if (dwSCMSFlags & SCMS_FLAGS_ANSI) {
RtlWCSMessageWParamCharToMB(msg, &wParam);
}
MSGDATA()->wParam = wParam;
MSGDATA()->lParam = lParam;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
MAKECALL(FNINWPARAMDBCSCHAR);
UNLOCKPWND();
CHECKRETURN();
TRACECALLBACKMSG("SfnINWPARAMDBCSCHAR");
ENDSEND(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINWPARAMDBCSCHAR, FNINWPARAMDBCSCHARMSG)
{
BOOL bAnsiWndProc;
BEGINRECV(0,NULL,0);
bAnsiWndProc = CALLDATA(bAnsi);
if (bAnsiWndProc) {
PKERNEL_MSG pmsgDbcsCB = GetCallBackDbcsInfo();
WPARAM wParam = pmsg->wParam;
BOOL bDbcsMessaging = FALSE;
//
// Check wParam has Dbcs character or not..
//
if (IS_DBCS_MESSAGE(pmsg->wParam)) {
if (pmsg->wParam & WMCR_IR_DBCSCHAR) {
//
// This is reply for WM_IME_REPORT:IR_DBCSCHAR, then
// We send DBCS chararcter at one time...
// (Do not need to send twice for DBCS LeadByte and TrailByte).
//
// Validation for wParam.. (mask off the secret bit).
//
wParam = (pmsg->wParam & 0x0000FFFF);
} else {
//
// Mark the wParam keeps Dbcs character..
//
bDbcsMessaging = TRUE;
//
// Backup current message. this backupped message will be used
// when Apps peek (or get) message from thier WndProc.
// (see GetMessageA(), PeekMessageA()...)
//
// pmsgDbcsCB->hwnd = HW(pmsg->pwnd);
// pmsgDbcsCB->message = pmsg->msg;
// pmsgDbcsCB->wParam = pmsg->wParam;
// pmsgDbcsCB->lParam = pmsg->lParam;
// pmsgDbcsCB->time = pmsg->time;
// pmsgDbcsCB->pt = pmsg->pt;
//
COPY_MSG_TO_KERNELMSG(pmsgDbcsCB,(PMSG)pmsg);
//
// pwnd should be converted to hwnd.
//
pmsgDbcsCB->hwnd = HW(pmsg->pwnd);
//
// DbcsLeadByte will be sent below soon, we just need DbcsTrailByte
// for further usage..
//
pmsgDbcsCB->wParam = (pmsg->wParam & 0x000000FF);
//
// Pass the LeadingByte of the DBCS character to an ANSI WndProc.
//
wParam = (pmsg->wParam & 0x0000FF00) >> 8;
}
}
//
// Forward Dbcs LeadingByte or Sbcs character to Apps WndProc.
//
retval = CALLPROC(CALLDATA(xpfnProc))(
CALLDATA(pwnd),
CALLDATA(msg),
wParam,
CALLDATA(lParam),
CALLDATA(xParam) );
//
// Check we need to send trailing byte or not, if the wParam has Dbcs character.
//
if (bDbcsMessaging && pmsgDbcsCB->wParam) {
//
// If an app didn't peek (or get) the trailing byte from within
// WndProc, and then pass the DBCS TrailingByte to the ANSI WndProc here
// pmsgDbcsCB->wParam has DBCS TrailingByte here.. see above..
//
wParam = KERNEL_WPARAM_TO_WPARAM(pmsgDbcsCB->wParam);
//
// Invalidate cached message.
//
pmsgDbcsCB->wParam = 0;
retval = CALLPROC(CALLDATA(xpfnProc))(
CALLDATA(pwnd),
CALLDATA(msg),
wParam,
CALLDATA(lParam),
CALLDATA(xParam) );
} else {
//
// If an app called Get/PeekMessageA from its
// WndProc, do not do anything.
//
}
} else {
//
// Only LOWORD of WPARAM is valid for WM_CHAR....
// (Mask off DBCS messaging information.)
//
pmsg->wParam &= 0x0000FFFF;
retval = (ULONG_PTR)CALLPROC(pmsg->xpfnProc)(
pmsg->pwnd,
pmsg->msg,
pmsg->wParam,
pmsg->lParam,
pmsg->xParam);
}
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* yyy
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _FNINOUTDRAGMSG {
PWND pwnd;
UINT msg;
WPARAM wParam;
ULONG_PTR xParam;
PROC xpfnProc;
DROPSTRUCT ds;
} FNINOUTDRAGMSG;
#ifdef SENDSIDE
SMESSAGECALL(INOUTDRAG)
{
SETUPPWND(FNINOUTDRAG)
UNREFERENCED_PARAMETER(dwSCMSFlags);
BEGINSEND(FNINOUTDRAG)
LPDROPSTRUCT pds = (LPDROPSTRUCT)lParam;
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
MSGDATA()->ds = *pds;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
MAKECALL(FNINOUTDRAG);
UNLOCKPWND();
CHECKRETURN();
BEGINCOPYOUT()
OUTSTRUCT(pds, DROPSTRUCT);
ENDCOPYOUT()
TRACECALLBACKMSG("SfnINOUTDRAG");
ENDSEND(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINOUTDRAG, FNINOUTDRAGMSG)
{
BEGINRECV(0, &pmsg->ds, sizeof(pmsg->ds));
retval = (ULONG_PTR)CALLPROC(pmsg->xpfnProc)(
pmsg->pwnd,
pmsg->msg,
pmsg->wParam,
&pmsg->ds,
pmsg->xParam);
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* fnGETTEXTLENGTHS
*
* Gets the Unicode & ANSI lengths
* Internally, lParam pints to the ANSI length in bytes and the return value
* is the Unicode length in bytes. However, the public definition is maintained
* on the client side, where lParam is not used and either ANSI or Unicode is
* returned.
*
* 10-Feb-1992 IanJa Created
\**************************************************************************/
typedef struct _FNGETTEXTLENGTHSMSG {
PWND pwnd;
UINT msg;
WPARAM wParam;
ULONG_PTR xParam;
PROC xpfnProc;
} FNGETTEXTLENGTHSMSG;
#ifdef SENDSIDE
SMESSAGECALL(GETTEXTLENGTHS)
{
SETUPPWND(FNGETTEXTLENGTHS)
UNREFERENCED_PARAMETER(lParam);
UNREFERENCED_PARAMETER(dwSCMSFlags);
UNREFERENCED_PARAMETER(psms);
BEGINSEND(FNGETTEXTLENGTHS)
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
MAKECALL(FNGETTEXTLENGTHS);
UNLOCKPWND();
CHECKRETURN();
/*
* ANSI client wndproc returns us cbANSI. We want cchUnicode,
* so we guess cchUnicode = cbANSI. (It may be less if
* multi-byte characters are involved, but it will never be more).
* Save cbANSI in *lParam in case the server ultimately returns
* the length to an ANSI caller.
*
* Unicode client wndproc returns us cchUnicode. If we want to know
* cbANSI, we must guess how many 'ANSI' chars we would need.
* We guess cbANSI = cchUnicode * 2. (It may be this much if all
* 'ANSI' characters are multi-byte, but it will never be more).
*
* Return cchUnicode (server code is all Unicode internally).
* Put cbANSI in *lParam to be passed along within the server in case
* we ultimately need to return it to the client.
*
* NOTE: this will sometimes cause text lengths to be misreported
* up to twice the real length, but that is expected to be harmless.
* This will only * happen if an app sends WM_GETcode TEXTLENGTH to a
* window with an ANSI client-side wndproc, or a ANSI WM_GETTEXTLENGTH
* is sent to a Unicode client-side wndproc.
*/
TRACECALLBACKMSG("SfnGETTEXTLENGTHS");
ENDSEND(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnGETTEXTLENGTHS, FNGETTEXTLENGTHSMSG)
{
BEGINRECV(0, NULL, 0);
retval = (ULONG_PTR)CALLPROC(pmsg->xpfnProc)(
pmsg->pwnd,
pmsg->msg,
pmsg->wParam,
0, // so we don't pass &cbAnsi to apps
pmsg->xParam);
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* yyy
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _FNINLPCREATESTRUCTMSG {
CAPTUREBUF CaptureBuf;
PWND pwnd;
UINT msg;
WPARAM wParam;
LPARAM lParam;
CREATESTRUCT cs;
ULONG_PTR xParam;
PROC xpfnProc;
} FNINLPCREATESTRUCTMSG;
#ifdef SENDSIDE
SMESSAGECALL(INLPCREATESTRUCT)
{
PCREATESTRUCTEX pcreatestruct = (PCREATESTRUCTEX)lParam;
DWORD cbName = 0, cbClass = 0;
DWORD cCapture = 0;
BOOL fAnsiReceiver = (dwSCMSFlags & SCMS_FLAGS_ANSI);
SETUPPWND(FNINLPCREATESTRUCT)
UNREFERENCED_PARAMETER(psms);
/*
* Compute ANSI capture lengths. Don't capture if
* the strings are in the client's address space.
*/
if (pcreatestruct) {
if (pcreatestruct->cs.lpszName &&
((BOOL)pcreatestruct->strName.bAnsi != fAnsiReceiver ||
IS_SYSTEM_ADDRESS((PVOID)pcreatestruct->cs.lpszName))) {
CALC_SIZE_IN(cbName, &pcreatestruct->strName);
cCapture++;
}
if (IS_PTR(pcreatestruct->cs.lpszClass) &&
((BOOL)pcreatestruct->strClass.bAnsi != fAnsiReceiver ||
IS_SYSTEM_ADDRESS((PVOID)pcreatestruct->cs.lpszClass))) {
CALC_SIZE_IN(cbClass, &pcreatestruct->strClass);
cCapture++;
}
}
BEGINSENDCAPTURE(FNINLPCREATESTRUCT, cCapture, cbName + cbClass, TRUE)
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
MSGDATA()->lParam = lParam; // this could be NULL in WOW apps!
if (pcreatestruct != NULL) {
MSGDATA()->cs = pcreatestruct->cs;
// Make it a "Large" copy because it could be an Edit control
if (cbName) {
if (!pcreatestruct->strName.bAnsi) {
WORD wOrdinal;
try {
wOrdinal = *(PWORD)pcreatestruct->cs.lpszName;
} except (W32ExceptionHandler(TRUE, RIP_WARNING)) {
goto errorexit;
}
if (wOrdinal == 0xffff) {
/*
* Copy out an ordinal of the form 0xffff, ID.
* If the receiver is ANSI, skip the first 0xff.
*/
if (fAnsiReceiver) {
if (!NT_SUCCESS(CaptureCallbackData(&mp->CaptureBuf,
(PBYTE)pcreatestruct->cs.lpszName + 1,
3, (PVOID *)&mp->cs.lpszName)))
goto errorexit;
} else {
if (!NT_SUCCESS(CaptureCallbackData(&mp->CaptureBuf,
(PBYTE)pcreatestruct->cs.lpszName,
4, (PVOID *)&mp->cs.lpszName)))
goto errorexit;
}
} else if (fAnsiReceiver) {
LARGECOPYSTRINGLPWSTRA(&pcreatestruct->strName, cs.lpszName);
} else {
LARGECOPYSTRINGLPWSTR(&pcreatestruct->strName, cs.lpszName);
}
} else {
BYTE bOrdinal;
try {
bOrdinal = *(PBYTE)pcreatestruct->cs.lpszName;
} except (W32ExceptionHandler(TRUE, RIP_WARNING)) {
goto errorexit;
}
if (bOrdinal == 0xff) {
/*
* Copy out an ordinal of the form 0xff, ID.
* If the receiver is UNICODE, expand the 0xff to 0xffff.
*/
if (fAnsiReceiver) {
if (!NT_SUCCESS(CaptureCallbackData(&mp->CaptureBuf,
(PBYTE)pcreatestruct->cs.lpszName,
3, (PVOID *)&mp->cs.lpszName)))
goto errorexit;
} else {
DWORD dwOrdinal;
try {
dwOrdinal = MAKELONG(0xffff,
(*(DWORD UNALIGNED *)pcreatestruct->cs.lpszName >> 8));
} except (W32ExceptionHandler(TRUE, RIP_WARNING)) {
goto errorexit;
}
if (!NT_SUCCESS(CaptureCallbackData(&mp->CaptureBuf,
&dwOrdinal,
4, (PVOID *)&mp->cs.lpszName)))
goto errorexit;
}
} else if (fAnsiReceiver) {
LARGECOPYSTRINGLPSTR(&pcreatestruct->strName, cs.lpszName);
} else {
LARGECOPYSTRINGLPSTRW(&pcreatestruct->strName, cs.lpszName);
}
}
}
if (cbClass) {
if (!pcreatestruct->strClass.bAnsi) {
if (fAnsiReceiver) {
LARGECOPYSTRINGLPWSTRA(&pcreatestruct->strClass, cs.lpszClass);
} else {
LARGECOPYSTRINGLPWSTR(&pcreatestruct->strClass, cs.lpszClass);
}
} else {
if (fAnsiReceiver) {
LARGECOPYSTRINGLPSTR(&pcreatestruct->strClass, cs.lpszClass);
} else {
LARGECOPYSTRINGLPSTRW(&pcreatestruct->strClass, cs.lpszClass);
}
}
}
}
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
MAKECALLCAPTURE(FNINLPCREATESTRUCT);
UNLOCKPWND();
CHECKRETURN();
TRACECALLBACKMSG("SfnINLPCREATESTRUCT");
ENDSENDCAPTURE(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINLPCREATESTRUCT, FNINLPCREATESTRUCTMSG)
{
LPARAM lParam;
BEGINRECV(0, NULL, 0);
FIXUPPOINTERS();
if (pmsg->lParam != 0) {
if ((ULONG_PTR)pmsg->cs.lpszName > gHighestUserAddress)
pmsg->cs.lpszName = REBASEPTR(pmsg->pwnd, pmsg->cs.lpszName);
if ((ULONG_PTR)pmsg->cs.lpszClass > gHighestUserAddress)
pmsg->cs.lpszClass = REBASEPTR(pmsg->pwnd, pmsg->cs.lpszClass);
lParam = (LPARAM)&pmsg->cs;
if ((pmsg->cs.lpCreateParams != NULL) &&
(TestWF(pmsg->pwnd, WEFMDICHILD))) {
// Note -- do not test the flag in cs.dwExStyle -- it gets zapped for Old UI apps, like Quicken
((LPMDICREATESTRUCT)(pmsg->cs.lpCreateParams))->szClass = pmsg->cs.lpszClass;
((LPMDICREATESTRUCT)(pmsg->cs.lpCreateParams))->szTitle = pmsg->cs.lpszName;
}
} else
lParam = 0;
retval = (ULONG_PTR)CALLPROC(pmsg->xpfnProc)(
pmsg->pwnd,
pmsg->msg,
pmsg->wParam,
lParam,
pmsg->xParam);
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* fnINLPMDICREATESTRUCT
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _FNINLPMDICREATESTRUCTMSG {
CAPTUREBUF CaptureBuf;
PWND pwnd;
UINT msg;
WPARAM wParam;
MDICREATESTRUCT mdics;
ULONG_PTR xParam;
PROC xpfnProc;
int szClass;
int szTitle;
} FNINLPMDICREATESTRUCTMSG;
#ifdef SENDSIDE
SMESSAGECALL(INLPMDICREATESTRUCT)
{
PMDICREATESTRUCTEX pmdicreatestruct = (PMDICREATESTRUCTEX)lParam;
DWORD cbTitle = 0, cbClass = 0;
DWORD cCapture = 0;
BOOL fAnsiReceiver = (dwSCMSFlags & SCMS_FLAGS_ANSI);
SETUPPWND(FNINLPMDICREATESTRUCT)
UNREFERENCED_PARAMETER(psms);
/*
* Compute ANSI capture lengths. Don't capture if
* the strings are in the client's address space and
* are Unicode.
*/
if (pmdicreatestruct->mdics.szTitle &&
(IS_SYSTEM_ADDRESS((PVOID)pmdicreatestruct->mdics.szTitle) ||
((BOOL)pmdicreatestruct->strTitle.bAnsi != fAnsiReceiver))) {
CALC_SIZE_IN(cbTitle, &pmdicreatestruct->strTitle);
cCapture = 1;
}
if (IS_PTR(pmdicreatestruct->mdics.szClass) &&
(IS_SYSTEM_ADDRESS((PVOID)pmdicreatestruct->mdics.szClass) ||
((BOOL)pmdicreatestruct->strClass.bAnsi != fAnsiReceiver))) {
CALC_SIZE_IN(cbClass, &pmdicreatestruct->strClass);
cCapture++;
}
BEGINSENDCAPTURE(FNINLPMDICREATESTRUCT, cCapture, cbTitle + cbClass, TRUE)
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
MSGDATA()->mdics = pmdicreatestruct->mdics;
if (cbTitle) {
if (!pmdicreatestruct->strTitle.bAnsi) {
if (fAnsiReceiver) {
LARGECOPYSTRINGLPWSTRA(&pmdicreatestruct->strTitle, mdics.szTitle);
} else {
LARGECOPYSTRINGLPWSTR(&pmdicreatestruct->strTitle, mdics.szTitle);
}
} else {
if (fAnsiReceiver) {
LARGECOPYSTRINGLPSTR(&pmdicreatestruct->strTitle, mdics.szTitle);
} else {
LARGECOPYSTRINGLPSTRW(&pmdicreatestruct->strTitle, mdics.szTitle);
}
}
}
if (cbClass) {
if (!pmdicreatestruct->strClass.bAnsi) {
if (fAnsiReceiver) {
LARGECOPYSTRINGLPWSTRA(&pmdicreatestruct->strClass, mdics.szClass);
} else {
LARGECOPYSTRINGLPWSTR(&pmdicreatestruct->strClass, mdics.szClass);
}
} else {
if (fAnsiReceiver) {
LARGECOPYSTRINGLPSTR(&pmdicreatestruct->strClass, mdics.szClass);
} else {
LARGECOPYSTRINGLPSTRW(&pmdicreatestruct->strClass, mdics.szClass);
}
}
}
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
MAKECALLCAPTURE(FNINLPMDICREATESTRUCT);
UNLOCKPWND();
CHECKRETURN();
TRACECALLBACKMSG("SfnINLPMDICREATESTRUCT");
ENDSENDCAPTURE(LRESULT,0);
DBG_UNREFERENCED_PARAMETER(wParam);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINLPMDICREATESTRUCT, FNINLPMDICREATESTRUCTMSG)
{
BEGINRECV(0, NULL, 0);
FIXUPPOINTERS();
retval = (ULONG_PTR)CALLPROC(pmsg->xpfnProc)(
pmsg->pwnd,
pmsg->msg,
pmsg->wParam,
&pmsg->mdics,
pmsg->xParam);
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* fnINPAINTCLIPBRD
*
* lParam is a supposed to be a Global Handle to DDESHARE memory.
*
* 22-Jul-1991 johnc Created
\**************************************************************************/
typedef struct _FNINPAINTCLIPBRDMSG {
PWND pwnd;
UINT msg;
WPARAM wParam;
PAINTSTRUCT ps;
ULONG_PTR xParam;
PROC xpfnProc;
} FNINPAINTCLIPBRDMSG;
#ifdef SENDSIDE
SMESSAGECALL(INPAINTCLIPBRD)
{
PWND pwndDCOwner;
/*
* We need to check clipboard access rights because the app could
* get the clipboard owner's window handle by enumeration etc and
* send this message
*/
SETUPPWND(FNINPAINTCLIPBRD)
UNREFERENCED_PARAMETER(dwSCMSFlags);
UNREFERENCED_PARAMETER(psms);
BEGINSEND(FNINPAINTCLIPBRD)
LPPAINTSTRUCT pps = (LPPAINTSTRUCT)lParam;
if (RtlAreAllAccessesGranted(PpiCurrent()->amwinsta,
WINSTA_ACCESSCLIPBOARD)) {
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
MSGDATA()->ps = *pps;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
/*
* We can't just set the owner of the DC and pass the original DC
* because currently GDI won't let you query the current owner
* and we don't know if it is a public or privately owned DC
*/
pwndDCOwner = _WindowFromDC(pps->hdc);
MSGDATA()->ps.hdc = _GetDC(pwndDCOwner);
LOCKPWND();
MAKECALL(FNINPAINTCLIPBRD);
UNLOCKPWND();
CHECKRETURN();
_ReleaseDC(MSGDATA()->ps.hdc);
}
TRACECALLBACKMSG("SfnINPAINTCLIPBRD");
ENDSEND(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINPAINTCLIPBRD, FNINPAINTCLIPBRDMSG)
{
LPPAINTSTRUCT lpps;
BEGINRECV(0, NULL, 0);
lpps = (LPPAINTSTRUCT)GlobalAlloc(GMEM_FIXED | GMEM_DDESHARE, sizeof(PAINTSTRUCT));
UserAssert(lpps);
if (lpps) {
*lpps = pmsg->ps;
UserAssert(lpps->hdc);
retval = (ULONG_PTR)CALLPROC(pmsg->xpfnProc)(
pmsg->pwnd,
pmsg->msg,
pmsg->wParam,
lpps,
pmsg->xParam);
GlobalFree((HGLOBAL)lpps);
}
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* fnINSIZECLIPBRD
*
* lParam is a supposed to be a Global Handle to DDESHARE memory.
*
* 11-Jun-1992 sanfords Created
\**************************************************************************/
typedef struct _FNINSIZECLIPBRDMSG {
PWND pwnd;
UINT msg;
WPARAM wParam;
RECT rc;
ULONG_PTR xParam;
PROC xpfnProc;
} FNINSIZECLIPBRDMSG;
#ifdef SENDSIDE
SMESSAGECALL(INSIZECLIPBRD)
{
/*
* We need to check clipboard access rights because the app could
* get the clipboard owner's window handle by enumeration etc and
* send this message
*/
SETUPPWND(FNINSIZECLIPBRD)
UNREFERENCED_PARAMETER(dwSCMSFlags);
UNREFERENCED_PARAMETER(psms);
BEGINSEND(FNINSIZECLIPBRD)
LPRECT prc = (LPRECT)lParam;
if (RtlAreAllAccessesGranted(PpiCurrent()->amwinsta,
WINSTA_ACCESSCLIPBOARD)) {
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
MSGDATA()->rc = *prc;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
MAKECALL(FNINSIZECLIPBRD);
UNLOCKPWND();
CHECKRETURN();
}
TRACECALLBACKMSG("SfnINSIZECLIPBRD");
ENDSEND(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINSIZECLIPBRD, FNINSIZECLIPBRDMSG)
{
LPRECT lprc;
BEGINRECV(0, NULL, 0);
lprc = (LPRECT)GlobalAlloc(GMEM_FIXED | GMEM_DDESHARE, sizeof(RECT));
UserAssert(lprc);
if (lprc) {
*lprc = pmsg->rc;
retval = (ULONG_PTR)CALLPROC(pmsg->xpfnProc)(
pmsg->pwnd,
pmsg->msg,
pmsg->wParam,
lprc,
pmsg->xParam);
GlobalFree((HGLOBAL)lprc);
}
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* fnINDESTROYCLIPBRD
*
* Special handler so we can call ClientEmptyClipboard on client
*
* 01-16-93 scottlu Created
\**************************************************************************/
typedef struct _FNINDESTROYCLIPBRDMSG {
PWND pwnd;
UINT msg;
WPARAM wParam;
LPARAM lParam;
ULONG_PTR xParam;
PROC xpfnProc;
} FNINDESTROYCLIPBRDMSG;
#ifdef SENDSIDE
SMESSAGECALL(INDESTROYCLIPBRD)
{
SETUPPWND(FNINDESTROYCLIPBRD)
UNREFERENCED_PARAMETER(dwSCMSFlags);
UNREFERENCED_PARAMETER(psms);
BEGINSEND(FNINDESTROYCLIPBRD)
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
MSGDATA()->lParam = lParam;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
MAKECALL(FNINDESTROYCLIPBRD);
UNLOCKPWND();
CHECKRETURN();
TRACECALLBACKMSG("SfnINDESTROYCLIPBRD");
ENDSEND(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINDESTROYCLIPBRD, FNINDESTROYCLIPBRDMSG)
{
void ClientEmptyClipboard(void);
BEGINRECV(0, NULL, 0);
retval = (ULONG_PTR)CALLPROC(pmsg->xpfnProc)(
pmsg->pwnd,
pmsg->msg,
pmsg->wParam,
pmsg->lParam,
pmsg->xParam);
/*
* Now empty the client side clipboard cache.
* Don't do this if this is a 16bit app. We don't want to clear out the
* clipboard just because one app is going away. All of the 16bit apps
* share one clipboard.
*/
if ((GetClientInfo()->CI_flags & CI_16BIT) == 0) {
ClientEmptyClipboard();
}
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* yyy
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _FNINOUTLPSCROLLINFOMSG {
PWND pwnd;
UINT msg;
WPARAM wParam;
SCROLLINFO info;
ULONG_PTR xParam;
PROC xpfnProc;
} FNINOUTLPSCROLLINFOMSG;
#ifdef SENDSIDE
SMESSAGECALL(INOUTLPSCROLLINFO)
{
SETUPPWND(FNINOUTLPSCROLLINFO)
UNREFERENCED_PARAMETER(dwSCMSFlags);
BEGINSEND(FNINOUTLPSCROLLINFO)
LPSCROLLINFO pinfo = (LPSCROLLINFO)lParam;
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
MSGDATA()->info = *pinfo;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
MAKECALL(FNINOUTLPSCROLLINFO);
UNLOCKPWND();
CHECKRETURN();
BEGINCOPYOUT()
OUTSTRUCT(pinfo, SCROLLINFO);
ENDCOPYOUT()
TRACECALLBACKMSG("SfnINOUTLPSCROLLINFO");
ENDSEND(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINOUTLPSCROLLINFO, FNINOUTLPSCROLLINFOMSG)
{
BEGINRECV(0, &pmsg->info, sizeof(pmsg->info));
retval = (ULONG_PTR)CALLPROC(pmsg->xpfnProc)(
pmsg->pwnd,
pmsg->msg,
pmsg->wParam,
&pmsg->info,
pmsg->xParam);
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* yyy
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _FNINOUTLPPOINT5MSG {
PWND pwnd;
UINT msg;
WPARAM wParam;
POINT5 point5;
ULONG_PTR xParam;
PROC xpfnProc;
} FNINOUTLPPOINT5MSG;
#ifdef SENDSIDE
SMESSAGECALL(INOUTLPPOINT5)
{
SETUPPWND(FNINOUTLPPOINT5)
UNREFERENCED_PARAMETER(dwSCMSFlags);
BEGINSEND(FNINOUTLPPOINT5)
LPPOINT5 ppoint5 = (LPPOINT5)lParam;
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
MSGDATA()->point5 = *ppoint5;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
MAKECALL(FNINOUTLPPOINT5);
UNLOCKPWND();
CHECKRETURN();
BEGINCOPYOUT()
OUTSTRUCT(ppoint5, POINT5);
ENDCOPYOUT()
TRACECALLBACKMSG("SfnINOUTLPPOINT5");
ENDSEND(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINOUTLPPOINT5, FNINOUTLPPOINT5MSG)
{
BEGINRECV(0, &pmsg->point5, sizeof(POINT5));
retval = (ULONG_PTR)CALLPROC(pmsg->xpfnProc)(
pmsg->pwnd,
pmsg->msg,
pmsg->wParam,
&pmsg->point5,
pmsg->xParam);
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* yyy
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _FNINOUTLPRECTMSG {
PWND pwnd;
UINT msg;
WPARAM wParam;
RECT rect;
ULONG_PTR xParam;
PROC xpfnProc;
} FNINOUTLPRECTMSG;
#ifdef SENDSIDE
SMESSAGECALL(INOUTLPRECT)
{
SETUPPWND(FNINOUTLPRECT)
UNREFERENCED_PARAMETER(dwSCMSFlags);
BEGINSEND(FNINOUTLPRECT)
LPRECT prect = (LPRECT)lParam;
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
MSGDATA()->rect = *prect;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
MAKECALL(FNINOUTLPRECT);
UNLOCKPWND();
CHECKRETURN();
BEGINCOPYOUT()
OUTSTRUCT(prect, RECT);
ENDCOPYOUT()
TRACECALLBACKMSG("SfnINOUTLPRECT");
ENDSEND(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINOUTLPRECT, FNINOUTLPRECTMSG)
{
BEGINRECV(0, &pmsg->rect, sizeof(pmsg->rect));
retval = (ULONG_PTR)CALLPROC(pmsg->xpfnProc)(
pmsg->pwnd,
pmsg->msg,
pmsg->wParam,
&pmsg->rect,
pmsg->xParam);
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* yyy
*
* 11-25-92 ScottLu Created.
\**************************************************************************/
typedef struct _FNINOUTNCCALCSIZEMSG {
PWND pwnd;
UINT msg;
WPARAM wParam;
ULONG_PTR xParam;
PROC xpfnProc;
union {
RECT rc;
struct {
NCCALCSIZE_PARAMS params;
WINDOWPOS pos;
} p;
} u;
} FNINOUTNCCALCSIZEMSG;
typedef struct _OUTNCCALCSIZE {
NCCALCSIZE_PARAMS params;
WINDOWPOS pos;
} OUTNCCALCSIZE, *POUTNCCALCSIZE;
#ifdef SENDSIDE
SMESSAGECALL(INOUTNCCALCSIZE)
{
SETUPPWND(FNINOUTNCCALCSIZE)
UNREFERENCED_PARAMETER(dwSCMSFlags);
BEGINSEND(FNINOUTNCCALCSIZE)
LPWINDOWPOS lppos;
UINT cbCallback;
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
/*
* If wParam != 0, lParam points to a NCCALCSIZE_PARAMS structure,
* otherwise it points to a rectangle.
*/
if (wParam != 0) {
MSGDATA()->u.p.params = *((LPNCCALCSIZE_PARAMS)lParam);
MSGDATA()->u.p.pos = *(MSGDATA()->u.p.params.lppos);
cbCallback = sizeof(FNINOUTNCCALCSIZEMSG);
} else {
MSGDATA()->u.rc = *((LPRECT)lParam);
cbCallback = FIELD_OFFSET(FNINOUTNCCALCSIZEMSG, u) +
sizeof(RECT);
}
/*
* Don't use the MAKECALL macro so we can
* select the callback data size
*/
LOCKPWND();
LeaveCrit();
Status = (DWORD)KeUserModeCallback(
FI_FNINOUTNCCALCSIZE,
mp,
cbCallback,
&pcbs,
&cbCBStatus);
EnterCrit();
UNLOCKPWND();
CHECKRETURN();
BEGINCOPYOUT()
try {
ProbeForRead(pcbs->pOutput, pcbs->cbOutput, sizeof(DWORD));
if (wParam != 0) {
lppos = ((LPNCCALCSIZE_PARAMS)lParam)->lppos;
*((LPNCCALCSIZE_PARAMS)lParam) =
((POUTNCCALCSIZE)pcbs->pOutput)->params;
*lppos = ((POUTNCCALCSIZE)pcbs->pOutput)->pos;
((LPNCCALCSIZE_PARAMS)lParam)->lppos = lppos;
} else {
*((LPRECT)lParam) = *(PRECT)pcbs->pOutput;
}
} except (W32ExceptionHandler(TRUE, RIP_WARNING)) {
MSGERROR();
}
ENDCOPYOUT()
TRACECALLBACKMSG("SfnINOUTNCCALCSIZE");
ENDSEND(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINOUTNCCALCSIZE, FNINOUTNCCALCSIZEMSG)
{
BEGINRECV(0, &pmsg->u, sizeof(pmsg->u));
if (CALLDATA(wParam) != 0)
CALLDATA(u.p.params).lppos = PCALLDATA(u.p.pos);
retval = (ULONG_PTR)CALLPROC(pmsg->xpfnProc)(
pmsg->pwnd,
pmsg->msg,
pmsg->wParam,
(LPARAM)&pmsg->u,
pmsg->xParam);
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* yyy
*
* 9/30/94 Sanfords created
\**************************************************************************/
typedef struct _FNINOUTSTYLECHANGEMSG {
PWND pwnd;
UINT msg;
WPARAM wParam;
STYLESTRUCT ss;
ULONG_PTR xParam;
PROC xpfnProc;
} FNINOUTSTYLECHANGEMSG;
#ifdef SENDSIDE
SMESSAGECALL(INOUTSTYLECHANGE)
{
SETUPPWND(FNINOUTSTYLECHANGE)
UNREFERENCED_PARAMETER(dwSCMSFlags);
UNREFERENCED_PARAMETER(psms);
BEGINSEND(FNINOUTSTYLECHANGE)
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
MSGDATA()->ss = *((LPSTYLESTRUCT)lParam);
LOCKPWND();
MAKECALL(FNINOUTSTYLECHANGE);
UNLOCKPWND();
CHECKRETURN();
if (msg == WM_STYLECHANGING)
OUTSTRUCT(((LPSTYLESTRUCT)lParam), STYLESTRUCT);
TRACECALLBACKMSG("SfnINOUTSTYLECHANGE");
ENDSEND(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINOUTSTYLECHANGE, FNINOUTSTYLECHANGEMSG)
{
BEGINRECV(0, &pmsg->ss, sizeof(pmsg->ss));
retval = (ULONG_PTR)CALLPROC(CALLDATA(xpfnProc))(
CALLDATA(pwnd),
CALLDATA(msg),
CALLDATA(wParam),
(LPARAM)&pmsg->ss,
pmsg->xParam);
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* yyy
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _FNOUTLPRECTMSG {
PWND pwnd;
UINT msg;
WPARAM wParam;
ULONG_PTR xParam;
PROC xpfnProc;
} FNOUTLPRECTMSG;
#ifdef SENDSIDE
SMESSAGECALL(OUTLPRECT)
{
SETUPPWND(FNOUTLPRECT)
UNREFERENCED_PARAMETER(dwSCMSFlags);
BEGINSEND(FNOUTLPRECT)
LPRECT prect = (LPRECT)lParam;
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
MAKECALL(FNOUTLPRECT);
UNLOCKPWND();
CHECKRETURN();
BEGINCOPYOUT()
OUTSTRUCT(prect, RECT);
ENDCOPYOUT()
TRACECALLBACKMSG("SfnOUTLPRECT");
ENDSEND(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnOUTLPRECT, FNOUTLPRECTMSG)
{
RECT rc;
BEGINRECV(0, &rc, sizeof(rc));
retval = (ULONG_PTR)CALLPROC(pmsg->xpfnProc)(
pmsg->pwnd,
pmsg->msg,
pmsg->wParam,
&rc,
pmsg->xParam);
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* yyy
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _FNINLPCOMPAREITEMSTRUCTMSG {
PWND pwnd;
UINT msg;
WPARAM wParam;
COMPAREITEMSTRUCT compareitemstruct;
ULONG_PTR xParam;
PROC xpfnProc;
} FNINLPCOMPAREITEMSTRUCTMSG;
#ifdef SENDSIDE
SMESSAGECALL(INLPCOMPAREITEMSTRUCT)
{
SETUPPWND(FNINLPCOMPAREITEMSTRUCT)
UNREFERENCED_PARAMETER(dwSCMSFlags);
UNREFERENCED_PARAMETER(psms);
BEGINSEND(FNINLPCOMPAREITEMSTRUCT)
LPCOMPAREITEMSTRUCT pcompareitemstruct = (LPCOMPAREITEMSTRUCT)lParam;
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
MSGDATA()->compareitemstruct = *pcompareitemstruct;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
MAKECALL(FNINLPCOMPAREITEMSTRUCT);
UNLOCKPWND();
CHECKRETURN();
TRACECALLBACKMSG("SfnINLPCOMPAREITEMSTRUCT");
ENDSEND(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINLPCOMPAREITEMSTRUCT, FNINLPCOMPAREITEMSTRUCTMSG)
{
BEGINRECV(0, NULL, 0);
retval = (ULONG_PTR)CALLPROC(pmsg->xpfnProc)(
pmsg->pwnd,
pmsg->msg,
pmsg->wParam,
&(pmsg->compareitemstruct),
pmsg->xParam);
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* yyy
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _FNINLPDELETEITEMSTRUCTMSG {
PWND pwnd;
UINT msg;
WPARAM wParam;
DELETEITEMSTRUCT deleteitemstruct;
ULONG_PTR xParam;
PROC xpfnProc;
} FNINLPDELETEITEMSTRUCTMSG;
#ifdef SENDSIDE
SMESSAGECALL(INLPDELETEITEMSTRUCT)
{
SETUPPWND(FNINLPDELETEITEMSTRUCT)
UNREFERENCED_PARAMETER(dwSCMSFlags);
UNREFERENCED_PARAMETER(psms);
BEGINSEND(FNINLPDELETEITEMSTRUCT)
LPDELETEITEMSTRUCT pdeleteitemstruct = (LPDELETEITEMSTRUCT)lParam;
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
MSGDATA()->deleteitemstruct = *pdeleteitemstruct;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
MAKECALL(FNINLPDELETEITEMSTRUCT);
UNLOCKPWND();
CHECKRETURN();
TRACECALLBACKMSG("SfnINLPDELETEITEMSTRUCT");
ENDSEND(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINLPDELETEITEMSTRUCT, FNINLPDELETEITEMSTRUCTMSG)
{
BEGINRECV(0, NULL, 0);
retval = (ULONG_PTR)CALLPROC(pmsg->xpfnProc)(
pmsg->pwnd,
pmsg->msg,
pmsg->wParam,
&(pmsg->deleteitemstruct),
pmsg->xParam);
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* FNINHLPSTRUCT
*
* 06-08-92 SanfordS Created
\**************************************************************************/
typedef struct _FNINLPHLPSTRUCTMSG {
CAPTUREBUF CaptureBuf;
PWND pwnd;
UINT msg;
WPARAM wParam;
LPHLP lphlp;
ULONG_PTR xParam;
PROC xpfnProc;
} FNINLPHLPSTRUCTMSG;
#ifdef SENDSIDE
SMESSAGECALL(INLPHLPSTRUCT)
{
LPHLP lphlp = (LPHLP)lParam;
SETUPPWND(FNINLPHLPSTRUCT)
UNREFERENCED_PARAMETER(dwSCMSFlags);
UNREFERENCED_PARAMETER(psms);
BEGINSENDCAPTURE(FNINLPHLPSTRUCT, 1, lphlp->cbData, TRUE)
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
COPYBYTES(lphlp, lphlp->cbData);
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
MAKECALLCAPTURE(FNINLPHLPSTRUCT);
UNLOCKPWND();
CHECKRETURN();
TRACECALLBACKMSG("SfnINLPHLPSTRUCT");
ENDSENDCAPTURE(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINLPHLPSTRUCT, FNINLPHLPSTRUCTMSG)
{
BEGINRECV(0, NULL, 0);
FIXUPPOINTERS();
retval = (ULONG_PTR)CALLPROC(pmsg->xpfnProc)(
pmsg->pwnd,
pmsg->msg,
pmsg->wParam,
FIXUP(lphlp),
pmsg->xParam);
ENDRECV();
}
#endif // RECVSIDE
#ifndef WINHELP4
/**************************************************************************\
* FNINHELPINFOSTRUCT
*
* 06-08-92 SanfordS Created
\**************************************************************************/
typedef struct _FNINLPHELPFINFOSTRUCTMSG {
CAPTUREBUF CaptureBuf;
PWND pwnd;
UINT msg;
WPARAM wParam;
LPHELPINFO lphlp;
ULONG_PTR xParam;
PROC xpfnProc;
} FNINLPHELPINFOSTRUCTMSG;
#ifdef SENDSIDE
SMESSAGECALL(INLPHELPINFOSTRUCT)
{
LPHELPINFO lphlp = (LPHELPINFO)lParam;
SETUPPWND(FNINLPHELPINFOSTRUCT)
UNREFERENCED_PARAMETER(dwSCMSFlags);
UNREFERENCED_PARAMETER(psms);
BEGINSENDCAPTURE(FNINLPHELPINFOSTRUCT, 1, lphlp->cbSize, TRUE)
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
COPYBYTES(lphlp, lphlp->cbSize);
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
MAKECALLCAPTURE(FNINLPHELPINFOSTRUCT);
UNLOCKPWND();
CHECKRETURN();
TRACECALLBACKMSG("SfnINLPHELPINFOSTRUCT");
ENDSENDCAPTURE(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINLPHELPINFOSTRUCT, FNINLPHELPINFOSTRUCTMSG)
{
BEGINRECV(0, NULL, 0);
FIXUPPOINTERS();
retval = (ULONG_PTR)CALLPROC(pmsg->xpfnProc)(
pmsg->pwnd,
pmsg->msg,
pmsg->wParam,
FIXUP(lphlp),
pmsg->xParam);
ENDRECV();
}
#endif // RECVSIDE
#endif // WINHELP4
/**************************************************************************\
* yyy
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _FNINLPDRAWITEMSTRUCTMSG {
PWND pwnd;
UINT msg;
WPARAM wParam;
DRAWITEMSTRUCT drawitemstruct;
ULONG_PTR xParam;
PROC xpfnProc;
} FNINLPDRAWITEMSTRUCTMSG;
#ifdef SENDSIDE
SMESSAGECALL(INLPDRAWITEMSTRUCT)
{
SETUPPWND(FNINLPDRAWITEMSTRUCT)
UNREFERENCED_PARAMETER(dwSCMSFlags);
UNREFERENCED_PARAMETER(psms);
BEGINSEND(FNINLPDRAWITEMSTRUCT)
LPDRAWITEMSTRUCT pdrawitemstruct = (LPDRAWITEMSTRUCT)lParam;
HDC hdcOriginal = (HDC)NULL;
/*
* Make sure that this is not an OLE inter-process DrawItem
*/
if (GreGetObjectOwner((HOBJ)pdrawitemstruct->hDC, DC_TYPE) !=
W32GetCurrentPID()) {
if (pdrawitemstruct->hDC) {
PWND pwndItem;
pwndItem = _WindowFromDC(pdrawitemstruct->hDC);
if (pwndItem) {
hdcOriginal = pdrawitemstruct->hDC;
pdrawitemstruct->hDC = _GetDC(pwndItem);
}
}
}
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
MSGDATA()->drawitemstruct = *pdrawitemstruct;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
MAKECALL(FNINLPDRAWITEMSTRUCT);
UNLOCKPWND();
CHECKRETURN();
if (hdcOriginal) {
_ReleaseDC(pdrawitemstruct->hDC);
pdrawitemstruct->hDC = hdcOriginal;
}
TRACECALLBACKMSG("SfnINLPDRAWITEMSTRUCT");
ENDSEND(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINLPDRAWITEMSTRUCT, FNINLPDRAWITEMSTRUCTMSG)
{
BEGINRECV(0, NULL, 0);
if (pmsg->drawitemstruct.hDC == NULL)
MSGERRORCODE(ERROR_INVALID_HANDLE);
retval = (ULONG_PTR)CALLPROC(pmsg->xpfnProc)(
pmsg->pwnd,
pmsg->msg,
pmsg->wParam,
&(pmsg->drawitemstruct),
pmsg->xParam);
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* fnINOUTLPMEASUREITEMSTRUCT
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _FNINOUTLPMEASUREITEMSTRUCTMSG {
PWND pwnd;
UINT msg;
WPARAM wParam;
MEASUREITEMSTRUCT measureitemstruct;
ULONG_PTR xParam;
PROC xpfnProc;
} FNINOUTLPMEASUREITEMSTRUCTMSG;
#ifdef SENDSIDE
SMESSAGECALL(INOUTLPMEASUREITEMSTRUCT)
{
SETUPPWND(FNINOUTLPMEASUREITEMSTRUCT)
BEGINSEND(FNINOUTLPMEASUREITEMSTRUCT)
PMEASUREITEMSTRUCT pmeasureitemstruct = (PMEASUREITEMSTRUCT)lParam;
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg & ~MSGFLAG_MASK;
MSGDATA()->wParam = wParam;
MSGDATA()->measureitemstruct = *pmeasureitemstruct;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
MAKECALL(FNINOUTLPMEASUREITEMSTRUCT);
UNLOCKPWND();
CHECKRETURN();
BEGINCOPYOUT()
OUTSTRUCT(pmeasureitemstruct, MEASUREITEMSTRUCT);
ENDCOPYOUT()
TRACECALLBACKMSG("SfnINOUTLPMEASUREITEMSTRUCT");
ENDSEND(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINOUTLPMEASUREITEMSTRUCT, FNINOUTLPMEASUREITEMSTRUCTMSG)
{
BEGINRECV(0, &pmsg->measureitemstruct, sizeof(pmsg->measureitemstruct));
retval = (ULONG_PTR)CALLPROC(pmsg->xpfnProc)(
pmsg->pwnd,
pmsg->msg,
pmsg->wParam,
&pmsg->measureitemstruct,
pmsg->xParam);
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* fnINSTRING
*
* 22-Jul-1991 mikeke Created
* 27-Jan-1992 IanJa Unicode/ANSI
\**************************************************************************/
typedef struct _FNINSTRINGMSG {
CAPTUREBUF CaptureBuf;
PWND pwnd;
UINT msg;
WPARAM wParam;
ULONG_PTR xParam;
PROC xpfnProc;
LPTSTR pwsz;
} FNINSTRINGMSG;
#ifdef SENDSIDE
SMESSAGECALL(INSTRING)
{
PLARGE_STRING pstr = (PLARGE_STRING)lParam;
DWORD cbCapture;
DWORD cCapture;
BOOL fAnsiReceiver = (dwSCMSFlags & SCMS_FLAGS_ANSI);
SETUPPWND(FNINSTRING)
UNREFERENCED_PARAMETER(psms);
/*
* Compute ANSI capture lengths. Don't capture if
* the strings are in the client's address space and
* of the correct type.
*/
if (pstr &&
(IS_SYSTEM_ADDRESS((PVOID)pstr->Buffer) ||
((BOOL)pstr->bAnsi != fAnsiReceiver))) {
cCapture = 1;
CALC_SIZE_IN(cbCapture, pstr);
} else {
cbCapture = 0;
cCapture = 0;
}
BEGINSENDCAPTURE(FNINSTRING, cCapture, cbCapture, TRUE)
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
if (cCapture) {
if (!pstr->bAnsi) {
if (fAnsiReceiver) {
LARGECOPYSTRINGLPWSTRA(pstr, pwsz);
} else {
LARGECOPYSTRINGLPWSTR(pstr, pwsz);
}
} else {
if (fAnsiReceiver) {
LARGECOPYSTRINGLPSTR(pstr, pwsz);
} else {
LARGECOPYSTRINGLPSTRW(pstr, pwsz);
}
}
} else {
MSGDATA()->pwsz = (pstr ? pstr->Buffer : NULL);
}
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
MAKECALLCAPTURE(FNINSTRING);
UNLOCKPWND();
CHECKRETURN();
TRACECALLBACKMSG("SfnINSTRING");
ENDSENDCAPTURE(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINSTRING, FNINSTRINGMSG)
{
BEGINRECV(0, NULL, 0);
FIXUPPOINTERS();
retval = (ULONG_PTR)CALLPROC(pmsg->xpfnProc)(
pmsg->pwnd,
pmsg->msg,
pmsg->wParam,
pmsg->pwsz,
pmsg->xParam);
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* fnINSTRINGNULL
*
* Server-side stub translates Unicode to ANSI if required.
*
* 22-Jul-1991 mikeke Created
* 28-Jan-1992 IanJa Unicode/ANSI (Server translate to ANSI if rquired)
\**************************************************************************/
typedef struct _FNINSTRINGNULLMSG {
CAPTUREBUF CaptureBuf;
PWND pwnd;
UINT msg;
WPARAM wParam;
ULONG_PTR xParam;
PROC xpfnProc;
LPTSTR pwsz;
} FNINSTRINGNULLMSG;
#ifdef SENDSIDE
SMESSAGECALL(INSTRINGNULL)
{
PLARGE_STRING pstr = (PLARGE_STRING)lParam;
DWORD cbCapture;
DWORD cCapture;
BOOL fAnsiReceiver = (dwSCMSFlags & SCMS_FLAGS_ANSI);
SETUPPWND(FNINSTRINGNULL)
UNREFERENCED_PARAMETER(psms);
cCapture = 0;
cbCapture = 0;
if (pstr) {
/*
* Compute ANSI capture lengths. Don't capture if
* the strings are in the client's address space and
* of the correct type.
*/
if (IS_SYSTEM_ADDRESS((PVOID)pstr->Buffer) ||
(BOOL)pstr->bAnsi != fAnsiReceiver) {
cCapture = 1;
CALC_SIZE_IN(cbCapture, pstr);
}
}
BEGINSENDCAPTURE(FNINSTRINGNULL, cCapture, cbCapture, TRUE)
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
if (cCapture) {
if (!pstr->bAnsi) {
if (fAnsiReceiver) {
LARGECOPYSTRINGLPWSTRA(pstr, pwsz);
} else {
LARGECOPYSTRINGLPWSTR(pstr, pwsz);
}
} else {
if (fAnsiReceiver) {
LARGECOPYSTRINGLPSTR(pstr, pwsz);
} else {
LARGECOPYSTRINGLPSTRW(pstr, pwsz);
}
}
} else
MSGDATA()->pwsz = pstr ? pstr->Buffer : NULL;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
MAKECALLCAPTURE(FNINSTRINGNULL);
UNLOCKPWND();
CHECKRETURN();
TRACECALLBACKMSG("SfnINSTRINGNULL");
ENDSENDCAPTURE(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINSTRINGNULL, FNINSTRINGNULLMSG)
{
BEGINRECV(0, NULL, 0);
FIXUPPOINTERS();
retval = (ULONG_PTR)CALLPROC(pmsg->xpfnProc)(
pmsg->pwnd,
pmsg->msg,
pmsg->wParam,
pmsg->pwsz,
pmsg->xParam);
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* yyy
*
* 27-May-1997 GregoryW Created
\**************************************************************************/
typedef struct _FNINLPKDRAWSWITCHWNDMSG {
CAPTUREBUF CaptureBuf;
PWND pwnd;
UINT msg;
WPARAM wParam;
ULONG_PTR xParam;
PROC xpfnProc;
LPWSTR pwsz;
RECT rcRect;
} FNINLPKDRAWSWITCHWNDMSG;
#ifdef SENDSIDE
SMESSAGECALL(INLPKDRAWSWITCHWND)
{
PLARGE_UNICODE_STRING pstr = &((LPKDRAWSWITCHWND *)lParam)->strName;
DWORD cbCapture;
DWORD cCapture = 1; // Always capture the string
PWND pwndDCOwner;
HDC hdcSwitch;
COLORREF clrOldText, clrOldBk;
HFONT hOldFont;
BOOL fAnsiReceiver = FALSE; // The string is always Unicode
SETUPPWND(FNINLPKDRAWSWITCHWND)
UNREFERENCED_PARAMETER(psms);
UNREFERENCED_PARAMETER(dwSCMSFlags);
CALC_SIZE_IN(cbCapture, pstr);
BEGINSENDCAPTURE(FNINLPKDRAWSWITCHWND, cCapture, cbCapture, TRUE)
LARGECOPYSTRINGLPWSTR(pstr, pwsz);
pwndDCOwner = _WindowFromDC((HDC)wParam);
hdcSwitch = _GetDC(pwndDCOwner);
clrOldText = GreSetTextColor(hdcSwitch, SYSRGB(BTNTEXT));
clrOldBk = GreSetBkColor(hdcSwitch, SYSRGB(3DFACE));
hOldFont = GreSelectFont(hdcSwitch, gpsi->hCaptionFont);
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = (WPARAM)hdcSwitch;
MSGDATA()->rcRect = ((LPKDRAWSWITCHWND *)lParam)->rcRect;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
MAKECALLCAPTURE(FNINLPKDRAWSWITCHWND);
UNLOCKPWND();
GreSelectFont(hdcSwitch, hOldFont);
GreSetBkColor(hdcSwitch, clrOldBk);
GreSetTextColor(hdcSwitch, clrOldText);
_ReleaseDC(hdcSwitch);
CHECKRETURN();
TRACECALLBACKMSG("SfnINLPKDRAWSWITCHWND");
ENDSENDCAPTURE(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINLPKDRAWSWITCHWND, FNINLPKDRAWSWITCHWNDMSG)
{
DRAWTEXTPARAMS dtp;
BEGINRECV(0, NULL, 0);
FIXUPPOINTERS();
dtp.cbSize = sizeof(dtp);
dtp.iLeftMargin = 0;
dtp.iRightMargin = 0;
retval = DrawTextExW(
(HDC)pmsg->wParam,
pmsg->pwsz,
-1,
&(pmsg->rcRect),
DT_NOPREFIX | DT_END_ELLIPSIS | DT_SINGLELINE,
&dtp
);
ENDRECV();
}
#endif // RECVSIDE
typedef struct _FNINDEVICECHANGEMSG {
CAPTUREBUF CaptureBuf;
PWND pwnd;
UINT msg;
WPARAM wParam;
ULONG_PTR xParam;
PROC xpfnProc;
LPTSTR pwsz;
BOOL fAnsi;
} FNINDEVICECHANGEMSG;
#ifdef SENDSIDE
SMESSAGECALL(INDEVICECHANGE)
{
PVOID pstr = (PVOID)lParam;
DWORD cbCapture;
BOOL fAnsiReceiver = (dwSCMSFlags & SCMS_FLAGS_ANSI);
BOOL fPtr = (BOOL)((wParam & 0x8000) == 0x8000);
SETUPPWND(FNINDEVICECHANGE)
UNREFERENCED_PARAMETER(psms);
cbCapture = 0;
if (fPtr && (pstr != NULL)) {
/*
* Compute ANSI capture lengths. Don't capture if
* the strings are in the client's address space and
* of the correct type.
*/
if (IS_SYSTEM_ADDRESS((PVOID)pstr)) {
cbCapture = *((DWORD *)pstr);
}
}
BEGINSENDCAPTURE(FNINDEVICECHANGE, 1, cbCapture, TRUE)
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
if (cbCapture) {
LARGECOPYBYTES2(pstr, *((DWORD *)pstr), pwsz);
} else {
MSGDATA()->pwsz = (LPTSTR)pstr;
}
MSGDATA()->fAnsi = fAnsiReceiver;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
MAKECALLCAPTURE(FNINDEVICECHANGE);
UNLOCKPWND();
CHECKRETURN();
TRACECALLBACKMSG("SfnINDEVICECHANGE");
ENDSENDCAPTURE(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINDEVICECHANGE, FNINDEVICECHANGEMSG)
{
struct _DEV_BROADCAST_HEADER *pHdr;
PDEV_BROADCAST_PORT_A pPortA = NULL;
PDEV_BROADCAST_PORT_W pPortW;
PDEV_BROADCAST_DEVICEINTERFACE_A pInterfaceA = NULL;
PDEV_BROADCAST_DEVICEINTERFACE_W pInterfaceW;
PDEV_BROADCAST_HANDLE pHandleA = NULL;
PDEV_BROADCAST_HANDLE pHandleW;
PDEV_BROADCAST_VOLUME pVolume;
int iStr, iSize;
LPSTR lpStr;
LPARAM lParam;
BEGINRECV(0, NULL, 0);
FIXUPPOINTERS();
lParam = (LPARAM)pmsg->pwsz;
pHdr = (struct _DEV_BROADCAST_HEADER *)lParam;
if (!lParam || !(pmsg->wParam & 0x8000) ||
(!pmsg->fAnsi &&
((pHdr->dbcd_devicetype != DBT_DEVTYP_VOLUME) || (pmsg->msg != WM_DEVICECHANGE))
)) {
goto shipit;
}
switch (pHdr->dbcd_devicetype) {
case DBT_DEVTYP_PORT:
pPortW = (PDEV_BROADCAST_PORT_W)lParam;
iStr = wcslen(pPortW->dbcp_name);
iSize = FIELD_OFFSET(DEV_BROADCAST_PORT_A, dbcp_name) + DBCS_CHARSIZE*(iStr+1);
pPortA = UserLocalAlloc(0, iSize);
if (pPortA == NULL)
MSGERROR();
RtlCopyMemory(pPortA, pPortW, FIELD_OFFSET(DEV_BROADCAST_PORT_A, dbcp_name));
lpStr = pPortA->dbcp_name;
if (iStr) {
WCSToMB(pPortW->dbcp_name, -1, &lpStr, iStr, FALSE);
}
lpStr[iStr] = 0;
pPortA->dbcp_size = iSize;
lParam = (LPARAM)pPortA;
break;
case DBT_DEVTYP_DEVICEINTERFACE:
pInterfaceW = (PDEV_BROADCAST_DEVICEINTERFACE_W)lParam;
iStr = wcslen(pInterfaceW->dbcc_name);
iSize = FIELD_OFFSET(DEV_BROADCAST_DEVICEINTERFACE_A, dbcc_name) + DBCS_CHARSIZE*(iStr+1);
pInterfaceA = UserLocalAlloc(0, iSize);
if (pInterfaceA == NULL)
MSGERROR();
RtlCopyMemory(pInterfaceA, pInterfaceW, FIELD_OFFSET(DEV_BROADCAST_DEVICEINTERFACE_A, dbcc_name));
lpStr = pInterfaceA->dbcc_name;
if (iStr) {
WCSToMB(pInterfaceW->dbcc_name, -1, &lpStr, iStr, FALSE);
}
lpStr[iStr] = 0;
pInterfaceA->dbcc_size = iSize;
lParam = (LPARAM)pInterfaceA;
break;
case DBT_DEVTYP_HANDLE:
pHandleW = (PDEV_BROADCAST_HANDLE)lParam;
if ((pmsg->wParam != DBT_CUSTOMEVENT) || (pHandleW->dbch_nameoffset < 0)) break;
iStr = wcslen((LPWSTR)(pHandleW->dbch_data+pHandleW->dbch_nameoffset));
iSize = pHandleW->dbch_size;
/*
* MB size can't be bigger than UNICODE size
*/
pHandleA = UserLocalAlloc(0, iSize);
if (pHandleA == NULL)
MSGERROR();
RtlCopyMemory(pHandleA, pHandleW, FIELD_OFFSET(DEV_BROADCAST_HANDLE, dbch_data)+ pHandleW->dbch_nameoffset);
lpStr = pHandleA->dbch_data+pHandleA->dbch_nameoffset;
if (iStr) {
WCSToMB((LPWSTR)(pHandleW->dbch_data+pHandleW->dbch_nameoffset), -1, &lpStr, iStr, FALSE);
}
lpStr[iStr] = 0;
pHandleA->dbch_size = iSize;
lParam = (LPARAM)pHandleA;
break;
case DBT_DEVTYP_VOLUME:
pVolume = (PDEV_BROADCAST_VOLUME)lParam;
if (((pmsg->wParam == DBT_DEVICEREMOVECOMPLETE) ||
(pmsg->wParam == DBT_DEVICEARRIVAL)) &&
(pVolume->dbcv_unitmask & DBV_FILTER_MSG)) {
DWORD LUIDDriveMask, ResultDriveMask;
LUIDDriveMask = GetLUIDDosDrivesOnly();
/*
* Filter out the common drive letter bits & DBV_FILTER_MSG
*/
ResultDriveMask = (((LUIDDriveMask & pVolume->dbcv_unitmask) ^
pVolume->dbcv_unitmask) ^
DBV_FILTER_MSG);
if (ResultDriveMask == 0) {
goto cleanup;
}
pVolume->dbcv_unitmask = ResultDriveMask;
lParam = (LPARAM)pVolume;
}
break;
}
shipit:
retval = (ULONG_PTR)CALLPROC(pmsg->xpfnProc)(
pmsg->pwnd,
pmsg->msg,
pmsg->wParam,
lParam,
pmsg->xParam);
cleanup:
if (pInterfaceA) UserLocalFree(pInterfaceA);
if (pPortA) UserLocalFree(pPortA);
if (pHandleA) UserLocalFree(pHandleA);
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* fnOUTSTRING
*
* Warning this message copies but does not count the NULL in retval
* as in WM_GETTEXT
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _FNOUTSTRINGMSG {
CAPTUREBUF CaptureBuf;
PWND pwnd;
UINT msg;
WPARAM wParam;
ULONG_PTR xParam;
PROC xpfnProc;
PBYTE pOutput;
DWORD cbOutput;
} FNOUTSTRINGMSG;
#ifdef SENDSIDE
SMESSAGECALL(OUTSTRING)
{
PLARGE_STRING pstr = (PLARGE_STRING)lParam;
DWORD cbCapture;
BOOL fAnsiReceiver = (dwSCMSFlags & SCMS_FLAGS_ANSI);
BOOL bInflateWParam = FALSE;
SETUPPWND(FNOUTSTRING)
CALC_SIZE_OUT_STRING(cbCapture, pstr);
BEGINSENDCAPTURE(FNOUTSTRING, 1, cbCapture, FALSE)
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
/*
* Need to wParam MBCS bytes may be required to form wParam Unicode bytes
*/
if (fAnsiReceiver && !(pstr->bAnsi)) {
/*
* Unicode -> Ansi
*/
MSGDATA()->wParam = (wParam * sizeof(WCHAR));
PtiCurrent()->TIF_flags |= TIF_ANSILENGTH;
bInflateWParam = TRUE;
} else {
/*
* if wParam is already adjusted for ANSI, we need to re-adjust for Unicode...
*
* This logic is for following cases...
*
* +========+===============+=============+================+=============+
* |WndProc |Unicode WndProc->Ansi WndProc->Unicode WndProc->Ansi WndProc|
* +--------+---------------+-------------+----------------+-------------+
* |Length | X -> (X * 2) -> X -> (X * 2) |
* +--------+---------------+-------------+----------------+-------------+
*/
if (!fAnsiReceiver && (PtiCurrent()->TIF_flags & TIF_ANSILENGTH)) {
/* adjust limit also... */
MSGDATA()->wParam = wParam / sizeof(WCHAR);
PtiCurrent()->TIF_flags &= ~TIF_ANSILENGTH;
} else {
MSGDATA()->wParam = wParam;
}
}
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
RESERVEBYTES(cbCapture, pOutput, cbOutput);
LOCKPWND();
MAKECALLCAPTURE(FNOUTSTRING);
UNLOCKPWND();
CHECKRETURN();
BEGINCOPYOUT()
if (retval) {
/*
* Non-zero retval means some text to copy out. Do not copy out
* more than the requested byte count 'wParam'.
*/
COPYOUTLPWSTRLIMIT(pstr, (int)wParam);
} else {
/*
* A dialog function returning FALSE means no text to copy out,
* but an empty string also has retval == 0: put a null char in
* pstr for the latter case.
*/
if (wParam != 0) {
if (pstr->bAnsi) {
*(PCHAR)pstr->Buffer = 0;
} else {
*(PWCHAR)pstr->Buffer = 0;
}
}
}
ENDCOPYOUT()
TRACECALLBACKMSG("SfnOUTSTRING");
ENDSENDCAPTUREOUTSTRING(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnOUTSTRING, FNOUTSTRINGMSG)
{
BYTE abOutput[CALLBACKSTACKLIMIT];
BEGINRECV(0, NULL, pmsg->cbOutput);
FIXUPPOINTERS();
if (pmsg->cbOutput <= CALLBACKSTACKLIMIT)
CallbackStatus.pOutput = abOutput;
else
CallbackStatus.pOutput = pmsg->pOutput;
retval = (ULONG_PTR)CALLPROC(CALLDATA(xpfnProc))(
CALLDATA(pwnd),
CALLDATA(msg),
CALLDATA(wParam),
(LPARAM)KPVOID_TO_PVOID(CallbackStatus.pOutput),
CALLDATA(xParam));
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* fnINCNTOUTSTRING
*
* Does NOT NULL terminate string
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _FNINCNTOUTSTRING {
CAPTUREBUF CaptureBuf;
PWND pwnd;
UINT msg;
WPARAM wParam;
ULONG_PTR xParam;
PROC xpfnProc;
WORD cchMax;
PBYTE pOutput;
DWORD cbOutput;
} FNINCNTOUTSTRINGMSG;
#ifdef SENDSIDE
SMESSAGECALL(INCNTOUTSTRING)
{
PLARGE_STRING pstr = (PLARGE_STRING)lParam;
DWORD cbCapture;
WORD cchOriginal;
BOOL fAnsiReceiver = (dwSCMSFlags & SCMS_FLAGS_ANSI);
SETUPPWND(FNINCNTOUTSTRING)
CALC_SIZE_OUT(cbCapture, pstr);
BEGINSENDCAPTURE(FNINCNTOUTSTRING, 1, cbCapture, FALSE)
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
cchOriginal = (WORD)pstr->MaximumLength;
if (!pstr->bAnsi)
cchOriginal /= sizeof(WCHAR);
MSGDATA()->cchMax = (WORD)min(cchOriginal, 0xffff);
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
RESERVEBYTES(cbCapture, pOutput, cbOutput);
LOCKPWND();
MAKECALLCAPTURE(FNINCNTOUTSTRING)
UNLOCKPWND();
CHECKRETURN();
/*
* We don't want to do the copy out of the sender died or if
* this message was just sent as part of a CALLWNDPROC hook processing
*/
BEGINCOPYOUT()
if (retval) {
/*
* Non-zero retval means some text to copy out. Do not copy out
* more than the requested char count 'wParam'.
*/
COPYOUTLPWSTRLIMIT(pstr, (int)cchOriginal);
} else {
/*
* A dialog function returning FALSE means no text to copy out,
* but an empty string also has retval == 0: put a null char in
* pstr for the latter case.
*/
if (pstr->bAnsi) {
*(PCHAR)pstr->Buffer = 0;
} else {
*(PWCHAR)pstr->Buffer = 0;
}
}
ENDCOPYOUT()
TRACECALLBACKMSG("SfnINCNTOUTSTRING");
ENDSENDCAPTURE(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINCNTOUTSTRING, FNINCNTOUTSTRINGMSG)
{
BYTE abOutput[CALLBACKSTACKLIMIT];
BEGINRECV(0, NULL, pmsg->cbOutput);
FIXUPPOINTERS();
if (pmsg->cbOutput <= CALLBACKSTACKLIMIT)
CallbackStatus.pOutput = abOutput;
else
CallbackStatus.pOutput = pmsg->pOutput;
*(KPWORD)CallbackStatus.pOutput = CALLDATA(cchMax);
retval = (ULONG_PTR)CALLPROC(CALLDATA(xpfnProc))(
CALLDATA(pwnd),
CALLDATA(msg),
CALLDATA(wParam),
(LPARAM)KPVOID_TO_PVOID(CallbackStatus.pOutput),
CALLDATA(xParam));
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* fnINCNTOUTSTRINGNULL
*
* wParam specifies the maximum number of bytes to copy
* the string is NULL terminated
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _FNINCNTOUTSTRINGNULL {
CAPTUREBUF CaptureBuf;
PWND pwnd;
UINT msg;
WPARAM wParam;
ULONG_PTR xParam;
PROC xpfnProc;
PBYTE pOutput;
DWORD cbOutput;
} FNINCNTOUTSTRINGNULLMSG;
#ifdef SENDSIDE
SMESSAGECALL(INCNTOUTSTRINGNULL)
{
PLARGE_STRING pstr = (PLARGE_STRING)lParam;
DWORD cbCapture;
BOOL fAnsiReceiver = (dwSCMSFlags & SCMS_FLAGS_ANSI);
SETUPPWND(FNINCNTOUTSTRINGNULL)
CALC_SIZE_OUT(cbCapture, pstr);
BEGINSENDCAPTURE(FNINCNTOUTSTRINGNULL, 1, cbCapture, FALSE)
if (wParam < 2) { // However unlikely, this prevents a possible GP
MSGERROR(); // on the server side.
}
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
RESERVEBYTES(cbCapture, pOutput, cbOutput);
LOCKPWND();
MAKECALLCAPTURE(FNINCNTOUTSTRINGNULL)
UNLOCKPWND();
CHECKRETURN();
/*
* We don't want to do the copy out of the sender died or if
* this message was just sent as part of a CALLWNDPROC hook processing
*/
BEGINCOPYOUT()
if (pcbs->cbOutput != 0) {
/*
* Buffer changed means some text to copy out. Do not copy out
* more than the requested byte count 'wParam'.
*/
COPYOUTLPWSTRLIMIT(pstr, (int)wParam);
}
ENDCOPYOUT()
TRACECALLBACKMSG("SfnINCNTOUTSTRINGNULL");
ENDSENDCAPTURE(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINCNTOUTSTRINGNULL, FNINCNTOUTSTRINGNULLMSG)
{
BYTE abOutput[CALLBACKSTACKLIMIT];
BEGINRECV(0, NULL, pmsg->cbOutput);
FIXUPPOINTERS();
if (pmsg->cbOutput <= CALLBACKSTACKLIMIT)
CallbackStatus.pOutput = abOutput;
else
CallbackStatus.pOutput = pmsg->pOutput;
retval = (ULONG_PTR)CALLPROC(CALLDATA(xpfnProc))(
CALLDATA(pwnd),
CALLDATA(msg),
CALLDATA(wParam),
(LPARAM)KPVOID_TO_PVOID(CallbackStatus.pOutput),
CALLDATA(xParam));
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* fnPOUTLPINT
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _FNPOUTLPINTMSG {
CAPTUREBUF CaptureBuf;
PWND pwnd;
UINT msg;
WPARAM wParam;
ULONG_PTR xParam;
PROC xpfnProc;
PBYTE pOutput;
DWORD cbOutput;
} FNPOUTLPINTMSG;
#ifdef SENDSIDE
SMESSAGECALL(POUTLPINT)
{
DWORD cbCapture;
LPINT pint = (LPINT)lParam;
SETUPPWND(FNPOUTLPINT)
cbCapture = (UINT)wParam * sizeof(INT);
BEGINSENDCAPTURE(FNPOUTLPINT, 1, cbCapture, FALSE)
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
/*
* Hooks should see the buffer content
*/
if (dwSCMSFlags & SCMS_FLAGS_INONLY) {
MSGDATA()->cbOutput = cbCapture;
LARGECOPYBYTES2(pint, cbCapture, pOutput);
} else {
RESERVEBYTES(cbCapture, pOutput, cbOutput);
}
LOCKPWND();
MAKECALLCAPTURE(FNPOUTLPINT);
UNLOCKPWND();
CHECKRETURN();
BEGINCOPYOUT()
try {
ProbeForRead(pcbs->pOutput, pcbs->cbOutput, sizeof(DWORD));
memcpy(pint, pcbs->pOutput, cbCapture);
} except (W32ExceptionHandler(TRUE, RIP_WARNING)) {
MSGERROR();
}
ENDCOPYOUT()
TRACECALLBACKMSG("SfnPOUTLPINT");
ENDSENDCAPTURE(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnPOUTLPINT, FNPOUTLPINTMSG)
{
BYTE abOutput[CALLBACKSTACKLIMIT];
BEGINRECV(0, NULL, pmsg->cbOutput);
FIXUPPOINTERS();
if (pmsg->cbOutput <= CALLBACKSTACKLIMIT)
CallbackStatus.pOutput = abOutput;
else
CallbackStatus.pOutput = pmsg->pOutput;
retval = (ULONG_PTR)CALLPROC(CALLDATA(xpfnProc))(
CALLDATA(pwnd),
CALLDATA(msg),
CALLDATA(wParam),
(LPARAM)KPVOID_TO_PVOID(CallbackStatus.pOutput),
CALLDATA(xParam));
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* fnPOPTINLPUINT
*
* NOTE!!! -- This function actually thunks arrays of INTs (32bit) and not
* WORDs (16bit). The name was left the same to prevent a global rebuild
* of client and server. The name should be changed to fnPOPTINLPINT as
* soon as we ship the beta! The corresponding callforward function in
* cf2.h should also have its name changed.
*
* 22-Jul-1991 mikeke Created
* 07-Jan-1993 JonPa Changed to pass INTs instead of WORDs
\**************************************************************************/
typedef struct _FNPOPTINLPUINTMSG {
CAPTUREBUF CaptureBuf;
PWND pwnd;
UINT msg;
WPARAM wParam;
LPWORD pw;
ULONG_PTR xParam;
PROC xpfnProc;
} FNPOPTINLPUINTMSG;
#ifdef SENDSIDE
SMESSAGECALL(POPTINLPUINT)
{
LPWORD pw = (LPWORD)lParam;
DWORD cCapture, cbCapture;
SETUPPWND(FNPOPTINLPUINT);
UNREFERENCED_PARAMETER(dwSCMSFlags);
UNREFERENCED_PARAMETER(psms);
if (lParam) {
cCapture = 1;
cbCapture = (UINT)wParam * sizeof(UINT);
} else {
cCapture = cbCapture = 0;
}
BEGINSENDCAPTURE(FNPOPTINLPUINT, cCapture, cbCapture, TRUE)
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
COPYBYTESOPT(pw, cbCapture);
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
MAKECALLCAPTURE(FNPOPTINLPUINT);
UNLOCKPWND();
CHECKRETURN();
TRACECALLBACKMSG("SfnPOPTINLPUINT");
ENDSENDCAPTURE(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnPOPTINLPUINT, FNPOPTINLPUINTMSG)
{
BEGINRECV(0, NULL, 0);
FIXUPPOINTERS();
retval = (ULONG_PTR)CALLPROC(CALLDATA(xpfnProc))(
CALLDATA(pwnd),
CALLDATA(msg),
CALLDATA(wParam),
(LPDWORD)FIRSTFIXUPOPT(pw),
CALLDATA(xParam));
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* fnINOUTLPWINDOWPOS (for WM_WINDOWPOSCHANGING message)
*
* 08-11-91 darrinm Created.
\**************************************************************************/
typedef struct _FNINOUTLPWINDOWPOSMSG {
PWND pwnd;
UINT msg;
WPARAM wParam;
WINDOWPOS wp;
ULONG_PTR xParam;
PROC xpfnProc;
} FNINOUTLPWINDOWPOSMSG;
#ifdef SENDSIDE
SMESSAGECALL(INOUTLPWINDOWPOS)
{
SETUPPWND(FNINOUTLPWINDOWPOS)
UNREFERENCED_PARAMETER(dwSCMSFlags);
BEGINSEND(FNINOUTLPWINDOWPOS)
LPWINDOWPOS pwp = (LPWINDOWPOS)lParam;
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
MSGDATA()->wp = *pwp;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
MAKECALL(FNINOUTLPWINDOWPOS);
UNLOCKPWND();
CHECKRETURN();
BEGINCOPYOUT()
OUTSTRUCT(pwp, WINDOWPOS);
ENDCOPYOUT()
TRACECALLBACKMSG("SfnINOUTLPWINDOWPOS");
ENDSEND(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINOUTLPWINDOWPOS, FNINOUTLPWINDOWPOSMSG)
{
BEGINRECV(0, &pmsg->wp, sizeof(pmsg->wp));
retval = (ULONG_PTR)CALLPROC(CALLDATA(xpfnProc))(
pmsg->pwnd,
pmsg->msg,
pmsg->wParam,
PCALLDATA(wp),
pmsg->xParam);
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* fnINLPWINDOWPOS (for WM_WINDOWPOSCHANGED message)
*
* 08-11-91 darrinm Created.
\**************************************************************************/
typedef struct _FNINLPWINDOWPOSMSG {
PWND pwnd;
UINT msg;
WPARAM wParam;
WINDOWPOS wp;
ULONG_PTR xParam;
PROC xpfnProc;
} FNINLPWINDOWPOSMSG;
#ifdef SENDSIDE
SMESSAGECALL(INLPWINDOWPOS)
{
SETUPPWND(FNINLPWINDOWPOS)
UNREFERENCED_PARAMETER(dwSCMSFlags);
UNREFERENCED_PARAMETER(psms);
BEGINSEND(FNINLPWINDOWPOS)
LPWINDOWPOS pwp = (LPWINDOWPOS)lParam;
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
MSGDATA()->wp = *pwp;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
MAKECALL(FNINLPWINDOWPOS);
UNLOCKPWND();
CHECKRETURN();
TRACECALLBACKMSG("SfnINLPWINDOWPOS");
ENDSEND(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINLPWINDOWPOS, FNINLPWINDOWPOSMSG)
{
BEGINRECV(0, NULL, 0);
retval = (ULONG_PTR)CALLPROC(CALLDATA(xpfnProc))(
CALLDATA(pwnd),
CALLDATA(msg),
CALLDATA(wParam),
PCALLDATA(wp),
CALLDATA(xParam));
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* fnINOUTNEXTMENU
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _FNINOUTNEXTMENUMSG {
PWND pwnd;
UINT msg;
WPARAM wParam;
MDINEXTMENU mnm;
ULONG_PTR xParam;
PROC xpfnProc;
} FNINOUTNEXTMENUMSG;
#ifdef SENDSIDE
SMESSAGECALL(INOUTNEXTMENU)
{
SETUPPWND(FNINOUTNEXTMENU)
UNREFERENCED_PARAMETER(dwSCMSFlags);
BEGINSEND(FNINOUTNEXTMENU)
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
MSGDATA()->mnm = *((PMDINEXTMENU)lParam);
LOCKPWND();
MAKECALL(FNINOUTNEXTMENU);
UNLOCKPWND();
CHECKRETURN();
BEGINCOPYOUT()
OUTSTRUCT(((PMDINEXTMENU)lParam), MDINEXTMENU);
ENDCOPYOUT()
TRACECALLBACKMSG("SfnINOUTNEXTMENU");
ENDSEND(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINOUTNEXTMENU, FNINOUTNEXTMENUMSG)
{
BEGINRECV(0, &pmsg->mnm, sizeof(pmsg->mnm));
retval = (ULONG_PTR)CALLPROC(CALLDATA(xpfnProc))(
CALLDATA(pwnd),
CALLDATA(msg),
CALLDATA(wParam),
&CALLDATA(mnm),
CALLDATA(xParam));
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* fnHkINLPCBTCREATESTRUCT
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _CREATESTRUCTDATA {
CREATESTRUCT cs;
HWND hwndInsertAfter;
} CREATESTRUCTDATA;
typedef struct _FNHKINLPCBTCREATESTRUCTMSG {
CAPTUREBUF CaptureBuf;
PWND pwnd;
UINT msg;
WPARAM wParam;
CREATESTRUCTDATA d;
PROC xpfnProc;
BOOL bAnsi;
} FNHKINLPCBTCREATESTRUCTMSG;
#ifdef SENDSIDE
LRESULT fnHkINLPCBTCREATESTRUCT(
UINT msg,
WPARAM wParam,
LPCBT_CREATEWND pcbt,
PROC xpfnProc,
BOOL fAnsiReceiver)
{
DWORD cbTitle = 0, cbClass = 0;
DWORD cCapture = 0;
CREATESTRUCTDATA csdOut;
PCREATESTRUCTEX pcreatestruct;
PWND pwnd = _GetDesktopWindow();
SETUPPWND(FNHKINLPCBTCREATESTRUCT)
/*
* Compute ANSI capture lengths. Don't capture if
* the strings are in the client's address space.
*/
pcreatestruct = (PCREATESTRUCTEX)pcbt->lpcs;
if (pcreatestruct->cs.lpszName &&
((BOOL)pcreatestruct->strName.bAnsi != fAnsiReceiver ||
IS_SYSTEM_ADDRESS((PVOID)pcreatestruct->cs.lpszName))) {
CALC_SIZE_IN(cbTitle, &pcreatestruct->strName);
cCapture++;
}
if (IS_PTR(pcreatestruct->cs.lpszClass) &&
((BOOL)pcreatestruct->strClass.bAnsi != fAnsiReceiver ||
IS_SYSTEM_ADDRESS((PVOID)pcreatestruct->cs.lpszClass))) {
CALC_SIZE_IN(cbClass, &pcreatestruct->strClass);
cCapture++;
}
BEGINSENDCAPTURE(FNHKINLPCBTCREATESTRUCT, cCapture, cbTitle + cbClass, TRUE)
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
MSGDATA()->d.cs = *(pcbt->lpcs);
if (cbTitle) {
if (!pcreatestruct->strName.bAnsi) {
WORD wOrdinal;
try {
wOrdinal = *(PWORD)pcreatestruct->cs.lpszName;
} except (W32ExceptionHandler(TRUE, RIP_WARNING)) {
goto errorexit;
}
if (wOrdinal == 0xffff) {
/*
* Copy out an ordinal of the form 0xffff, ID.
* If the receiver is ANSI, skip the first 0xff.
*/
if (fAnsiReceiver) {
if (!NT_SUCCESS(CaptureCallbackData(&mp->CaptureBuf,
(PBYTE)pcreatestruct->cs.lpszName + 1,
3, (PVOID *)&mp->d.cs.lpszName)))
goto errorexit;
} else {
if (!NT_SUCCESS(CaptureCallbackData(&mp->CaptureBuf,
(PBYTE)pcreatestruct->cs.lpszName,
4, (PVOID *)&mp->d.cs.lpszName)))
goto errorexit;
}
} else if (fAnsiReceiver) {
LARGECOPYSTRINGLPWSTRA(&pcreatestruct->strName, d.cs.lpszName);
} else {
LARGECOPYSTRINGLPWSTR(&pcreatestruct->strName, d.cs.lpszName);
}
} else {
BYTE bOrdinal;
try {
bOrdinal = *(PBYTE)pcreatestruct->cs.lpszName;
} except (W32ExceptionHandler(TRUE, RIP_WARNING)) {
goto errorexit;
}
if (bOrdinal == 0xff) {
/*
* Copy out an ordinal of the form 0xff, ID.
* If the receiver is UNICODE, expand the 0xff to 0xffff.
*/
if (fAnsiReceiver) {
if (!NT_SUCCESS(CaptureCallbackData(&mp->CaptureBuf,
(PBYTE)pcreatestruct->cs.lpszName,
3, (PVOID *)&mp->d.cs.lpszName)))
goto errorexit;
} else {
DWORD dwOrdinal;
try {
dwOrdinal = MAKELONG(0xffff,
(*(DWORD UNALIGNED *)pcreatestruct->cs.lpszName >> 8));
} except (W32ExceptionHandler(TRUE, RIP_WARNING)) {
goto errorexit;
}
if (!NT_SUCCESS(CaptureCallbackData(&mp->CaptureBuf,
&dwOrdinal,
4, (PVOID *)&mp->d.cs.lpszName)))
goto errorexit;
}
} else if (fAnsiReceiver) {
LARGECOPYSTRINGLPSTR(&pcreatestruct->strName, d.cs.lpszName);
} else {
LARGECOPYSTRINGLPSTRW(&pcreatestruct->strName, d.cs.lpszName);
}
}
}
if (cbClass) {
if (!pcreatestruct->strClass.bAnsi) {
if (fAnsiReceiver) {
LARGECOPYSTRINGLPWSTRA(&pcreatestruct->strClass, d.cs.lpszClass);
} else {
LARGECOPYSTRINGLPWSTR(&pcreatestruct->strClass, d.cs.lpszClass);
}
} else {
if (fAnsiReceiver) {
LARGECOPYSTRINGLPSTR(&pcreatestruct->strClass, d.cs.lpszClass);
} else {
LARGECOPYSTRINGLPSTRW(&pcreatestruct->strClass, d.cs.lpszClass);
}
}
}
MSGDATA()->d.hwndInsertAfter = pcbt->hwndInsertAfter;
MSGDATA()->xpfnProc = xpfnProc;
MSGDATA()->bAnsi = fAnsiReceiver;
LOCKPWND();
MAKECALLCAPTURE(FNHKINLPCBTCREATESTRUCT);
UNLOCKPWND();
CHECKRETURN();
/*
* Probe output data
*/
OUTSTRUCT(&csdOut, CREATESTRUCTDATA);
// MS Visual C centers its dialogs with the CBT_CREATEHOOK
pcbt->hwndInsertAfter = csdOut.hwndInsertAfter;
pcbt->lpcs->x = csdOut.cs.x;
pcbt->lpcs->y = csdOut.cs.y;
pcbt->lpcs->cx = csdOut.cs.cx;
pcbt->lpcs->cy = csdOut.cs.cy;
TRACECALLBACK("SfnHkINLPCBTCREATESTRUCT");
ENDSENDCAPTURE(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnHkINLPCBTCREATESTRUCT, FNHKINLPCBTCREATESTRUCTMSG)
{
CBT_CREATEWND cbt;
BEGINRECV(0, &pmsg->d, sizeof(pmsg->d));
FIXUPPOINTERS();
cbt.lpcs = &pmsg->d.cs;
cbt.hwndInsertAfter = pmsg->d.hwndInsertAfter;
if ((ULONG_PTR)pmsg->d.cs.lpszName > gHighestUserAddress)
pmsg->d.cs.lpszName = REBASEPTR(pmsg->pwnd, pmsg->d.cs.lpszName);
if ((ULONG_PTR)pmsg->d.cs.lpszClass > gHighestUserAddress)
pmsg->d.cs.lpszClass = REBASEPTR(pmsg->pwnd, pmsg->d.cs.lpszClass);
if (pmsg->bAnsi) {
retval = DispatchHookA(
pmsg->msg,
pmsg->wParam,
(LPARAM)&cbt,
(HOOKPROC)pmsg->xpfnProc);
} else {
retval = DispatchHookW(
pmsg->msg,
pmsg->wParam,
(LPARAM)&cbt,
(HOOKPROC)pmsg->xpfnProc);
}
pmsg->d.hwndInsertAfter = cbt.hwndInsertAfter;
pmsg->d.cs.x = cbt.lpcs->x;
pmsg->d.cs.y = cbt.lpcs->y;
pmsg->d.cs.cx = cbt.lpcs->cx;
pmsg->d.cs.cy = cbt.lpcs->cy;
ENDRECV();
}
#endif // RECVSIDE
#ifdef REDIRECTION
/**************************************************************************\
* fnHkINLPPOINT
*
* 29-Jan-1999 clupu Created
\**************************************************************************/
typedef struct _FNHKINLPPOINTMSG {
DWORD nCode;
WPARAM wParam;
POINT pt;
ULONG_PTR xParam;
PROC xpfnProc;
} FNHKINLPPOINTMSG;
#ifdef SENDSIDE
LRESULT fnHkINLPPOINT(
IN DWORD nCode,
IN WPARAM wParam,
IN OUT LPPOINT ppt,
IN ULONG_PTR xParam,
IN PROC xpfnProc)
{
SETUP(FNHKINLPPOINT)
BEGINSEND(FNHKINLPPOINT)
MSGDATA()->nCode = nCode;
MSGDATA()->wParam = wParam;
MSGDATA()->pt = *ppt;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
MAKECALL(FNHKINLPPOINT);
CHECKRETURN();
/*
* Probe output data
*/
OUTSTRUCT(ppt, POINT);
TRACECALLBACK("SfnHkINLPPOINT");
ENDSEND(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnHkINLPPOINT, FNHKINLPPOINTMSG)
{
BEGINRECV(0, &pmsg->pt, sizeof(POINT));
retval = (DWORD)CALLPROC(pmsg->xpfnProc)(
pmsg->nCode,
pmsg->wParam,
PCALLDATA(pt),
pmsg->xParam);
ENDRECV();
}
#endif // RECVSIDE
#endif // REDIRECTION
/**************************************************************************\
* fnHkINLPRECT
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _FNHKINLPRECTMSG {
DWORD nCode;
WPARAM wParam;
RECT rect;
ULONG_PTR xParam;
PROC xpfnProc;
} FNHKINLPRECTMSG;
#ifdef SENDSIDE
LRESULT fnHkINLPRECT(
IN DWORD nCode,
IN WPARAM wParam,
IN OUT LPRECT prect,
IN ULONG_PTR xParam,
IN PROC xpfnProc)
{
SETUP(FNHKINLPRECT)
BEGINSEND(FNHKINLPRECT)
MSGDATA()->nCode = nCode;
MSGDATA()->wParam = wParam;
MSGDATA()->rect = *prect;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
MAKECALL(FNHKINLPRECT);
CHECKRETURN();
/*
* Probe output data
*/
OUTSTRUCT(prect, RECT);
TRACECALLBACK("SfnHkINLPRECT");
ENDSEND(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnHkINLPRECT, FNHKINLPRECTMSG)
{
BEGINRECV(0, &pmsg->rect, sizeof(RECT));
retval = (DWORD)CALLPROC(pmsg->xpfnProc)(
pmsg->nCode,
pmsg->wParam,
PCALLDATA(rect),
pmsg->xParam);
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* yyy
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _FNHKINDWORDMSG {
GENERICHOOKHEADER ghh;
DWORD flags;
LPARAM lParam;
} FNHKINDWORDMSG;
#ifdef SENDSIDE
LRESULT fnHkINDWORD(
IN DWORD nCode,
IN WPARAM wParam,
IN LPARAM lParam,
IN ULONG_PTR xParam,
IN PROC xpfnProc,
IN OUT LPDWORD lpFlags)
{
SETUP(FNHKINDWORD)
BEGINSEND(FNHKINDWORD)
MSGDATA()->ghh.nCode = nCode;
MSGDATA()->ghh.wParam = wParam;
MSGDATA()->lParam = lParam;
MSGDATA()->ghh.xParam = xParam;
MSGDATA()->ghh.xpfnProc = xpfnProc;
MSGDATA()->flags = *lpFlags;
MAKECALL(FNHKINDWORD);
CHECKRETURN();
/*
* Probe output data
*/
OUTBITMASK(lpFlags, DWORD, HF_HOOKFAULTED);
TRACECALLBACK("SfnHkINDWORD");
ENDSEND(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnHkINDWORD, FNHKINDWORDMSG)
{
BEGINRECV(0, &pmsg->flags, sizeof(pmsg->flags));
retval = CallHookWithSEH((LPGENERICHOOKHEADER)pmsg, (LPVOID)pmsg->lParam, &pmsg->flags, retval);
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* yyy
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _FNHKINLPMSGDATA {
MSG msg;
DWORD flags;
} FNHKINLPMSGDATA;
typedef struct _FNHKINLPMSGMSG {
GENERICHOOKHEADER ghh;
FNHKINLPMSGDATA d;
} FNHKINLPMSGMSG;
#ifdef SENDSIDE
LRESULT fnHkINLPMSG(
DWORD nCode,
WPARAM wParam,
LPMSG pmsg,
ULONG_PTR xParam,
PROC xpfnProc,
BOOL bAnsi,
LPDWORD lpFlags)
{
SETUP(FNHKINLPMSG)
WPARAM wParamOriginal;
BEGINSEND(FNHKINLPMSG)
MSGDATA()->ghh.nCode = nCode;
MSGDATA()->ghh.wParam = wParam;
MSGDATA()->d.msg = *pmsg;
if (((WM_CHAR == pmsg->message) || (WM_SYSCHAR == pmsg->message)) && bAnsi) {
wParamOriginal = pmsg->wParam;
RtlWCSMessageWParamCharToMB(pmsg->message, &(MSGDATA()->d.msg.wParam));
}
MSGDATA()->ghh.xParam = xParam;
MSGDATA()->ghh.xpfnProc = xpfnProc;
MSGDATA()->d.flags = *lpFlags;
MAKECALL(FNHKINLPMSG);
CHECKRETURN();
/*
* Probe output data
*/
try {
ProbeForRead(pcbs->pOutput, sizeof(FNHKINLPMSGDATA), sizeof(DWORD));
*pmsg = ((FNHKINLPMSGDATA *)pcbs->pOutput)->msg;
COPY_FLAG(*lpFlags, ((FNHKINLPMSGDATA *)pcbs->pOutput)->flags, HF_HOOKFAULTED);
} except (W32ExceptionHandler(TRUE, RIP_WARNING)) {
MSGERROR();
}
if (((WM_CHAR == pmsg->message) || (WM_SYSCHAR == pmsg->message)) && bAnsi) {
/*
* LATER, DBCS should be handled correctly.
*/
/*
* If the ANSI hook didn't change the wParam we sent it, restore
* the Unicode value we started with, otherwise we just collapse
* Unicode chars to an ANSI codepage (best visual fit or ?)
* The rotten "Intellitype" point32.exe does this.
*/
if (MSGDATA()->d.msg.wParam == pmsg->wParam) {
pmsg->wParam = wParamOriginal;
} else {
RtlMBMessageWParamCharToWCS(pmsg->message, &pmsg->wParam);
}
}
TRACECALLBACK("SfnHkINLPMSG");
ENDSEND(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnHkINLPMSG, FNHKINLPMSGMSG)
{
BEGINRECV(0, &pmsg->d, sizeof(pmsg->d));
/*
* LATER, DBCS should be handled correctly.
*/
retval = CallHookWithSEH((LPGENERICHOOKHEADER)pmsg, &pmsg->d.msg, &pmsg->d.flags, retval);
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* yyy
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _FNHKINLPMOUSEHOOKSTRUCTEXMSG {
GENERICHOOKHEADER ghh;
DWORD flags;
MOUSEHOOKSTRUCTEX mousehookstructex;
} FNHKINLPMOUSEHOOKSTRUCTEXMSG;
#ifdef SENDSIDE
LRESULT fnHkINLPMOUSEHOOKSTRUCTEX(
IN DWORD nCode,
IN WPARAM wParam,
IN LPMOUSEHOOKSTRUCTEX pmousehookstructex,
IN ULONG_PTR xParam,
IN PROC xpfnProc,
IN OUT LPDWORD lpFlags)
{
SETUP(FNHKINLPMOUSEHOOKSTRUCTEX)
BEGINSEND(FNHKINLPMOUSEHOOKSTRUCTEX)
MSGDATA()->ghh.nCode = nCode;
MSGDATA()->ghh.wParam = wParam;
MSGDATA()->mousehookstructex = *pmousehookstructex;
MSGDATA()->ghh.xParam = xParam;
MSGDATA()->ghh.xpfnProc = xpfnProc;
MSGDATA()->flags = *lpFlags;
MAKECALL(FNHKINLPMOUSEHOOKSTRUCTEX);
CHECKRETURN();
/*
* Probe output data
*/
OUTBITMASK(lpFlags, DWORD, HF_HOOKFAULTED);
TRACECALLBACK("SfnHkINLPMOUSEHOOKSTRUCTEX");
ENDSEND(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnHkINLPMOUSEHOOKSTRUCTEX, FNHKINLPMOUSEHOOKSTRUCTEXMSG)
{
BEGINRECV(0, &pmsg->flags, sizeof(pmsg->flags));
retval = CallHookWithSEH((LPGENERICHOOKHEADER)pmsg, &pmsg->mousehookstructex, &pmsg->flags, retval);
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* kbdll
*
* 06-Jun-1996 clupu Created
\**************************************************************************/
typedef struct _FNHKINLPKBDLLHOOKSTRUCTMSG {
GENERICHOOKHEADER ghh;
KBDLLHOOKSTRUCT kbdllhookstruct;
} FNHKINLPKBDLLHOOKSTRUCTMSG;
#ifdef SENDSIDE
LRESULT fnHkINLPKBDLLHOOKSTRUCT(
IN DWORD nCode,
IN WPARAM wParam,
IN LPKBDLLHOOKSTRUCT pkbdllhookstruct,
IN ULONG_PTR xParam,
IN PROC xpfnProc)
{
SETUP(FNHKINLPKBDLLHOOKSTRUCT)
BEGINSEND(FNHKINLPKBDLLHOOKSTRUCT)
MSGDATA()->ghh.nCode = nCode;
MSGDATA()->ghh.wParam = wParam;
MSGDATA()->kbdllhookstruct = *pkbdllhookstruct;
MSGDATA()->ghh.xParam = xParam;
MSGDATA()->ghh.xpfnProc = xpfnProc;
MAKECALL(FNHKINLPKBDLLHOOKSTRUCT);
CHECKRETURN();
TRACECALLBACK("SfnHkINLPKBDLLHOOKSTRUCT");
ENDSEND(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnHkINLPKBDLLHOOKSTRUCT, FNHKINLPKBDLLHOOKSTRUCTMSG)
{
BEGINRECV(0, &pmsg->kbdllhookstruct, sizeof(pmsg->kbdllhookstruct));
retval = (DWORD)CALLPROC(pmsg->ghh.xpfnProc)(
pmsg->ghh.nCode,
pmsg->ghh.wParam,
&pmsg->kbdllhookstruct,
pmsg->ghh.xParam);
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* msll
*
* 06-Jun-1996 clupu Created
\**************************************************************************/
typedef struct _FNHKINLPMSLLHOOKSTRUCTMSG {
GENERICHOOKHEADER ghh;
MSLLHOOKSTRUCT msllhookstruct;
} FNHKINLPMSLLHOOKSTRUCTMSG;
#ifdef SENDSIDE
LRESULT fnHkINLPMSLLHOOKSTRUCT(
IN DWORD nCode,
IN WPARAM wParam,
IN LPMSLLHOOKSTRUCT pmsllhookstruct,
IN ULONG_PTR xParam,
IN PROC xpfnProc)
{
SETUP(FNHKINLPMSLLHOOKSTRUCT)
BEGINSEND(FNHKINLPMSLLHOOKSTRUCT)
MSGDATA()->ghh.nCode = nCode;
MSGDATA()->ghh.wParam = wParam;
MSGDATA()->msllhookstruct = *pmsllhookstruct;
MSGDATA()->ghh.xParam = xParam;
MSGDATA()->ghh.xpfnProc = xpfnProc;
MAKECALL(FNHKINLPMSLLHOOKSTRUCT);
CHECKRETURN();
TRACECALLBACK("SfnHkINLPMSLLHOOKSTRUCT");
ENDSEND(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnHkINLPMSLLHOOKSTRUCT, FNHKINLPMSLLHOOKSTRUCTMSG)
{
BEGINRECV(0, &pmsg->msllhookstruct, sizeof(pmsg->msllhookstruct));
retval = (DWORD)CALLPROC(pmsg->ghh.xpfnProc)(
pmsg->ghh.nCode,
pmsg->ghh.wParam,
&pmsg->msllhookstruct,
pmsg->ghh.xParam);
ENDRECV();
}
#endif // RECVSIDE
#ifdef REDIRECTION
/**************************************************************************\
* ht
*
* 21-Jan-1999 clupu Created
\**************************************************************************/
typedef struct _FNHKINLPHTHOOKSTRUCTMSG {
GENERICHOOKHEADER ghh;
HTHOOKSTRUCT hthookstruct;
} FNHKINLPHTHOOKSTRUCTMSG;
#ifdef SENDSIDE
LRESULT fnHkINLPHTHOOKSTRUCT(
IN DWORD nCode,
IN WPARAM wParam,
IN OUT LPHTHOOKSTRUCT phthookstruct,
IN ULONG_PTR xParam,
IN PROC xpfnProc)
{
SETUP(FNHKINLPHTHOOKSTRUCT)
BEGINSEND(FNHKINLPHTHOOKSTRUCT)
MSGDATA()->ghh.nCode = nCode;
MSGDATA()->ghh.wParam = wParam;
MSGDATA()->hthookstruct = *phthookstruct;
MSGDATA()->ghh.xParam = xParam;
MSGDATA()->ghh.xpfnProc = xpfnProc;
MAKECALL(FNHKINLPHTHOOKSTRUCT);
CHECKRETURN();
/*
* Probe output data
*/
if (phthookstruct != NULL)
OUTSTRUCT(phthookstruct, HTHOOKSTRUCT);
TRACECALLBACK("SfnHkINLPHTHOOKSTRUCT");
ENDSEND(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnHkINLPHTHOOKSTRUCT, FNHKINLPHTHOOKSTRUCTMSG)
{
BEGINRECV(0, &pmsg->hthookstruct, sizeof(pmsg->hthookstruct));
retval = (DWORD)CALLPROC(pmsg->ghh.xpfnProc)(
pmsg->ghh.nCode,
pmsg->ghh.wParam,
&pmsg->hthookstruct,
pmsg->ghh.xParam);
ENDRECV();
}
#endif // RECVSIDE
#endif // REDIRECTION
/**************************************************************************\
* yyy
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _FNHKOPTINLPEVENTMSGMSG {
DWORD nCode;
WPARAM wParam;
LPEVENTMSGMSG peventmsgmsg;
ULONG_PTR xParam;
PROC xpfnProc;
EVENTMSG eventmsgmsg;
} FNHKOPTINLPEVENTMSGMSG;
#ifdef SENDSIDE
LRESULT fnHkOPTINLPEVENTMSG(
IN DWORD nCode,
IN WPARAM wParam,
IN OUT LPEVENTMSGMSG peventmsgmsg,
IN ULONG_PTR xParam,
IN PROC xpfnProc)
{
SETUP(FNHKOPTINLPEVENTMSG)
BEGINSEND(FNHKOPTINLPEVENTMSG)
MSGDATA()->nCode = nCode;
MSGDATA()->wParam = wParam;
COPYSTRUCTOPT(eventmsgmsg);
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
MAKECALL(FNHKOPTINLPEVENTMSG);
CHECKRETURN();
/*
* Probe output data
*/
if (peventmsgmsg != NULL)
OUTSTRUCT(peventmsgmsg, EVENTMSG);
TRACECALLBACK("SfnHkOPTINLPEVENTMSG");
ENDSEND(DWORD,-1);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnHkOPTINLPEVENTMSG, FNHKOPTINLPEVENTMSGMSG)
{
PHOOK phk;
BEGINRECV(-1, &pmsg->eventmsgmsg, sizeof(pmsg->eventmsgmsg));
if (pmsg->wParam) {
phk = (PHOOK)HMValidateHandle((HANDLE)pmsg->wParam, TYPE_HOOK);
if (phk != NULL) {
/*
* The HF_NEEDHC_SKIP bit is passed on from the pti when we need to
* pass on a HC_SKIP
*/
if ((phk->flags & HF_NEEDHC_SKIP) &&
(HIWORD(pmsg->nCode) == WH_JOURNALPLAYBACK)) {
UserAssert(LOWORD(pmsg->nCode) == HC_GETNEXT);
CALLPROC(pmsg->xpfnProc)(
MAKELONG(HC_SKIP, HIWORD(pmsg->nCode)),
0,
0,
pmsg->xParam);
}
/*
* Make sure the hook wasn't free'd during the last call to the app
*/
if (HMIsMarkDestroy(phk)) {
retval = (DWORD)-1;
goto AllDoneHere;
}
}
}
pmsg->wParam = 0;
retval = (DWORD)CALLPROC(pmsg->xpfnProc)(
pmsg->nCode,
pmsg->wParam,
PCALLDATAOPT(eventmsgmsg),
pmsg->xParam);
AllDoneHere:
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* yyy
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
/*
* Create a structure big enough to hold the larges item LPARAM points to.
*/
typedef union _DEBUGLPARAM {
MSG msg; // WH_GETMESSAGE, WH_MSGFILTER, WH_SYSMSGFILTER
CWPSTRUCT cwp; // WH_CALLWNDPROC
CWPRETSTRUCT cwpret; // WH_CALLWNDPROCRET
MOUSEHOOKSTRUCTEX mhs; // WH_MOUSE, HCBT_CLICKSKIPPED
EVENTMSG em; // WH_JOURNALRECORD, WH_JOURNALPLAYBACK
CBTACTIVATESTRUCT as; // HCBT_ACTIVATE
CBT_CREATEWND cw; // HCBT_CREATEWND
RECT rc; // HCBT_MOVESIZE
} DEBUGLPARAM;
typedef struct _FNHKINLPDEBUGHOOKSTRUCTMSG {
DWORD nCode;
WPARAM wParam;
DEBUGHOOKINFO debughookstruct;
DEBUGLPARAM dbgLParam;
DWORD cbDbgLParam;
ULONG_PTR xParam;
PROC xpfnProc;
} FNHKINLPDEBUGHOOKSTRUCTMSG;
#ifdef SENDSIDE
LRESULT fnHkINLPDEBUGHOOKSTRUCT(
IN DWORD nCode,
IN WPARAM wParam,
IN LPDEBUGHOOKINFO pdebughookstruct,
IN ULONG_PTR xParam,
IN PROC xpfnProc)
{
SETUP(FNHKINLPDEBUGHOOKSTRUCT)
BEGINSEND(FNHKINLPDEBUGHOOKSTRUCT)
MSGDATA()->nCode = nCode;
MSGDATA()->wParam = wParam;
MSGDATA()->debughookstruct = *pdebughookstruct;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
MSGDATA()->cbDbgLParam = GetDebugHookLParamSize(wParam, pdebughookstruct);
switch(wParam) {
case WH_MOUSE_LL:
case WH_KEYBOARD_LL:
return 0;
}
/*
* if LPARAM in the debug hook points to struct then copy it over
*/
if (MSGDATA()->cbDbgLParam) {
try {
RtlCopyMemory(&MSGDATA()->dbgLParam, (BYTE *)pdebughookstruct->lParam,
MSGDATA()->cbDbgLParam);
} except (W32ExceptionHandler(FALSE, RIP_WARNING)) {
MSGERROR();
}
}
MAKECALL(FNHKINLPDEBUGHOOKSTRUCT);
CHECKRETURN();
TRACECALLBACK("SfnHkINLPDEBUGHOOKSTRUCT");
ENDSEND(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnHkINLPDEBUGHOOKSTRUCT, FNHKINLPDEBUGHOOKSTRUCTMSG)
{
BEGINRECV(0, NULL, 0);
if (pmsg->cbDbgLParam) {
pmsg->debughookstruct.lParam = (LPARAM)&(pmsg->dbgLParam);
}
retval = (DWORD)CALLPROC(pmsg->xpfnProc)(
pmsg->nCode,
pmsg->wParam,
&(pmsg->debughookstruct),
pmsg->xParam);
ENDRECV();
}
#endif // RECVSIDE
DWORD GetDebugHookLParamSize(
IN WPARAM wParam,
IN PDEBUGHOOKINFO pdebughookstruct)
{
DWORD cbDbgLParam = 0;
switch(wParam) {
case WH_MSGFILTER:
case WH_SYSMSGFILTER:
case WH_GETMESSAGE:
cbDbgLParam = sizeof(MSG);
break;
case WH_CALLWNDPROC:
cbDbgLParam = sizeof(CWPSTRUCT);
break;
case WH_CALLWNDPROCRET:
cbDbgLParam = sizeof(CWPRETSTRUCT);
break;
case WH_MOUSE:
cbDbgLParam = sizeof(MOUSEHOOKSTRUCTEX);
break;
case WH_JOURNALRECORD:
case WH_JOURNALPLAYBACK:
cbDbgLParam = sizeof(EVENTMSG);
break;
case WH_CBT:
switch (pdebughookstruct->code) {
case HCBT_ACTIVATE:
cbDbgLParam = sizeof(CBTACTIVATESTRUCT);
break;
case HCBT_CLICKSKIPPED:
cbDbgLParam = sizeof(MOUSEHOOKSTRUCTEX);
break;
case HCBT_CREATEWND:
cbDbgLParam = sizeof(CBT_CREATEWND);
break;
case HCBT_MOVESIZE:
cbDbgLParam = sizeof(RECT);
break;
}
break;
case WH_SHELL:
if (pdebughookstruct->code == HSHELL_GETMINRECT) {
cbDbgLParam = sizeof(RECT);
}
break;
}
return cbDbgLParam;
}
/**************************************************************************\
* fnHkINLPCBTACTIVATESTRUCT
*
* 17-Mar-1992 jonpa Created
\**************************************************************************/
typedef struct _FNHKINLPCBTACTIVATESTRUCTMSG {
DWORD nCode;
WPARAM wParam;
CBTACTIVATESTRUCT cbtactivatestruct;
ULONG_PTR xParam;
PROC xpfnProc;
} FNHKINLPCBTACTIVATESTRUCTMSG;
#ifdef SENDSIDE
LRESULT fnHkINLPCBTACTIVATESTRUCT(
IN DWORD nCode,
IN WPARAM wParam,
IN LPCBTACTIVATESTRUCT pcbtactivatestruct,
IN ULONG_PTR xParam,
IN PROC xpfnProc)
{
SETUP(FNHKINLPCBTACTIVATESTRUCT)
BEGINSEND(FNHKINLPCBTACTIVATESTRUCT)
MSGDATA()->nCode = nCode;
MSGDATA()->wParam = wParam;
MSGDATA()->cbtactivatestruct = *pcbtactivatestruct;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
MAKECALL(FNHKINLPCBTACTIVATESTRUCT);
CHECKRETURN();
TRACECALLBACK("SfnHkINLPCBTACTIVATESTRUCT");
ENDSEND(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnHkINLPCBTACTIVATESTRUCT, FNHKINLPCBTACTIVATESTRUCTMSG)
{
BEGINRECV(0, NULL, 0);
retval = (DWORD)CALLPROC(pmsg->xpfnProc)(
pmsg->nCode,
pmsg->wParam,
&(pmsg->cbtactivatestruct),
pmsg->xParam);
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* ClientLoadMenu
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _CLIENTLOADMENUMSG {
CAPTUREBUF CaptureBuf;
HANDLE hmod;
UNICODE_STRING strName;
} CLIENTLOADMENUMSG;
#ifdef SENDSIDE
PMENU xxxClientLoadMenu(
IN HANDLE hmod,
IN PUNICODE_STRING pstrName)
{
DWORD cCapture, cbCapture;
SETUP(CLIENTLOADMENU)
if (pstrName->MaximumLength) {
cCapture = 1;
cbCapture = pstrName->MaximumLength;
} else
cCapture = cbCapture = 0;
BEGINSENDCAPTURE(CLIENTLOADMENU, cCapture, cbCapture, TRUE)
MSGDATA()->hmod = hmod;
COPYSTRINGID(strName);
MAKECALLCAPTURE(CLIENTLOADMENU);
CHECKRETURN();
retval = (ULONG_PTR)HtoP((HMENU)retval);
TRACECALLBACK("ClientLoadMenu");
ENDSENDCAPTURE(PMENU,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientLoadMenu, CLIENTLOADMENUMSG)
{
BEGINRECV(0, NULL, 0);
FIXUPPOINTERS();
retval = (ULONG_PTR)LoadMenu(
CALLDATA(hmod) ? CALLDATA(hmod) : hmodUser,
(LPTSTR)FIXUPSTRINGID(strName));
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* xxxClientLoadImage
*
* 28-Aug-1995 ChrisWil Created
\**************************************************************************/
typedef struct _CLIENTLOADIMAGEMSG {
CAPTUREBUF CaptureBuf;
UNICODE_STRING strModName;
UNICODE_STRING strName;
UINT uImageType;
int cxDesired;
int cyDesired;
UINT LR_flags;
BOOL fWallpaper;
} CLIENTLOADIMAGEMSG;
#ifdef SENDSIDE
HANDLE xxxClientLoadImage(
IN PUNICODE_STRING pstrName,
IN ATOM atomModName,
IN WORD wImageType,
IN int cxDesired,
IN int cyDesired,
IN UINT LR_flags,
IN BOOL fWallpaper)
{
DWORD cCapture;
DWORD cbCapture;
WCHAR awszModName[MAX_PATH];
UNICODE_STRING strModName;
PUNICODE_STRING pstrModName = &strModName;
SETUP(CLIENTLOADIMAGE)
if (pstrName->MaximumLength) {
cCapture = 1;
cbCapture = pstrName->MaximumLength;
} else {
cCapture =
cbCapture = 0;
}
if (atomModName && atomModName != atomUSER32) {
UserGetAtomName(atomModName, awszModName, MAX_PATH);
RtlInitUnicodeString(&strModName, awszModName);
} else {
strModName.Length = strModName.MaximumLength = 0;
strModName.Buffer = NULL;
}
if (pstrModName->MaximumLength) {
cCapture++;
cbCapture += pstrModName->MaximumLength;
}
BEGINSENDCAPTURE(CLIENTLOADIMAGE, cCapture, cbCapture, TRUE)
COPYSTRINGOPT(strModName);
COPYSTRINGID(strName);
MSGDATA()->uImageType = (UINT)wImageType;
MSGDATA()->cxDesired = cxDesired;
MSGDATA()->cyDesired = cyDesired;
MSGDATA()->LR_flags = LR_flags;
MSGDATA()->fWallpaper = fWallpaper;
MAKECALLCAPTURE(CLIENTLOADIMAGE);
CHECKRETURN();
if (retval && (wImageType != IMAGE_BITMAP)) {
retval = (ULONG_PTR)HMRevalidateHandle((HANDLE)retval);
}
TRACECALLBACK("ClientLoadImage");
ENDSENDCAPTURE(PCURSOR,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientLoadImage, CLIENTLOADIMAGEMSG)
{
HMODULE hmod;
LPTSTR filepart;
LPTSTR lpszName;
TCHAR szFullPath[MAX_PATH];
TCHAR szExpandedPath[MAX_PATH];
DWORD dwRet;
BEGINRECV(0, NULL, 0);
FIXUPPOINTERS();
if (hmod = (HMODULE)FIXUPSTRINGIDOPT(strModName)) {
if ((hmod = GetModuleHandle((LPTSTR)hmod)) == NULL) {
MSGERROR();
}
}
/*
* Find the file. This normalizes the filename.
*/
lpszName = (LPTSTR)FIXUPSTRINGID(strName);
if (CALLDATA(fWallpaper)) {
/*
* Expand any environment strings in the path. This is beneficial
* for people using roaming profiles. See bug #89188.
*/
dwRet = ExpandEnvironmentStrings(lpszName, szExpandedPath, MAX_PATH);
/*
* dwRet > MAX_PATH means that the buffer we supplied was too small. If
* this happens, there's no way the LoadImage can succeed - even if the
* buffer were big enough, as the filename can't possibly refer to a
* valid file - so fail the call.
*/
if (dwRet == 0 || dwRet > MAX_PATH) {
MSGERROR();
}
if (!SearchPath(NULL,
szExpandedPath,
TEXT(".bmp"),
ARRAY_SIZE(szFullPath),
szFullPath,
&filepart)) {
MSGERROR();
}
lpszName = szFullPath;
}
retval = (ULONG_PTR)LoadImage(hmod,
lpszName,
CALLDATA(uImageType),
CALLDATA(cxDesired),
CALLDATA(cyDesired),
CALLDATA(LR_flags));
ENDRECV();
}
#endif // RECVSIDE
/***********************************************************************\
* xxxClientCopyImage
*
* Returns: hIconCopy - note LR_flags could cause this to be the same as
* what came in.
*
* 11/3/1995 Created SanfordS
\***********************************************************************/
typedef struct _CLIENTCOPYIMAGEMSG {
HANDLE hImage;
UINT uImageType;
int cxDesired;
int cyDesired;
UINT LR_flags;
} CLIENTCOPYIMAGEMSG;
#ifdef SENDSIDE
HANDLE xxxClientCopyImage(
IN HANDLE hImage,
IN UINT uImageType,
IN int cxDesired,
IN int cyDesired,
IN UINT LR_flags)
{
SETUP(CLIENTCOPYIMAGE)
BEGINSEND(CLIENTCOPYIMAGE)
MSGDATA()->hImage = hImage;
MSGDATA()->uImageType = uImageType;
MSGDATA()->cxDesired = cxDesired;
MSGDATA()->cyDesired = cyDesired;
MSGDATA()->LR_flags = LR_flags;
MAKECALL(CLIENTCOPYIMAGE);
CHECKRETURN();
if (retval && (uImageType != IMAGE_BITMAP)) {
retval = (ULONG_PTR)HMRevalidateHandle((HANDLE)retval);
}
TRACECALLBACK("ClientCopyImage");
ENDSEND(HANDLE,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientCopyImage, CLIENTCOPYIMAGEMSG)
{
BEGINRECV(0, NULL, 0);
retval = (ULONG_PTR)InternalCopyImage(CALLDATA(hImage),
CALLDATA(uImageType),
CALLDATA(cxDesired),
CALLDATA(cyDesired),
CALLDATA(LR_flags));
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* yyy
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _CLIENTGETLISTBOXSTRINGMSG {
CAPTUREBUF CaptureBuf;
PWND pwnd;
UINT msg;
WPARAM wParam;
ULONG_PTR xParam;
PROC xpfn;
PBYTE pOutput;
DWORD cbOutput;
} CLIENTGETLISTBOXSTRINGMSG;
#ifdef SENDSIDE
DWORD ClientGetListboxString(
IN PWND pwnd,
IN UINT msg,
IN WPARAM wParam,
OUT PVOID pdata,
IN ULONG_PTR xParam,
IN PROC xpfn,
IN DWORD dwSCMSFlags,
IN BOOL bNotString,
IN PSMS psms)
{
DWORD cbCapture;
DWORD cchRet;
PLARGE_STRING pstr;
BOOL fAnsiReceiver = (dwSCMSFlags & SCMS_FLAGS_ANSI);
SETUPPWND(CLIENTGETLISTBOXSTRING)
CheckLock(pwnd);
pstr = (PLARGE_STRING)pdata;
cbCapture = pstr->MaximumLength;
BEGINSENDCAPTURE(CLIENTGETLISTBOXSTRING, 1, cbCapture, FALSE)
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfn = xpfn;
RESERVEBYTES(cbCapture, pOutput, cbOutput);
LOCKPWND();
MAKECALLCAPTURE(CLIENTGETLISTBOXSTRING);
UNLOCKPWND();
CHECKRETURN();
BEGINCOPYOUT()
if (bNotString) {
/*
* This is a 4-byte "object" for ownerdraw listboxes without
* the LBS_HASSTRINGS style.
*/
OUTSTRUCT((PULONG_PTR)pstr->Buffer, ULONG_PTR);
} else {
COPYOUTLPWSTRLIMIT(pstr,
pstr->bAnsi ? (int)pstr->MaximumLength :
(int)pstr->MaximumLength / sizeof(WCHAR));
}
cchRet = pstr->Length;
if (!pstr->bAnsi)
cchRet *= sizeof(WCHAR);
if (!bNotString && retval != LB_ERR && retval > cchRet) {
RIPMSG2(RIP_WARNING, "GetListBoxString: limit %lX chars to %lX\n",
retval, cchRet);
retval = cchRet;
}
ENDCOPYOUT()
TRACECALLBACK("ClientGetListboxString");
ENDSENDCAPTURE(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientGetListboxString, CLIENTGETLISTBOXSTRINGMSG)
{
BYTE abOutput[CALLBACKSTACKLIMIT];
BEGINRECV(0, NULL, pmsg->cbOutput);
FIXUPPOINTERS();
if (pmsg->cbOutput <= CALLBACKSTACKLIMIT)
CallbackStatus.pOutput = abOutput;
else
CallbackStatus.pOutput = pmsg->pOutput;
retval = (DWORD)_ClientGetListboxString(
CALLDATA(pwnd),
CALLDATA(msg),
CALLDATA(wParam),
(LPSTR)KPVOID_TO_PVOID(CallbackStatus.pOutput),
CALLDATA(xParam),
CALLDATA(xpfn));
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* yyy
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _CLIENTLOADLIBRARYMSG {
CAPTUREBUF CaptureBuf;
UNICODE_STRING strLib;
ULONG_PTR offPfnInitUserApiHook;
} CLIENTLOADLIBRARYMSG;
#ifdef SENDSIDE
HANDLE ClientLoadLibrary(
IN PUNICODE_STRING pstrLib,
IN ULONG_PTR offPfnInitUserApiHook)
{
SETUP(CLIENTLOADLIBRARY)
BEGINSENDCAPTURE(CLIENTLOADLIBRARY, 1, pstrLib->MaximumLength, TRUE)
MSGDATA()->offPfnInitUserApiHook = offPfnInitUserApiHook;
COPYSTRING(strLib);
MAKECALLCAPTURE(CLIENTLOADLIBRARY);
CHECKRETURN();
TRACECALLBACK("ClientLoadLibrary");
ENDSENDCAPTURE(HANDLE,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientLoadLibrary, CLIENTLOADLIBRARYMSG)
{
BEGINRECV(0, NULL, 0);
FIXUPPOINTERS();
retval = (ULONG_PTR)LoadLibraryEx((LPTSTR)FIXUPSTRING(strLib), NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
/*
* If we're loading the module containing the UserApiHook's,
* make sure it's correctly initialized.
*/
if ((retval != 0) && CALLDATA(offPfnInitUserApiHook)) {
if (!InitUserApiHook((HMODULE)retval, CALLDATA(offPfnInitUserApiHook))) {
FreeLibrary((HMODULE)retval);
retval = 0;
MSGERROR();
}
}
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* yyy
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _CLIENTFREELIBRARYMSG {
HANDLE hmod;
} CLIENTFREELIBRARYMSG;
#ifdef SENDSIDE
BOOL ClientFreeLibrary(
IN HANDLE hmod)
{
SETUP(CLIENTFREELIBRARY)
BEGINSEND(CLIENTFREELIBRARY)
MSGDATA()->hmod = hmod;
MAKECALL(CLIENTFREELIBRARY);
CHECKRETURN();
TRACECALLBACK("ClientFreeLibrary");
ENDSEND(BOOL,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientFreeLibrary, CLIENTFREELIBRARYMSG)
{
BEGINRECV(0, NULL, 0);
/*
* Make sure we don't free a UserApiHook module that's in use.
*/
if (!ClearUserApiHook(CALLDATA(hmod))) {
MSGERROR();
}
retval = (DWORD)FreeLibrary(CALLDATA(hmod));
ENDRECV();
}
#endif // RECVSIDE
#ifdef MESSAGE_PUMP_HOOK
/**************************************************************************\
* GetMessageMPH()
*
* 06-Dec-2000 JStall Created
\**************************************************************************/
typedef struct _CLIENTGETMESSAGEMPHMSG {
HWND hwndFilter;
UINT msgMin;
UINT msgMax;
UINT flags;
BOOL fGetMessage;
} CLIENTGETMESSAGEMPHMSG;
#ifdef SENDSIDE
BOOL ClientGetMessageMPH(
IN MSG * pmsg,
IN HWND hwndFilter,
IN UINT msgMin,
IN UINT msgMax,
IN UINT flags,
IN BOOL fGetMessage)
{
SETUP(CLIENTGETMESSAGEMPH)
BEGINSEND(CLIENTGETMESSAGEMPH)
MSGDATA()->hwndFilter = hwndFilter;
MSGDATA()->msgMin = msgMin;
MSGDATA()->msgMax = msgMax;
MSGDATA()->flags = flags;
MSGDATA()->fGetMessage = fGetMessage;
MAKECALL(CLIENTGETMESSAGEMPH);
CHECKRETURN();
OUTSTRUCT(pmsg, MSG);
TRACECALLBACK("ClientGetMessageMPH");
ENDSEND(BOOL,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientGetMessageMPH, CLIENTGETMESSAGEMPHMSG)
{
MSG msg;
BEGINRECV(0, &msg, sizeof(msg));
retval = (ULONG_PTR)(gmph.pfnInternalGetMessage)(&msg, CALLDATA(hwndFilter),
CALLDATA(msgMin), CALLDATA(msgMax), CALLDATA(flags), CALLDATA(fGetMessage));
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* WaitMessageMPH()
*
* 06-Dec-2000 JStall Created
\**************************************************************************/
typedef struct _CLIENTWAITMESSAGEEXMPHMSG {
UINT fsWakeMask;
DWORD Timeout;
} CLIENTWAITMESSAGEEXMPHMSG;
#ifdef SENDSIDE
BOOL ClientWaitMessageExMPH(
IN UINT fsWakeMask,
IN DWORD Timeout)
{
SETUP(CLIENTWAITMESSAGEEXMPH)
BEGINSEND(CLIENTWAITMESSAGEEXMPH)
MSGDATA()->fsWakeMask = fsWakeMask;
MSGDATA()->Timeout = Timeout;
MAKECALL(CLIENTWAITMESSAGEEXMPH);
CHECKRETURN();
TRACECALLBACK("ClientWaitMessageExMPH");
ENDSEND(BOOL,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientWaitMessageExMPH, CLIENTWAITMESSAGEEXMPHMSG)
{
BEGINRECV(0, NULL, 0);
retval = (ULONG_PTR)(gmph.pfnWaitMessageEx)(CALLDATA(fsWakeMask), CALLDATA(Timeout));
ENDRECV();
}
#endif // RECVSIDE
#endif // MESSAGE_PUMP_HOOK
/**************************************************************************\
* xxxClientGetCharsetInfo
*
* 96-06-11 IanJa Created
\**************************************************************************/
typedef struct _CLIENTGETCHARSETINFOMSG {
LCID lcid;
CHARSETINFO cs;
} CLIENTGETCHARSETINFOMSG;
#ifdef SENDSIDE
BOOL xxxClientGetCharsetInfo(
IN LCID lcid,
OUT PCHARSETINFO pcs)
{
SETUP(CLIENTGETCHARSETINFO)
BEGINSEND(CLIENTGETSCHARSETINFO)
MSGDATA()->lcid = lcid;
MAKECALL(CLIENTGETCHARSETINFO);
CHECKRETURN();
OUTSTRUCT(pcs, CHARSETINFO);
TRACECALLBACK("ClientGetCharsetInfo");
ENDSEND(BOOL,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientGetCharsetInfo, CLIENTGETCHARSETINFOMSG)
{
BEGINRECV(0, &pmsg->cs, sizeof(CHARSETINFO));
// TCI_SRCLOCALE = 0x1000
// Sundown: lcid value should be zero-extended in the TCI_SRCLOCALE case.
retval = (DWORD)TranslateCharsetInfo((DWORD *)ULongToPtr( pmsg->lcid ), &pmsg->cs, TCI_SRCLOCALE);
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* ClientFreeDDEHandle
*
* 9-29-91 sanfords Created.
\**************************************************************************/
typedef struct _CLIENTFREEDDEHANDLEMSG {
HANDLE hClient;
DWORD flags;
} CLIENTFREEDDEHANDLEMSG;
#ifdef SENDSIDE
DWORD ClientFreeDDEHandle(
IN HANDLE hClient,
IN DWORD flags)
{
SETUP(CLIENTFREEDDEHANDLE)
BEGINSEND(CLIENTFREEDDEHANDLE)
MSGDATA()->hClient = hClient;
MSGDATA()->flags = flags;
MAKECALL(CLIENTFREEDDEHANDLE);
CHECKRETURN();
TRACECALLBACK("ClientFreeDDEHandle");
ENDSEND(DWORD, 0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientFreeDDEHandle, CLIENTFREEDDEHANDLEMSG)
{
BEGINRECV(0, NULL, 0);
_ClientFreeDDEHandle(CALLDATA(hClient), CALLDATA(flags));
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* ClientGetDDEFlags
*
* This function is used to get a peek at the wStatus flags packed within
* DDE handles - this could either be within the DdePack structure directly
* or within the direct data handle given or referenced via the DdePack
* structure. flags is used to figure out the right thing to do.
*
* 9-29-91 sanfords Created.
\**************************************************************************/
typedef struct _CLIENTGETDDEFLAGSMSG {
HANDLE hClient;
DWORD flags;
} CLIENTGETDDEFLAGSMSG;
#ifdef SENDSIDE
DWORD ClientGetDDEFlags(
IN HANDLE hClient,
IN DWORD flags)
{
SETUP(CLIENTGETDDEFLAGS)
BEGINSEND(CLIENTGETDDEFLAGS)
MSGDATA()->hClient = hClient;
MSGDATA()->flags = flags;
MAKECALL(CLIENTGETDDEFLAGS);
CHECKRETURN();
TRACECALLBACK("ClientGetDDEFlags");
ENDSEND(DWORD, 0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientGetDDEFlags, CLIENTGETDDEFLAGSMSG)
{
BEGINRECV(0, NULL, 0);
retval = _ClientGetDDEFlags(CALLDATA(hClient), CALLDATA(flags));
ENDRECV();
}
#endif // RECVSIDE
/************************************************************************
* ClientCopyDDEIn1
*
* History:
* 10-22-91 sanfords Created
\***********************************************************************/
typedef struct _CLIENTCOPYDDEIN1MSG {
HANDLE hClient; // client side DDE handle - non-0 on initial call
DWORD flags;
} CLIENTCOPYDDEIN1MSG;
#ifdef SENDSIDE
DWORD xxxClientCopyDDEIn1(
HANDLE hClient,
DWORD flags,
PINTDDEINFO *ppi)
{
PINTDDEINFO pi;
INTDDEINFO IntDdeInfo;
SETUP(CLIENTCOPYDDEIN1)
BEGINSEND(CLIENTCOPYDDEIN1)
retval = FAIL_POST;
*ppi = NULL;
MSGDATA()->hClient = hClient;
MSGDATA()->flags = flags;
MAKECALL(CLIENTCOPYDDEIN1);
CHECKRETURN();
if (retval != DO_POST) {
MSGERROR();
}
try {
OUTSTRUCT(&IntDdeInfo, INTDDEINFO);
pi = (PINTDDEINFO)UserAllocPool(
sizeof(INTDDEINFO) + IntDdeInfo.cbDirect +
IntDdeInfo.cbIndirect, TAG_DDE);
if (pi != NULL) {
*ppi = pi;
*pi = IntDdeInfo;
if (IntDdeInfo.cbDirect) {
RtlCopyMemory((PBYTE)pi + sizeof(INTDDEINFO),
IntDdeInfo.pDirect,
IntDdeInfo.cbDirect);
}
if (IntDdeInfo.cbIndirect) {
RtlCopyMemory((PBYTE)pi + sizeof(INTDDEINFO) +
IntDdeInfo.cbDirect,
IntDdeInfo.pIndirect,
IntDdeInfo.cbIndirect);
}
xxxClientCopyDDEIn2(pi);
} else {
retval = FAILNOFREE_POST;
}
} except (W32ExceptionHandler(TRUE, RIP_WARNING)) {
if (pi != NULL)
UserFreePool(pi);
retval = FAILNOFREE_POST;
MSGERROR();
}
TRACECALLBACK("ClientCopyDDEIn1");
ENDSEND(DWORD, retval);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientCopyDDEIn1, CLIENTCOPYDDEIN1MSG)
{
INTDDEINFO IntDdeInfo;
BEGINRECV(0, &IntDdeInfo, sizeof(INTDDEINFO));
IntDdeInfo.flags = CALLDATA(flags);
retval = _ClientCopyDDEIn1(CALLDATA(hClient), &IntDdeInfo);
ENDRECV();
}
#endif // RECVSIDE
/************************************************************************
* ClientCopyDDEIn2
*
* History:
* 9-3-91 sanfords Created
\***********************************************************************/
typedef struct _CLIENTCOPYDDEIN2MSG {
INTDDEINFO IntDdeInfo;
} CLIENTCOPYDDEIN2MSG;
#ifdef SENDSIDE
BOOL xxxClientCopyDDEIn2(
PINTDDEINFO pi)
{
SETUP(CLIENTCOPYDDEIN2)
BEGINSEND(CLIENTCOPYDDEIN2)
MSGDATA()->IntDdeInfo = *pi;
MAKECALL(CLIENTCOPYDDEIN2);
CHECKRETURN();
TRACECALLBACK("ClientCopyDDEIn2");
ENDSEND(BOOL, 0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientCopyDDEIn2, CLIENTCOPYDDEIN2MSG)
{
BEGINRECV(0, NULL, 0);
_ClientCopyDDEIn2(PCALLDATA(IntDdeInfo));
ENDRECV();
}
#endif // RECVSIDE
/************************************************************************
* ClientCopyDDEOut2
*
* History:
* 10-22-91 sanfords Created
\***********************************************************************/
typedef struct _CLIENTCOPYDDEOUT2MSG {
INTDDEINFO IntDdeInfo;
} CLIENTCOPYDDEOUT2MSG;
#ifdef SENDSIDE
DWORD xxxClientCopyDDEOut2(
PINTDDEINFO pi)
{
SETUP(CLIENTCOPYDDEOUT2)
BEGINSEND(CLIENTCOPYDDEOUT2)
MSGDATA()->IntDdeInfo = *pi;
MAKECALL(CLIENTCOPYDDEOUT2);
/*
* This read is covered by a try/except in ClientCopyDDEOut1.
*/
pi->hDirect = MSGDATA()->IntDdeInfo.hDirect;
CHECKRETURN();
TRACECALLBACK("ClientCopyDDEOut2");
ENDSEND(DWORD, 0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientCopyDDEOut2, CLIENTCOPYDDEOUT2MSG)
{
BEGINRECV(0, NULL, 0);
retval = _ClientCopyDDEOut2(PCALLDATA(IntDdeInfo));
ENDRECV();
}
#endif // RECVSIDE
/************************************************************************
* ClientCopyDDEOut1
*
* History:
* 10-22-91 sanfords Created
\***********************************************************************/
typedef struct _CLIENTCOPYDDEOUT1MSG {
INTDDEINFO IntDdeInfo;
} CLIENTCOPYDDEOUT1MSG;
#ifdef SENDSIDE
HANDLE xxxClientCopyDDEOut1(
PINTDDEINFO pi)
{
INTDDEINFO IntDdeInfo;
SETUP(CLIENTCOPYDDEOUT1)
BEGINSEND(CLIENTCOPYDDEOUT1)
MSGDATA()->IntDdeInfo = *pi;
MAKECALL(CLIENTCOPYDDEOUT1);
CHECKRETURN();
if (retval) {
try {
OUTSTRUCT(&IntDdeInfo, INTDDEINFO);
if (pi->cbDirect) {
ProbeForWrite(IntDdeInfo.pDirect,
pi->cbDirect,
sizeof(BYTE));
RtlCopyMemory(IntDdeInfo.pDirect,
(PBYTE)pi + sizeof(INTDDEINFO),
pi->cbDirect);
}
if (pi->cbIndirect) {
ProbeForWrite(IntDdeInfo.pIndirect,
pi->cbIndirect,
sizeof(BYTE));
RtlCopyMemory(IntDdeInfo.pIndirect,
(PBYTE)pi + sizeof(INTDDEINFO) + pi->cbDirect,
pi->cbIndirect);
}
if (IntDdeInfo.hDirect != NULL) {
BOOL fSuccess = xxxClientCopyDDEOut2(&IntDdeInfo);
if (fSuccess && IntDdeInfo.flags & XS_EXECUTE) {
/*
* In case value was changed by Execute Fixup.
*/
retval = (ULONG_PTR)IntDdeInfo.hDirect;
}
}
*pi = IntDdeInfo;
} except (W32ExceptionHandler(TRUE, RIP_WARNING)) {
retval = 0;
MSGERROR();
}
}
TRACECALLBACK("ClientCopyDDEOut1");
ENDSEND(HANDLE, 0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientCopyDDEOut1, CLIENTCOPYDDEOUT1MSG)
{
BEGINRECV(0, &pmsg->IntDdeInfo, sizeof(INTDDEINFO));
retval = (ULONG_PTR)_ClientCopyDDEOut1(&pmsg->IntDdeInfo);
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* ClientEventCallback
*
* 11-11-91 sanfords Created
\**************************************************************************/
typedef struct _CLIENTEVENTCALLBACKMSG {
CAPTUREBUF CaptureBuf;
PVOID pcii;
PVOID pep;
} CLIENTEVENTCALLBACKMSG;
#ifdef SENDSIDE
DWORD ClientEventCallback(
IN PVOID pcii,
IN PEVENT_PACKET pep)
{
DWORD cbCapture = pep->cbEventData +
sizeof(EVENT_PACKET) - sizeof(DWORD);
SETUP(CLIENTEVENTCALLBACK)
BEGINSENDCAPTURE(CLIENTEVENTCALLBACK, 1, cbCapture, TRUE)
MSGDATA()->pcii = pcii;
COPYBYTES(pep, cbCapture);
MAKECALLCAPTURE(CLIENTEVENTCALLBACK);
CHECKRETURN();
TRACECALLBACK("ClientEventCallback");
ENDSENDCAPTURE(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientEventCallback, CLIENTEVENTCALLBACKMSG)
{
BEGINRECV(0, NULL, 0);
FIXUPPOINTERS();
_ClientEventCallback(CALLDATA(pcii), (PEVENT_PACKET)FIXUP(pep));
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* ClientGetDDEHookData
*
* 11-11-91 sanfords Created
\**************************************************************************/
typedef struct _CLIENTGETDDEHOOKDATAMSG {
UINT message;
LPARAM lParam;
DDEML_MSG_HOOK_DATA dmhd;
} CLIENTGETDDEHOOKDATAMSG;
#ifdef SENDSIDE
DWORD ClientGetDDEHookData(
IN UINT message,
IN LPARAM lParam,
OUT PDDEML_MSG_HOOK_DATA pdmhd)
{
SETUP(CLIENTGETDDEHOOKDATA)
BEGINSEND(CLIENTGETDDEHOOKDATA)
MSGDATA()->lParam = lParam;
MSGDATA()->message = message;
MAKECALL(CLIENTGETDDEHOOKDATA);
CHECKRETURN();
OUTSTRUCT(pdmhd, DDEML_MSG_HOOK_DATA);
TRACECALLBACK("ClientGetDDEHookData");
ENDSEND(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientGetDDEHookData, CLIENTGETDDEHOOKDATAMSG)
{
BEGINRECV(0, &pmsg->dmhd, sizeof(DDEML_MSG_HOOK_DATA));
_ClientGetDDEHookData(CALLDATA(message), CALLDATA(lParam),
(PDDEML_MSG_HOOK_DATA)&pmsg->dmhd);
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
*
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _CLIENTCHARTOWCHARMSG {
WORD CodePage;
WORD wch;
} CLIENTCHARTOWCHARMSG;
#ifdef SENDSIDE
WCHAR xxxClientCharToWchar(
IN WORD CodePage,
IN WORD wch)
{
SETUP(CLIENTCHARTOWCHAR)
BEGINSEND(CLIENTCHARTOWCHAR)
MSGDATA()->CodePage = CodePage;
MSGDATA()->wch = wch;
MAKECALL(CLIENTCHARTOWCHAR);
CHECKRETURN();
TRACECALLBACK("ClientCharToWchar");
ENDSEND(WCHAR, L'_');
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientCharToWchar, CLIENTCHARTOWCHARMSG)
{
char ach[2];
WCHAR wch = L'_';
BEGINRECV(0, NULL, 0);
ach[0] = LOBYTE(CALLDATA(wch));
ach[1] = HIBYTE(CALLDATA(wch));
MultiByteToWideChar(
CALLDATA(CodePage), // CP_THREAD_ACP, 437, 850 etc.
MB_PRECOMPOSED | MB_USEGLYPHCHARS, // visual map to precomposed
ach, ach[1] ? 2 : 1, // source & length
&wch, // destination
1); // max poss. precomposed length
retval = (DWORD)wch;
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
*
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _CLIENTFINDMNEMCHARMSG {
CAPTUREBUF CaptureBuf;
UNICODE_STRING strSrc;
WCHAR ch;
BOOL fFirst;
BOOL fPrefix;
} CLIENTFINDMNEMCHARMSG;
#ifdef SENDSIDE
int xxxClientFindMnemChar(
IN PUNICODE_STRING pstrSrc,
IN WCHAR ch,
IN BOOL fFirst,
IN BOOL fPrefix)
{
SETUP(CLIENTFINDMNEMCHAR)
BEGINSENDCAPTURE(CLIENTFINDMNEMCHAR, 1, pstrSrc->MaximumLength, TRUE)
MSGDATA()->ch = ch;
MSGDATA()->fFirst = fFirst;
MSGDATA()->fPrefix = fPrefix;
COPYSTRING(strSrc);
MAKECALLCAPTURE(CLIENTFINDMNEMCHAR);
CHECKRETURN();
TRACECALLBACK("ClientFindMnemChar");
ENDSENDCAPTURE(BOOL,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientFindMnemChar, CLIENTFINDMNEMCHARMSG)
{
BEGINRECV(0, NULL, 0);
FIXUPPOINTERS();
retval = (DWORD)FindMnemChar((LPWSTR)FIXUPSTRING(strSrc),
CALLDATA(ch), CALLDATA(fFirst), CALLDATA(fPrefix));
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* xxxClientPSMTextOut
*
* Called when a client-side LanguagePack (LPK) is installed
*
* 18-Sep-1996 GregoryW Created
* 11-Dec-1997 SamerA Calling LPK with user-mode accessible DC
\**************************************************************************/
typedef struct _CLIENTPSMTEXTOUTMSG {
CAPTUREBUF CaptureBuf;
UNICODE_STRING strSrc;
HDC hdc;
int xLeft;
int yTop;
int cch;
DWORD dwFlags;
} CLIENTPSMTEXTOUTMSG;
#ifdef SENDSIDE
void xxxClientPSMTextOut(
IN HDC hdc,
IN int xLeft,
IN int yTop,
IN PUNICODE_STRING pstrSrc,
IN int cch,
IN DWORD dwFlags)
{
SETUPDC(CLIENTPSMTEXTOUT)
/*
* Make sure this routine is called when a client LanguagePack (LPK)
* is installed.
*/
UserAssert(CALL_LPK(PtiCurrentShared()));
BEGINSENDCAPTUREVOIDDC(CLIENTPSMTEXTOUT, 1, pstrSrc->MaximumLength, TRUE)
CheckPublicDC ("xxxClientPSMTextOut: Public DC passed to LPK. hdcUse=%lX", hdcUse);
MSGDATA()->hdc = hdcUse;
MSGDATA()->xLeft = xLeft;
MSGDATA()->yTop = yTop;
MSGDATA()->cch = cch;
MSGDATA()->dwFlags = dwFlags;
COPYSTRING(strSrc);
MAKECALLCAPTUREDC(CLIENTPSMTEXTOUT);
CHECKRETURN();
TRACECALLBACK("ClientPSMTextOut");
ENDSENDCAPTUREVOIDDC();
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientPSMTextOut, CLIENTPSMTEXTOUTMSG)
{
BEGINRECV(0, NULL, 0);
FIXUPPOINTERS();
PSMTextOut(CALLDATA(hdc), CALLDATA(xLeft), CALLDATA(yTop),
(LPWSTR)FIXUPSTRING(strSrc), CALLDATA(cch), CALLDATA(dwFlags));
retval = 0;
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* xxxClientLpkDrawTextEx
*
* Called when a client-side LanguagePack (LPK) is installed
*
* 18-Sep-1996 GregoryW Created
* 11-Dec-1997 SamerA Calling LPK with user-mode accessible DC
\**************************************************************************/
typedef struct _CLIENTLPKDRAWTEXTEXMSG {
CAPTUREBUF CaptureBuf;
UNICODE_STRING strSrc;
HDC hdc;
int xLeft;
int yTop;
int nCount;
BOOL fDraw;
UINT wFormat;
DRAWTEXTDATA DrawInfo;
UINT bAction;
int iCharSet;
} CLIENTLPKDRAWTEXTEXMSG;
#ifdef SENDSIDE
int xxxClientLpkDrawTextEx(
IN HDC hdc,
IN int xLeft,
IN int yTop,
IN LPCWSTR lpsz,
IN int nCount,
IN BOOL fDraw,
IN UINT wFormat,
IN LPDRAWTEXTDATA lpDrawInfo,
IN UINT bAction,
IN int iCharSet)
{
SETUPDC(CLIENTLPKDRAWTEXTEX)
UNICODE_STRING strSrc;
UNICODE_STRING *pstrSrc = &strSrc;
/*
* Make sure this routine is called when a client LanguagePack (LPK)
* is installed.
*/
UserAssert(CALL_LPK(PtiCurrentShared()));
RtlInitUnicodeString(pstrSrc, lpsz);
BEGINSENDCAPTUREDC(CLIENTLPKDRAWTEXTEX, 1, nCount, TRUE)
CheckPublicDC ("xxxClientLpkDrawTextEx: Public DC passed to LPK. hdcUse=%lX", hdcUse);
MSGDATA()->hdc = hdcUse;
MSGDATA()->xLeft = xLeft;
MSGDATA()->yTop = yTop;
MSGDATA()->nCount = nCount;
MSGDATA()->fDraw = fDraw;
MSGDATA()->wFormat = wFormat;
MSGDATA()->DrawInfo = *lpDrawInfo;
MSGDATA()->bAction = bAction;
MSGDATA()->iCharSet = iCharSet;
COPYSTRING(strSrc);
MAKECALLCAPTUREDC(CLIENTLPKDRAWTEXTEX);
CHECKRETURN();
TRACECALLBACK("ClientLpkDrawTextEx");
ENDSENDCAPTUREDC(int, 0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientLpkDrawTextEx, CLIENTLPKDRAWTEXTEXMSG)
{
BEGINRECV(0, NULL, 0);
FIXUPPOINTERS();
retval = (*fpLpkDrawTextEx)(CALLDATA(hdc), CALLDATA(xLeft), CALLDATA(yTop),
(LPWSTR)FIXUPSTRING(strSrc), CALLDATA(nCount), CALLDATA(fDraw),
CALLDATA(wFormat), PCALLDATA(DrawInfo), CALLDATA(bAction), CALLDATA(iCharSet));
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* xxxClientExtTextOutW
*
* Called when a client-side LanguagePack (LPK) is installed
*
* 26-Jan-1997 GregoryW Created
* 11-Dec-1997 SamerA Calling LPK with user-mode accessible DC
\**************************************************************************/
typedef struct _CLIENTEXTTEXTOUTW {
CAPTUREBUF CaptureBuf;
UNICODE_STRING strSrc;
HDC hdc;
int x;
int y;
int flOpts;
RECT rcl;
UINT cwc;
BOOL fNullRect;
} CLIENTEXTTEXTOUTWMSG;
#ifdef SENDSIDE
BOOL xxxClientExtTextOutW(
IN HDC hdc,
IN int x,
IN int y,
IN int flOpts,
IN RECT *prcl,
IN LPCWSTR pwsz,
IN UINT cwc,
IN INT *pdx)
{
SETUPDC(CLIENTEXTTEXTOUTW)
UNICODE_STRING strSrc;
UNICODE_STRING *pstrSrc = &strSrc;
/*
* Make sure this routine is called when a client LanguagePack (LPK)
* is installed.
*/
UserAssert(CALL_LPK(PtiCurrentShared()));
RtlInitUnicodeString(pstrSrc, pwsz);
BEGINSENDCAPTUREDC(CLIENTEXTTEXTOUTW, 1, cwc, TRUE)
CheckPublicDC ("xxxClientExtTextOutW: Public DC passed to LPK. hdcUse=%lX", hdcUse);
MSGDATA()->hdc = hdcUse;
MSGDATA()->x = x;
MSGDATA()->y = y;
MSGDATA()->flOpts = flOpts;
/* In order not to pass a NULL ptr */
if( prcl ){
MSGDATA()->rcl = *prcl;
MSGDATA()->fNullRect=TRUE;
}
else {
MSGDATA()->fNullRect=FALSE;
}
MSGDATA()->cwc = cwc;
COPYSTRING(strSrc);
MAKECALLCAPTUREDC(CLIENTEXTTEXTOUTW);
CHECKRETURN();
TRACECALLBACK("ClientExtTextOutW");
ENDSENDCAPTUREDC(BOOL, 0);
UNREFERENCED_PARAMETER(pdx);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientExtTextOutW, CLIENTEXTTEXTOUTWMSG)
{
BEGINRECV(0, NULL, 0);
FIXUPPOINTERS();
retval = ExtTextOutW(CALLDATA(hdc), CALLDATA(x), CALLDATA(y),
CALLDATA(flOpts), (CALLDATA(fNullRect)) ? PCALLDATA(rcl) : NULL , (LPWSTR)FIXUPSTRING(strSrc),
CALLDATA(cwc), NULL);
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* xxxClientGetTextExtentPointW
*
* Called when a client-side LanguagePack (LPK) is installed
*
* 06-Feb-1997 GregoryW Created
* 19-Jan-1998 SamerA EIP_ERROR if a public DC is passed other than hdcGray
\**************************************************************************/
typedef struct _CLIENTGETTEXTEXTENTPOINTW {
CAPTUREBUF CaptureBuf;
UNICODE_STRING strSrc;
HDC hdc;
int cch;
SIZE size;
} CLIENTGETTEXTEXTENTPOINTWMSG;
#ifdef SENDSIDE
BOOL xxxClientGetTextExtentPointW(
IN HDC hdc,
IN LPCWSTR lpstr,
IN int cch,
OUT PSIZE psize)
{
SETUPDC(CLIENTGETTEXTEXTENTPOINTW)
UNICODE_STRING strSrc;
UNICODE_STRING *pstrSrc = &strSrc;
/*
* Make sure this routine is called when a client LanguagePack (LPK)
* is installed.
*/
UserAssert(CALL_LPK(PtiCurrentShared()));
RtlInitUnicodeString(pstrSrc, lpstr);
BEGINSENDCAPTUREDC(CLIENTGETTEXTEXTENTPOINTW, 1, cch, TRUE)
CheckPublicDC ("xxxGetTextExtentPointW: Public DC passed to LPK. hdcUse=%lX", hdcUse);
MSGDATA()->hdc = hdcUse;
MSGDATA()->cch = cch;
COPYSTRING(strSrc);
MAKECALLCAPTUREDC(CLIENTGETTEXTEXTENTPOINTW);
CHECKRETURN();
OUTSTRUCT(psize, SIZE);
TRACECALLBACK("ClientGetTextExtentPointW");
ENDSENDCAPTUREDC(BOOL, 0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientGetTextExtentPointW, CLIENTGETTEXTEXTENTPOINTWMSG)
{
BEGINRECV(0, &pmsg->size, sizeof(SIZE));
FIXUPPOINTERS();
retval = GetTextExtentPointW(CALLDATA(hdc), (LPWSTR)FIXUPSTRING(strSrc),
CALLDATA(cch), PCALLDATA(size));
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
*
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _CLIENTADDFONTRESOURCEWMSG {
CAPTUREBUF CaptureBuf;
UNICODE_STRING strSrc;
DWORD dwFlags;
DESIGNVECTOR dv;
} CLIENTADDFONTRESOURCEWMSG;
#ifdef SENDSIDE
int xxxClientAddFontResourceW(
IN PUNICODE_STRING pstrSrc,
IN DWORD dwFlags,
IN DESIGNVECTOR *pdv)
{
SETUP(CLIENTADDFONTRESOURCEW)
BEGINSENDCAPTURE(CLIENTADDFONTRESOURCEW, 1, pstrSrc->MaximumLength, TRUE)
COPYSTRING(strSrc);
MSGDATA()->dwFlags = dwFlags;
if (pdv && pdv->dvNumAxes) {
MSGDATA()->dv = *pdv;
} else {
MSGDATA()->dv.dvNumAxes = 0;
}
MAKECALLCAPTURE(CLIENTADDFONTRESOURCEW);
CHECKRETURN();
TRACECALLBACK("ClientAddFontResourceW");
ENDSENDCAPTURE(int,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientAddFontResourceW, CLIENTADDFONTRESOURCEWMSG)
{
DWORD AddFont(LPWSTR, DWORD, DESIGNVECTOR*);
BEGINRECV(0, NULL, 0);
FIXUPPOINTERS();
retval = GdiAddFontResourceW((LPWSTR)FIXUPSTRING(strSrc),
CALLDATA(dwFlags), CALLDATA(dv).dvNumAxes ? &CALLDATA(dv) : NULL);
ENDRECV();
}
#endif // RECVSIDE
/******************************Public*Routine******************************\
*
* FontSweep()
*
* History:
* 23-Oct-1995 -by- Bodin Dresevic [BodinD]
* Wrote it.
\**************************************************************************/
#ifdef SENDSIDE
VOID ClientFontSweep(VOID)
{
PVOID p;
ULONG cb;
LeaveCrit();
KeUserModeCallback(
FI_CLIENTFONTSWEEP,
NULL,
0,
&p,
&cb);
EnterCrit();
return;
}
#endif // SENDSIDE
#ifdef RECVSIDE
DWORD __ClientFontSweep(
PVOID p)
{
UNREFERENCED_PARAMETER(p);
vFontSweep();
return NtCallbackReturn(NULL, 0, STATUS_SUCCESS);
}
#endif // RECVSIDE
/******************************Public*Routine******************************\
*
* VOID ClientLoadLocalT1Fonts(VOID)
* very similar to above, only done for t1 fonts
*
* History:
* 25-Apr-1996 -by- Bodin Dresevic [BodinD]
* Wrote it.
\**************************************************************************/
#ifdef SENDSIDE
VOID ClientLoadLocalT1Fonts(VOID)
{
PVOID p;
ULONG cb;
LeaveCrit();
KeUserModeCallback(
FI_CLIENTLOADLOCALT1FONTS,
NULL,
0,
&p,
&cb);
EnterCrit();
return;
}
#endif // SENDSIDE
#ifdef RECVSIDE
DWORD __ClientLoadLocalT1Fonts(
PVOID p)
{
UNREFERENCED_PARAMETER(p);
vLoadLocalT1Fonts();
return NtCallbackReturn(NULL, 0, STATUS_SUCCESS);
}
#endif // RECVSIDE
/******************************Public*Routine******************************\
*
* VOID ClientLoadRemoteT1Fonts(VOID)
* very similar to above, only done for t1 fonts
*
* History:
* 25-Apr-1996 -by- Bodin Dresevic [BodinD]
* Wrote it.
\**************************************************************************/
#ifdef SENDSIDE
VOID ClientLoadRemoteT1Fonts(VOID)
{
PVOID p;
ULONG cb;
LeaveCrit();
KeUserModeCallback(
FI_CLIENTLOADREMOTET1FONTS,
NULL,
0,
&p,
&cb);
EnterCrit();
return;
}
#endif // SENDSIDE
#ifdef RECVSIDE
DWORD __ClientLoadRemoteT1Fonts(
PVOID p)
{
UNREFERENCED_PARAMETER(p);
vLoadRemoteT1Fonts();
return NtCallbackReturn(NULL, 0, STATUS_SUCCESS);
}
#endif // RECVSIDE
/**************************************************************************\
* pppUserModeCallback
*
* Same as xxxUserModeCallback except not leaving/re-entering critical section
*
* 12/9/97 LingyunW Copied from xxxUserModeCallback
\**************************************************************************/
#ifdef SENDSIDE
NTSTATUS pppUserModeCallback (ULONG uApi, PVOID pIn, ULONG cbIn, PVOID pOut, ULONG cbOut)
{
NTSTATUS Status;
PVOID pLocalOut;
ULONG cbLocalOut;
/*
* Call the client
*/
Status = KeUserModeCallback(uApi, pIn, cbIn, &pLocalOut, &cbLocalOut);
/*
* If it failed, bail
*/
if (!NT_SUCCESS(Status)) {
return Status;
}
/*
* If we didn't get the right amount of data, fail.
*/
if (cbLocalOut != cbOut) {
RIPMSG3(RIP_WARNING, "pppUserModeCallback: uAPi: %#lx cbOut: %#lx cbLocalOut: %#lx",
uApi, cbOut, cbLocalOut);
return STATUS_UNSUCCESSFUL;
}
/*
* If we were expecting some data, copy it.
*/
if (cbOut != 0) {
try {
ProbeForRead(pLocalOut, cbLocalOut, sizeof(DWORD));
RtlCopyMemory(pOut, pLocalOut, cbLocalOut);
} except (W32ExceptionHandler(FALSE, RIP_WARNING)) {
RIPMSG2(RIP_WARNING, "pppUserModeCallback: uAPi: %#lx Exception: %#lx", uApi, GetExceptionCode());
Status = STATUS_UNSUCCESSFUL;
}
}
return Status;
}
#endif // SENDSIDE
/******************************Public*Routine******************************\
* ClientPrinterThunk
*
* Callback used as the kernel-to-user transport layer.
*
* Note: User critical section is not held by the caller.
*
* History:
* 22-Jun-1997 -by- Gilman Wong [gilmanw]
* 11/13/97 -by- Lingyun Wang [lingyunw] clean up
*
* Wrote it.
\**************************************************************************/
#define CLIENTPRINTERTHUNKMSG UMTHDR
#ifdef SENDSIDE
DWORD ClientPrinterThunk(PVOID pvIn, ULONG cjIn, PVOID pvOut, ULONG cjOut)
{
NTSTATUS Status;
/*
* (Temporarly..) we return failure if we are holding USERK's crit section
*/
if (ExIsResourceAcquiredExclusiveLite(gpresUser)
|| (ExIsResourceAcquiredSharedLite(gpresUser) != 0)) {
RIPMSG0(RIP_ERROR, "ClientPrinterThunk: Holding USERK critical section!");
return 0xffffffff;
}
/*
* The pvIn buffer must have at least a CLIENTPRINTERTHUNK header.
*/
UserAssertMsg1(cjIn >= sizeof(CLIENTPRINTERTHUNKMSG), "ClientPrinterThunk: incorrect cjIn:%#lx", cjIn);
/*
* Set the private cjOut. The receive-side uses this to allocate
* a return buffer.
*/
((CLIENTPRINTERTHUNKMSG *) pvIn)->ulReserved1 = cjOut;
((CLIENTPRINTERTHUNKMSG *) pvIn)->ulReserved2 = 0;
/*
* Do the callback.
*/
Status = pppUserModeCallback(FI_CLIENTPRINTERTHUNK, pvIn, cjIn, pvOut, cjOut);
return (NT_SUCCESS(Status) ? 0 : 0xFFFFFFFF);
}
#endif // SENDSIDE
#ifdef RECVSIDE
DWORD __ClientPrinterThunk(CLIENTPRINTERTHUNKMSG *pMsg)
{
PVOID pv;
ULONG aul[526];
NTSTATUS Status;
/*
* Check that the local buffer is big enough.
*/
if (pMsg->ulReserved1 <= sizeof(aul)) {
pv = (PVOID) aul;
/*
* Call GDI to process command.
*/
if (GdiPrinterThunk((UMTHDR *) pMsg, pv, pMsg->ulReserved1) != GPT_ERROR) {
Status = STATUS_SUCCESS;
} else {
RIPMSG0(RIP_WARNING, "ClientPrinterThunk failed");
Status = STATUS_UNSUCCESSFUL;
}
} else {
RIPMSG0(RIP_WARNING, "ClientPrinterThunk: buffer too big!");
Status = STATUS_NO_MEMORY;
}
/*
* Return to kernel.
*/
if (NT_SUCCESS(Status)) {
return UserCallbackReturn(pv, pMsg->ulReserved1, Status);
} else {
return UserCallbackReturn(NULL, 0, Status);
}
}
#endif // RECVSIDE
/**************************************************************************\
*
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
#ifdef SENDSIDE
VOID ClientNoMemoryPopup(VOID)
{
PVOID p;
ULONG cb;
LeaveCrit();
KeUserModeCallback(
FI_CLIENTNOMEMORYPOPUP,
NULL,
0,
&p,
&cb);
EnterCrit();
return;
}
#endif // SENDSIDE
#ifdef RECVSIDE
DWORD __ClientNoMemoryPopup(
PVOID p)
{
WCHAR szNoMem[200];
UNREFERENCED_PARAMETER(p);
if (LoadStringW(hmodUser, STR_NOMEMBITMAP, szNoMem,
sizeof(szNoMem) / sizeof(WCHAR))) {
MessageBoxW(GetActiveWindow(), szNoMem, NULL, MB_OK);
}
return NtCallbackReturn(NULL, 0, STATUS_SUCCESS);
}
#endif // RECVSIDE
/**************************************************************************\
* ClientThreadSetup
*
* Callback to the client to perform thread initialization.
*
* 04-07-95 JimA Created.
\**************************************************************************/
#ifdef SENDSIDE
NTSTATUS xxxClientThreadSetup(VOID)
{
PVOID p;
ULONG cb;
NTSTATUS Status;
LeaveCrit();
Status = KeUserModeCallback(
FI_CLIENTTHREADSETUP,
NULL,
0,
&p,
&cb);
EnterCrit();
return Status;
}
#endif // SENDSIDE
#ifdef RECVSIDE
DWORD __ClientThreadSetup(
PVOID p)
{
BOOL fSuccess;
BOOL ClientThreadSetup(VOID);
UNREFERENCED_PARAMETER(p);
fSuccess = ClientThreadSetup();
return NtCallbackReturn(NULL, 0,
fSuccess ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL);
}
#endif // RECVSIDE
/**************************************************************************\
* ClientDeliverUserApc
*
* Callback to the client to handle a user APC. This is needed to
* ensure that a thread will exit promptly when terminated.
*
* 08-12-95 JimA Created.
\**************************************************************************/
#ifdef SENDSIDE
VOID ClientDeliverUserApc(VOID)
{
PVOID p;
ULONG cb;
LeaveCrit();
KeUserModeCallback(
FI_CLIENTDELIVERUSERAPC,
NULL,
0,
&p,
&cb);
EnterCrit();
}
#endif // SENDSIDE
#ifdef RECVSIDE
DWORD __ClientDeliverUserApc(
PVOID p)
{
UNREFERENCED_PARAMETER(p);
return NtCallbackReturn(NULL, 0, STATUS_SUCCESS);
}
#endif // RECVSIDE
/**************************************************************************\
* ClientImmLoadLayout
*
* 29-Jan-1996 wkwok Created
\**************************************************************************/
typedef struct _CLIENTIMMLOADLAYOUTMSG {
HKL hKL;
} CLIENTIMMLOADLAYOUTMSG;
#ifdef SENDSIDE
BOOL ClientImmLoadLayout(
IN HKL hKL,
OUT PIMEINFOEX piiex)
{
SETUP(CLIENTIMMLOADLAYOUT)
BEGINSEND(CLIENTIMMLOADLAYOUT)
MSGDATA()->hKL = hKL;
MAKECALL(CLIENTIMMLOADLAYOUT);
CHECKRETURN();
if (retval)
OUTSTRUCT(piiex, IMEINFOEX);
TRACECALLBACK("ClientImmLoadLayout");
ENDSEND(BOOL, 0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientImmLoadLayout, CLIENTIMMLOADLAYOUTMSG)
{
IMEINFOEX iiex;
BEGINRECV(0, &iiex, sizeof(iiex));
retval = fpImmLoadLayout(CALLDATA(hKL), &iiex);
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* ClientImmProcessKey
*
* 03-Mar-1996 TakaoK Created
\**************************************************************************/
typedef struct _CLIENTIMMPROCESSKEYMSG {
HWND hWnd;
HKL hkl;
UINT uVKey;
LPARAM lParam;
DWORD dwHotKeyID;
} CLIENTIMMPROCESSKEYMSG;
#ifdef SENDSIDE
DWORD ClientImmProcessKey(
IN HWND hWnd,
IN HKL hkl,
IN UINT uVKey,
IN LPARAM lParam,
IN DWORD dwHotKeyID)
{
SETUP(CLIENTIMMPROCESSKEY)
UserAssert(IS_IME_ENABLED());
BEGINSEND(CLIENTIMMPROCESSKEY)
MSGDATA()->hWnd = hWnd,
MSGDATA()->hkl = hkl;
MSGDATA()->uVKey = uVKey;
MSGDATA()->lParam = lParam;
MSGDATA()->dwHotKeyID = dwHotKeyID;
MAKECALL(CLIENTIMMPROCESSKEY);
CHECKRETURN();
TRACECALLBACK("ClientImmProcessKey");
ENDSEND(DWORD, 0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientImmProcessKey, CLIENTIMMPROCESSKEYMSG)
{
BEGINRECV(0, NULL, 0);
retval = fpImmProcessKey(CALLDATA(hWnd),
CALLDATA(hkl),
CALLDATA(uVKey),
CALLDATA(lParam),
CALLDATA(dwHotKeyID));
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* fnIMECONTROL
*
* 22-Apr-1996 wkwok Created
\**************************************************************************/
typedef struct _FNIMECONTROL {
CAPTUREBUF CaptureBuf;
PWND pwnd;
UINT msg;
WPARAM wParam;
union {
PCANDIDATEFORM pCandForm;
PCOMPOSITIONFORM pCompForm;
PLOGFONTA pLogFontA;
PLOGFONTW pLogFontW;
PSOFTKBDDATA pSoftKbdData;
LPARAM lParam;
} u;
ULONG_PTR xParam;
PROC xpfnProc;
PBYTE pOutput;
DWORD cbOutput;
} FNIMECONTROLMSG;
#ifdef SENDSIDE
void CopyLogFontAtoW(
PLOGFONTW pdest,
PLOGFONTA psrc)
{
LPSTR lpstrFont = (LPSTR)(&psrc->lfFaceName);
LPWSTR lpstrFontW = (LPWSTR)(&pdest->lfFaceName);
memcpy((LPBYTE)pdest, psrc, sizeof(LOGFONTA) - LF_FACESIZE);
memset(pdest->lfFaceName, 0, LF_FACESIZE * sizeof(WCHAR));
MBToWCS(lpstrFont, -1, &lpstrFontW, LF_FACESIZE, FALSE);
}
SMESSAGECALL(IMECONTROL)
{
DWORD cCapture, cbCapture;
SETUPPWND(FNIMECONTROL)
switch (wParam) {
case IMC_GETCANDIDATEPOS:
case IMC_SETCANDIDATEPOS:
cCapture = 1;
cbCapture = sizeof(CANDIDATEFORM);
break;
case IMC_GETCOMPOSITIONWINDOW:
case IMC_SETCOMPOSITIONWINDOW:
cCapture = 1;
cbCapture = sizeof(COMPOSITIONFORM);
break;
case IMC_GETCOMPOSITIONFONT:
case IMC_SETCOMPOSITIONFONT:
case IMC_GETSOFTKBDFONT:
cCapture = 1;
cbCapture = (dwSCMSFlags & SCMS_FLAGS_ANSI)
? sizeof(LOGFONTA) : sizeof(LOGFONTW) ;
break;
case IMC_SETSOFTKBDDATA:
cCapture = 1;
cbCapture = FIELD_OFFSET(SOFTKBDDATA, wCode[0])
+ ((PSOFTKBDDATA)lParam)->uCount * sizeof(WORD) * 256;
break;
default:
cCapture = 0;
cbCapture = 0;
break;
}
BEGINSENDCAPTURE(FNIMECONTROL, cCapture, cbCapture, TRUE);
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
MSGDATA()->u.lParam = lParam;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
switch (wParam) {
case IMC_GETCANDIDATEPOS:
case IMC_GETCOMPOSITIONWINDOW:
case IMC_GETCOMPOSITIONFONT:
case IMC_GETSOFTKBDFONT:
RESERVEBYTES(cbCapture, pOutput, cbOutput);
MAKECALLCAPTURE(FNIMECONTROL);
UNLOCKPWND();
CHECKRETURN();
BEGINCOPYOUT()
try {
ProbeForRead(pcbs->pOutput, pcbs->cbOutput, sizeof(DWORD));
switch (wParam) {
case IMC_GETCANDIDATEPOS:
case IMC_GETCOMPOSITIONWINDOW:
memcpy((LPBYTE)lParam, pcbs->pOutput, cbCapture);
break;
case IMC_GETCOMPOSITIONFONT:
case IMC_GETSOFTKBDFONT:
if (dwSCMSFlags & SCMS_FLAGS_ANSI) {
CopyLogFontAtoW((PLOGFONTW)lParam, (PLOGFONTA)pcbs->pOutput);
}
else {
memcpy((LPBYTE)lParam, pcbs->pOutput, cbCapture);
}
break;
}
} except (W32ExceptionHandler(TRUE, RIP_WARNING)) {
MSGERROR();
}
ENDCOPYOUT()
break;
case IMC_SETCANDIDATEPOS:
case IMC_SETCOMPOSITIONWINDOW:
case IMC_SETCOMPOSITIONFONT:
case IMC_SETSOFTKBDDATA:
if (wParam == IMC_SETCANDIDATEPOS) {
PCANDIDATEFORM pCandForm = (PCANDIDATEFORM)lParam;
LARGECOPYBYTES2(pCandForm, sizeof(CANDIDATEFORM), u.pCandForm);
}
else if (wParam == IMC_SETCOMPOSITIONWINDOW) {
PCOMPOSITIONFORM pCompForm = (PCOMPOSITIONFORM)lParam;
LARGECOPYBYTES2(pCompForm, sizeof(COMPOSITIONFORM), u.pCompForm);
}
else if (wParam == IMC_SETCOMPOSITIONFONT) {
if (dwSCMSFlags & SCMS_FLAGS_ANSI) {
LOGFONTA LogFontA;
LPSTR lpstrFontA = LogFontA.lfFaceName;
LPWSTR lpstrFontW = ((PLOGFONTW)lParam)->lfFaceName;
memcpy(&LogFontA, (PBYTE)lParam, sizeof(LOGFONTA)-LF_FACESIZE);
memset(lpstrFontA, 0, LF_FACESIZE * sizeof(CHAR));
WCSToMB(lpstrFontW, -1, &lpstrFontA, LF_FACESIZE, FALSE);
LARGECOPYBYTES2(&LogFontA, sizeof(LOGFONTA), u.pLogFontA);
}
else {
PLOGFONTW pLogFontW = (PLOGFONTW)lParam;
LARGECOPYBYTES2(pLogFontW, sizeof(LOGFONTW), u.pLogFontW);
}
}
else if (wParam == IMC_SETSOFTKBDDATA) {
PSOFTKBDDATA pSoftKbdData;
if (dwSCMSFlags & SCMS_FLAGS_ANSI) {
PWORD pCodeA;
PWSTR pCodeW;
CHAR ch[2];
PSTR pch = (PSTR)&ch;
UINT i;
pSoftKbdData = (PSOFTKBDDATA)UserAllocPool(cbCapture, TAG_IME);
if (pSoftKbdData == NULL)
MSGERROR();
pCodeA = &pSoftKbdData->wCode[0][0];
pCodeW = (PWSTR)&((PSOFTKBDDATA)lParam)->wCode[0][0];
pSoftKbdData->uCount = ((PSOFTKBDDATA)lParam)->uCount;
i = pSoftKbdData->uCount * 256;
while (i--) {
pch[1] = '\0';
WCSToMBEx(THREAD_CODEPAGE(), pCodeW, 1, &pch, 2, FALSE);
if (pch[1]) {
*pCodeA = MAKEWORD(pch[1], pch[0]);
} else {
*pCodeA = MAKEWORD(pch[0], 0);
}
pCodeA++; pCodeW++;
}
LARGECOPYBYTES2(pSoftKbdData, cbCapture, u.pSoftKbdData);
UserFreePool(pSoftKbdData);
}
else {
pSoftKbdData = (PSOFTKBDDATA)lParam;
LARGECOPYBYTES2(pSoftKbdData, cbCapture, u.pSoftKbdData);
}
}
/*
* Fall thur.
*/
default:
MAKECALLCAPTURE(FNIMECONTROL);
UNLOCKPWND();
CHECKRETURN();
break;
}
TRACECALLBACKMSG("SfnINSTRINGNULL");
ENDSENDCAPTURE(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnIMECONTROL, FNIMECONTROLMSG)
{
BYTE abOutput[CALLBACKSTACKLIMIT];
LPARAM lParam;
BEGINRECV(0, NULL, pmsg->cbOutput);
FIXUPPOINTERS();
if (pmsg->cbOutput <= CALLBACKSTACKLIMIT)
CallbackStatus.pOutput = abOutput;
else
CallbackStatus.pOutput = pmsg->pOutput;
switch (CALLDATA(wParam)) {
case IMC_GETCANDIDATEPOS:
case IMC_GETCOMPOSITIONWINDOW:
case IMC_GETCOMPOSITIONFONT:
case IMC_GETSOFTKBDFONT:
lParam = (LPARAM)CallbackStatus.pOutput;
break;
case IMC_SETCANDIDATEPOS:
case IMC_SETCOMPOSITIONWINDOW:
case IMC_SETCOMPOSITIONFONT:
case IMC_SETSOFTKBDDATA:
lParam = FIRSTFIXUP(u.lParam);
break;
default:
lParam = CALLDATA(u.lParam);
break;
}
retval = (ULONG_PTR)CALLPROC(CALLDATA(xpfnProc))(
CALLDATA(pwnd),
CALLDATA(msg),
CALLDATA(wParam),
lParam,
CALLDATA(xParam));
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* fnIMEREQUEST
*
* 22-Apr-1996 Created
\**************************************************************************/
#ifdef LATER
typedef struct _FNIMEREQUEST {
CAPTUREBUF CaptureBuf;
PWND pwnd;
UINT msg;
WPARAM wParam;
union {
LPCANDIDATEFORM pCandidateForm;
LPLOGFONTA pLogFontA;
LPLOGFONTW pLogFontW;
LPCOMPOSITIONFORM pCompositionForm;
LPRECONVERTSTRING pReconvertString;
LPPrivateIMECHARPOSITION pImeCharPosition;
LPARAM lParam;
} u;
ULONG_PTR xParam;
PROC xpfnProc;
PBYTE pOutput;
DWORD cbOutput;
BOOL fAnsi;
} FNIMEREQUESTMSG;
#ifdef SENDSIDE
SMESSAGECALL(IMEREQUEST)
{
DWORD cCapture, cbCapture;
SETUPPWND(FNIMEREQUEST)
//
// IMEREQUEST assumes the callback is within the thread
// (see MESSAGECALL(IMEREQUEST) in kernel/ntstubs.c.)
//
// All the data pointed by lParam should point the valid
// client side address. Thus all the validation and copy
// (if needed) will be done in the receiver side.
//
UserAssert(psms == NULL || psms->ptiSender == psms->ptiReceiver);
switch (wParam) {
case IMR_CANDIDATEWINDOW:
cCapture = 1;
cbCapture = sizeof(CANDIDATEFORM);
break;
case IMR_COMPOSITIONWINDOW:
cCapture = 1;
cbCapture = sizeof(COMPOSITIONFORM);
break;
case IMR_CONFIRMRECONVERTSTRING:
case IMR_RECONVERTSTRING:
case IMR_DOCUMENTFEED:
case IMR_QUERYCHARPOSITION:
cCapture = 0;
cbCapture = 0;
break;
case IMR_COMPOSITIONFONT: // only the exception to the rule above.
cCapture = 1;
cbCapture = (dwSCMSFlags & SCMS_FLAGS_ANSI) ? sizeof(LOGFONTA) : sizeof(LOGFONTW);
break;
default:
UserAssert(FALSE);
cCapture = 0;
cbCapture = 0;
break;
}
BEGINSENDCAPTURE(FNIMEREQUEST, cCapture, cbCapture, TRUE);
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
MSGDATA()->u.lParam = lParam;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
MSGDATA()->fAnsi = (dwSCMSFlags & SCMS_FLAGS_ANSI);
LOCKPWND();
//
// Preparation
//
switch (wParam) {
case IMR_COMPOSITIONFONT:
RESERVEBYTES(cbCapture, pOutput, cbOutput);
break;
}
MAKECALLCAPTURE(FNIMEREQUEST);
UNLOCKPWND();
CHECKRETURN();
BEGINCOPYOUT()
try {
switch (wParam) {
case IMR_COMPOSITIONFONT:
ProbeForRead(pcbs->pOutput, pcbs->cbOutput, sizeof(DWORD));
if (dwSCMSFlags & SCMS_FLAGS_ANSI) {
CopyLogFontAtoW((PLOGFONTW)lParam, (PLOGFONTA)pcbs->pOutput);
}
else {
memcpy((LPBYTE)lParam, pcbs->pOutput, cbCapture);
}
break;
}
} except (EXCEPTION_EXECUTE_HANDLER) {
MSGERROR();
}
ENDCOPYOUT()
TRACECALLBACKMSG("SfnIMEREQUEST");
ENDSENDCAPTURE(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnIMEREQUEST, FNIMEREQUESTMSG)
{
BYTE abOutput[CALLBACKSTACKLIMIT];
LPVOID pvNew = NULL;
LPARAM lParam;
BEGINRECV(0, NULL, pmsg->cbOutput);
FIXUPPOINTERS();
if (pmsg->cbOutput <= CALLBACKSTACKLIMIT)
CallbackStatus.pOutput = abOutput;
else
CallbackStatus.pOutput = pmsg->pOutput;
lParam = CALLDATA(u.lParam);
switch (CALLDATA(wParam)) {
case IMR_COMPOSITIONWINDOW:
case IMR_CANDIDATEWINDOW:
// lParam = CALLDATA(lParam);
break;
case IMR_COMPOSITIONFONT:
lParam = (LPARAM)CallbackStatus.pOutput;
break;
case IMR_QUERYCHARPOSITION:
if (CALLDATA(fAnsi)) {
LPPrivateIMECHARPOSITION lpCharPos;
pvNew = UserLocalAlloc(0, sizeof(PrivateIMECHARPOSITION));
if (pvNew == NULL) {
goto error_return;
}
lpCharPos = pvNew;
*lpCharPos = *CALLDATA(u.pImeCharPosition);
lpCharPos->dwCharPos = lpCharPos->dwCharPositionA;
}
break;
case IMR_RECONVERTSTRING:
case IMR_CONFIRMRECONVERTSTRING:
case IMR_DOCUMENTFEED:
// Real W/A conversion may be needed.
if (CALLDATA(fAnsi) && lParam) {
PRECONVERTSTRING Source = (LPRECONVERTSTRING)lParam;
// Do conversion.
DWORD dwNewSize = ImmGetReconvertTotalSize(((LPRECONVERTSTRING)lParam)->dwSize, FROM_IME, TRUE);
if (dwNewSize == 0) {
goto error_return;
}
pvNew = UserLocalAlloc(0, dwNewSize);
if (pvNew == NULL) {
goto error_return;
}
lParam = (LPARAM)pvNew;
#define lpReconv ((LPRECONVERTSTRING)lParam)
// setup the information in the allocated structure
lpReconv->dwVersion = 0;
lpReconv->dwSize = dwNewSize;
if (CALLDATA(wParam) == IMR_CONFIRMRECONVERTSTRING) {
ImmReconversionWorker(lpReconv, (LPRECONVERTSTRING)lParam, TRUE, CP_ACP);
}
}
break;
default:
lParam = CALLDATA(u.lParam);
break;
}
retval = (ULONG_PTR)CALLPROC(CALLDATA(xpfnProc))(
CALLDATA(pwnd),
CALLDATA(msg),
CALLDATA(wParam),
lParam,
CALLDATA(xParam));
switch (CALLDATA(wParam)) {
case IMR_RECONVERTSTRING:
case IMR_DOCUMENTFEED:
if (CALLDATA(fAnsi)) {
retval = ImmGetReconvertTotalSize((DWORD)retval, FROM_APP, TRUE);
if (lParam) {
retval = ImmReconversionWorker((LPRECONVERTSTRING)CALLDATA(u.lParam), (LPRECONVERTSTRING)pvNew, FALSE, CP_ACP);
}
}
break;
}
if (pvNew) {
UserLocalFree(pvNew);
}
error_return:
ENDRECV();
}
#undef lpReconv
#endif // RECVSIDE
#endif
/**************************************************************************\
* fnGETDBCSTEXTLENGTHS (DBCS-aware Version)
*
* Gets the Unicode & ANSI lengths
* Internally, lParam pints to the ANSI length in bytes and the return value
* is the Unicode length in bytes. However, the public definition is maintained
* on the client side, where lParam is not used and either ANSI or Unicode is
* returned.
*
* 14-Mar-1996 HideyukN Created
\**************************************************************************/
#if (WM_GETTEXTLENGTH - WM_GETTEXT) != 1
#error "WM_GETTEXT Messages no longer 1 apart. Error in code."
#endif
#if (LB_GETTEXTLEN - LB_GETTEXT) != 1
#error "LB_GETTEXT Messages no longer 1 apart. Error in code."
#endif
#if (CB_GETLBTEXTLEN - CB_GETLBTEXT) != 1
#error "CB_GETLBTEXT Messages no longer 1 apart. Error in code."
#endif
typedef struct _FNGETDBCSTEXTLENGTHSMSG {
PWND pwnd;
UINT msg;
WPARAM wParam;
ULONG_PTR xParam;
PROC xpfnProc;
} FNGETDBCSTEXTLENGTHSMSG;
#ifdef SENDSIDE
SMESSAGECALL(GETDBCSTEXTLENGTHS)
{
BOOL fAnsiSender = !!(BOOL)lParam;
BOOL fAnsiReceiver = ((dwSCMSFlags & SCMS_FLAGS_ANSI) != 0);
LPVOID pfnSavedWndProc = pwnd->lpfnWndProc;
SETUPPWND(FNGETDBCSTEXTLENGTHS)
BEGINSEND(FNGETDBCSTEXTLENGTHS)
UserAssert((fAnsiReceiver & 1) == fAnsiReceiver && (fAnsiSender & 1) == fAnsiSender);
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
MAKECALL(FNGETTEXTLENGTHS);
UNLOCKPWND();
CHECKRETURN1();
/*
* ANSI client wndproc returns us cbANSI. We want cchUnicode,
* so we guess cchUnicode = cbANSI. (It may be less if
* multi-byte characters are involved, but it will never be more).
* Save cbANSI in *lParam in case the server ultimately returns
* the length to an ANSI caller.
*
* Unicode client wndproc returns us cchUnicode. If we want to know
* cbANSI, we must guess how many 'ANSI' chars we would need.
* We guess cbANSI = cchUnicode * 2. (It may be this much if all
* 'ANSI' characters are multi-byte, but it will never be more).
*
* Return cchUnicode (server code is all Unicode internally).
* Put cbANSI in *lParam to be passed along within the server in case
* we ultimately need to return it to the client.
*
* NOTE: this will sometimes cause text lengths to be misreported
* up to twice the real length, but that is expected to be harmless.
* This will only * happen if an app sends WM_GETcode TEXTLENGTH to a
* window with an ANSI client-side wndproc, or a ANSI WM_GETTEXTLENGTH
* is sent to a Unicode client-side wndproc.
*/
BEGINCOPYOUT()
//
// retval can be [CB|LB]_ERR (-1) or [CB|LB]_ERRSPACE (-2)
// then, it should be grater then zero. otherwise we can handle
// it as error, or zero length string.
//
if ((LONG)retval > 0) {
//
// Check we need to Ansi <-> Unicode conversion.
//
if (fAnsiSender != fAnsiReceiver) {
if (pwnd->lpfnWndProc != pfnSavedWndProc) {
// The window procedure is changed during the first callback.
// Let's take a guess for the worst case.
RIPMSG1(RIP_WARNING, "GETTEXTLENGTHS(pwnd=%x): The subclass status of winproc changed during 1st callback.",
pwnd);
retval *= 2;
}
else {
BOOL bNotString = FALSE; // default is string....
if (msg != WM_GETTEXTLENGTH) {
DWORD dw;
if (!RevalidateHwnd(HW(pwnd))) {
MSGERROR1();
}
//
// Get window style.
//
dw = pwnd->style;
if (msg == LB_GETTEXTLEN) {
//
// See if the control is ownerdraw and does not have the LBS_HASSTRINGS
// style.
//
bNotString = (!(dw & LBS_HASSTRINGS) &&
(dw & (LBS_OWNERDRAWFIXED | LBS_OWNERDRAWVARIABLE)));
} else if (msg == CB_GETLBTEXTLEN) {
//
// See if the control is ownerdraw and does not have the CBS_HASSTRINGS
// style.
//
bNotString = (!(dw & CBS_HASSTRINGS) &&
(dw & (CBS_OWNERDRAWFIXED | CBS_OWNERDRAWVARIABLE)));
} else {
MSGERROR1();
}
//
// if so, the length should be ULONG_PTR.
//
if (bNotString) {
retval = sizeof(ULONG_PTR);
}
}
//
// if the target data is "string", get it, and compute the length
//
if (!bNotString) {
if (PtiCurrent()->TIF_flags & TIF_INGETTEXTLENGTH) {
if (fAnsiSender) {
UserAssert(!fAnsiReceiver);
//
// retval has Unicode character count, guessed DBCS length.
//
retval *= 2;
}
} else {
//
// fAnsiReceiver == 1, retval has MBCS character count.
// fAnsiReceiver == 0, retval has Unicode character count.
//
// Add 1 to make room for zero-terminator.
//
DWORD cchText = (DWORD)retval + 1;
DWORD cbCapture = cchText;
SETUPPWND(FNOUTSTRING)
PtiCurrent()->TIF_flags |= TIF_INGETTEXTLENGTH;
//
// if reciver is Unicode, The buffder should be reserved as musg as
// (TextLength * sizeof(WCHAR).
//
if (!fAnsiReceiver) {
cbCapture *= sizeof(WCHAR);
}
BEGINSENDCAPTURE(FNOUTSTRING, 1, cbCapture, FALSE)
MSGDATA()->pwnd = pwndClient;
//
// Use (msg-1) for sending the WM_GETTEXT, LB_GETTEXT or CB_GETLBTEXT
// since the above precompiler checks passed.
//
MSGDATA()->msg = msg-1;
if (msg == WM_GETTEXTLENGTH) {
//
// WM_GETTEXT:
// wParam = cchTextMax; // number of character to copy.
// lParam = lpszText; // address of buffer for text.
//
MSGDATA()->wParam = cchText;
} else {
//
// LB_GETTEXT:
// CB_GETLBTEXT:
// wParam = index; // item index
// lParam = lpszText; // address of buffer for text.
//
MSGDATA()->wParam = wParam;
}
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
RESERVEBYTES(cbCapture, pOutput, cbOutput);
LOCKPWND();
MAKECALLCAPTURE(FNOUTSTRING);
UNLOCKPWND();
CHECKRETURN();
BEGINCOPYOUT()
//
// retval can be [CB|LB]_ERR (-1) or [CB|LB]_ERRSPACE (-2)
// then, it should be grater then zero.
//
if ((LONG)retval > 0) {
/*
* Non-zero retval means some text to copy out.
*/
CALC_SIZE_STRING_OUT((LONG)retval);
}
ENDCOPYOUT()
PtiCurrent()->TIF_flags &= ~TIF_INGETTEXTLENGTH;
TRACECALLBACKMSG("SfnOUTSTRING");
ENDSENDCAPTURE(LRESULT,0);
}
}
}
}
}
ENDCOPYOUT()
TRACECALLBACKMSG("SfnGETDBCSTEXTLENGTHS");
ENDSEND1(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
/*
* The fnGETTEXTLENGTHS routine is used for this message (see... client\dispcb.tpl)
*/
#endif // RECVSIDE
/***************************************************************************\
* xxxClientMonitorEnumProc
*
* Calls the client callback given to EnumDisplayMonitors.
*
* History:
* 05-Sep-1996 adams Created.
\***************************************************************************/
typedef struct _CLIENTMONITORENUMPROCMSG {
HMONITOR hMonitor;
HDC hdcMonitor;
RECT rc;
LPARAM dwData;
MONITORENUMPROC xpfnProc;
} CLIENTMONITORENUMPROCMSG;
#ifdef SENDSIDE
BOOL xxxClientMonitorEnumProc(
HMONITOR hMonitor,
HDC hdcMonitor,
LPRECT lprc,
LPARAM dwData,
MONITORENUMPROC xpfnProc)
{
SETUP(CLIENTMONITORENUMPROC)
BEGINSEND(CLIENTMONITORENUMPROCMSG)
MSGDATA()->hMonitor = hMonitor;
MSGDATA()->hdcMonitor = hdcMonitor;
MSGDATA()->rc = *lprc;
MSGDATA()->dwData = dwData;
MSGDATA()->xpfnProc = xpfnProc;
MAKECALL(CLIENTMONITORENUMPROC);
CHECKRETURN();
TRACECALLBACK("SxxxClientMonitorEnumProc");
ENDSEND(BOOL,FALSE);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientMonitorEnumProc, CLIENTMONITORENUMPROCMSG)
{
BEGINRECV(FALSE, NULL, 0);
retval = (DWORD)CALLPROC(pmsg->xpfnProc)(
CALLDATA(hMonitor),
CALLDATA(hdcMonitor),
PCALLDATA(rc),
CALLDATA(dwData));
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* xxxUserModeCallback
*
* Generic kernel callback stub
*
* 10/28/96 GerardoB Created
\**************************************************************************/
#ifdef SENDSIDE
NTSTATUS xxxUserModeCallback (ULONG uApi, PVOID pIn, ULONG cbIn, PVOID pOut, ULONG cbOut)
{
NTSTATUS Status;
PVOID pLocalOut;
ULONG cbLocalOut;
/*
* Call the client
*/
LeaveCrit();
Status = KeUserModeCallback(uApi, pIn, cbIn, &pLocalOut, &cbLocalOut);
EnterCrit();
/*
* If it failed, bail
*/
if (!NT_SUCCESS(Status)) {
return Status;
}
/*
* If we didn't get the right amount of data, fail.
*/
if (cbLocalOut != cbOut) {
RIPMSG3(RIP_WARNING, "xxxUserModeCallback: uAPi: %#lx cbOut: %#lx cbLocalOut: %#lx",
uApi, cbOut, cbLocalOut);
return STATUS_UNSUCCESSFUL;
}
/*
* If we were expecting some data, copy it.
*/
if (cbOut != 0) {
try {
ProbeForRead(pLocalOut, cbLocalOut, sizeof(DWORD));
RtlCopyMemory(pOut, pLocalOut, cbLocalOut);
} except (W32ExceptionHandler(FALSE, RIP_WARNING)) {
RIPMSG2(RIP_WARNING, "xxxUserModeCallback: uAPi: %#lx Exception: %#lx", uApi, GetExceptionCode());
Status = STATUS_UNSUCCESSFUL;
}
}
return Status;
}
#endif // SENDSIDE
/**************************************************************************\
* fnINOUTMENUGETOBJECT
*
* 11/12/96 GerardoB Created
\**************************************************************************/
typedef struct _FNINOUTMENUGETOBJECTMSG {
PWND pwnd;
UINT msg;
WPARAM wParam;
MENUGETOBJECTINFO mngoi;
ULONG_PTR xParam;
PROC xpfnProc;
} FNINOUTMENUGETOBJECTMSG;
#ifdef SENDSIDE
SMESSAGECALL(INOUTMENUGETOBJECT)
{
SETUPPWND(FNINOUTMENUGETOBJECT)
UNREFERENCED_PARAMETER(dwSCMSFlags);
BEGINSEND(FNOUTDWORDINDWORD)
PMENUGETOBJECTINFO pmngoi = (PMENUGETOBJECTINFO)lParam;
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
MSGDATA()->mngoi = *pmngoi;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
MAKECALL(FNINOUTMENUGETOBJECT);
UNLOCKPWND();
CHECKRETURN();
BEGINCOPYOUT()
try {
UserAssert(pcbs->cbOutput == sizeof(pmngoi->pvObj));
ProbeForRead(pcbs->pOutput, sizeof(pmngoi->pvObj), sizeof(DWORD));
pmngoi->pvObj = *((PVOID *)(pcbs->pOutput));
} except (W32ExceptionHandler(TRUE, RIP_WARNING)) {
MSGERROR();
}
ENDCOPYOUT()
TRACECALLBACKMSG("SfnINOUTMENUGETOBJECT");
ENDSEND(LRESULT, 0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINOUTMENUGETOBJECT, FNINOUTMENUGETOBJECTMSG)
{
BEGINRECV(0, &(pmsg->mngoi.pvObj), sizeof(pmsg->mngoi.pvObj));
retval = (ULONG_PTR)CALLPROC(CALLDATA(xpfnProc))(
CALLDATA(pwnd),
CALLDATA(msg),
CALLDATA(wParam),
PCALLDATA(mngoi),
CALLDATA(xParam));
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* fnLOGONNOTIFY
*
* 2/1/97 JerrySh Created
\**************************************************************************/
typedef struct _FNLOGONNOTIFYMSG {
PWND pwnd;
UINT msg;
WPARAM wParam;
LPARAM lParam;
POWERSTATEPARAMS psParams;
ULONG_PTR xParam;
PROC xpfnProc;
} FNLOGONNOTIFYMSG;
#ifdef SENDSIDE
SMESSAGECALL(LOGONNOTIFY)
{
SETUPPWND(FNLOGONNOTIFY)
UNREFERENCED_PARAMETER(dwSCMSFlags);
UNREFERENCED_PARAMETER(psms);
BEGINSEND(FNLOGONNOTIFY)
PPOWERSTATEPARAMS ppsParams = (PPOWERSTATEPARAMS)lParam;
if (wParam == LOGON_POWERSTATE ||
wParam == LOGON_REMOVE_POWER_MESSAGE ||
wParam == LOGON_SHOW_POWER_MESSAGE) {
MSGDATA()->psParams = *((PPOWERSTATEPARAMS)lParam);
}
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
MSGDATA()->lParam = lParam;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
MAKECALL(FNLOGONNOTIFY);
UNLOCKPWND();
CHECKRETURN();
if (wParam == LOGON_POWERSTATE) {
BEGINCOPYOUT()
OUTSTRUCT(ppsParams, POWERSTATEPARAMS);
ENDCOPYOUT()
}
TRACECALLBACKMSG("SfnLOGONNOTIFY");
ENDSEND(LRESULT, 0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnLOGONNOTIFY, FNLOGONNOTIFYMSG)
{
BEGINRECV(0, &pmsg->psParams, sizeof(pmsg->psParams));
if (CALLDATA(wParam) == LOGON_POWERSTATE ||
CALLDATA(wParam) == LOGON_REMOVE_POWER_MESSAGE ||
CALLDATA(wParam) == LOGON_SHOW_POWER_MESSAGE) {
CALLDATA(lParam) = (LPARAM)&CALLDATA(psParams);
}
retval = (ULONG_PTR)CALLPROC(CALLDATA(xpfnProc))(
CALLDATA(pwnd),
CALLDATA(msg),
CALLDATA(wParam),
CALLDATA(lParam),
CALLDATA(xParam));
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* xxxClientCallWinEventProc
*
* cf. Win'97 Call32BitEventProc() in user_40\user32\user.c
*
* 1996-10-18 IanJa Created
\**************************************************************************/
typedef struct _CLIENTCALLWINEVENTPROCMSG {
WINEVENTPROC pfn;
HWINEVENTHOOK hWinEventHook;
DWORD event;
HWND hwnd;
LONG idObject;
LONG idChild;
DWORD idEventThread;
DWORD dwmsEventTime;
} CLIENTCALLWINEVENTPROCMSG;
#ifdef SENDSIDE
BOOL xxxClientCallWinEventProc(
WINEVENTPROC pfn,
PEVENTHOOK pEventHook,
PNOTIFY pNotify)
{
SETUP(CLIENTCALLWINEVENTPROC)
BEGINSEND(CLIENTCALLWINEVENTPROC)
MSGDATA()->pfn = pfn;
MSGDATA()->hWinEventHook = (HWINEVENTHOOK)PtoH(pEventHook);
MSGDATA()->hwnd = pNotify->hwnd;
MSGDATA()->event = pNotify->event;
MSGDATA()->idObject = pNotify->idObject;
MSGDATA()->idChild = pNotify->idChild;
MSGDATA()->idEventThread = pNotify->idSenderThread;
MSGDATA()->dwmsEventTime = pNotify->dwEventTime;
MAKECALL(CLIENTCALLWINEVENTPROC);
CHECKRETURN();
TRACECALLBACK("xxxClientCallWinEventProc");
ENDSEND(BOOL, FALSE);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientCallWinEventProc, CLIENTCALLWINEVENTPROCMSG)
{
BEGINRECV(FALSE, NULL, 0);
retval = (DWORD)CALLPROC(pmsg->pfn)(
CALLDATA(hWinEventHook),
CALLDATA(event),
CALLDATA(hwnd),
CALLDATA(idObject),
CALLDATA(idChild),
CALLDATA(idEventThread),
CALLDATA(dwmsEventTime));
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* WOWGetProcModule
*
* 3/25/97 FritzS created
\**************************************************************************/
typedef struct _CLIENTWOWGETPROCMODULEMSG {
WNDPROC_PWND pfn;
} CLIENTWOWGETPROCMODULEMSG;
#ifdef SENDSIDE
WORD xxxClientWOWGetProcModule(
WNDPROC_PWND pfn)
{
SETUP(CLIENTWOWGETPROCMODULE)
BEGINSEND(CLIENTWOWGETPROCMODULE)
MSGDATA()->pfn = pfn;
MAKECALL(CLIENTWOWGETPROCMODULE);
CHECKRETURN();
TRACECALLBACK("xxxWOWGetProcModule");
ENDSEND(WORD, FALSE);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientWOWGetProcModule, CLIENTWOWGETPROCMODULEMSG)
{
ULONG ulReal;
BEGINRECV(0, NULL, 0);
if ((pfnWowGetProcModule == NULL) || !IsWOWProc(CALLDATA(pfn))) {
retval = 0;
} else {
UnMarkWOWProc(CALLDATA(pfn),ulReal);
retval = (pfnWowGetProcModule)(ulReal);
}
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* WOWTask16SchedNotify
*
* 12/20/00 ARR created
\**************************************************************************/
typedef struct _CLIENTWOWTASK16SCHEDNOTIFYMSG {
DWORD NotifyParm;
DWORD dwParam;
} CLIENTWOWTASK16SCHEDNOTIFYMSG;
#ifdef SENDSIDE
DWORD xxxClientWOWTask16SchedNotify(
DWORD NotifyParm,
DWORD dwParam)
{
SETUP(CLIENTWOWTASK16SCHEDNOTIFY)
BEGINSEND(CLIENTWOWTASK16SCHEDNOTIFY)
MSGDATA()->NotifyParm = NotifyParm;
MSGDATA()->dwParam = dwParam;
MAKECALL(CLIENTWOWTASK16SCHEDNOTIFY);
CHECKRETURN();
TRACECALLBACK("xxxWOWTask16SchedNotify");
ENDSEND(DWORD, FALSE);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientWOWTask16SchedNotify, CLIENTWOWTASK16SCHEDNOTIFYMSG)
{
BEGINRECV(0, NULL, 0);
if (pfnWowTask16SchedNotify == NULL) {
retval = 1;
} else {
retval = (pfnWowTask16SchedNotify)(CALLDATA(NotifyParm),CALLDATA(dwParam));
}
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* xxxClientLoadStringW
*
* Called to load per user ToolTip strings
*
* 24-Feb-2000 Mhamid Created
\**************************************************************************/
typedef struct _CLIENTLOADSTRINGWMSG {
CAPTUREBUF CaptureBuf;
UINT StrID;
int cch;
PBYTE pOutput;
DWORD cbOutput;
} CLIENTLOADSTRINGWMSG;
#ifdef SENDSIDE
int xxxClientLoadStringW(
IN UINT StrID,
OUT LPWSTR szText,
IN int cch)
{
DWORD cbCapture;
PLARGE_STRING pstr;
BOOL fAnsiReceiver = FALSE;
LARGE_UNICODE_STRING strName;
SETUP(CLIENTLOADSTRINGW)
cbCapture = cch * sizeof(WCHAR);
RtlInitLargeUnicodeString(&strName, szText, cbCapture);
pstr = (PLARGE_STRING)&strName;
BEGINSENDCAPTURE(CLIENTLOADSTRINGW, 1, cbCapture, FALSE)
MSGDATA()->StrID = StrID;
MSGDATA()->cch = cch;
RESERVEBYTES(cbCapture, pOutput, cbOutput);
MAKECALLCAPTURE(CLIENTLOADSTRINGW);
CHECKRETURN();
COPYOUTLPWSTRLIMIT(pstr,cch);
TRACECALLBACK("ClientLoadStringW");
ENDSENDCAPTURE(int, 0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
VOID CheckMsgFontDimensions();
RECVCALL(ClientLoadStringW, CLIENTLOADSTRINGWMSG)
{
BYTE abOutput[CALLBACKSTACKLIMIT];
BEGINRECV(0, NULL, pmsg->cbOutput);
FIXUPPOINTERS();
if (pmsg->cbOutput <= CALLBACKSTACKLIMIT)
CallbackStatus.pOutput = abOutput;
else
CallbackStatus.pOutput = pmsg->pOutput;
retval = (DWORD)LoadStringOrError(
hmodUser,
CALLDATA(StrID),
(LPWSTR)KPVOID_TO_PVOID(CallbackStatus.pOutput),
CALLDATA(cch),
0);
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* fnOUTLPCOMBOBOXINFO (for CB_GETCOMBOBOXINFO message)
*
* 05/12/00 MHamid Created
\**************************************************************************/
typedef struct _FNOUTLPCOMBOBOXINFOMSG {
PWND pwnd;
UINT msg;
WPARAM wParam;
COMBOBOXINFO cbinfo;
ULONG_PTR xParam;
PROC xpfnProc;
} FNOUTLPCOMBOBOXINFOMSG;
#ifdef SENDSIDE
SMESSAGECALL(OUTLPCOMBOBOXINFO)
{
SETUPPWND(FNOUTLPCOMBOBOXINFO)
UNREFERENCED_PARAMETER(dwSCMSFlags);
BEGINSEND(FNOUTLPCOMBOBOXINFO)
PCOMBOBOXINFO pcbinfo = (PCOMBOBOXINFO)lParam;
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
MSGDATA()->cbinfo = *pcbinfo;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
MAKECALL(FNOUTLPCOMBOBOXINFO);
UNLOCKPWND();
CHECKRETURN();
BEGINCOPYOUT()
OUTSTRUCT(pcbinfo, COMBOBOXINFO);
ENDCOPYOUT()
TRACECALLBACKMSG("SfnOUTLPCOMBOBOXINFO");
ENDSEND(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnOUTLPCOMBOBOXINFO, FNOUTLPCOMBOBOXINFOMSG)
{
BEGINRECV(0, &pmsg->cbinfo, sizeof(pmsg->cbinfo));
retval = (ULONG_PTR)CALLPROC(CALLDATA(xpfnProc))(
pmsg->pwnd,
pmsg->msg,
pmsg->wParam,
PCALLDATA(cbinfo),
pmsg->xParam);
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* fnOUTLPSCROLLBARINFO (for SBM_GETSCROLLBARINFO message)
*
* 05/12/00 MHamid Created
\**************************************************************************/
typedef struct _FNOUTLPSCROLLBARINFOMSG {
PWND pwnd;
UINT msg;
WPARAM wParam;
SCROLLBARINFO sbinfo;
ULONG_PTR xParam;
PROC xpfnProc;
} FNOUTLPSCROLLBARINFOMSG;
#ifdef SENDSIDE
SMESSAGECALL(OUTLPSCROLLBARINFO)
{
SETUPPWND(FNOUTLPSCROLLBARINFO)
UNREFERENCED_PARAMETER(dwSCMSFlags);
BEGINSEND(FNOUTLPSCROLLBARINFO)
PSCROLLBARINFO psbinfo = (PSCROLLBARINFO)lParam;
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
MSGDATA()->sbinfo = *psbinfo;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
MAKECALL(FNOUTLPSCROLLBARINFO);
UNLOCKPWND();
CHECKRETURN();
BEGINCOPYOUT()
OUTSTRUCT(psbinfo, SCROLLBARINFO);
ENDCOPYOUT()
TRACECALLBACKMSG("SfnOUTLPSCROLLBARINFO");
ENDSEND(LRESULT,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnOUTLPSCROLLBARINFO, FNOUTLPSCROLLBARINFOMSG)
{
BEGINRECV(0, &pmsg->sbinfo, sizeof(pmsg->sbinfo));
retval = (ULONG_PTR)CALLPROC(CALLDATA(xpfnProc))(
pmsg->pwnd,
pmsg->msg,
pmsg->wParam,
PCALLDATA(sbinfo),
pmsg->xParam);
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* GetLUIDDosDrivesOnly
*
* Called to check the drive letters used in the LUID DosDevice
* map. Does not check if the drive letters are used in the Global
* DosDevices
*
* 08/18/00 ELi Created
\**************************************************************************/
#ifdef RECVSIDE
__inline DWORD GetLUIDDosDrivesOnly()
{
NTSTATUS Status;
PROCESS_DEVICEMAP_INFORMATION_EX ProcessDeviceMapInfoEx;
ProcessDeviceMapInfoEx.Flags = PROCESS_LUID_DOSDEVICES_ONLY;
Status = NtQueryInformationProcess( NtCurrentProcess(),
ProcessDeviceMap,
&ProcessDeviceMapInfoEx,
sizeof( ProcessDeviceMapInfoEx ),
NULL
);
if (NT_SUCCESS( Status )) {
return ProcessDeviceMapInfoEx.Query.DriveMap;
}
else {
return 0;
}
}
#endif // RECVSIDE