00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
#if DBG
00012
#define DDEMLAlloc(cb) RtlAllocateHeap(gpDDEMLHeap, HEAP_ZERO_MEMORY, (cb))
00013
#define DDEMLReAlloc(p, cb) RtlReAllocateHeap(gpDDEMLHeap, HEAP_ZERO_MEMORY, (p), (cb))
00014
#define DDEMLFree(p) RtlFreeHeap(gpDDEMLHeap, 0, (p))
00015
#else
00016 #define DDEMLAlloc(cb) LocalAlloc(LPTR, cb)
00017 #define DDEMLReAlloc(p, cb) LocalReAlloc(p, cb, LHND)
00018 #define DDEMLFree(p) LocalFree(p);
00019
#endif
00020
00021
00022
00023
00024 typedef ATOM
LATOM;
00025 typedef ATOM
GATOM;
00026
00027
00028
00029 #define MONHSZ(pcii, hsz, type) if ((pcii->MonitorFlags & MF_HSZ_INFO) && hsz) \
00030
MonitorStringHandle(pcii, hsz, type)
00031 #define MONLINK(pcii, fEst, fNoD, aS, aT, aI, wFmt, fSvr, hConvS, hConvC) \
00032
if (pcii->MonitorFlags & MF_LINKS) \
00033
MonitorLink(pcii, fEst, fNoD, aS, aT, aI, \
00034
wFmt, fSvr, hConvS, hConvC)
00035
00036 #define MONCONV(pcoi, fConn) \
00037
if (((pcoi)->pcii->MonitorFlags & MF_CONV) && \
00038
((((pcoi)->state & ST_ISLOCAL) && (pcoi)->state & ST_CLIENT) || \
00039
!((pcoi)->state & ST_ISLOCAL))) \
00040
MonitorConv(pcoi, fConn);
00041
00042
00043
00044 extern RTL_CRITICAL_SECTION
gcsDDEML;
00045
#if DBG
00046
extern PVOID gpDDEMLHeap;
00047
#endif
00048 #define EnterDDECrit RtlEnterCriticalSection(&gcsDDEML);
00049 #define LeaveDDECrit RtlLeaveCriticalSection(&gcsDDEML);
00050
#if DBG
00051
#define CheckDDECritIn if (GetCurrentThreadId() != HandleToUlong(gcsDDEML.OwningThread)) { \
00052
RIPMSG0(RIP_ERROR, "CheckDDECritIn failed"); \
00053
}
00054
#define CheckDDECritOut if (GetCurrentThreadId() == HandleToUlong(gcsDDEML.OwningThread)) { \
00055
RIPMSG0(RIP_ERROR, "CheckDDECritoUT failed"); \
00056
}
00057
#else
00058 #define CheckDDECritIn ;
00059 #define CheckDDECritOut ;
00060
#endif
00061
00062
00063
00064
00065 #define HSZT_INVALID 0
00066 #define HSZT_NORMAL 1
00067 #define HSZT_INST_SPECIFIC 2
00068
00069 #define LATOM_FROM_HSZ(hsz) (LATOM)(ULONG_PTR)(hsz)
00070 #define NORMAL_HSZ_FROM_LATOM(a) (HSZ)(ULONG_PTR)(a)
00071 #define INST_SPECIFIC_HSZ_FROM_LATOM(a) (HSZ)LongToHandle( MAKELONG(a, 1) )
00072
00073
00074
00075 typedef struct tagCHANDLEENTRY {
00076 HANDLE
handle;
00077 ULONG_PTR
dwData;
00078 }
CHANDLEENTRY, *
PCHANDLEENTRY;
00079
00080 typedef BOOL (*PFNHANDLEAPPLY)(HANDLE);
00081
00082 #define MASK_ID 0xFF000000 // 256 uniqueness
00083 #define SHIFT_ID 24
00084 #define MASK_INDEX 0x00FFFC00 // 16K handles per process max
00085 #define SHIFT_INDEX 10
00086 #define MASK_TYPE 0x00000380 // 8 types max
00087 #define SHIFT_TYPE 7
00088 #define MASK_INST 0x0000007F // 128 instances per process max
00089 #define SHIFT_INST 0
00090 #define MAX_INST MASK_INST
00091
00092 #define IdFromHandle(h) (DWORD)(((ULONG_PTR)(h) & MASK_ID) >> SHIFT_ID)
00093 #define IndexFromHandle(h) (DWORD)(((ULONG_PTR)(h) & MASK_INDEX) >> SHIFT_INDEX)
00094 #define TypeFromHandle(h) (DWORD)(((ULONG_PTR)(h) & MASK_TYPE) >> SHIFT_TYPE)
00095 #define InstFromHandle(h) (DWORD)(((ULONG_PTR)(h) & MASK_INST) >> SHIFT_INST)
00096
00097 #define HandleFromId(h) (((DWORD)(h)) << SHIFT_ID)
00098 #define HandleFromIndex(h) (((DWORD)(h)) << SHIFT_INDEX)
00099 #define HandleFromType(h) (((DWORD)(h)) << SHIFT_TYPE)
00100 #define HandleFromInst(h) (((DWORD)(h)) << SHIFT_INST)
00101
00102 #define HTYPE_EMPTY 0
00103 #define HTYPE_INSTANCE 1
00104 #define HTYPE_SERVER_CONVERSATION 2
00105 #define HTYPE_CLIENT_CONVERSATION 3
00106 #define HTYPE_CONVERSATION_LIST 4
00107 #define HTYPE_TRANSACTION 5
00108 #define HTYPE_DATA_HANDLE 6
00109 #define HTYPE_ZOMBIE_CONVERSATION 7
00110
00111 #define HTYPE_ANY (DWORD)(-1)
00112 #define HINST_ANY (DWORD)(-1)
00113
00114
00115
00116 typedef struct tagXACT_INFO *
PXACT_INFO;
00117
00118 typedef BOOL (* FNRESPONSE)(
PXACT_INFO,
UINT, LPARAM);
00119
00120 typedef struct tagXACT_INFO {
00121 struct tagXACT_INFO *
next;
00122 struct tagCONV_INFO *
pcoi;
00123 DWORD_PTR
hUser;
00124 HANDLE
hXact;
00125 FNRESPONSE pfnResponse;
00126 GATOM gaItem;
00127 WORD
wFmt;
00128 WORD
wType;
00129 WORD
wStatus;
00130 WORD
flags;
00131 WORD
state;
00132 HANDLE
hDDESent;
00133 HANDLE
hDDEResult;
00134 }
XACT_INFO;
00135
00136 #define XIF_SYNCHRONOUS 0x1
00137 #define XIF_COMPLETE 0x2
00138 #define XIF_ABANDONED 0x4
00139
00140 #define TID_TIMEOUT 1
00141
00142
00143
00144 typedef struct tagLINK_COUNT *
PLINK_COUNT;
00145 typedef struct tagADVISE_LINK {
00146 struct tagLINK_COUNT *
pLinkCount;
00147 LATOM laItem;
00148 WORD
wFmt;
00149 WORD
wType;
00150 WORD
state;
00151 }
ADVISE_LINK, *
PADVISE_LINK;
00152
00153 #define ADVST_WAITING 0x0080
00154 #define ADVST_CHANGED 0x0040
00155
00156
00157
00158 typedef struct tagDDE_MESSAGE_QUEUE {
00159 struct tagDDE_MESSAGE_QUEUE *
next;
00160 struct tagCONV_INFO *
pcoi;
00161 UINT msg;
00162 LPARAM
lParam;
00163 }
DDE_MESSAGE_QUEUE, *
PDDE_MESSAGE_QUEUE;
00164
00165
00166
00167 typedef struct tagSERVER_LOOKUP {
00168 LATOM laService;
00169 LATOM laTopic;
00170 HWND
hwndServer;
00171 }
SERVER_LOOKUP, *
PSERVER_LOOKUP;
00172
00173 typedef struct tagLINK_COUNT {
00174 struct tagLINK_COUNT *
next;
00175 LATOM laTopic;
00176 GATOM gaItem;
00177 LATOM laItem;
00178 WORD
wFmt;
00179 short Total;
00180 short Count;
00181 }
LINK_COUNT;
00182
00183 typedef struct tagCL_INSTANCE_INFO {
00184 struct tagCL_INSTANCE_INFO *
next;
00185 HANDLE
hInstServer;
00186 HANDLE
hInstClient;
00187 DWORD MonitorFlags;
00188 HWND
hwndMother;
00189 HWND
hwndEvent;
00190 HWND
hwndTimeout;
00191 DWORD afCmd;
00192 PFNCALLBACK
pfnCallback;
00193 DWORD LastError;
00194 DWORD tid;
00195 LATOM *
plaNameService;
00196 WORD
cNameServiceAlloc;
00197 PSERVER_LOOKUP aServerLookup;
00198 short cServerLookupAlloc;
00199 WORD
ConvStartupState;
00200 WORD
flags;
00201 short cInDDEMLCallback;
00202 PLINK_COUNT pLinkCount;
00203 }
CL_INSTANCE_INFO, *
PCL_INSTANCE_INFO;
00204
00205 #define IIF_IN_SYNC_XACT 0x0001
00206 #define IIF_UNICODE 0x8000
00207
00208
00209
00210 typedef struct tagCONV_INFO {
00211 struct tagCONV_INFO *
next;
00212 PCL_INSTANCE_INFO pcii;
00213 DWORD_PTR
hUser;
00214 HCONV
hConv;
00215 LATOM laService;
00216 LATOM laTopic;
00217 HWND
hwndPartner;
00218 HWND
hwndConv;
00219 WORD
state;
00220 LATOM laServiceRequested;
00221 PXACT_INFO pxiIn;
00222 PXACT_INFO pxiOut;
00223 PDDE_MESSAGE_QUEUE dmqIn;
00224 PDDE_MESSAGE_QUEUE dmqOut;
00225 PADVISE_LINK aLinks;
00226 int cLinks;
00227 int cLocks;
00228 }
CONV_INFO, *
PCONV_INFO;
00229
00230 typedef struct tagCL_CONV_INFO {
00231 CONV_INFO ci;
00232 HWND
hwndReconnect;
00233 HCONVLIST
hConvList;
00234 }
CL_CONV_INFO, *
PCL_CONV_INFO;
00235
00236 typedef struct tagSVR_CONV_INFO {
00237 CONV_INFO ci;
00238 }
SVR_CONV_INFO, *
PSVR_CONV_INFO;
00239
00240 typedef struct tagCONVLIST {
00241 int chwnd;
00242 HWND
ahwnd[1];
00243 }
CONVLIST, *
PCONVLIST;
00244
00245 extern CONVCONTEXT
DefConvContext;
00246
00247 typedef struct tagENABLE_ENUM_STRUCT{
00248 BOOL *
pfRet;
00249 WORD
wCmd;
00250 WORD
wCmd2;
00251 }
ENABLE_ENUM_STRUCT, *
PENABLE_ENUM_STRUCT;
00252
00253
00254
00255 typedef struct tagDDEMLDATA {
00256 HANDLE
hDDE;
00257 DWORD flags;
00258 }
DDEMLDATA, *
PDDEMLDATA;
00259
00260
00261
00262 extern PHANDLE
aInstance;
00263 extern DWORD gWM_REGISTERCALLBACK;
00264
00265
00266
00267
00268
00269 HANDLE
CreateHandle(ULONG_PTR dwData, DWORD type, DWORD inst);
00270 ULONG_PTR
DestroyHandle(HANDLE h);
00271 ULONG_PTR
GetHandleData(HANDLE h);
00272
VOID SetHandleData(HANDLE h, ULONG_PTR dwData);
00273 ULONG_PTR
ValidateCHandle(HANDLE h, DWORD ExpectedType, DWORD ExpectedInstance);
00274
PCL_INSTANCE_INFO PciiFromHandle(HANDLE h);
00275 HANDLE
FindIstanceHandleFromHandle(HANDLE h);
00276
VOID ApplyFunctionToObjects(DWORD ExpectedType, DWORD ExpectedInstance,
00277 PFNHANDLEAPPLY pfn);
00278
VOID BestSetLastDDEMLError(DWORD error);
00279
00280
00281
00282
BOOL RW_RegisterDDEML(
void);
00283
00284
00285
00286
UINT InternalDdeInitialize(LPDWORD pidInst, PFNCALLBACK pfnCallback, DWORD afCmd,
00287 BOOL fUnicode);
00288
00289
00290
00291
00292
00293
00294
00295
00296 HANDLE
AddInstance(HANDLE hInst);
00297 HANDLE
DestroyInstance(HANDLE hInst);
00298
PCL_INSTANCE_INFO ValidateInstance(HANDLE hInst);
00299
BOOL CsClearSecurityForAck(HANDLE hInst, HWND hwndServer, HWND hwndClient);
00300
VOID SetLastDDEMLError(PCL_INSTANCE_INFO pcii, DWORD error);
00301
00302
00303
00304 HSZ
InternalDdeCreateStringHandle(DWORD idInst, PVOID psz,
int iCodePage);
00305
00306
00307
DWORD InternalDdeQueryString(DWORD idInst, HSZ hsz, PVOID psz, DWORD cchMax,
00308 INT iCodePage);
00309
00310
00311
00312
00313
00314
00315
DWORD ValidateHSZ(HSZ hsz);
00316
LATOM MakeInstSpecificAtom(LATOM la, HWND hwnd);
00317 HWND
ParseInstSpecificAtom(LATOM la, LATOM *plaNormal);
00318
GATOM LocalToGlobalAtom(LATOM la);
00319
LATOM GlobalToLocalAtom(GATOM ga);
00320
GATOM IncGlobalAtomCount(GATOM la);
00321
LATOM IncLocalAtomCount(LATOM la);
00322
00323
00324
00325
00326
00327
00328
BOOL ValidateConnectParameters(HANDLE hInst, PCL_INSTANCE_INFO *ppcii,
00329 HSZ *phszService, HSZ hszTopic, LATOM *plaNormalSvcName,
00330 PCONVCONTEXT *ppCC, HWND *phwndTarget, HCONVLIST hConvList);
00331
PCL_CONV_INFO ConnectConv(PCL_INSTANCE_INFO pcii, LATOM laService,
00332 LATOM laTopic, HWND hwndTarget, HWND hwndSkip,
00333 PCONVCONTEXT pCC, HCONVLIST hConvList, DWORD clst);
00334
VOID SetCommonStateFlags(HWND hwndUs, HWND hwndThem, PWORD pwFlags);
00335
00336
00337
00338
VOID ShutdownConversation(PCONV_INFO pcoi, BOOL fMakeCallback);
00339
VOID FreeConversationResources(PCONV_INFO pcoi);
00340
BOOL WaitForZombieTerminate(HANDLE hData);
00341
00342
00343
00344
VOID GetConvContext(HWND hwnd, LONG *pl);
00345
VOID SetConvContext(HWND hwnd, LONG *pl);
00346
00347
00348
00349
00350
BOOL
00351
UpdateLinkIfChanged(
00352 PADVISE_LINK paLink,
00353
PXACT_INFO pxi,
00354 PCONV_INFO pcoi,
00355 PADVISE_LINK paLinkLast,
00356 PBOOL pfSwapped,
00357 DWORD cLinksToGo);
00358
00359
00360
VOID LinkTransaction(
PXACT_INFO pxi);
00361
VOID UnlinkTransaction(
PXACT_INFO pxi);
00362
BOOL ValidateTransaction(HCONV hConv, HANDLE hXact, PCONV_INFO *ppcoi,
00363
PXACT_INFO *ppxi);
00364
00365
00366
00367
00368
00369 HDDEDATA
InternalCreateDataHandle(PCL_INSTANCE_INFO pcii, LPBYTE pSrc, DWORD cb,
00370 DWORD cbOff, DWORD flags, WORD wStatus, WORD wFmt);
00371
00372
00373
00374
00375
00376
BOOL ApplyFreeDataHandle(HANDLE hData);
00377
BOOL InternalFreeDataHandle(HDDEDATA hData, BOOL fIgnorefRelease);
00378
VOID FreeDDEData(HANDLE hDDE, BOOL fIgnorefRelease, BOOL fFreeTruelyGlobalObjects);
00379 HANDLE
CopyDDEData(HANDLE hDDE, BOOL fExec);
00380
00381
00382
00383 HDDEDATA
DoCallback(PCL_INSTANCE_INFO pcii, WORD wType, WORD wFmt, HCONV hConv,
00384 HSZ hsz1, HSZ hsz2, HDDEDATA hData, ULONG_PTR dw1, ULONG_PTR dw2);
00385
DWORD _ClientEventCallback(PCL_INSTANCE_INFO pcii,
PEVENT_PACKET pep);
00386
00387
BOOL SetEnableState(PCONV_INFO pcoi, UINT wCmd);
00388
DWORD _ClientGetDDEHookData(UINT message, LPARAM lParam,
00389 PDDEML_MSG_HOOK_DATA pdmhd);
00390
DWORD _ClientGetDDEFlags(HANDLE hClient, DWORD flags);
00391
BOOL EnableEnumProc(HWND hwnd, PENABLE_ENUM_STRUCT pees);
00392
00393
00394
00395 LRESULT
DDEMLMotherWndProc(HWND, UINT, WPARAM, LPARAM);
00396 LRESULT
DDEMLClientWndProc(HWND, UINT, WPARAM, LPARAM);
00397 LRESULT
DDEMLServerWndProc(HWND, UINT, WPARAM, LPARAM);
00398
PCONV_INFO ProcessTerminateMsg(PCONV_INFO pcoi, HWND hwndFrom);
00399
VOID ProcessAsyncDDEMsg(PCONV_INFO pcoi, UINT msg, HWND hwndFrom, LPARAM lParam);
00400
BOOL CheckForQueuedMessages(PCONV_INFO pcoi);
00401
VOID DumpDDEMessage(BOOL fFreeData, UINT msg, LPARAM lParam);
00402
BOOL ProcessSyncDDEMessage(PCONV_INFO pcoi, UINT msg, LPARAM lParam);
00403
00404
00405
00406
BOOL ClStartAdvise(
PXACT_INFO pxi);
00407
BOOL SvSpontAdvise(PSVR_CONV_INFO psi, LPARAM lParam);
00408
BOOL ClRespAdviseAck(
PXACT_INFO pxi, UINT msg, LPARAM lParam);
00409
BOOL SvStartAdviseUpdate(
PXACT_INFO pxi, DWORD cLinksToGo);
00410
BOOL ClSpontAdviseData(PCL_CONV_INFO pci, LPARAM lParam);
00411
BOOL SvRespAdviseDataAck(
PXACT_INFO pxi, UINT msg, LPARAM lParam);
00412
BOOL ClStartUnadvise(
PXACT_INFO pxi);
00413
BOOL SvSpontUnadvise(PSVR_CONV_INFO psi, LPARAM lParam);
00414
BOOL ClRespUnadviseAck(
PXACT_INFO pxi, UINT msg, LPARAM lParam);
00415
BOOL ClStartExecute(
PXACT_INFO pxi);
00416
BOOL ClRespExecuteAck(
PXACT_INFO pxi, UINT msg, LPARAM lParam);
00417
BOOL ClStartPoke(
PXACT_INFO pxi);
00418
BOOL SvSpontPoke(PSVR_CONV_INFO psi, LPARAM lParam);
00419
BOOL ClRespPokeAck(
PXACT_INFO pxi, UINT msg, LPARAM lParam);
00420
BOOL ClStartRequest(
PXACT_INFO pxi);
00421
BOOL SvSpontRequest(PSVR_CONV_INFO psi, LPARAM lParam);
00422
BOOL ClRespRequestData(
PXACT_INFO pxi, UINT msg, LPARAM lParam);
00423
BOOL SpontaneousClientMessage(PCL_CONV_INFO pci, UINT msg, LPARAM lParam);
00424
BOOL SpontaneousServerMessage(PSVR_CONV_INFO psi, UINT msg, LPARAM lParam);
00425 HANDLE
AllocAndSetDDEData(LPBYTE pSrc, DWORD cb, WORD wStatus, WORD wFmt);
00426
DWORD PackAndPostMessage(HWND hwndTo, UINT msgIn, UINT msgOut, HWND hwndFrom,
00427 LPARAM lParam, UINT_PTR uiLo, UINT_PTR uiHi);
00428
BOOL ExtractDDEDataInfo(HANDLE hDDE, LPWORD pwStatus, LPWORD pwFmt);
00429
BOOL TransactionComplete(
PXACT_INFO pxi, HDDEDATA hData);
00430 HANDLE
UnpackAndFreeDDEMLDataHandle(HDDEDATA hData, BOOL fExec);
00431
00432
00433
00434
BOOL AddLink(PCONV_INFO pcoi, GATOM gaItem, WORD wFmt, WORD wType);
00435
VOID DeleteLinkCount(PCL_INSTANCE_INFO pcii,
PLINK_COUNT pLinkCountDelete);
00436
00437
00438
00439
VOID MonitorStringHandle(PCL_INSTANCE_INFO pcii, HSZ hsz, DWORD fsAction);
00440
VOID MonitorLink(PCL_INSTANCE_INFO pcii, BOOL fEstablished, BOOL fNoData,
00441 LATOM laSvc, LATOM laTopic, GATOM gaItem, WORD wFmt, BOOL fServer,
00442 HCONV hConvServer, HCONV hConvClient);
00443
VOID MonitorConv(PCONV_INFO pcoi, BOOL fConnect);
00444
00445
00446
00447
VOID RegisterService(BOOL fRegister, GATOM gaApp, HWND hwndListen);
00448 LRESULT
ProcessRegistrationMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);