windows-nt/Source/XPSP1/NT/base/mvdm/wow16/ddeml/ddemlp.h
2020-09-26 16:20:57 +08:00

729 lines
24 KiB
C

/****************************** Module Header ******************************\
* Module Name: DDEMLP.H
*
* Private header for DDE manager DLL.
*
* Created: 12/16/88 by Sanford Staab
* Modified for Win 3.0: 5/31/90 by Rich Gartland, Aldus
* Cleaned up: 11/14/90 Sanford Staab
*
* Copyright (c) 1988, 1989 Microsoft Corporation
* Copyright (c) 1990 Aldus Corporation
\***************************************************************************/
#define NOGDICAPMASKS
#define NOVIRTUALKEYCODES
#define NOSYSMETRICS
#define NOKEYSTATES
#define OEMRESOURCE
#define NOCOLOR
// #define NOCTLMGR
#define NODRAWTEXT
// #define NOMETAFILE
#define NOMINMAX
#define NOSCROLL
#define NOSOUND
#define NOCOMM
#define NOKANJI
#define NOHELP
#define NOPROFILER
#include <windows.h>
#include <dde.h>
#define DDEMLDB
#include <ddeml.h>
#ifdef DEBUG
extern int bDbgFlags;
#define DBF_STOPONTRACE 0x01
#define DBF_TRACETERM 0x02
#define DBF_LOGALLOCS 0x04
#define DBF_TRACEATOMS 0x08
#define DBF_TRACEAPI 0x10
#define TRACETERM(x) if (bDbgFlags & DBF_TRACETERM) { \
char szT[100]; \
wsprintf##x; \
OutputDebugString(szT); \
if (bDbgFlags & DBF_STOPONTRACE) { \
DebugBreak(); \
} \
}
#define TRACETERMBREAK(x) if (bDbgFlags & DBF_TRACETERM) { \
char szT[100]; \
wsprintf##x; \
OutputDebugString(szT); \
DebugBreak(); \
}
VOID TraceApiIn(LPSTR psz);
#define TRACEAPIIN(x) if (bDbgFlags & DBF_TRACEAPI) { \
char szT[100]; \
wsprintf##x; \
TraceApiIn(szT); \
}
VOID TraceApiOut(LPSTR psz);
#define TRACEAPIOUT(x) if (bDbgFlags & DBF_TRACEAPI) { \
char szT[100]; \
wsprintf##x; \
TraceApiOut(szT); \
}
#else
#define TRACETERM(x)
#define TRACETERMBREAK(x)
#define TRACEAPIIN(x)
#define TRACEAPIOUT(x)
#endif
// PRIVATE CONSTANTS
#define CBF_MASK 0x003ff000L
#define CBF_MONMASK 0x0027f000L
#define ST_TERM_WAITING 0x8000
#define ST_NOTIFYONDEATH 0x4000
#define ST_PERM2DIE 0x2000
#define ST_IM_DEAD 0x1000
#define ST_DISC_ATTEMPTED 0x0800
#define ST_CHECKPARTNER 0x0400
#define DDEFMT_TEXT CF_TEXT
#define TID_TIMEOUT 1
#define TID_SHUTDOWN 2
#define TID_EMPTYPOSTQ 4
#define TIMEOUT_QUEUECHECK 200
//
// values for pai->wTimeoutStatus
//
#define TOS_CLEAR 0x00
#define TOS_TICK 0x01
#define TOS_ABORT 0x02
#define TOS_DONE 0x80
#define GWL_PCI 0 // ties conv windows to data.
#define GWW_PAI 0 // other windows have pai here.
#define GWW_CHECKVAL 4 // for verification of hwnds.
#define GWW_STATE 6 // conv list state
#define MH_INTCREATE 5
#define MH_INTKEEP 6
#define MH_INTDELETE 7
// MACROS
#define MAKEHCONV(hwnd) (IsWindow(hwnd) ? hwnd | ((DWORD)GetWindowWord(hwnd, GWW_CHECKVAL) << 16) : 0)
#define UNUSED
#define max(a,b) (((a) > (b)) ? (a) : (b))
#define min(a,b) (((a) < (b)) ? (a) : (b))
#define PHMEM(hData) ((LPBYTE)&((LPWORD)&(hData))[1])
#define MONHSZ(a, fsAction, hTask) if (cMonitor) MonHsz(a, fsAction, hTask)
#define MONERROR(pai, e) MonError(pai, e)
#define MONLINK(pai, fEst, fNoData, hszSvc, hszTopic, hszItem, wFmt, fServer, hConvS, hConvC) \
if (cMonitor) \
MonLink(pai, fEst, fNoData, hszSvc, hszTopic, \
hszItem, wFmt, fServer, hConvS, hConvC)
#define MONCONN(pai, hszSvcInst, hszTopic, hwndC, hwndS, fConnect) \
if (cMonitor) \
MonConn(pai, hszSvcInst, hszTopic, hwndC, hwndS, fConnect)
#define SETLASTERROR(pai, e) MonError(pai, e)
#define SEMCHECKIN()
#define SEMCHECKOUT()
#define SEMENTER()
#define SEMLEAVE()
#define SEMINIT()
#ifdef DEBUG
VOID _loadds fAssert(BOOL f, LPSTR psz, WORD line, LPSTR szFile, BOOL fWarning);
#define AssertF(f, psz) fAssert(f, psz, __LINE__, __FILE__, FALSE);
#define AssertFW(f, psz) fAssert(f, psz, __LINE__, __FILE__, TRUE);
#define DEBUGBREAK() DebugBreak()
#define GLOBALREALLOC LogGlobalReAlloc
#define GLOBALALLOC LogGlobalAlloc
#define GLOBALFREE LogGlobalFree
#define GLOBALLOCK LogGlobalLock
#define GLOBALUNLOCK LogGlobalUnlock
#include "heapwach.h"
#else
#define AssertF(f, psz)
#define AssertFW(f, psz)
#define DEBUGBREAK()
#define GLOBALREALLOC GlobalReAlloc
#define GLOBALALLOC GlobalAlloc
#define GLOBALFREE GlobalFree
#define GLOBALLOCK GlobalLock
#define GLOBALUNLOCK GlobalUnlock
#endif /* DEBUG */
#define GLOBALPTR(h) (LPVOID)MAKELONG(0,h)
typedef ATOM GATOM;
typedef ATOM LATOM;
// -------------- LISTS --------------
typedef struct _LITEM { // generic list item
struct _LITEM FAR *next;
} LITEM;
typedef LITEM FAR *PLITEM;
typedef struct _LST { // generic list header
PLITEM pItemFirst;
HANDLE hheap;
WORD cbItem;
} LST;
typedef LST FAR *PLST;
#define ILST_LAST 0x0000 // flags for list lookups
#define ILST_FIRST 0x0001
#define ILST_NOLINK 0x0002
typedef struct _HSZLI { // HSZ list item
PLITEM next;
ATOM a;
} HSZLI;
typedef struct _HWNDLI { // HWND list item
PLITEM next;
HWND hwnd;
} HWNDLI;
typedef struct _ACKHWNDLI { // extra ACK list item
PLITEM next;
HWND hwnd; // same as HWNDLI to here
HSZ hszSvc;
HSZ aTopic;
} ACKHWNDLI;
typedef struct _HWNDHSZLI { // HWND-HSZ pair list item
PLITEM next;
ATOM a; // same as HSZLI to here
HWND hwnd;
} HWNDHSZLI;
typedef HWNDHSZLI FAR *PHWNDHSZLI;
typedef struct _ADVLI { // ADVISE loop list item
PLITEM next;
ATOM aItem; // same as HSZLI to here
ATOM aTopic;
WORD wFmt;
WORD fsStatus; // used to remember NODATA and FACKREQ state */
HWND hwnd; // hwnd that has advise loop
} ADVLI;
typedef ADVLI FAR *PADVLI;
// ------------ PILES -------------
typedef struct _PILEB { // generic pile block header
struct _PILEB FAR *next; // same as LITEM structure
WORD cItems;
WORD reserved;
} PILEB;
typedef PILEB FAR *PPILEB;
typedef struct PILE { // generic pile header
PPILEB pBlockFirst;
HANDLE hheap;
WORD cbBlock; // same as LST structure
WORD cSubItemsMax;
WORD cbSubItem;
} PILE;
typedef PILE FAR *PPILE;
typedef BOOL (*NPFNCMP)(LPBYTE, LPBYTE); // item comparison function pointer
#define PTOPPILEITEM(p) ((LPBYTE)p->pBlockFirst + sizeof(PILEB))
#define FPI_DELETE 0x1 // pile search flags
#define FPI_COUNT 0x2
#define API_ADDED 1 // AddPileItem flags
#define API_FOUND 2
#define API_ERROR 0
typedef struct _DIP { /* Data handle tracking pile */
HANDLE hData; /* the handle to the data */
HANDLE hTask; /* task owning the data */
WORD cCount; /* use count = # datapiles using the handle */
WORD fFlags; /* readonly, etc. */
} DIP;
typedef struct _LAP { /* Lost Ack Pile item */
WORD object; /* either a handle or an atom */
WORD type; /* transaction type the ack was meant for */
} LAP;
/*
* These bits are used to keep track of advise loop states.
*/
#define ADVST_WAITING 0x0080 /* fReserved bit - set if still waiting for FACK */
#define ADVST_CHANGED 0x0040 /* fReserved bit - set if data changed while waiting */
// ------------ QUEUES -------------
typedef struct _QUEUEITEM { // generic queue item
struct _QUEUEITEM FAR *next;
struct _QUEUEITEM FAR *prev;
WORD inst;
} QUEUEITEM;
typedef QUEUEITEM FAR *PQUEUEITEM;
typedef struct _QST { // generic queue header
WORD cItems;
WORD instLast;
WORD cbItem;
HANDLE hheap;
PQUEUEITEM pqiHead;
} QST;
typedef QST FAR *PQST;
#define MAKEID(pqd) (LOWORD((DWORD)pqd) + ((DWORD)((pqd)->inst) << 16))
#define PFROMID(pQ, id) ((PQUEUEITEM)MAKELONG(LOWORD(id), HIWORD(pQ)))
#define QID_NEWEST -2L
#define QID_OLDEST 0L
// ------------- STRUCTURES -------------
typedef struct _PMQI { // post message queue
PQUEUEITEM FAR *next;
PQUEUEITEM FAR *prev;
WORD inst; // same as QUEUEITEM to here!
WORD msg;
LONG lParam;
WORD wParam;
HWND hwndTo;
HGLOBAL hAssoc;
WORD msgAssoc;
} PMQI;
typedef PMQI FAR *PPMQI;
typedef struct _MQL { // message queue list
struct _MQL FAR*next;
HANDLE hTaskTo;
PQST pMQ;
} MQL, FAR *LPMQL;
typedef struct _XFERINFO { // DdeClientTransaction parameters reversed!!!
LPDWORD pulResult; // sync->flags, async->ID
DWORD ulTimeout;
WORD wType;
WORD wFmt;
HSZ hszItem;
HCONV hConvClient;
DWORD cbData;
HDDEDATA hDataClient;
} XFERINFO;
typedef XFERINFO FAR *PXFERINFO;
typedef struct _XADATA { // internal transaction specif info
WORD state; // state of this transaction (XST_)
WORD LastError; // last error logged in this transaction
DWORD hUser; // set with DdeSetUserHandle
PXFERINFO pXferInfo; // associated transaction info
DWORD pdata; // data for the client from the server
WORD DDEflags; // DDE flags resulting from transaction
BOOL fAbandoned; // set if this transaction is abandoned.
} XADATA;
typedef XADATA FAR *PXADATA;
typedef struct _CQDATA { // Client transaction queue
PQUEUEITEM FAR *next;
PQUEUEITEM FAR *prev;
WORD inst;
XADATA xad;
XFERINFO XferInfo;
} CQDATA;
typedef CQDATA FAR *PCQDATA;
typedef struct _APPINFO { // App wide information
struct _APPINFO *next; // local heap object
WORD cZombies; // number of hwnd's awaiting terminates
PFNCALLBACK pfnCallback; // callback address
PPILE pAppNamePile; // registered service names list
PPILE pHDataPile; // data handles not freed
PPILE pHszPile; // hsz cleanup tracking pile.
HWND hwndSvrRoot; // root of all server windows.
PLST plstCB; // callback queue
DWORD afCmd; // app filter and command flags
HANDLE hTask; // app task
HANDLE hheapApp; // app heap
HWND hwndDmg; // main app window
HWND hwndFrame; // main app initiate window
HWND hwndMonitor; // monitor window
HWND hwndTimer; // current timer window
WORD LastError; // last error
WORD wFlags; // set to ST_BLOCKED or not.
WORD cInProcess; // recursion guard
WORD instCheck; // to validate idInst param.
PLST pServerAdvList; // active ADVISE loops for servers
LPSTR lpMemReserve; // reserve memory in case of crunch
WORD wTimeoutStatus; // used to alert timeout modal loop
} APPINFO;
typedef APPINFO *PAPPINFO; // local heap object
typedef APPINFO FAR *LPAPPINFO;
typedef PAPPINFO FAR *LPPAPPINFO;
#define LPCREATESTRUCT_GETPAI(lpcs) (*((LPPAPPINFO)(((LPCREATESTRUCT)lpcs)->lpCreateParams)))
// defines for wFlags field
#define AWF_DEFCREATESTATE 0x0001
#define AWF_INSYNCTRANSACTION 0x0002
#define AWF_UNINITCALLED 0x0004
#define AWF_INPOSTDDEMSG 0x0008
#define CB_RESERVE 256 // size of memory reserve block
typedef struct _COMMONINFO { // Common (client & server) Conversation info
PAPPINFO pai; // associated app info
HSZ hszSvcReq; // app name used to make connection
ATOM aServerApp; // app name returned by server
ATOM aTopic; // conversation topic returned by server
HCONV hConvPartner; // conversation partner window
XADATA xad; // synchronous transaction data
WORD fs; // conversation status (ST_ flags)
HWND hwndFrame; // initiate window used to make connection
CONVCONTEXT CC; // conversation context values
PQST pPMQ; // post message queue - if needed.
} COMMONINFO;
typedef COMMONINFO far *PCOMMONINFO;
typedef struct _CBLI { /* callback list item */
PLITEM next;
HCONV hConv; /* perameters for callback */
HSZ hszTopic;
HSZ hszItem;
WORD wFmt;
WORD wType;
HDDEDATA hData;
DWORD dwData1;
DWORD dwData2;
WORD msg; /* message received that created this item */
WORD fsStatus; /* Status from DDE msg */
HWND hwndPartner;
PAPPINFO pai;
HANDLE hMemFree; /* used for holding memory to free after callback */
BOOL fQueueOnly; /* used to properly order replies to non-callback cases. */
} CBLI;
typedef CBLI FAR *PCBLI;
typedef struct _CLIENTINFO { /* Client specific conversation info */
COMMONINFO ci;
HWND hwndInit; // frame window last INITIATE was sent to.
PQST pQ; // assync transaction queue
PLST pClientAdvList; // active ADVISE loops for client
} CLIENTINFO;
typedef CLIENTINFO FAR *PCLIENTINFO;
typedef struct _SERVERINFO { /* Server specific conversation info */
COMMONINFO ci;
} SERVERINFO;
typedef SERVERINFO FAR *PSERVERINFO;
typedef struct _EXTDATAINFO { /* used to tie instance info to hDatas */
PAPPINFO pai;
HDDEDATA hData;
} EXTDATAINFO;
typedef EXTDATAINFO FAR *LPEXTDATAINFO;
#define EXTRACTHCONVPAI(hConv) ((PCLIENTINFO)GetWindowLong((HWND)hConv, GWL_PCI))->ci.pai
#define EXTRACTHCONVLISTPAI(hcl) (PAPPINFO)GetWindowWord((HWND)hcl, GWW_PAI)
#define EXTRACTHDATAPAI(XhData) ((LPEXTDATAINFO)(XhData))->pai
#define FREEEXTHDATA(XhData) FarFreeMem((LPSTR)XhData);
typedef struct _DDE_DATA {
WORD wStatus;
WORD wFmt;
WORD wData;
} DDE_DATA, FAR *LPDDE_DATA;
/******** structure for hook functions *******/
typedef struct _HMSTRUCT {
WORD hlParam;
WORD llParam;
WORD wParam;
WORD wMsg;
WORD hWnd;
} HMSTRUCT, FAR *LPHMSTRUCT;
typedef struct _IE { // InitEnum structure used to pass data to the fun.
HWND hwnd;
PCLIENTINFO pci;
ATOM aTopic;
} IE;
/***** private window messages and constants ******/
#define HDATA_READONLY 0x8000
#define HDATA_NOAPPFREE 0x4000 // set on loaned handles (callback)
#define HDATA_EXEC 0x0100 // this data was from execute
#define UMSR_POSTADVISE (WM_USER + 104)
#define UMSR_CHGPARTNER (WM_USER + 107)
#define UM_REGISTER (WM_USER + 200)
#define UM_UNREGISTER (WM_USER + 201)
#define UM_MONITOR (WM_USER + 202)
#define UM_QUERY (WM_USER + 203)
#define Q_CLIENT 0
#define Q_APPINFO 1
#define UM_CHECKCBQ (WM_USER + 204)
#define UM_DISCONNECT (WM_USER + 206)
#define UM_SETBLOCK (WM_USER + 207)
#define UM_FIXHEAP (WM_USER + 208)
#define UM_TERMINATE (WM_USER + 209)
// GLOBALS
extern HANDLE hInstance;
extern HWND hwndDmgMonitor;
extern HANDLE hheapDmg;
extern PAPPINFO pAppInfoList;
extern PPILE pDataInfoPile;
extern PPILE pLostAckPile;
extern WORD hwInst;
extern DWORD aulmapType[];
extern CONVCONTEXT CCDef;
extern char szNull[];
extern WORD cMonitor;
extern FARPROC prevMsgHook;
extern FARPROC prevCallHook;
extern DWORD ShutdownTimeout;
extern DWORD ShutdownRetryTimeout;
extern LPMQL gMessageQueueList;
extern char SZFRAMECLASS[];
extern char SZDMGCLASS[];
extern char SZCLIENTCLASS[];
extern char SZSERVERCLASS[];
extern char SZMONITORCLASS[];
extern char SZCONVLISTCLASS[];
extern char SZHEAPWATCHCLASS[];
//#ifdef DEBUG
extern WORD cAtoms;
//#endif
// PROGMAN HACK!!!!
extern ATOM aProgmanHack;
// PROC DEFS
/* from dmgutil.asm */
LPBYTE NEAR HugeOffset(LPBYTE pSrc, DWORD cb);
#ifdef DEBUG
VOID StkTrace(WORD cFrames, LPVOID lpBuf);
#endif
extern WORD NEAR SwitchDS(WORD newDS);
/* dmg.c entrypoints are exported by ddeml.h */
/* from ddeml.c */
WORD Register(LPDWORD pidInst, PFNCALLBACK pfnCallback, DWORD afCmd);
BOOL AbandonTransaction(HWND hwnd, PAPPINFO pai, DWORD id, BOOL fMarkOnly);
/* from dmgwndp.c */
VOID ChildMsg(HWND hwndParent, WORD msg, WORD wParam, DWORD lParam, BOOL fPost);
long EXPENTRY DmgWndProc(HWND hwnd, WORD msg, WORD wParam, DWORD lParam);
long EXPENTRY ClientWndProc(HWND hwnd, WORD msg, WORD wParam, DWORD lParam);
BOOL DoClientDDEmsg(PCLIENTINFO pci, HWND hwndClient, WORD msg, HWND hwndServer,
DWORD lParam);
BOOL fExpectedMsg(PXADATA pXad, DWORD lParam, WORD msg);
BOOL AdvanceXaction(HWND hwnd, PCLIENTINFO pci, PXADATA pXad,
DWORD lParam, WORD msg, LPWORD pErr);
VOID CheckCBQ(PAPPINFO pai);
VOID Disconnect(HWND hwnd, WORD afCmd, PCLIENTINFO pci);
VOID Terminate(HWND hwnd, HWND hwndFrom, PCLIENTINFO pci);
long EXPENTRY ServerWndProc(HWND hwnd, WORD msg, WORD wParam, DWORD lParam);
long EXPENTRY subframeWndProc(HWND hwnd, WORD msg, WORD wParam, DWORD lParam);
long EXPENTRY ConvListWndProc(HWND hwnd, WORD msg, WORD wParam, DWORD lParam);
HDDEDATA DoCallback(PAPPINFO pai, HCONV hConv, HSZ hszTopic, HSZ hszItem,
WORD wFmt, WORD wType, HDDEDATA hData, DWORD dwData1, DWORD dwData2);
/* from dmgdde.c */
BOOL timeout(PAPPINFO pai, DWORD ulTimeout, HWND hwndTimeout);
HANDLE AllocDDESel(WORD fsStatus, WORD wFmt, DWORD cbData);
BOOL MakeCallback(PCOMMONINFO pci, HCONV hConv, HSZ hszTopic, HSZ hszItem,
WORD wFmt, WORD wType, HDDEDATA hData, DWORD dwData1, DWORD dwData2,
WORD msg, WORD fsStatus, HWND hwndPartner, HANDLE hMemFree,
BOOL fQueueOnly);
BOOL PostDdeMessage(PCOMMONINFO pci, WORD msg, HWND hwndFrom, LONG lParam,
WORD msgAssoc, HGLOBAL hAssoc);
BOOL EmptyDDEPostQ(VOID);
void CALLBACK EmptyQTimerProc(HWND hwnd, UINT msg, UINT tid, DWORD dwTime);
/* from dmgmon.c */
//#ifdef DEBUG
long EXPENTRY DdePostHookProc(int nCode, WORD wParam, LPMSG lParam);
long EXPENTRY DdeSendHookProc(int nCode, WORD wParam, LPHMSTRUCT lParam);
VOID MonBrdcastCB(PAPPINFO pai, WORD wType, WORD wFmt, HCONV hConv,
HSZ hszTopic, HSZ hszItem, HDDEDATA hData, DWORD dwData1,
DWORD dwData2, DWORD dwRet);
VOID MonHsz(ATOM a, WORD fsAction, HANDLE hTask);
WORD MonError(PAPPINFO pai, WORD error);
VOID MonLink(PAPPINFO pai, BOOL fEstablished, BOOL fNoData, HSZ hszSvc,
HSZ hszTopic, HSZ hszItem, WORD wFmt, BOOL fServer,
HCONV hConvServer, HCONV hConvClient);
VOID MonConn(PAPPINFO pai, ATOM aApp, ATOM aTopic, HWND hwndClient,
HWND hwndServer, BOOL fConnect);
VOID MonitorBroadcast(HDDEDATA hData, WORD filter);
HDDEDATA allocMonBuf(WORD cb, WORD filter);
long EXPENTRY MonitorWndProc(HWND hwnd, WORD msg, WORD wParam, DWORD lParam);
//#endif
/* from dmghsz.c */
BOOL FreeHsz(ATOM a);
BOOL IncHszCount(ATOM a);
WORD QueryHszLength(HSZ hsz);
WORD QueryHszName(HSZ hsz, LPSTR psz, WORD cchMax);
ATOM FindAddHsz(LPSTR psz, BOOL fAdd);
HSZ MakeInstAppName(ATOM a, HWND hwndFrame);
/* from dmgdb.c */
PAPPINFO GetCurrentAppInfo(PAPPINFO);
VOID UnlinkAppInfo(PAPPINFO pai);
PLST CreateLst(HANDLE hheap, WORD cbItem);
VOID DestroyLst(PLST pLst);
VOID DestroyAdvLst(PLST pLst);
VOID CleanupAdvList(HWND hwndClient, PCLIENTINFO pci);
PLITEM FindLstItem(PLST pLst, NPFNCMP npfnCmp, PLITEM piSearch);
BOOL CmpWORD(LPBYTE pb1, LPBYTE pb2);
BOOL CmpHIWORD(LPBYTE pb1, LPBYTE pb2);
BOOL CmpDWORD(LPBYTE pb1, LPBYTE pb2);
PLITEM NewLstItem(PLST pLst, WORD afCmd);
BOOL RemoveLstItem(PLST pLst, PLITEM pi);
PPILE CreatePile(HANDLE hheap, WORD cbItem, WORD cItemsPerBlock);
PPILE DestroyPile(PPILE pPile);
WORD QPileItemCount(PPILE pPile);
LPBYTE FindPileItem(PPILE pPile, NPFNCMP npfnCmp, LPBYTE pbSearch, WORD afCmd);
WORD AddPileItem(PPILE pPile, LPBYTE pb, NPFNCMP npfncmp);
BOOL PopPileSubitem(PPILE pPile, LPBYTE pb);
VOID AddHwndHszList(ATOM a, HWND hwnd, PLST pLst);
VOID DestroyHwndHszList(PLST pLst);
HWND HwndFromHsz(ATOM a, PLST pLst);
BOOL CmpAdv(LPBYTE pb1, LPBYTE pb2);
WORD CountAdvReqLeft(register PADVLI pali);
BOOL AddAdvList(PLST pLst, HWND hwnd, ATOM aTopic, ATOM aItem, WORD fsStatus, WORD usFormat);
BOOL DeleteAdvList(PLST pLst, HWND hwnd, ATOM aTopic, ATOM aItem, WORD wFmt);
PADVLI FindAdvList(PLST pLst, HWND hwnd, ATOM aTopic, ATOM aItem, WORD wFmt);
PADVLI FindNextAdv(PADVLI padvli, HWND hwnd, ATOM aTopic, ATOM aItem);
VOID SemInit(VOID);
VOID SemCheckIn(VOID);
VOID SemCheckOut(VOID);
VOID SemEnter(VOID);
VOID SemLeave(VOID);
BOOL CopyHugeBlock(LPBYTE pSrc, LPBYTE pDst, DWORD cb);
BOOL DmgDestroyWindow(HWND hwnd);
BOOL ValidateHConv(HCONV hConv);
/* from dmgq.c */
PQST CreateQ(WORD cbItem);
BOOL DestroyQ(PQST pQ);
PQUEUEITEM Addqi(PQST pQ);
VOID Deleteqi(PQST pQ, DWORD id);
PQUEUEITEM Findqi(PQST pQ, DWORD id);
PQUEUEITEM FindNextQi(PQST pQ, PQUEUEITEM pqi, BOOL fDelete);
/* from dmgmem.c */
HANDLE DmgCreateHeap(WORD wSize);
HANDLE DmgDestroyHeap(HANDLE hheap);
LPVOID FarAllocMem(HANDLE hheap, WORD wSize);
VOID FarFreeMem(LPVOID lpMem);
VOID RegisterClasses(VOID);
// VOID UnregisterClasses(VOID);
#ifdef DEBUG
HGLOBAL LogGlobalReAlloc(HGLOBAL h, DWORD cb, UINT flags);
HGLOBAL LogGlobalAlloc(UINT flags, DWORD cb);
void FAR * LogGlobalLock(HGLOBAL h);
BOOL LogGlobalUnlock(HGLOBAL h);
HGLOBAL LogGlobalFree(HGLOBAL h);
VOID LogDdeObject(UINT msg, LONG lParam);
VOID DumpGlobalLogs(VOID);
#endif
/* from hData.c */
HDDEDATA PutData(LPBYTE pSrc, DWORD cb, DWORD cbOff, ATOM aItem, WORD wFmt,
WORD afCmd, PAPPINFO pai);
VOID FreeDataHandle(PAPPINFO pai, HDDEDATA hData, BOOL fInternal);
HDDEDATA DllEntry(PCOMMONINFO pcomi, HDDEDATA hData);
VOID XmitPrep(HDDEDATA hData, PAPPINFO pai);
HDDEDATA RecvPrep(PAPPINFO pai, HANDLE hMem, WORD afCmd);
HANDLE CopyDDEShareHandle(HANDLE hMem);
HBITMAP CopyBitmap(PAPPINFO pai, HBITMAP hbm);
HDDEDATA CopyHDDEDATA(PAPPINFO pai, HDDEDATA hData);
VOID FreeDDEData(HANDLE hMem, WORD wFmt);
/* from stdinit.c */
long ClientCreate(HWND hwnd, PAPPINFO pai);
HWND GetDDEClientWindow(PAPPINFO pai, HWND hwndParent, HWND hwndSend, HSZ hszSvc, ATOM aTopic, PCONVCONTEXT pCC);
BOOL FAR PASCAL InitEnum(HWND hwnd, IE FAR *pie);
HWND CreateServerWindow(PAPPINFO pai, ATOM aTopic, PCONVCONTEXT pCC);
VOID ServerFrameInitConv(PAPPINFO pai, HWND hwndFrame, HWND hwndClient, ATOM aApp, ATOM aTopic);
long ServerCreate(HWND hwnd, PAPPINFO pai);
BOOL ClientInitAck(HWND hwnd, PCLIENTINFO pci, HWND hwndServer,
ATOM aApp, ATOM aTopic);
/* from stdptcl.c */
long ClientXferReq(PXFERINFO pXferInfo, HWND hwnd, PCLIENTINFO pci);
WORD SendClientReq(PAPPINFO pai, PXADATA pXad, HWND hwndServer, HWND hwnd);
VOID ServerProcessDDEMsg(PSERVERINFO psi, WORD msg, HWND hwndServer,
HWND hwndClient, WORD lo, WORD hi);
VOID PostServerAdvise(HWND hwnd, PSERVERINFO psi, PADVLI pali, WORD cLoops);
VOID QReply(PCBLI pcbi, HDDEDATA hDataRet);
long ClientXferRespond(HWND hwndClient, PXADATA pXad, LPWORD pErr);
/* from register.c */
LRESULT ProcessRegistrationMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
VOID RegisterService(BOOL fRegister, GATOM gaApp, HWND hwndListen);