Windows NT 4.0 source code leak
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.
 
 
 
 
 
 

6148 lines
154 KiB

/****************************** Module Header ******************************\
* Module Name: ntcb.h
*
* Copyright (c) 1985-95, Microsoft Corporation
*
* Kernel mode sending stubs
*
* 07-06-91 ScottLu Created.
\***************************************************************************/
// If SERVER is UNICODE
// Copy UNICODE -> UNICODE
// or Copy ANSI -> UNICODE
// prototypes to client side functions only called by these stubs
// ddetrack.c
BOOL _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);
typedef struct _GENERICHOOKHEADER {
DWORD nCode;
DWORD wParam;
DWORD xParam;
DWORD xpfnProc;
} GENERICHOOKHEADER, * LPGENERICHOOKHEADER;
#ifdef RECVSIDE
DWORD CallHookWithSEH(GENERICHOOKHEADER *pmsg, LPVOID pData, LPDWORD pFlags, DWORD retval) {
try {
retval = (DWORD)CALLPROC(pmsg->xpfnProc)(
pmsg->nCode,
pmsg->wParam,
pData,
pmsg->xParam);
} except ((*pFlags & HF_GLOBAL) ? EXCEPTION_EXECUTE_HANDLER : 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;
DWORD xParam;
PROC xpfnProc;
} FNOUTDWORDDWORDMSG;
#ifdef SENDSIDE
SMESSAGECALL(OUTDWORDDWORD)
{
SETUPPWND(FNOUTDWORDDWORD)
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();
if (psms == NULL || ((psms->flags & (SMF_SENDERDIED | SMF_REPLY)) == 0)) {
try {
ProbeForRead(pcbs->pOutput, pcbs->cbOutput, sizeof(DWORD));
*lpdwW = *(LPDWORD)pcbs->pOutput;
*lpdwL = *((LPDWORD)pcbs->pOutput + 1);
} except (EXCEPTION_EXECUTE_HANDLER) {
MSGNTERRORCODE(GetExceptionCode());
}
}
TRACECALLBACKMSG("SfnOUTDWORDDWORD");
ENDSEND(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnOUTDWORDDWORD, FNOUTDWORDDWORDMSG)
{
DWORD adwOut[2];
BEGINRECV(0, adwOut, sizeof(adwOut));
retval = (DWORD)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;
DWORD wParam;
LONG lParam;
DWORD xParam;
PROC xpfnProc;
} FNOUTDWORDINDWORDMSG;
#ifdef SENDSIDE
SMESSAGECALL(OUTDWORDINDWORD)
{
SETUPPWND(FNOUTDWORDINDWORD)
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();
if (psms == NULL || ((psms->flags & (SMF_SENDERDIED | SMF_REPLY)) == 0)) {
try {
ProbeForRead(pcbs->pOutput, pcbs->cbOutput, sizeof(DWORD));
*lpdwW = *(LPDWORD)pcbs->pOutput;
} except (EXCEPTION_EXECUTE_HANDLER) {
MSGNTERRORCODE(GetExceptionCode());
}
}
TRACECALLBACKMSG("SfnOUTDWORDINDWORD");
ENDSEND(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnOUTDWORDINDWORD, FNOUTDWORDINDWORDMSG)
{
DWORD dwOut;
BEGINRECV(0, &dwOut, sizeof(dwOut));
retval = (DWORD)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;
DWORD xParam;
PROC xpfnProc;
} FNOPTOUTLPDWORDOPTOUTLPDWORDMSG;
#ifdef SENDSIDE
SMESSAGECALL(OPTOUTLPDWORDOPTOUTLPDWORD)
{
SETUPPWND(FNOPTOUTLPDWORDOPTOUTLPDWORD)
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();
if (psms == NULL || ((psms->flags & (SMF_SENDERDIED | SMF_REPLY)) == 0)) {
try {
ProbeForRead(pcbs->pOutput, pcbs->cbOutput, sizeof(DWORD));
if (lpdwW != NULL)
*lpdwW = *(LPDWORD)pcbs->pOutput;
if (lpdwL != NULL)
*lpdwL = *((LPDWORD)pcbs->pOutput + 1);
} except (EXCEPTION_EXECUTE_HANDLER) {
MSGNTERRORCODE(GetExceptionCode());
}
}
TRACECALLBACKMSG("SfnOPTOUTLPDWORDOPTOUTLPDWORD");
ENDSEND(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnOPTOUTLPDWORDOPTOUTLPDWORD, FNOPTOUTLPDWORDOPTOUTLPDWORDMSG)
{
DWORD adwOut[2];
BEGINRECV(0, adwOut, sizeof(adwOut));
retval = (DWORD)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;
DWORD wParam;
LPMSG pmsgstruct;
DWORD xParam;
PROC xpfnProc;
MSG msgstruct;
} FNDWORDOPTINLPMSGMSG;
#ifdef SENDSIDE
SMESSAGECALL(DWORDOPTINLPMSG)
{
SETUPPWND(FNDWORDOPTINLPMSG)
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(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnDWORDOPTINLPMSG, FNDWORDOPTINLPMSGMSG)
{
BEGINRECV(0, NULL, 0);
retval = (DWORD)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)
{
SETUPPWND(FNCOPYGLOBALDATA)
PBYTE pData = (PBYTE)lParam;
BEGINSENDCAPTURE(FNCOPYGLOBALDATA, 1, wParam, TRUE)
if (pData == 0) {
MSGERROR();
}
MSGDATA()->cbSize = wParam;
LARGECOPYBYTES(pData, wParam);
LOCKPWND();
MAKECALLCAPTURE(FNCOPYGLOBALDATA);
UNLOCKPWND();
CHECKRETURN();
TRACECALLBACKMSG("SfnCOPYGLOBALDATA");
ENDSENDCAPTURE(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnCOPYGLOBALDATA, FNCOPYGLOBALDATAMSG)
{
PBYTE p;
BEGINRECV(0, NULL, 0);
FIXUPPOINTERS();
retval = (DWORD)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;
DWORD xParam;
PROC xpfnProc;
} FNCOPYDATAMSG;
#ifdef SENDSIDE
SMESSAGECALL(COPYDATA)
{
HWND hwndFrom = (HWND)wParam;
PCOPYDATASTRUCT pcds = (PCOPYDATASTRUCT)lParam;
DWORD cCapture, cbCapture;
SETUPPWND(FNCOPYDATA)
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(DWORD,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;
DWORD wParam;
DWORD lParam;
DWORD xParam;
PROC xpfnProc;
BOOL fIsUnicodeProc;
} FNSENTDDEMSGMSG;
#ifdef SENDSIDE
SMESSAGECALL(SENTDDEMSG)
{
MSG msgs;
SETUPPWND(FNSENTDDEMSG)
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) -
pci->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(DWORD,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)));
/*
* BUGBUG:
* 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 = (DWORD)CALLPROC(CALLDATA(xpfnProc))(
CALLDATA(pwnd),
CALLDATA(msg),
CALLDATA(wParam),
CALLDATA(lParam),
CALLDATA(xParam));
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* fnPAINT
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _FNPAINTMSG {
PWND pwnd;
UINT msg;
DWORD wParam;
LONG lParam;
DWORD xParam;
PROC xpfnProc;
} FNPAINTMSG;
#ifdef SENDSIDE
SMESSAGECALL(PAINT)
{
SETUPPWND(FNPAINT)
BEGINSEND(FNPAINT)
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
MSGDATA()->lParam = lParam;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
MAKECALL(FNPAINT);
UNLOCKPWND();
CHECKRETURN();
TRACECALLBACKMSG("SfnPAINT");
ENDSEND(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnPAINT, FNPAINTMSG)
{
BEGINRECV(0, NULL, 0);
if (CALLDATA(wParam)) {
DWORD dwT = (DWORD)((HDC)CALLDATA(wParam));
if (dwT) {
CALLDATA(wParam) = dwT;
}
}
retval = (DWORD)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;
DWORD wParam;
LONG lParam;
DWORD xParam;
PROC xpfnProc;
} FNDWORDMSG;
#ifdef SENDSIDE
SMESSAGECALL(DWORD)
{
SETUPPWND(FNDWORD)
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(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnDWORD, FNDWORDMSG)
{
BEGINRECV(0, NULL, 0);
retval = (DWORD)CALLPROC(CALLDATA(xpfnProc))(
CALLDATA(pwnd),
CALLDATA(msg),
CALLDATA(wParam),
CALLDATA(lParam),
CALLDATA(xParam));
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* fnINWPARAMCHAR
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _FNINWPARAMCHARMSG {
PWND pwnd;
UINT msg;
DWORD wParam;
LONG lParam;
DWORD xParam;
PROC xpfnProc;
} FNINWPARAMCHARMSG;
#ifdef SENDSIDE
SMESSAGECALL(INWPARAMCHAR)
{
SETUPPWND(FNINWPARAMCHAR)
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) {
DWORD 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(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
/*
* The fnDWORD routine is used for this message
*/
#endif // RECVSIDE
#ifdef FE_SB // fnINWPARAMDBCSCHAR()
/**************************************************************************\
* fnINWPARAMDBCSCHAR
*
* 12-Feb-1996 hideyukn Created
\**************************************************************************/
typedef struct _FNINWPARAMDBCSCHARMSG {
PWND pwnd;
UINT msg;
DWORD wParam;
LONG lParam;
DWORD xParam;
PROC xpfnProc;
BOOL bAnsi;
} FNINWPARAMDBCSCHARMSG;
#ifdef SENDSIDE
SMESSAGECALL(INWPARAMDBCSCHAR)
{
SETUPPWND(FNINWPARAMDBCSCHAR)
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(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINWPARAMDBCSCHAR, FNINWPARAMDBCSCHARMSG)
{
BOOL bAnsiWndProc;
BEGINRECV(0,NULL,0);
bAnsiWndProc = CALLDATA(bAnsi);
if (bAnsiWndProc) {
PMSG pmsgDbcsCB = GetCallBackDbcsInfo();
DWORD 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;
//
RtlCopyMemory(pmsgDbcsCB,pmsg,sizeof(MSG));
//
// 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 = 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 = (DWORD)CALLPROC(pmsg->xpfnProc)(
pmsg->pwnd,
pmsg->msg,
pmsg->wParam,
pmsg->lParam,
pmsg->xParam);
}
ENDRECV();
}
#endif // RECVSIDE
#endif // FE_SB
/**************************************************************************\
* yyy
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _FNINOUTDRAGMSG {
PWND pwnd;
UINT msg;
DWORD wParam;
DWORD xParam;
PROC xpfnProc;
DROPSTRUCT ds;
} FNINOUTDRAGMSG;
#ifdef SENDSIDE
SMESSAGECALL(INOUTDRAG)
{
SETUPPWND(FNINOUTDRAG)
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();
if (psms == NULL || ((psms->flags & (SMF_SENDERDIED | SMF_REPLY)) == 0)) {
OUTSTRUCT(pds, DROPSTRUCT);
}
TRACECALLBACKMSG("SfnINOUTDRAG");
ENDSEND(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINOUTDRAG, FNINOUTDRAGMSG)
{
BEGINRECV(0, &pmsg->ds, sizeof(pmsg->ds));
retval = (DWORD)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;
DWORD wParam;
DWORD xParam;
PROC xpfnProc;
} FNGETTEXTLENGTHSMSG;
#ifdef SENDSIDE
SMESSAGECALL(GETTEXTLENGTHS)
{
SETUPPWND(FNGETTEXTLENGTHS)
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(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnGETTEXTLENGTHS, FNGETTEXTLENGTHSMSG)
{
BEGINRECV(0, NULL, 0);
retval = (DWORD)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;
DWORD wParam;
DWORD lParam;
CREATESTRUCT cs;
DWORD 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)
/*
* 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 ||
MM_IS_SYSTEM_VIRTUAL_ADDRESS((PVOID)pcreatestruct->cs.lpszName))) {
CALC_SIZE_IN(cbName, &pcreatestruct->strName);
cCapture++;
}
if (HIWORD(pcreatestruct->cs.lpszClass) &&
((BOOL)pcreatestruct->strClass.bAnsi != fAnsiReceiver ||
MM_IS_SYSTEM_VIRTUAL_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) {
if (*(PWORD)pcreatestruct->cs.lpszName == 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 {
if (*(PBYTE)pcreatestruct->cs.lpszName == 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;
dwOrdinal = MAKELONG(0xffff,
(*(DWORD UNALIGNED *)pcreatestruct->cs.lpszName >> 8));
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(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINLPCREATESTRUCT, FNINLPCREATESTRUCTMSG)
{
LPARAM lParam;
BEGINRECV(0, NULL, 0);
FIXUPPOINTERS();
if (pmsg->lParam != 0) {
if ((PVOID)pmsg->cs.lpszName > MM_HIGHEST_USER_ADDRESS)
pmsg->cs.lpszName = REBASEPTR(pmsg->pwnd, pmsg->cs.lpszName);
if ((PVOID)pmsg->cs.lpszClass > MM_HIGHEST_USER_ADDRESS)
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 = (DWORD)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;
DWORD wParam;
MDICREATESTRUCT mdics;
DWORD xParam;
PROC xpfnProc;
int szClass;
int szTitle;
} FNINLPMDICREATESTRUCTMSG;
#ifdef SENDSIDE
SMESSAGECALL(INLPMDICREATESTRUCT)
{
LPMDICREATESTRUCT pmdicreatestruct = (LPMDICREATESTRUCT)lParam;
DWORD cbTitle = 0, cbClass = 0;
DWORD cCapture = 0;
BOOL fAnsiReceiver = (dwSCMSFlags & SCMS_FLAGS_ANSI);
SETUPPWND(FNINLPMDICREATESTRUCT)
/*
* Compute ANSI capture lengths. Don't capture if
* the strings are in the client's address space and
* are Unicode.
*/
if (pmdicreatestruct->szTitle &&
(MM_IS_SYSTEM_VIRTUAL_ADDRESS((PVOID)pmdicreatestruct->szTitle) ||
(fAnsiReceiver))) {
cbTitle = wcslen(pmdicreatestruct->szTitle) + 1;
cCapture = 1;
}
if (HIWORD(pmdicreatestruct->szClass) &&
(MM_IS_SYSTEM_VIRTUAL_ADDRESS((PVOID)pmdicreatestruct->szClass) ||
(fAnsiReceiver))) {
cbClass = wcslen(pmdicreatestruct->szClass) + 1;
cCapture++;
}
/*
* If unicode, convert to proper length
*/
if (!(fAnsiReceiver)) {
cbTitle *= sizeof(WCHAR);
cbClass *= sizeof(WCHAR);
}
BEGINSENDCAPTURE(FNINLPMDICREATESTRUCT, cCapture, cbTitle + cbClass, TRUE)
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
/*
* wParam isn't used... from the client to the server, we use it
* for dwExpWinVer. So we don't pass this back to the client, be
* sure to fill wParam with 0.
*/
MSGDATA()->wParam = 0;
MSGDATA()->mdics = *pmdicreatestruct;
if (fAnsiReceiver) {
if (cbClass)
COPYLPWSTR2A(pmdicreatestruct->szClass, mdics.szClass);
if (cbTitle)
COPYLPWSTROPT2A(pmdicreatestruct->szTitle, mdics.szTitle);
} else {
if (cbClass)
COPYLPWSTR2(pmdicreatestruct->szClass, mdics.szClass);
if (cbTitle)
COPYLPWSTR2(pmdicreatestruct->szTitle, mdics.szTitle);
}
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
MAKECALLCAPTURE(FNINLPMDICREATESTRUCT);
UNLOCKPWND();
CHECKRETURN();
TRACECALLBACKMSG("SfnINLPMDICREATESTRUCT");
ENDSENDCAPTURE(DWORD,0);
DBG_UNREFERENCED_PARAMETER(wParam);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINLPMDICREATESTRUCT, FNINLPMDICREATESTRUCTMSG)
{
BEGINRECV(0, NULL, 0);
FIXUPPOINTERS();
retval = (DWORD)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;
DWORD wParam;
PAINTSTRUCT ps;
DWORD 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)
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(DWORD,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 = (DWORD)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;
DWORD wParam;
RECT rc;
DWORD 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)
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(DWORD,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 = (DWORD)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;
DWORD wParam;
DWORD lParam;
DWORD xParam;
PROC xpfnProc;
} FNINDESTROYCLIPBRDMSG;
#ifdef SENDSIDE
SMESSAGECALL(INDESTROYCLIPBRD)
{
SETUPPWND(FNINDESTROYCLIPBRD)
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(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINDESTROYCLIPBRD, FNINDESTROYCLIPBRDMSG)
{
void ClientEmptyClipboard(void);
BEGINRECV(0, NULL, 0);
retval = (DWORD)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;
DWORD wParam;
SCROLLINFO info;
DWORD xParam;
PROC xpfnProc;
} FNINOUTLPSCROLLINFOMSG;
#ifdef SENDSIDE
SMESSAGECALL(INOUTLPSCROLLINFO)
{
SETUPPWND(FNINOUTLPSCROLLINFO)
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();
if (psms == NULL || ((psms->flags & (SMF_SENDERDIED | SMF_REPLY)) == 0)) {
OUTSTRUCT(pinfo, SCROLLINFO);
}
TRACECALLBACKMSG("SfnINOUTLPSCROLLINFO");
ENDSEND(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINOUTLPSCROLLINFO, FNINOUTLPSCROLLINFOMSG)
{
BEGINRECV(0, &pmsg->info, sizeof(pmsg->info));
retval = (DWORD)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;
DWORD wParam;
POINT5 point5;
DWORD xParam;
PROC xpfnProc;
} FNINOUTLPPOINT5MSG;
#ifdef SENDSIDE
SMESSAGECALL(INOUTLPPOINT5)
{
SETUPPWND(FNINOUTLPPOINT5)
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();
if (psms == NULL || ((psms->flags & (SMF_SENDERDIED | SMF_REPLY)) == 0)) {
OUTSTRUCT(ppoint5, POINT5);
}
TRACECALLBACKMSG("SfnINOUTLPPOINT5");
ENDSEND(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINOUTLPPOINT5, FNINOUTLPPOINT5MSG)
{
BEGINRECV(0, &pmsg->point5, sizeof(POINT5));
retval = (DWORD)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;
DWORD wParam;
RECT rect;
DWORD xParam;
PROC xpfnProc;
} FNINOUTLPRECTMSG;
#ifdef SENDSIDE
SMESSAGECALL(INOUTLPRECT)
{
SETUPPWND(FNINOUTLPRECT)
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();
if (psms == NULL || ((psms->flags & (SMF_SENDERDIED | SMF_REPLY)) == 0)) {
OUTSTRUCT(prect, RECT);
}
TRACECALLBACKMSG("SfnINOUTLPRECT");
ENDSEND(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINOUTLPRECT, FNINOUTLPRECTMSG)
{
BEGINRECV(0, &pmsg->rect, sizeof(pmsg->rect));
retval = (DWORD)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;
DWORD wParam;
DWORD 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)
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();
if (psms == NULL || ((psms->flags & (SMF_SENDERDIED | SMF_REPLY)) == 0)) {
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 (EXCEPTION_EXECUTE_HANDLER) {
MSGNTERRORCODE(GetExceptionCode());
}
}
TRACECALLBACKMSG("SfnINOUTNCCALCSIZE");
ENDSEND(DWORD,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 = (DWORD)CALLPROC(pmsg->xpfnProc)(
pmsg->pwnd,
pmsg->msg,
pmsg->wParam,
(LONG)&pmsg->u,
pmsg->xParam);
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* yyy
*
* 9/30/94 Sanfords created
\**************************************************************************/
typedef struct _FNINOUTSTYLECHANGEMSG {
PWND pwnd;
UINT msg;
DWORD wParam;
STYLESTRUCT ss;
DWORD xParam;
PROC xpfnProc;
} FNINOUTSTYLECHANGEMSG;
#ifdef SENDSIDE
SMESSAGECALL(INOUTSTYLECHANGE)
{
SETUPPWND(FNINOUTSTYLECHANGE)
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(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINOUTSTYLECHANGE, FNINOUTSTYLECHANGEMSG)
{
BEGINRECV(0, &pmsg->ss, sizeof(pmsg->ss));
retval = (DWORD)CALLPROC(CALLDATA(xpfnProc))(
CALLDATA(pwnd),
CALLDATA(msg),
CALLDATA(wParam),
(LONG)&pmsg->ss,
pmsg->xParam);
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* yyy
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _FNOUTLPRECTMSG {
PWND pwnd;
UINT msg;
DWORD wParam;
DWORD xParam;
PROC xpfnProc;
} FNOUTLPRECTMSG;
#ifdef SENDSIDE
SMESSAGECALL(OUTLPRECT)
{
SETUPPWND(FNOUTLPRECT)
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();
if (psms == NULL || ((psms->flags & (SMF_SENDERDIED | SMF_REPLY)) == 0)) {
OUTSTRUCT(prect, RECT);
}
TRACECALLBACKMSG("SfnOUTLPRECT");
ENDSEND(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnOUTLPRECT, FNOUTLPRECTMSG)
{
RECT rc;
BEGINRECV(0, &rc, sizeof(rc));
retval = (DWORD)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;
DWORD wParam;
COMPAREITEMSTRUCT compareitemstruct;
DWORD xParam;
PROC xpfnProc;
} FNINLPCOMPAREITEMSTRUCTMSG;
#ifdef SENDSIDE
SMESSAGECALL(INLPCOMPAREITEMSTRUCT)
{
SETUPPWND(FNINLPCOMPAREITEMSTRUCT)
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(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINLPCOMPAREITEMSTRUCT, FNINLPCOMPAREITEMSTRUCTMSG)
{
BEGINRECV(0, NULL, 0);
retval = (DWORD)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;
DWORD wParam;
DELETEITEMSTRUCT deleteitemstruct;
DWORD xParam;
PROC xpfnProc;
} FNINLPDELETEITEMSTRUCTMSG;
#ifdef SENDSIDE
SMESSAGECALL(INLPDELETEITEMSTRUCT)
{
SETUPPWND(FNINLPDELETEITEMSTRUCT)
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(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINLPDELETEITEMSTRUCT, FNINLPDELETEITEMSTRUCTMSG)
{
BEGINRECV(0, NULL, 0);
retval = (DWORD)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;
DWORD wParam;
LPHLP lphlp;
DWORD xParam;
PROC xpfnProc;
} FNINLPHLPSTRUCTMSG;
#ifdef SENDSIDE
SMESSAGECALL(INLPHLPSTRUCT)
{
LPHLP lphlp = (LPHLP)lParam;
SETUPPWND(FNINLPHLPSTRUCT)
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(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINLPHLPSTRUCT, FNINLPHLPSTRUCTMSG)
{
BEGINRECV(0, NULL, 0);
FIXUPPOINTERS();
retval = (DWORD)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;
DWORD wParam;
LPHELPINFO lphlp;
DWORD xParam;
PROC xpfnProc;
} FNINLPHELPINFOSTRUCTMSG;
#ifdef SENDSIDE
SMESSAGECALL(INLPHELPINFOSTRUCT)
{
LPHELPINFO lphlp = (LPHELPINFO)lParam;
SETUPPWND(FNINLPHELPINFOSTRUCT)
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(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINLPHELPINFOSTRUCT, FNINLPHELPINFOSTRUCTMSG)
{
BEGINRECV(0, NULL, 0);
FIXUPPOINTERS();
retval = (DWORD)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;
DWORD wParam;
DRAWITEMSTRUCT drawitemstruct;
DWORD xParam;
PROC xpfnProc;
} FNINLPDRAWITEMSTRUCTMSG;
#ifdef SENDSIDE
SMESSAGECALL(INLPDRAWITEMSTRUCT)
{
SETUPPWND(FNINLPDRAWITEMSTRUCT)
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) !=
W32GetCurrentProcess()->W32Pid) {
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(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINLPDRAWITEMSTRUCT, FNINLPDRAWITEMSTRUCTMSG)
{
HDC hdc;
BEGINRECV(0, NULL, 0);
hdc = pmsg->drawitemstruct.hDC;
if (pmsg->drawitemstruct.hDC == NULL)
MSGERRORCODE(ERROR_INVALID_HANDLE);
retval = (DWORD)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;
DWORD wParam;
MEASUREITEMSTRUCT measureitemstruct;
DWORD 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();
if ((psms == NULL || ((psms->flags & (SMF_SENDERDIED | SMF_REPLY)) == 0))
&& !(dwSCMSFlags & SCMS_FLAGS_INONLY)) {
OUTSTRUCT(pmeasureitemstruct, MEASUREITEMSTRUCT);
}
TRACECALLBACKMSG("SfnINOUTLPMEASUREITEMSTRUCT");
ENDSEND(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINOUTLPMEASUREITEMSTRUCT, FNINOUTLPMEASUREITEMSTRUCTMSG)
{
BEGINRECV(0, &pmsg->measureitemstruct, sizeof(pmsg->measureitemstruct));
retval = (DWORD)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;
DWORD wParam;
DWORD 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)
/*
* Compute ANSI capture lengths. Don't capture if
* the strings are in the client's address space and
* of the correct type.
*/
if (pstr &&
(MM_IS_SYSTEM_VIRTUAL_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(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINSTRING, FNINSTRINGMSG)
{
BEGINRECV(0, NULL, 0);
FIXUPPOINTERS();
retval = (DWORD)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;
DWORD wParam;
DWORD 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)
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 (MM_IS_SYSTEM_VIRTUAL_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(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINSTRINGNULL, FNINSTRINGNULLMSG)
{
BEGINRECV(0, NULL, 0);
FIXUPPOINTERS();
retval = (DWORD)CALLPROC(pmsg->xpfnProc)(
pmsg->pwnd,
pmsg->msg,
pmsg->wParam,
pmsg->pwsz,
pmsg->xParam);
ENDRECV();
}
#endif // RECVSIDE
typedef struct _FNINDEVICECHANGEMSG {
CAPTUREBUF CaptureBuf;
PWND pwnd;
UINT msg;
DWORD wParam;
DWORD xParam;
PROC xpfnProc;
LPTSTR pwsz;
} 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)
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 (MM_IS_SYSTEM_VIRTUAL_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()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
LOCKPWND();
MAKECALLCAPTURE(FNINDEVICECHANGE);
UNLOCKPWND();
CHECKRETURN();
TRACECALLBACKMSG("SfnINDEVICECHANGE");
ENDSENDCAPTURE(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINDEVICECHANGE, FNINDEVICECHANGEMSG)
{
BEGINRECV(0, NULL, 0);
FIXUPPOINTERS();
retval = (DWORD)CALLPROC(pmsg->xpfnProc)(
pmsg->pwnd,
pmsg->msg,
pmsg->wParam,
pmsg->pwsz,
pmsg->xParam);
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;
DWORD wParam;
DWORD 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);
SETUPPWND(FNOUTSTRING)
CALC_SIZE_OUT(cbCapture, pstr);
BEGINSENDCAPTURE(FNOUTSTRING, 1, cbCapture, FALSE)
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
/*
* Up to wParam MBCS bytes may be required to form wParam Unicode bytes
*/
MSGDATA()->wParam = wParam;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
RESERVEBYTES(cbCapture, pOutput, cbOutput);
LOCKPWND();
MAKECALLCAPTURE(FNOUTSTRING);
UNLOCKPWND();
CHECKRETURN();
if ((psms == NULL || ((psms->flags & (SMF_SENDERDIED | SMF_REPLY)) == 0))
&& !(dwSCMSFlags & SCMS_FLAGS_INONLY)) {
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;
}
}
}
}
TRACECALLBACKMSG("SfnOUTSTRING");
ENDSENDCAPTURE(DWORD,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 = (DWORD)CALLPROC(CALLDATA(xpfnProc))(
CALLDATA(pwnd),
CALLDATA(msg),
CALLDATA(wParam),
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;
DWORD wParam;
DWORD 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
*/
if ((psms == NULL || ((psms->flags & (SMF_SENDERDIED | SMF_REPLY)) == 0))
&& !(dwSCMSFlags & SCMS_FLAGS_INONLY)) {
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;
}
}
}
TRACECALLBACKMSG("SfnINCNTOUTSTRING");
ENDSENDCAPTURE(DWORD,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;
*(LPWORD)CallbackStatus.pOutput = CALLDATA(cchMax);
retval = (DWORD)CALLPROC(CALLDATA(xpfnProc))(
CALLDATA(pwnd),
CALLDATA(msg),
CALLDATA(wParam),
(LPSTR)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;
DWORD wParam;
DWORD 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
*/
if ((psms == NULL || ((psms->flags & (SMF_SENDERDIED | SMF_REPLY)) == 0))
&& !(dwSCMSFlags & SCMS_FLAGS_INONLY)) {
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);
}
}
TRACECALLBACKMSG("SfnINCNTOUTSTRINGNULL");
ENDSENDCAPTURE(DWORD,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 = (DWORD)CALLPROC(CALLDATA(xpfnProc))(
CALLDATA(pwnd),
CALLDATA(msg),
CALLDATA(wParam),
(LPSTR)CallbackStatus.pOutput,
CALLDATA(xParam));
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* fnPOUTLPINT
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _FNPOUTLPINTMSG {
CAPTUREBUF CaptureBuf;
PWND pwnd;
UINT msg;
DWORD wParam;
DWORD xParam;
PROC xpfnProc;
PBYTE pOutput;
DWORD cbOutput;
} FNPOUTLPINTMSG;
#ifdef SENDSIDE
SMESSAGECALL(POUTLPINT)
{
DWORD cbCapture;
LPINT pint = (LPINT)lParam;
SETUPPWND(FNPOUTLPINT)
cbCapture = wParam * sizeof(INT);
BEGINSENDCAPTURE(FNPOUTLPINT, 1, cbCapture, FALSE)
MSGDATA()->pwnd = pwndClient;
MSGDATA()->msg = msg;
MSGDATA()->wParam = wParam;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
RESERVEBYTES(cbCapture, pOutput, cbOutput);
LOCKPWND();
MAKECALLCAPTURE(FNPOUTLPINT);
UNLOCKPWND();
CHECKRETURN();
if (psms == NULL || ((psms->flags & (SMF_SENDERDIED | SMF_REPLY)) == 0)) {
try {
ProbeForRead(pcbs->pOutput, pcbs->cbOutput, sizeof(DWORD));
memcpy(pint, pcbs->pOutput, cbCapture);
} except (EXCEPTION_EXECUTE_HANDLER) {
MSGNTERRORCODE(GetExceptionCode());
}
}
TRACECALLBACKMSG("SfnPOUTLPINT");
ENDSENDCAPTURE(DWORD,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 = (DWORD)CALLPROC(CALLDATA(xpfnProc))(
CALLDATA(pwnd),
CALLDATA(msg),
CALLDATA(wParam),
(LPINT)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;
DWORD wParam;
LPWORD pw;
DWORD xParam;
PROC xpfnProc;
} FNPOPTINLPUINTMSG;
#ifdef SENDSIDE
SMESSAGECALL(POPTINLPUINT)
{
LPWORD pw = (LPWORD)lParam;
DWORD cCapture, cbCapture;
SETUPPWND(FNPOPTINLPUINT);
if (lParam) {
cCapture = 1;
cbCapture = 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(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnPOPTINLPUINT, FNPOPTINLPUINTMSG)
{
BEGINRECV(0, NULL, 0);
FIXUPPOINTERS();
retval = (DWORD)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;
DWORD wParam;
WINDOWPOS wp;
DWORD xParam;
PROC xpfnProc;
} FNINOUTLPWINDOWPOSMSG;
#ifdef SENDSIDE
SMESSAGECALL(INOUTLPWINDOWPOS)
{
SETUPPWND(FNINOUTLPWINDOWPOS)
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();
if (psms == NULL || ((psms->flags & (SMF_SENDERDIED | SMF_REPLY)) == 0)) {
OUTSTRUCT(pwp, WINDOWPOS);
}
TRACECALLBACKMSG("SfnINOUTLPWINDOWPOS");
ENDSEND(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINOUTLPWINDOWPOS, FNINOUTLPWINDOWPOSMSG)
{
BEGINRECV(0, &pmsg->wp, sizeof(pmsg->wp));
retval = (DWORD)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;
DWORD wParam;
WINDOWPOS wp;
DWORD xParam;
PROC xpfnProc;
} FNINLPWINDOWPOSMSG;
#ifdef SENDSIDE
SMESSAGECALL(INLPWINDOWPOS)
{
SETUPPWND(FNINLPWINDOWPOS)
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(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINLPWINDOWPOS, FNINLPWINDOWPOSMSG)
{
BEGINRECV(0, NULL, 0);
retval = (DWORD)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;
DWORD wParam;
MDINEXTMENU mnm;
DWORD xParam;
PROC xpfnProc;
} FNINOUTNEXTMENUMSG;
#ifdef SENDSIDE
SMESSAGECALL(INOUTNEXTMENU)
{
SETUPPWND(FNINOUTNEXTMENU)
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();
if (psms == NULL || ((psms->flags & (SMF_SENDERDIED | SMF_REPLY)) == 0)) {
OUTSTRUCT(((PMDINEXTMENU)lParam), MDINEXTMENU);
}
TRACECALLBACKMSG("SfnINOUTNEXTMENU");
ENDSEND(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnINOUTNEXTMENU, FNINOUTNEXTMENUMSG)
{
BEGINRECV(0, &pmsg->mnm, sizeof(pmsg->mnm));
retval = (DWORD)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;
DWORD wParam;
CREATESTRUCTDATA d;
PROC xpfnProc;
BOOL bAnsi;
} FNHKINLPCBTCREATESTRUCTMSG;
#ifdef SENDSIDE
DWORD fnHkINLPCBTCREATESTRUCT(
UINT msg,
DWORD 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 ||
MM_IS_SYSTEM_VIRTUAL_ADDRESS((PVOID)pcreatestruct->cs.lpszName))) {
CALC_SIZE_IN(cbTitle, &pcreatestruct->strName);
cCapture++;
}
if (HIWORD(pcreatestruct->cs.lpszClass) &&
((BOOL)pcreatestruct->strClass.bAnsi != fAnsiReceiver ||
MM_IS_SYSTEM_VIRTUAL_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) {
if (*(PWORD)pcreatestruct->cs.lpszName == 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 {
if (*(PBYTE)pcreatestruct->cs.lpszName == 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;
dwOrdinal = MAKELONG(0xffff,
(*(DWORD UNALIGNED *)pcreatestruct->cs.lpszName >> 8));
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 ((PVOID)pmsg->d.cs.lpszName > MM_HIGHEST_USER_ADDRESS)
pmsg->d.cs.lpszName = REBASEPTR(pmsg->pwnd, pmsg->d.cs.lpszName);
if ((PVOID)pmsg->d.cs.lpszClass > MM_HIGHEST_USER_ADDRESS)
pmsg->d.cs.lpszClass = REBASEPTR(pmsg->pwnd, pmsg->d.cs.lpszClass);
if (pmsg->bAnsi) {
retval = DispatchHookA(
pmsg->msg,
pmsg->wParam,
(DWORD)&cbt,
(HOOKPROC)pmsg->xpfnProc);
} else {
retval = DispatchHookW(
pmsg->msg,
pmsg->wParam,
(DWORD)&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
/**************************************************************************\
* fnHkINLPRECT
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _FNHKINLPRECTMSG {
DWORD nCode;
DWORD wParam;
RECT rect;
DWORD xParam;
DWORD xpfnProc;
} FNHKINLPRECTMSG;
#ifdef SENDSIDE
DWORD fnHkINLPRECT(
IN DWORD nCode,
IN DWORD wParam,
IN OUT LPRECT prect,
IN DWORD xParam,
IN DWORD 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;
LONG lParam;
} FNHKINDWORDMSG;
#ifdef SENDSIDE
DWORD fnHkINDWORD(
IN DWORD nCode,
IN DWORD wParam,
IN LONG lParam,
IN DWORD xParam,
IN DWORD 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
*/
OUTSTRUCT(lpFlags, DWORD);
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
DWORD fnHkINLPMSG(
DWORD nCode,
DWORD wParam,
LPMSG pmsg,
DWORD xParam,
DWORD 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;
*lpFlags = ((FNHKINLPMSGDATA *)pcbs->pOutput)->flags;
} except (EXCEPTION_EXECUTE_HANDLER) {
MSGNTERRORCODE(GetExceptionCode());
}
if (((WM_CHAR == pmsg->message) || (WM_SYSCHAR == pmsg->message)) && bAnsi) {
#ifdef FE_SB // fnHkINLPMSG()
/*
* LATER, DBCS should be handled correctly.
*/
#endif // FE_SB
/*
* 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));
#ifdef FE_SB // fnHkINLPMSG()
/*
* LATER, DBCS should be handled correctly.
*/
#endif // FE_SB
retval = CallHookWithSEH((LPGENERICHOOKHEADER)pmsg, &pmsg->d.msg, &pmsg->d.flags, retval);
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* yyy
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _FNHKINLPMOUSEHOOKSTRUCTMSG {
GENERICHOOKHEADER ghh;
DWORD flags;
MOUSEHOOKSTRUCT mousehookstruct;
} FNHKINLPMOUSEHOOKSTRUCTMSG;
#ifdef SENDSIDE
DWORD fnHkINLPMOUSEHOOKSTRUCT(
IN DWORD nCode,
IN DWORD wParam,
IN LPMOUSEHOOKSTRUCT pmousehookstruct,
IN DWORD xParam,
IN DWORD xpfnProc,
IN OUT LPDWORD lpFlags)
{
SETUP(FNHKINLPMOUSEHOOKSTRUCT)
BEGINSEND(FNHKINLPMOUSEHOOKSTRUCT)
MSGDATA()->ghh.nCode = nCode;
MSGDATA()->ghh.wParam = wParam;
MSGDATA()->mousehookstruct = *pmousehookstruct;
MSGDATA()->ghh.xParam = xParam;
MSGDATA()->ghh.xpfnProc = xpfnProc;
MSGDATA()->flags = *lpFlags;
MAKECALL(FNHKINLPMOUSEHOOKSTRUCT);
CHECKRETURN();
/*
* Probe output data
*/
OUTSTRUCT(lpFlags, DWORD);
TRACECALLBACK("SfnHkINLPMOUSEHOOKSTRUCT");
ENDSEND(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(fnHkINLPMOUSEHOOKSTRUCT, FNHKINLPMOUSEHOOKSTRUCTMSG)
{
BEGINRECV(0, &pmsg->flags, sizeof(pmsg->flags));
retval = CallHookWithSEH((LPGENERICHOOKHEADER)pmsg, &pmsg->mousehookstruct, &pmsg->flags, retval);
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* yyy
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _FNHKOPTINLPEVENTMSGMSG {
DWORD nCode;
DWORD wParam;
LPEVENTMSGMSG peventmsgmsg;
DWORD xParam;
DWORD xpfnProc;
EVENTMSG eventmsgmsg;
} FNHKOPTINLPEVENTMSGMSG;
#ifdef SENDSIDE
DWORD fnHkOPTINLPEVENTMSG(
IN DWORD nCode,
IN DWORD wParam,
IN OUT LPEVENTMSGMSG peventmsgmsg,
IN DWORD xParam,
IN DWORD 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
MOUSEHOOKSTRUCT 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;
DWORD wParam;
DEBUGHOOKINFO debughookstruct;
DEBUGLPARAM dbgLParam;
DWORD cbDbgLParam;
DWORD xParam;
DWORD xpfnProc;
} FNHKINLPDEBUGHOOKSTRUCTMSG;
#ifdef SENDSIDE
DWORD fnHkINLPDEBUGHOOKSTRUCT(
IN DWORD nCode,
IN DWORD wParam,
IN LPDEBUGHOOKINFO pdebughookstruct,
IN DWORD xParam,
IN DWORD xpfnProc)
{
SETUP(FNHKINLPDEBUGHOOKSTRUCT)
BEGINSEND(FNHKINLPDEBUGHOOKSTRUCT)
MSGDATA()->nCode = nCode;
MSGDATA()->wParam = wParam;
MSGDATA()->debughookstruct = *pdebughookstruct;
MSGDATA()->xParam = xParam;
MSGDATA()->xpfnProc = xpfnProc;
MSGDATA()->cbDbgLParam = 0;
switch(wParam) {
case WH_MSGFILTER:
case WH_SYSMSGFILTER:
case WH_GETMESSAGE:
MSGDATA()->cbDbgLParam = sizeof(MSG);
break;
case WH_CALLWNDPROC:
MSGDATA()->cbDbgLParam = sizeof(CWPSTRUCT);
break;
case WH_CALLWNDPROCRET:
MSGDATA()->cbDbgLParam = sizeof(CWPRETSTRUCT);
break;
case WH_MOUSE:
MSGDATA()->cbDbgLParam = sizeof(MOUSEHOOKSTRUCT);
break;
case WH_JOURNALRECORD:
case WH_JOURNALPLAYBACK:
MSGDATA()->cbDbgLParam = sizeof(EVENTMSG);
break;
case WH_CBT:
switch (pdebughookstruct->code) {
case HCBT_ACTIVATE:
MSGDATA()->cbDbgLParam = sizeof(CBTACTIVATESTRUCT);
break;
case HCBT_CLICKSKIPPED:
MSGDATA()->cbDbgLParam = sizeof(MOUSEHOOKSTRUCT);
break;
case HCBT_CREATEWND:
MSGDATA()->cbDbgLParam = sizeof(CBT_CREATEWND);
break;
case HCBT_MOVESIZE:
MSGDATA()->cbDbgLParam = sizeof(RECT);
break;
}
break;
case WH_SHELL:
if (pdebughookstruct->code == HSHELL_GETMINRECT) {
MSGDATA()->cbDbgLParam = sizeof(RECT);
}
break;
}
/*
* if LPARAM in the debug hook points to struct then copy it over
*/
if (MSGDATA()->cbDbgLParam) {
RtlCopyMemory(&MSGDATA()->dbgLParam, (BYTE *)pdebughookstruct->lParam,
MSGDATA()->cbDbgLParam);
}
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
/**************************************************************************\
* fnHkINLPCBTACTIVATESTRUCT
*
* 17-Mar-1992 jonpa Created
\**************************************************************************/
typedef struct _FNHKINLPCBTACTIVATESTRUCTMSG {
DWORD nCode;
DWORD wParam;
CBTACTIVATESTRUCT cbtactivatestruct;
DWORD xParam;
DWORD xpfnProc;
} FNHKINLPCBTACTIVATESTRUCTMSG;
#ifdef SENDSIDE
DWORD fnHkINLPCBTACTIVATESTRUCT(
IN DWORD nCode,
IN DWORD wParam,
IN LPCBTACTIVATESTRUCT pcbtactivatestruct,
IN DWORD xParam,
IN DWORD 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 = (DWORD)HtoP((HMENU)retval);
TRACECALLBACK("ClientLoadMenu");
ENDSENDCAPTURE(PMENU,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientLoadMenu, CLIENTLOADMENUMSG)
{
BEGINRECV(0, NULL, 0);
FIXUPPOINTERS();
retval = (DWORD)LoadMenu(
CALLDATA(hmod) ? CALLDATA(hmod) : hmodUser,
(LPTSTR)FIXUPSTRINGID(strName));
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* ClientDeleteObject
*
* 07-Dec-1994 ChrisWil Created
\**************************************************************************/
typedef struct _CLIENTDELETEOBJECTMSG {
HANDLE hobj;
UINT utype;
} CLIENTDELETEOBJECTMSG;
#ifdef SENDSIDE
BOOL ClientDeleteObject(
IN HANDLE hobj,
IN UINT utype)
{
SETUP(CLIENTDELETEOBJECT)
BEGINSEND(CLIENTDELETEOBJECT)
MSGDATA()->hobj = hobj;
MSGDATA()->utype = utype;
MAKECALL(CLIENTDELETEOBJECT);
CHECKRETURN();
TRACECALLBACK("ClientDeleteObject");
ENDSEND(BOOL,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientDeleteObject, CLIENTDELETEOBJECTMSG)
{
BEGINRECV(0, NULL, 0);
switch (CALLDATA(utype)) {
case OBJ_BITMAP:
case OBJ_BRUSH:
case OBJ_FONT:
retval = (int)DeleteObject(CALLDATA(hobj));
break;
default:
retval = 0;
break;
}
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) {
GetAtomNameW(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 = (LONG)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];
BEGINRECV(0, NULL, 0);
FIXUPPOINTERS();
if (hmod = (HMODULE)(DWORD)FIXUPSTRINGIDOPT(strModName)) {
if ((hmod = GetModuleHandle((LPTSTR)(DWORD)hmod)) == NULL) {
MSGERROR();
}
}
/*
* Find the file. This normalizes the filename.
*/
lpszName = (LPTSTR)FIXUPSTRINGID(strName);
if (CALLDATA(fWallpaper)) {
if (!SearchPath(NULL,
lpszName,
TEXT(".bmp"),
(MAX_PATH / sizeof(TCHAR)),
szFullPath,
&filepart)) {
MSGERROR();
}
lpszName = szFullPath;
}
retval = (DWORD)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 = (LONG)HMRevalidateHandle((HANDLE)retval);
}
TRACECALLBACK("ClientCopyImage");
ENDSEND(HANDLE,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientCopyImage, CLIENTCOPYIMAGEMSG)
{
BEGINRECV(0, NULL, 0);
retval = (DWORD)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;
DWORD wParam;
DWORD xParam;
PROC xpfn;
PBYTE pOutput;
DWORD cbOutput;
} CLIENTGETLISTBOXSTRINGMSG;
#ifdef SENDSIDE
DWORD ClientGetListboxString(
IN PWND pwnd,
IN UINT msg,
IN DWORD wParam,
OUT PVOID pdata,
IN DWORD 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();
if ((psms == NULL || ((psms->flags & (SMF_SENDERDIED | SMF_REPLY)) == 0))
&& !(dwSCMSFlags & SCMS_FLAGS_INONLY)) {
if (bNotString) {
/*
* This is a 4-byte "object" for ownerdraw listboxes without
* the LBS_HASSTRINGS style.
*/
OUTSTRUCT((LPDWORD)pstr->Buffer, DWORD);
} 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_ERROR, "GetListBoxString: limit %lX chars to %lX\n",
retval, cchRet);
retval = cchRet;
}
}
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),
CallbackStatus.pOutput,
CALLDATA(xParam),
CALLDATA(xpfn));
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* yyy
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _CLIENTLOADLIBRARYMSG {
CAPTUREBUF CaptureBuf;
UNICODE_STRING strLib;
BOOL bWx86KnownDll;
} CLIENTLOADLIBRARYMSG;
#ifdef SENDSIDE
HANDLE ClientLoadLibrary(
IN PUNICODE_STRING pstrLib,
IN BOOL bWx86KnownDll)
{
SETUP(CLIENTLOADLIBRARY)
BEGINSENDCAPTURE(CLIENTLOADLIBRARY, 1, pstrLib->MaximumLength, TRUE)
MSGDATA()->bWx86KnownDll = bWx86KnownDll;
COPYSTRING(strLib);
MAKECALLCAPTURE(CLIENTLOADLIBRARY);
CHECKRETURN();
TRACECALLBACK("ClientLoadLibrary");
ENDSENDCAPTURE(HANDLE,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientLoadLibrary, CLIENTLOADLIBRARYMSG)
{
#if defined(WX86)
PWX86TIB Wx86Tib;
BOOL bWx86KnownDll;
#endif
BEGINRECV(0, NULL, 0);
FIXUPPOINTERS();
#if defined(WX86)
//
// Indicate to loader, whether we expect an x86 or risc image type.
//
bWx86KnownDll = CALLDATA(bWx86KnownDll);
Wx86Tib = Wx86CurrentTib();
if (Wx86Tib) {
if (bWx86KnownDll) {
//
// If we haven't done so yet, setup user32 so it can
// fetch Risc Thunks, for x86 hook procs.
//
if (!pfnWx86HookCallBack) {
HMODULE hWx86Dll;
hWx86Dll = GetModuleHandleW(L"Wx86.dll");
if (hWx86Dll) {
pfnWx86HookCallBack = (PVOID)GetProcAddress(hWx86Dll,
"Wx86HookCallBack"
);
}
}
if (!pfnWx86HookCallBack) {
retval = 0;
goto CLLFailed;
}
Wx86Tib->UseKnownWx86Dll = TRUE;
}
} else if (bWx86KnownDll) {
retval = 0;
goto CLLFailed;
}
#endif
retval = (DWORD)LoadLibraryEx((LPTSTR)FIXUPSTRING(strLib), NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
#if defined(WX86)
if (Wx86Tib) {
Wx86Tib->UseKnownWx86Dll = FALSE;
}
CLLFailed:
#endif
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);
#if defined(WX86)
//
// if the Hook Module is an X86 image, notify Wx86, so that
// it can clear its hook cache.
//
if (pfnWx86HookCallBack &&
RtlImageNtHeader(pmsg->hmod)->FileHeader.Machine == IMAGE_FILE_MACHINE_I386)
{
pfnWx86HookCallBack(0, NULL);
}
#endif
retval = (DWORD)FreeLibrary(pmsg->hmod);
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* 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
retval = (DWORD)TranslateCharsetInfo((DWORD *)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
PINTDDEINFO xxxClientCopyDDEIn1(
HANDLE hClient,
DWORD flags)
{
PINTDDEINFO pi;
INTDDEINFO IntDdeInfo;
SETUP(CLIENTCOPYDDEIN1)
BEGINSEND(CLIENTCOPYDDEIN1)
MSGDATA()->hClient = hClient;
MSGDATA()->flags = flags;
MAKECALL(CLIENTCOPYDDEIN1);
CHECKRETURN();
if (!retval) {
MSGERROR();
}
retval = 0;
pi = NULL;
try {
OUTSTRUCT(&IntDdeInfo, INTDDEINFO);
pi = (PINTDDEINFO)UserAllocPool(
sizeof(INTDDEINFO) + IntDdeInfo.cbDirect +
IntDdeInfo.cbIndirect, TAG_DDE);
if (pi != NULL) {
*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);
retval = (DWORD)pi;
}
} except (EXCEPTION_EXECUTE_HANDLER) {
if (pi != NULL)
UserFreePool(pi);
MSGNTERRORCODE(GetExceptionCode());
}
TRACECALLBACK("ClientCopyDDEIn1");
ENDSEND(PINTDDEINFO, 0);
}
#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) {
RtlCopyMemory(IntDdeInfo.pDirect,
(PBYTE)pi + sizeof(INTDDEINFO),
pi->cbDirect);
}
if (pi->cbIndirect) {
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 = (DWORD)IntDdeInfo.hDirect;
}
}
*pi = IntDdeInfo;
} except (EXCEPTION_EXECUTE_HANDLER) {
retval = 0;
MSGNTERRORCODE(GetExceptionCode());
}
}
TRACECALLBACK("ClientCopyDDEOut1");
ENDSEND(HANDLE, 0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientCopyDDEOut1, CLIENTCOPYDDEOUT1MSG)
{
BEGINRECV(0, &pmsg->IntDdeInfo, sizeof(INTDDEINFO));
retval = (DWORD)_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;
LONG lParam;
DDEML_MSG_HOOK_DATA dmhd;
} CLIENTGETDDEHOOKDATAMSG;
#ifdef SENDSIDE
DWORD ClientGetDDEHookData(
IN UINT message,
IN LONG 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((UINT)CALLDATA(message), (LONG)CALLDATA(lParam),
(PDDEML_MSG_HOOK_DATA)&pmsg->dmhd);
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
*
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _CLIENTSENDHELPMSG {
HELPINFO HelpInfo;
DWORD xpfnProc;
} CLIENTSENDHELPMSG;
#ifdef SENDSIDE
BOOL ClientSendHelp(
IN HELPINFO *pHelpInfo,
IN DWORD xpfnProc
)
{
SETUP(CLIENTSENDHELP)
BEGINSEND(CLIENTSENDHELP)
MSGDATA()->HelpInfo = *pHelpInfo;
MSGDATA()->xpfnProc = xpfnProc;
MAKECALL(CLIENTSENDHELP);
CHECKRETURN();
TRACECALLBACK("ClientSendHelp");
ENDSEND(BOOL,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientSendHelp, CLIENTSENDHELPMSG)
{
BEGINRECV(0, NULL, 0);
retval = (DWORD)CALLPROC(CALLDATA(xpfnProc))(
PCALLDATA(HelpInfo));
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
*
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _CLIENTFOLDSTRINGMSG {
CAPTUREBUF CaptureBuf;
DWORD dwMapFlags;
UNICODE_STRING strSrc;
} CLIENTFOLDSTRINGMSG;
#ifdef SENDSIDE
int xxxClientFoldString(
IN DWORD dwMapFlags,
IN PUNICODE_STRING pstrSrc,
OUT PUNICODE_STRING pstrDest)
{
SETUP(CLIENTFOLDSTRING)
BEGINSENDCAPTURE(CLIENTFOLDSTRING, 1, pstrSrc->MaximumLength, TRUE)
MSGDATA()->dwMapFlags = dwMapFlags;
COPYSTRING(strSrc);
MAKECALLCAPTURE(CLIENTFOLDSTRING);
CHECKRETURN();
OUTSTRING(pstrDest);
TRACECALLBACK("ClientFoldString");
ENDSENDCAPTURE(BOOL,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientFoldString, CLIENTFOLDSTRINGMSG)
{
UNICODE_STRING strOut;
BEGINRECV(0, &strOut, sizeof(strOut));
FIXUPPOINTERS();
/*
* Use the TEB for the output buffer.
*/
strOut.Length = 0;
strOut.MaximumLength = STATIC_UNICODE_BUFFER_LENGTH * sizeof(WCHAR);
strOut.Buffer = NtCurrentTeb()->StaticUnicodeBuffer;
retval = (DWORD)FoldStringW(CALLDATA(dwMapFlags),
(LPCWSTR)FIXUPSTRING(strSrc),
CALLDATA(strSrc.Length) / sizeof(WCHAR),
strOut.Buffer,
STATIC_UNICODE_BUFFER_LENGTH);
if (retval)
strOut.Length = (SHORT)(retval * sizeof(WCHAR));
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
*
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _CLIENTOEMTOCHARMSG {
DWORD chOem;
} CLIENTOEMTOCHARMSG;
#ifdef SENDSIDE
WCHAR xxxClientOemToChar(
IN char chOem)
{
SETUP(CLIENTOEMTOCHAR)
BEGINSEND(CLIENTOEMTOCHAR)
MSGDATA()->chOem = chOem;
MAKECALL(CLIENTOEMTOCHAR);
CHECKRETURN();
TRACECALLBACK("ClientOemToChar");
ENDSEND(WCHAR, L'_');
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientOemToChar, CLIENTOEMTOCHARMSG)
{
char chOem;
WCHAR wch = L'_';
BEGINRECV(0, NULL, 0);
chOem = (char)CALLDATA(chOem);
OemToCharBuffW(&chOem, &wch, 1);
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
/**************************************************************************\
*
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
NTSTATUS CallSoundDriver(
IN BOOL fInit,
IN LPWSTR lpszName OPTIONAL,
IN DWORD idSnd,
IN DWORD dwFlags,
IN PBOOL pbResult);
typedef struct _CLIENTCALLSOUNDDRIVERMSG {
CAPTUREBUF CaptureBuf;
BOOL fInit;
UNICODE_STRING strName;
DWORD idSnd;
DWORD dwFlags;
} CLIENTCALLSOUNDDRIVERMSG;
#ifdef SENDSIDE
NTSTATUS xxxClientCallSoundDriver(
IN BOOL fInit,
IN PUNICODE_STRING pstrName OPTIONAL,
IN DWORD idSnd OPTIONAL,
IN DWORD dwFlags OPTIONAL,
IN PBOOL pbResult OPTIONAL)
{
DWORD cCapture, cbCapture;
SETUP(CLIENTCALLSOUNDDRIVER)
if (pstrName) {
cCapture = 1;
cbCapture = pstrName->MaximumLength;
} else
cCapture = cbCapture = 0;
BEGINSENDCAPTURE(CLIENTCALLSOUNDDRIVER, cCapture, cbCapture, TRUE)
MSGDATA()->fInit = fInit;
MSGDATA()->idSnd = idSnd;
MSGDATA()->dwFlags = dwFlags;
COPYSTRINGOPT(strName);
MAKECALLCAPTURE(CLIENTCALLSOUNDDRIVER);
CHECKRETURN();
if (pbResult)
OUTSTRUCT(pbResult, BOOL);
TRACECALLBACK("ClientCallSoundDriver");
ENDSENDCAPTURE(BOOL,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientCallSoundDriver, CLIENTCALLSOUNDDRIVERMSG)
{
BOOL bResult;
BEGINRECV(0, &bResult, sizeof(BOOL));
FIXUPPOINTERS();
retval = CallSoundDriver(CALLDATA(fInit),
(LPWSTR)FIXUPSTRING(strName),
CALLDATA(idSnd), CALLDATA(dwFlags), &bResult);
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
*
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _CLIENTLOADDISPLAYRESOURCEMSG {
CAPTUREBUF CaptureBuf;
UNICODE_STRING strDriverName;
} CLIENTLOADDISPLAYRESOURCEMSG;
#ifdef SENDSIDE
BOOL xxxClientLoadDisplayResource(
IN PUNICODE_STRING pstrDriverName,
OUT PDISPLAYRESOURCE pdr)
{
SETUP(CLIENTLOADDISPLAYRESOURCE)
BEGINSENDCAPTURE(CLIENTLOADDISPLAYRESOURCE, 1, pstrDriverName->MaximumLength, TRUE)
COPYSTRING(strDriverName);
MAKECALLCAPTURE(CLIENTLOADDISPLAYRESOURCE);
CHECKRETURN();
if (retval)
OUTSTRUCT(pdr, DISPLAYRESOURCE);
TRACECALLBACK("ClientLoadDisplayResource");
ENDSENDCAPTURE(BOOL,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientLoadDisplayResource, CLIENTLOADDISPLAYRESOURCEMSG)
{
HANDLE hModuleDisplay;
HANDLE hRL;
PDISPLAYRESOURCE pdr;
DISPLAYRESOURCE dr;
BEGINRECV(0, &dr, sizeof(dr));
FIXUPPOINTERS();
hModuleDisplay = LoadLibraryEx((LPWSTR)FIXUPSTRING(strDriverName),
NULL,
LOAD_LIBRARY_AS_DATAFILE);
if (hModuleDisplay) {
hRL = FindResourceW(hModuleDisplay, MAKEINTRESOURCE(1), RT_RCDATA);
pdr = (PDISPLAYRESOURCE)LoadResource(hModuleDisplay, hRL);
dr = *pdr;
FreeLibrary(hModuleDisplay);
retval = TRUE;
} else
retval = FALSE;
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
*
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _CLIENTADDFONTRESOURCEWMSG {
CAPTUREBUF CaptureBuf;
UNICODE_STRING strSrc;
DWORD dwFlags;
} CLIENTADDFONTRESOURCEWMSG;
#ifdef SENDSIDE
int xxxClientAddFontResourceW(
IN PUNICODE_STRING pstrSrc,
IN DWORD dwFlags)
{
SETUP(CLIENTADDFONTRESOURCEW)
BEGINSENDCAPTURE(CLIENTADDFONTRESOURCEW, 1, pstrSrc->MaximumLength, TRUE)
COPYSTRING(strSrc);
MSGDATA()->dwFlags = dwFlags;
MAKECALLCAPTURE(CLIENTADDFONTRESOURCEW);
CHECKRETURN();
TRACECALLBACK("ClientAddFontResourceW");
ENDSENDCAPTURE(int,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientAddFontResourceW, CLIENTADDFONTRESOURCEWMSG)
{
DWORD AddFont(LPWSTR, DWORD);
BEGINRECV(0, NULL, 0);
FIXUPPOINTERS();
retval = GdiAddFontResourceW((LPWSTR)FIXUPSTRING(strSrc),
CALLDATA(dwFlags));
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)
{
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)
{
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)
{
vLoadRemoteT1Fonts();
return NtCallbackReturn(NULL, 0, STATUS_SUCCESS);
}
#endif // RECVSIDE
/**************************************************************************\
*
*
* 22-Jul-1991 mikeke Created
\**************************************************************************/
typedef struct _CLIENTOPENKEYMSG {
CAPTUREBUF CaptureBuf;
ACCESS_MASK amRequest;
UNICODE_STRING strKey;
} CLIENTOPENKEYMSG;
#ifdef SENDSIDE
NTSTATUS ClientOpenKey(
OUT PHANDLE phKey,
IN ACCESS_MASK amRequest,
IN PUNICODE_STRING pstrKey)
{
SETUP(CLIENTOPENKEY)
BEGINSENDCAPTURE(CLIENTOPENKEY, 1, pstrKey->MaximumLength, TRUE)
COPYSTRING(strKey);
MSGDATA()->amRequest = amRequest;
MAKECALLCAPTURE(CLIENTOPENKEY);
CHECKRETURN();
if (NT_SUCCESS(retval))
OUTSTRUCT(phKey, HANDLE);
TRACECALLBACK("ClientOpenKey");
ENDSENDCAPTURE(NTSTATUS, (ULONG)STATUS_UNSUCCESSFUL);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientOpenKey, CLIENTOPENKEYMSG)
{
OBJECT_ATTRIBUTES OA;
HANDLE hKey;
BEGINRECV(0, &hKey, sizeof(hKey));
FIXUPPOINTERS();
InitializeObjectAttributes(&OA, PCALLDATA(strKey), OBJ_CASE_INSENSITIVE,
NULL, NULL);
retval = NtOpenKey(&hKey, CALLDATA(amRequest), &OA);
ENDRECV();
}
#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];
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 ClientThreadSetup(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);
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)
{
return NtCallbackReturn(NULL, 0, STATUS_SUCCESS);
}
#endif // RECVSIDE
#ifdef FE_IME
/**************************************************************************\
* ClientImmCreateDefaultContext
*
* 29-Jan-1996 wkwok Created
\**************************************************************************/
typedef struct _CLIENTIMMCREATEDEFAULTCONTEXTMSG {
HIMC hImc;
} CLIENTIMMCREATEDEFAULTCONTEXTMSG;
#ifdef SENDSIDE
BOOL ClientImmCreateDefaultContext(
IN HIMC hImc)
{
SETUP(CLIENTIMMCREATEDEFAULTCONTEXT)
BEGINSEND(CLIENTIMMCREATEDEFAULTCONTEXT)
MSGDATA()->hImc = hImc;
MAKECALL(CLIENTIMMCREATEDEFAULTCONTEXT);
CHECKRETURN();
TRACECALLBACK("ClientImmCreateDefaultContext");
ENDSEND(BOOL, 0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
RECVCALL(ClientImmCreateDefaultContext, CLIENTIMMCREATEDEFAULTCONTEXTMSG)
{
BEGINRECV(0, NULL, 0);
retval = (DWORD)ImmCreateDefaultContext(CALLDATA(hImc));
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* ClientImmLoadLayout
*
* 29-Jan-1996 wkwok Created
\**************************************************************************/
typedef struct _CLIENTIMMLOADLAYOUTMSG {
CAPTUREBUF CaptureBuf;
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));
FIXUPPOINTERS();
retval = ImmLoadLayout(CALLDATA(hKL), &iiex);
ENDRECV();
}
#endif // RECVSIDE
/**************************************************************************\
* ClientImmProcessKey
*
* 03-Mar-1996 TakaoK Created
\**************************************************************************/
typedef struct _CLIENTIMMPROCESSKEYMSG {
HWND hWnd;
HIMC hIMC;
HKL hkl;
UINT uVKey;
LONG lParam;
DWORD dwHotKeyID;
} CLIENTIMMPROCESSKEYMSG;
#ifdef SENDSIDE
DWORD ClientImmProcessKey(
IN HWND hWnd,
IN HIMC hIMC,
IN HKL hkl,
IN UINT uVKey,
IN LONG lParam,
IN DWORD dwHotKeyID)
{
SETUP(CLIENTIMMPROCESSKEY)
BEGINSEND(CLIENTIMMPROCESSKEY)
MSGDATA()->hWnd = hWnd,
MSGDATA()->hIMC = hIMC;
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 = ImmProcessKey( CALLDATA(hWnd),
CALLDATA(hIMC),
CALLDATA(hkl),
CALLDATA(uVKey),
CALLDATA(lParam),
CALLDATA(dwHotKeyID) );
ENDRECV();
}
#endif // RECVSIDE
#endif // FE_IME
#ifdef FE_SB // fnGETDBCSTEXTLENGTHS
/**************************************************************************\
* 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;
DWORD wParam;
DWORD xParam;
PROC xpfnProc;
} FNGETDBCSTEXTLENGTHSMSG;
#ifdef SENDSIDE
SMESSAGECALL(GETDBCSTEXTLENGTHS)
{
BOOL fAnsiSender = (BOOL)lParam;
BOOL fAnsiReceiver = (dwSCMSFlags & SCMS_FLAGS_ANSI);
SETUPPWND(FNGETDBCSTEXTLENGTHS)
BEGINSEND(FNGETDBCSTEXTLENGTHS)
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.
*/
if ((psms == NULL || ((psms->flags & (SMF_SENDERDIED | SMF_REPLY)) == 0))
&& !(dwSCMSFlags & SCMS_FLAGS_INONLY)) {
if ((fAnsiSender && !fAnsiReceiver) || (!fAnsiSender && fAnsiReceiver)) {
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 DWORD.
//
if (bNotString) {
retval = sizeof(DWORD);
}
}
//
// if the target data is "string", get it, and compute the length
//
if (!bNotString) {
if (PtiCurrent()->TIF_flags & TIF_INGETTEXTLENGTH) {
if (fAnsiSender && !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 = 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();
if ((psms == NULL || ((psms->flags & (SMF_SENDERDIED | SMF_REPLY)) == 0))
&& !(dwSCMSFlags & SCMS_FLAGS_INONLY)) {
if (retval) {
/*
* Non-zero retval means some text to copy out.
*/
CALC_SIZE_STRING_OUT(retval);
}
}
PtiCurrent()->TIF_flags &= ~TIF_INGETTEXTLENGTH;
TRACECALLBACKMSG("SfnOUTSTRING");
ENDSENDCAPTURE(DWORD,0);
}
}
}
}
TRACECALLBACKMSG("SfnGETDBCSTEXTLENGTHS");
ENDSEND1(DWORD,0);
}
#endif // SENDSIDE
#ifdef RECVSIDE
/*
* The fnGETTEXTLENGTHS routine is used for this message (see... client\dispcb.tpl)
*/
#endif // RECVSIDE
#endif // FE_SB