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.
 
 
 
 
 
 

119 lines
4.0 KiB

/*
* _IMEMX.H
*
* Routines and macros to manage per-instance global variables
* for DLLs under both Win16 and Win32. Allows the per-instance globals
* for different functional areas of a DLL to reside in seperate memory blocks
* Functions are provided to install and retrieve the
* correct block of memory for the current instance/functional_area.
*
* There are only two functions:
*
* PvGetInstanceGlobalsEx Call this to get the address of the
* per-instance globals structure.
* ScSetinstanceGlobalsEx Call this to install the
* per-instance globals structure. It
* may fail if the number of instances
* exceeds a certain limit.
*
* The caller is free to choose the name, size, and allocation
* method of the per-instance global variables structure.
*/
#ifndef _IMEMX_H
#define _IMEMX_H
#if defined (WIN32) && !defined (MAC)
/*
* The WIN32 implementation uses a pointer in the DLL's data
* segment. This assumes that the DLL gets a separate instance
* of the default data segment per calling process.
*/
#define DefineInstList(Name) VOID FAR *pinst_##Name = NULL
#define DeclareInstList(Name) extern VOID FAR *pinst_##Name;
#define PvGetInstanceGlobalsEx(Name) pinst_##Name
#define ScSetInstanceGlobalsEx(_pv, Name) (pinst_##Name = _pv, 0)
#elif defined (WIN16)
/* InstList
*
* Since more than one independently developed functional areas can be
* combined into a single DLL, the routines for finding instance data in
* WIN16 will take an LPInstList as a parameter. A seperate InstList
* structure is kept for each functional area.
*
* Each InstList has a fixed array of pointers (lprgLpvInstList) and a
* matching fixed array of keys (lprgInstKeyList) unique to the calling
* process. The key for a given process (StackSegment) and the index of this
* key in lprgInstKeyList can be quickly obtained. A pointer to the instance
* data is at the corresponding index of lprgLpvInstList. Though the
* instance key (StackSegment) can be obtained quickly and is guaranteed (in
* WIN16) to be unique at any given moment, it is not guaranteed to be unique
* throughout the life of the DLL. For this reason a "more" unique key may
* be useful at Instance Contruct/Destruct time. lprgdwPidList is a list of
* keys corresponding to lprgInstKeyList which are guaranteed unique through
* the life of the DLL, but which are more time consuming to obtain.
*/
typedef struct _InstList
{
WORD cInstEntries;
WORD wCachedKey;
LPVOID lpvCachedInst;
DWORD dwInstFlags;
WORD FAR * lprgwInstKey;
LPVOID FAR * lprglpvInst;
DWORD FAR * lprgdwPID;
HTASK FAR * lprghTask; // raid 31090: used to recycle instance slots
} InstList, FAR * LPInstList;
#define INST_ALLOCATED 1
/*
*
*/
#define cInstChunk 50
#define DefineInstList(Name) \
InstList instList_##Name = { 0, 0, NULL, INST_ALLOCATED, NULL, NULL, NULL}
#define DeclareInstList(Name) extern InstList instList_##Name
#define PvGetInstanceGlobalsEx(Name) \
PvGetInstanceGlobalsInt(&instList_##Name)
#define ScSetInstanceGlobalsEx(pv, Name) \
ScSetInstanceGlobalsInt(pv, &instList_##Name)
extern LPVOID PvGetInstanceGlobalsInt(LPInstList lpInstListX);
extern SCODE ScSetInstanceGlobalsInt(LPVOID pv, LPInstList lpInstListX);
#elif defined (MAC)
/*
* The MAC implementation uses a linked list containing unique keys
* to the calling process and pointers to instance data. This linked
* list is n-dimensional because the Mac version often groups several
* dlls into one exe.
*/
#define DeclareInstList(Name)
LPVOID FAR PASCAL PvGetInstanceGlobalsMac(WORD dwDataSet);
SCODE FAR PASCAL ScSetInstanceGlobalsMac(LPVOID pv, WORD dwDataSet);
#else
//$ REVIEW: DOS based pst will not compile without these
// definitions
//
#define DeclareInstList(Name) extern VOID FAR *pinst_##Name;
#define PvGetInstanceGlobalsEx(Name) pinst_##Name
#endif /* WIN32, WIN16, Mac */
#endif /* _IMEMX_H */