00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
#include "precomp.h"
00016
#pragma hdrstop
00017
00018
00019 DWORD MonitorFlags = 0;
00020
00021 typedef struct tagMONITOR_COUNT {
00022 int iCount;
00023 DWORD flag;
00024 }
MONITOR_COUNT, *
PMONITOR_COUNT;
00025
00026 #define C_MONITOR_COUNT 10
00027
00028 MONITOR_COUNT aMonitorCount[
C_MONITOR_COUNT] = {
00029 { 0, MF_HSZ_INFO },
00030 { 0, MF_SENDMSGS },
00031 { 0, MF_POSTMSGS },
00032 { 0, MF_CALLBACKS },
00033 { 0, MF_ERRORS },
00034 { 0, MF_LINKS },
00035 { 0, MF_CONV },
00036 { 0, CBF_SKIP_REGISTRATIONS },
00037 { 0, CBF_SKIP_UNREGISTRATIONS },
00038 { 0,
MF_INTERNAL },
00039 };
00040
00041 #define MONITORED_FLAGS \
00042
MF_HSZ_INFO | \
00043
MF_SENDMSGS | \
00044
MF_POSTMSGS | \
00045
MF_CALLBACKS | \
00046
MF_ERRORS | \
00047
MF_LINKS | \
00048
MF_CONV | \
00049
CBF_SKIP_REGISTRATIONS | \
00050
CBF_SKIP_UNREGISTRATIONS | \
00051
MF_INTERNAL
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064 VOID xxxChangeMonitorFlags(
00065
PSVR_INSTANCE_INFO psii,
00066 DWORD afCmdNew)
00067 {
00068
int i;
00069
DWORD dwChangedFlags;
00070
DWORD OldMonitorFlags;
00071
00072
CheckCritIn();
00073
00074 dwChangedFlags = psii->
afCmd ^ afCmdNew;
00075
if (!(dwChangedFlags &
MONITORED_FLAGS)) {
00076
return;
00077 }
00078 psii->
afCmd = afCmdNew;
00079
00080 OldMonitorFlags =
MonitorFlags;
00081
MonitorFlags = 0;
00082
for (i = 0; i <
C_MONITOR_COUNT; i++) {
00083
if (dwChangedFlags &
aMonitorCount[i].
flag) {
00084
if (
aMonitorCount[i].
flag & afCmdNew) {
00085
aMonitorCount[i].
iCount++;
00086 }
else {
00087
aMonitorCount[i].
iCount--;
00088 }
00089 }
00090
if (
aMonitorCount[i].
iCount) {
00091
MonitorFlags |=
aMonitorCount[i].
flag;
00092 }
00093 }
00094
if (OldMonitorFlags !=
MonitorFlags) {
00095
EVENT_PACKET ep;
00096
00097 ep.
EventType = 0;
00098 ep.
fSense =
FALSE;
00099 ep.
cbEventData =
sizeof(
DWORD);
00100 ep.
Data =
MonitorFlags;
00101
xxxCsEvent(&ep,
sizeof(
DWORD));
00102 }
00103 }
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120 DWORD xxxCsEvent(
00121
PEVENT_PACKET pep, WORD cbEventData)
00122 {
00123
PSVR_INSTANCE_INFO psiiT;
00124
PEVENT_PACKET pep2;
00125 HWND *ahwndEvent =
NULL;
00126
PWND pwnd;
00127
int cHwndAllocated, i, cTargets;
00128
TL tlpwnd;
00129
TL tlpep2;
00130
TL tlahwndEvent;
00131 ULONG cbEventPacket;
00132
PTHREADINFO pti =
PtiCurrent();
00133
00134
CheckCritIn();
00135
00136
00137
00138
00139 cbEventPacket = cbEventData +
sizeof(
EVENT_PACKET) -
sizeof(
DWORD);
00140 pep2 = (
PEVENT_PACKET)UserAllocPoolWithQuota(cbEventPacket, TAG_DDE5);
00141
if (pep2 ==
NULL) {
00142
return DMLERR_MEMORY_ERROR;
00143 }
00144
try {
00145 RtlCopyMemory((LPSTR)pep2, (LPSTR)
pep, cbEventPacket);
00146 } except (W32ExceptionHandler(
FALSE, RIP_WARNING)) {
00147 UserFreePool(pep2);
00148
return DMLERR_INVALIDPARAMETER;
00149 }
00150
00151 pep2->
cbEventData = cbEventData;
00152 cTargets = 0;
00153 cHwndAllocated = 0;
00154
00155
for (psiiT =
psiiList; psiiT !=
NULL; psiiT = psiiT->
next) {
00156
00157
00158
00159
00160
if (((psiiT->
afCmd & pep2->
EventType) && !pep2->
fSense) ||
00161 (!(psiiT->
afCmd & pep2->
EventType) && pep2->
fSense)) {
00162
continue;
00163 }
00164
00165
if (cTargets >= cHwndAllocated) {
00166
if (ahwndEvent ==
NULL) {
00167 cHwndAllocated = 8;
00168 ahwndEvent = (HWND *)UserAllocPoolWithQuota(
00169
sizeof(HWND) * cHwndAllocated,
00170 TAG_DDE6);
00171 }
else {
00172
DWORD dwSize = cHwndAllocated *
sizeof(HWND);
00173 HWND *ahwndEventT = ahwndEvent;
00174
00175 cHwndAllocated += 8;
00176 ahwndEvent = (HWND *)UserReAllocPoolWithQuota(ahwndEvent, dwSize,
00177
sizeof(HWND) * cHwndAllocated, TAG_DDE7);
00178
if (ahwndEvent ==
NULL) {
00179 UserFreePool(ahwndEventT);
00180 }
00181 }
00182
if (ahwndEvent ==
NULL) {
00183 UserFreePool(pep2);
00184
return DMLERR_MEMORY_ERROR;
00185 }
00186 }
00187 ahwndEvent[cTargets++] =
PtoH(psiiT->
spwndEvent);
00188 }
00189
00190
ThreadLockPool(pti, pep2, &tlpep2);
00191
if (ahwndEvent !=
NULL) {
00192
ThreadLockPool(pti, ahwndEvent, &tlahwndEvent);
00193
for (i = 0; i < cTargets; i++) {
00194
00195
00196
00197 pwnd =
ValidateHwnd(ahwndEvent[i]);
00198
if (pwnd !=
NULL) {
00199
ThreadLockAlwaysWithPti(pti, pwnd, &tlpwnd);
00200
xxxSendMessage(pwnd, WM_DDEMLEVENT, 0, (LPARAM)pep2);
00201
ThreadUnlock(&tlpwnd);
00202 }
00203 }
00204
ThreadUnlockAndFreePool(pti, &tlahwndEvent);
00205 }
00206
ThreadUnlockAndFreePool(pti, &tlpep2);
00207
00208
return DMLERR_NO_ERROR;
00209 }
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224 LRESULT
xxxEventWndProc(
00225
PWND pwnd,
00226 UINT message,
00227 WPARAM wParam,
00228 LPARAM lParam)
00229 {
00230
PSVR_INSTANCE_INFO psii;
00231
00232
CheckCritIn();
00233
CheckLock(pwnd);
00234
00235 psii =
HMValidateHandleNoRip((HANDLE)
_GetWindowLongPtr(pwnd,
GWLP_PSII),
00236
TYPE_DDEACCESS);
00237
if (psii ==
NULL) {
00238
goto CallDWP;
00239 }
00240
00241
switch (message) {
00242
case WM_DDEMLEVENT:
00243
#define pep ((PEVENT_PACKET)lParam)
00244
if (((psii->
afCmd &
pep->EventType) &&
pep->fSense) ||
00245 (!(psii->
afCmd &
pep->EventType) && !
pep->fSense)) {
00246
ClientEventCallback(psii->
pcii,
pep);
00247 }
00248
#undef pep
00249
break;
00250
00251
case WM_DESTROY:
00252
xxxChangeMonitorFlags(psii, 0);
00253
break;
00254
00255
default:
00256 CallDWP:
00257
return xxxDefWindowProc(pwnd, message, wParam, lParam);
00258 }
00259
return 0;
00260 }
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275 VOID xxxMessageEvent(
00276
PWND pwndTo,
00277 UINT message,
00278 WPARAM wParam,
00279 LPARAM lParam,
00280 DWORD flag,
00281 PDDEML_MSG_HOOK_DATA pdmhd)
00282 {
00283
PEVENT_PACKET pep;
00284
PWND pwndFrom;
00285
TL tlpep;
00286
PTHREADINFO pti;
00287
00288
CheckCritIn();
00289
00290
pep = (
PEVENT_PACKET)UserAllocPoolWithQuota(
sizeof(
EVENT_PACKET) -
00291
sizeof(
DWORD) +
sizeof(MONMSGSTRUCT), TAG_DDE8);
00292
if (
pep ==
NULL) {
00293
return;
00294 }
00295
pep->EventType = flag;
00296
pep->fSense =
TRUE;
00297
pep->cbEventData =
sizeof(MONMSGSTRUCT);
00298
#define pmsgs ((MONMSGSTRUCT *)&pep->Data)
00299
pmsgs->cb =
sizeof(MONMSGSTRUCT);
00300
pmsgs->hwndTo =
PtoH(pwndTo);
00301
pmsgs->dwTime =
NtGetTickCount();
00302
00303 pwndFrom =
RevalidateHwnd((HWND)wParam);
00304
if (pwndFrom !=
NULL) {
00305
pmsgs->hTask =
GETPTI(pwndFrom)->pEThread->Cid.UniqueThread;
00306 }
else {
00307
pmsgs->hTask = 0;
00308 }
00309
00310
pmsgs->wMsg = message;
00311
pmsgs->wParam = wParam;
00312
pmsgs->lParam = lParam;
00313
if (pdmhd !=
NULL) {
00314
pmsgs->dmhd = *pdmhd;
00315 }
00316
#undef pmsgs
00317
pti =
PtiCurrent();
00318
ThreadLockPool(pti,
pep, &tlpep);
00319
xxxCsEvent(
pep,
sizeof(MONMSGSTRUCT));
00320
ThreadUnlockAndFreePool(pti, &tlpep);
00321 }