/****************************** Module Header ******************************\ * Module Name: ddemlcli.h * * Copyright (c) 1985 - 1999, Microsoft Corporation * * This header file contains stuff used by client side ddeml code. * * History: * 10-28-91 Sanfords Created \***************************************************************************/ #if DBG #define DDEMLAlloc(cb) RtlAllocateHeap(gpDDEMLHeap, HEAP_ZERO_MEMORY, (cb)) #define DDEMLReAlloc(p, cb) RtlReAllocateHeap(gpDDEMLHeap, HEAP_ZERO_MEMORY, (p), (cb)) #define DDEMLFree(p) RtlFreeHeap(gpDDEMLHeap, 0, (p)) #else #define DDEMLAlloc(cb) LocalAlloc(LPTR, cb) #define DDEMLReAlloc(p, cb) LocalReAlloc(p, cb, LHND) #define DDEMLFree(p) LocalFree(p); #endif // general typedefs typedef ATOM LATOM; typedef ATOM GATOM; // monitor stuff ------------------------------------------ #define MONHSZ(pcii, hsz, type) if ((pcii->MonitorFlags & MF_HSZ_INFO) && hsz) \ MonitorStringHandle(pcii, hsz, type) #define MONLINK(pcii, fEst, fNoD, aS, aT, aI, wFmt, fSvr, hConvS, hConvC) \ if (pcii->MonitorFlags & MF_LINKS) \ MonitorLink(pcii, fEst, fNoD, aS, aT, aI, \ wFmt, fSvr, hConvS, hConvC) #define MONCONV(pcoi, fConn) \ if (((pcoi)->pcii->MonitorFlags & MF_CONV) && \ ((((pcoi)->state & ST_ISLOCAL) && (pcoi)->state & ST_CLIENT) || \ !((pcoi)->state & ST_ISLOCAL))) \ MonitorConv(pcoi, fConn); // critical section stuff --------------------------------- extern RTL_CRITICAL_SECTION gcsDDEML; #if DBG extern PVOID gpDDEMLHeap; #endif #define EnterDDECrit RtlEnterCriticalSection(&gcsDDEML); #define LeaveDDECrit RtlLeaveCriticalSection(&gcsDDEML); #if DBG #define CheckDDECritIn if (GetCurrentThreadId() != HandleToUlong(gcsDDEML.OwningThread)) { \ RIPMSG0(RIP_ERROR, "CheckDDECritIn failed"); \ } #define CheckDDECritOut if (GetCurrentThreadId() == HandleToUlong(gcsDDEML.OwningThread)) { \ RIPMSG0(RIP_ERROR, "CheckDDECritoUT failed"); \ } #else #define CheckDDECritIn ; #define CheckDDECritOut ; #endif // String handle stuff ------------------------------------- // return values for ValidateHSZ macro #define HSZT_INVALID 0 #define HSZT_NORMAL 1 #define HSZT_INST_SPECIFIC 2 #define LATOM_FROM_HSZ(hsz) (LATOM)(ULONG_PTR)(hsz) #define NORMAL_HSZ_FROM_LATOM(a) (HSZ)(ULONG_PTR)(a) #define INST_SPECIFIC_HSZ_FROM_LATOM(a) (HSZ)LongToHandle( MAKELONG(a, 1) ) // Handle manager stuff ------------------------------------------ typedef struct tagCHANDLEENTRY { HANDLE handle; ULONG_PTR dwData; } CHANDLEENTRY, *PCHANDLEENTRY; typedef BOOL (*PFNHANDLEAPPLY)(HANDLE); #define MASK_ID 0xFF000000 // 256 uniqueness #define SHIFT_ID 24 #define MASK_INDEX 0x00FFFC00 // 16K handles per process max #define SHIFT_INDEX 10 #define MASK_TYPE 0x00000380 // 8 types max #define SHIFT_TYPE 7 #define MASK_INST 0x0000007F // 128 instances per process max #define SHIFT_INST 0 #define MAX_INST MASK_INST #define IdFromHandle(h) (DWORD)(((ULONG_PTR)(h) & MASK_ID) >> SHIFT_ID) #define IndexFromHandle(h) (DWORD)(((ULONG_PTR)(h) & MASK_INDEX) >> SHIFT_INDEX) #define TypeFromHandle(h) (DWORD)(((ULONG_PTR)(h) & MASK_TYPE) >> SHIFT_TYPE) #define InstFromHandle(h) (DWORD)(((ULONG_PTR)(h) & MASK_INST) >> SHIFT_INST) #define HandleFromId(h) (((DWORD)(h)) << SHIFT_ID) #define HandleFromIndex(h) (((DWORD)(h)) << SHIFT_INDEX) #define HandleFromType(h) (((DWORD)(h)) << SHIFT_TYPE) #define HandleFromInst(h) (((DWORD)(h)) << SHIFT_INST) #define HTYPE_EMPTY 0 #define HTYPE_INSTANCE 1 #define HTYPE_SERVER_CONVERSATION 2 #define HTYPE_CLIENT_CONVERSATION 3 #define HTYPE_CONVERSATION_LIST 4 #define HTYPE_TRANSACTION 5 #define HTYPE_DATA_HANDLE 6 #define HTYPE_ZOMBIE_CONVERSATION 7 #define HTYPE_ANY (DWORD)(-1) #define HINST_ANY (DWORD)(-1) // transaction stuff ------------------------------------------- typedef struct tagXACT_INFO *PXACT_INFO; typedef BOOL (* FNRESPONSE)(PXACT_INFO, UINT, LPARAM); typedef struct tagXACT_INFO { struct tagXACT_INFO *next; struct tagCONV_INFO *pcoi; DWORD_PTR hUser; HANDLE hXact; FNRESPONSE pfnResponse; GATOM gaItem; WORD wFmt; WORD wType; // for DdeQueryConvInfo only WORD wStatus; // see DDE_F flags WORD flags; // see XIF_ flags WORD state; // see XST_ state values (ddeml.h) HANDLE hDDESent; // in case NACK is returned. HANDLE hDDEResult; } XACT_INFO; #define XIF_SYNCHRONOUS 0x1 #define XIF_COMPLETE 0x2 #define XIF_ABANDONED 0x4 #define TID_TIMEOUT 1 // Advise link tracking stuff ----------------------------------- typedef struct tagLINK_COUNT *PLINK_COUNT; typedef struct tagADVISE_LINK { struct tagLINK_COUNT *pLinkCount; LATOM laItem; WORD wFmt; WORD wType; // XTYP_ and XTYPF_ constants WORD state; // ADVST_ constant } ADVISE_LINK, *PADVISE_LINK; #define ADVST_WAITING 0x0080 #define ADVST_CHANGED 0x0040 // DDE message handling stuff ----------------------------------- typedef struct tagDDE_MESSAGE_QUEUE { struct tagDDE_MESSAGE_QUEUE *next; struct tagCONV_INFO *pcoi; UINT msg; LPARAM lParam; } DDE_MESSAGE_QUEUE, *PDDE_MESSAGE_QUEUE; // instance info stuff ------------------------------------------- typedef struct tagSERVER_LOOKUP { LATOM laService; LATOM laTopic; HWND hwndServer; } SERVER_LOOKUP, *PSERVER_LOOKUP; typedef struct tagLINK_COUNT { struct tagLINK_COUNT *next; LATOM laTopic; GATOM gaItem; LATOM laItem; WORD wFmt; short Total; short Count; } LINK_COUNT; typedef struct tagCL_INSTANCE_INFO { struct tagCL_INSTANCE_INFO *next; HANDLE hInstServer; HANDLE hInstClient; DWORD MonitorFlags; HWND hwndMother; HWND hwndEvent; HWND hwndTimeout; DWORD afCmd; PFNCALLBACK pfnCallback; DWORD LastError; DWORD tid; LATOM *plaNameService; WORD cNameServiceAlloc; PSERVER_LOOKUP aServerLookup; short cServerLookupAlloc; WORD ConvStartupState; WORD flags; // IIF_ flags short cInDDEMLCallback; PLINK_COUNT pLinkCount; } CL_INSTANCE_INFO, *PCL_INSTANCE_INFO; #define IIF_IN_SYNC_XACT 0x0001 #define IIF_UNICODE 0x8000 // conversation stuff --------------------------------------------- typedef struct tagCONV_INFO { struct tagCONV_INFO *next; PCL_INSTANCE_INFO pcii; DWORD_PTR hUser; HCONV hConv; LATOM laService; LATOM laTopic; HWND hwndPartner; HWND hwndConv; WORD state; // ST_ flags LATOM laServiceRequested; PXACT_INFO pxiIn; PXACT_INFO pxiOut; PDDE_MESSAGE_QUEUE dmqIn; PDDE_MESSAGE_QUEUE dmqOut; PADVISE_LINK aLinks; int cLinks; int cLocks; } CONV_INFO, *PCONV_INFO; typedef struct tagCL_CONV_INFO { CONV_INFO ci; HWND hwndReconnect; HCONVLIST hConvList; } CL_CONV_INFO, *PCL_CONV_INFO; typedef struct tagSVR_CONV_INFO { CONV_INFO ci; } SVR_CONV_INFO, *PSVR_CONV_INFO; typedef struct tagCONVLIST { int chwnd; // number of client windows in this list HWND ahwnd[1]; // windows in list. } CONVLIST, *PCONVLIST; extern CONVCONTEXT DefConvContext; // global from connect.c typedef struct tagENABLE_ENUM_STRUCT{ BOOL *pfRet; WORD wCmd; WORD wCmd2; } ENABLE_ENUM_STRUCT, *PENABLE_ENUM_STRUCT; // memory management stuff ------------------------------------- typedef struct tagDDEMLDATA { HANDLE hDDE; // Global data handle or data token DWORD flags; // See HDATA_ constants } DDEMLDATA, *PDDEMLDATA; // DDEML client side Globals ----------------------------------- extern PHANDLE aInstance; extern DWORD gWM_REGISTERCALLBACK; // prototypes -------------------------------------------------- // handles.c HANDLE CreateHandle(ULONG_PTR dwData, DWORD type, DWORD inst); ULONG_PTR DestroyHandle(HANDLE h); ULONG_PTR GetHandleData(HANDLE h); VOID SetHandleData(HANDLE h, ULONG_PTR dwData); ULONG_PTR ValidateCHandle(HANDLE h, DWORD ExpectedType, DWORD ExpectedInstance); PCL_INSTANCE_INFO PciiFromHandle(HANDLE h); HANDLE FindIstanceHandleFromHandle(HANDLE h); VOID ApplyFunctionToObjects(DWORD ExpectedType, DWORD ExpectedInstance, PFNHANDLEAPPLY pfn); VOID BestSetLastDDEMLError(DWORD error); // ddemlcli.c UINT InternalDdeInitialize(LPDWORD pidInst, PFNCALLBACK pfnCallback, DWORD afCmd, BOOL fUnicode); // DDEML API DdeInitializeA // DDEML API DdeInitializeW // DDEML API DdeUninitialize // DDEML API DdeNameService // DDEML API DdeGetLastError // instance.c HANDLE AddInstance(HANDLE hInst); HANDLE DestroyInstance(HANDLE hInst); PCL_INSTANCE_INFO ValidateInstance(HANDLE hInst); BOOL CsClearSecurityForAck(HANDLE hInst, HWND hwndServer, HWND hwndClient); VOID SetLastDDEMLError(PCL_INSTANCE_INFO pcii, DWORD error); // hsz.c HSZ InternalDdeCreateStringHandle(DWORD idInst, PVOID psz, int iCodePage); // DDEML API DdeCreateStringHandleA // DDEML API DdeCreateStringHandleW DWORD InternalDdeQueryString(DWORD idInst, HSZ hsz, PVOID psz, DWORD cchMax, INT iCodePage); // DDEML API DdeQueryStringA // DDEML API DdeQueryStringW // DDEML API DdeFreeStringHandle // DDEML API DdeKeepStringHandle // DDEML API DdeCmpStringHandles DWORD ValidateHSZ(HSZ hsz); LATOM MakeInstSpecificAtom(LATOM la, HWND hwnd); HWND ParseInstSpecificAtom(LATOM la, LATOM *plaNormal); GATOM LocalToGlobalAtom(LATOM la); LATOM GlobalToLocalAtom(GATOM ga); GATOM IncGlobalAtomCount(GATOM la); LATOM IncLocalAtomCount(LATOM la); // connect.c // DDEML API DdeConnect // DDEML API DdeConnectList // DDEML API DdeReconnect BOOL ValidateConnectParameters(HANDLE hInst, PCL_INSTANCE_INFO *ppcii, HSZ *phszService, HSZ hszTopic, LATOM *plaNormalSvcName, PCONVCONTEXT *ppCC, HWND *phwndTarget, HCONVLIST hConvList); PCL_CONV_INFO ConnectConv(PCL_INSTANCE_INFO pcii, LATOM laService, LATOM laTopic, HWND hwndTarget, HWND hwndSkip, PCONVCONTEXT pCC, HCONVLIST hConvList, DWORD clst); VOID SetCommonStateFlags(HWND hwndUs, HWND hwndThem, PWORD pwFlags); // DDEML API DdeQueryNextServer // DDEML API DdeDisconnect // DDEML API DdeDisconnectList VOID ShutdownConversation(PCONV_INFO pcoi, BOOL fMakeCallback); VOID FreeConversationResources(PCONV_INFO pcoi); BOOL WaitForZombieTerminate(HANDLE hData); // xact.c VOID GetConvContext(HWND hwnd, LONG *pl); VOID SetConvContext(HWND hwnd, LONG *pl); // DDEML API DdeClientTransaction // DDEML API DdeQueryConvInfo // DDEML API DdeSetUserHandle // DDEML API DdeAbandonTransaction BOOL UpdateLinkIfChanged( PADVISE_LINK paLink, PXACT_INFO pxi, PCONV_INFO pcoi, PADVISE_LINK paLinkLast, PBOOL pfSwapped, DWORD cLinksToGo); // DDEML API DdePostAdvise VOID LinkTransaction(PXACT_INFO pxi); VOID UnlinkTransaction(PXACT_INFO pxi); BOOL ValidateTransaction(HCONV hConv, HANDLE hXact, PCONV_INFO *ppcoi, PXACT_INFO *ppxi); // hdata.c // DDEML API DdeCreateDataHandle HDDEDATA InternalCreateDataHandle(PCL_INSTANCE_INFO pcii, LPBYTE pSrc, DWORD cb, DWORD cbOff, DWORD flags, WORD wStatus, WORD wFmt); // DDEML API DdeAddData // DDEML API DdeGetData // DDEML API DdeAccessData // DDEML API DdeUnaccessData // DDEML API DdeFreeDataHandle BOOL ApplyFreeDataHandle(HANDLE hData); BOOL InternalFreeDataHandle(HDDEDATA hData, BOOL fIgnorefRelease); VOID FreeDDEData(HANDLE hDDE, BOOL fIgnorefRelease, BOOL fFreeTruelyGlobalObjects); HANDLE CopyDDEData(HANDLE hDDE, BOOL fExec); // callback.c HDDEDATA DoCallback(PCL_INSTANCE_INFO pcii, WORD wType, WORD wFmt, HCONV hConv, HSZ hsz1, HSZ hsz2, HDDEDATA hData, ULONG_PTR dw1, ULONG_PTR dw2); DWORD _ClientEventCallback(PCL_INSTANCE_INFO pcii, PEVENT_PACKET pep); // DDEML API DdeEnableCallback BOOL SetEnableState(PCONV_INFO pcoi, UINT wCmd); DWORD _ClientGetDDEHookData(UINT message, LPARAM lParam, PDDEML_MSG_HOOK_DATA pdmhd); DWORD _ClientGetDDEFlags(HANDLE hClient, DWORD flags); BOOL EnableEnumProc(HWND hwnd, PENABLE_ENUM_STRUCT pees); // ddemlwp.c LRESULT DDEMLMotherWndProc(HWND, UINT, WPARAM, LPARAM); LRESULT DDEMLClientWndProc(HWND, UINT, WPARAM, LPARAM); LRESULT DDEMLServerWndProc(HWND, UINT, WPARAM, LPARAM); PCONV_INFO ProcessTerminateMsg(PCONV_INFO pcoi, HWND hwndFrom); VOID ProcessAsyncDDEMsg(PCONV_INFO pcoi, UINT msg, HWND hwndFrom, LPARAM lParam); BOOL CheckForQueuedMessages(PCONV_INFO pcoi); VOID DumpDDEMessage(BOOL fFreeData, UINT msg, LPARAM lParam); BOOL ProcessSyncDDEMessage(PCONV_INFO pcoi, UINT msg, LPARAM lParam); // stdptcl.c BOOL ClStartAdvise(PXACT_INFO pxi); BOOL SvSpontAdvise(PSVR_CONV_INFO psi, LPARAM lParam); BOOL ClRespAdviseAck(PXACT_INFO pxi, UINT msg, LPARAM lParam); BOOL SvStartAdviseUpdate(PXACT_INFO pxi, DWORD cLinksToGo); BOOL ClSpontAdviseData(PCL_CONV_INFO pci, LPARAM lParam); BOOL SvRespAdviseDataAck(PXACT_INFO pxi, UINT msg, LPARAM lParam); BOOL ClStartUnadvise(PXACT_INFO pxi); BOOL SvSpontUnadvise(PSVR_CONV_INFO psi, LPARAM lParam); BOOL ClRespUnadviseAck(PXACT_INFO pxi, UINT msg, LPARAM lParam); BOOL ClStartExecute(PXACT_INFO pxi); BOOL ClRespExecuteAck(PXACT_INFO pxi, UINT msg, LPARAM lParam); BOOL ClStartPoke(PXACT_INFO pxi); BOOL SvSpontPoke(PSVR_CONV_INFO psi, LPARAM lParam); BOOL ClRespPokeAck(PXACT_INFO pxi, UINT msg, LPARAM lParam); BOOL ClStartRequest(PXACT_INFO pxi); BOOL SvSpontRequest(PSVR_CONV_INFO psi, LPARAM lParam); BOOL ClRespRequestData(PXACT_INFO pxi, UINT msg, LPARAM lParam); BOOL SpontaneousClientMessage(PCL_CONV_INFO pci, UINT msg, LPARAM lParam); BOOL SpontaneousServerMessage(PSVR_CONV_INFO psi, UINT msg, LPARAM lParam); HANDLE AllocAndSetDDEData(LPBYTE pSrc, DWORD cb, WORD wStatus, WORD wFmt); DWORD PackAndPostMessage(HWND hwndTo, UINT msgIn, UINT msgOut, HWND hwndFrom, LPARAM lParam, UINT_PTR uiLo, UINT_PTR uiHi); BOOL ExtractDDEDataInfo(HANDLE hDDE, LPWORD pwStatus, LPWORD pwFmt); BOOL TransactionComplete(PXACT_INFO pxi, HDDEDATA hData); HANDLE UnpackAndFreeDDEMLDataHandle(HDDEDATA hData, BOOL fExec); // util.c BOOL AddLink(PCONV_INFO pcoi, GATOM gaItem, WORD wFmt, WORD wType); VOID DeleteLinkCount(PCL_INSTANCE_INFO pcii, PLINK_COUNT pLinkCountDelete); // monitor.c VOID MonitorStringHandle(PCL_INSTANCE_INFO pcii, HSZ hsz, DWORD fsAction); VOID MonitorLink(PCL_INSTANCE_INFO pcii, BOOL fEstablished, BOOL fNoData, LATOM laSvc, LATOM laTopic, GATOM gaItem, WORD wFmt, BOOL fServer, HCONV hConvServer, HCONV hConvClient); VOID MonitorConv(PCONV_INFO pcoi, BOOL fConnect); // register.c VOID RegisterService(BOOL fRegister, GATOM gaApp, HWND hwndListen); LRESULT ProcessRegistrationMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);