Leaked source code of windows server 2003
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.
 
 
 
 
 
 

444 lines
16 KiB

/****************************** 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);