Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

1123 lines
36 KiB

/***************************************************************************
*
* Copyright (C) 1996 Microsoft Corporation. All Rights Reserved.
*
* File: stipriv.h
* Content: Internal include file
*@@BEGIN_MSINTERNAL
* History:
*
* 10/28/96 vlads Starting code for STI
*
*@@END_MSINTERNAL
*
***************************************************************************/
#ifdef __cplusplus
extern "C" {
#endif
#ifndef FINAL
#define EXPIRE_YEAR 2001
#define EXPIRE_MONTH 01
#define EXPIRE_DAY 24
#endif
typedef LPUNKNOWN PUNK;
typedef LPVOID PV, *PPV;
typedef CONST VOID *PCV;
typedef REFIID RIID;
typedef CONST GUID *PCGUID;
#define MAX_REG_CHAR 128
//
// We need to use free-threading model, definitions for which are guarded
// with the following define ( in VC 5.0).
//
#ifndef _WIN32_DCOM
//#define _WIN32_DCOM
#endif
/***************************************************************************
*
* Global variables
*
***************************************************************************/
extern HINSTANCE g_hInst;
extern BOOL g_NoUnicodePlatform;
extern BOOL g_COMInitialized;
extern HANDLE g_hStiFileLog;
/*****************************************************************************
*
* stiobj.c - ISti objectimplementation
*
*****************************************************************************/
STDMETHODIMP CStiObj_New(PUNK punkOuter, RIID riid, PPV ppvOut);
STDMETHODIMP StiCreateHelper(
HINSTANCE hinst,
DWORD dwVer,
PPV ppvObj,
PUNK punkOuter,
RIID riid
);
STDMETHODIMP StiPrivateGetDeviceInfoHelperW(
LPWSTR pwszDeviceName,
LPVOID *ppBuffer
);
/*****************************************************************************
*
*
*****************************************************************************/
#define INTERNAL NTAPI /* Called only within a translation unit */
#define EXTERNAL NTAPI /* Called from other translation units */
#define INLINE static __inline
#define BEGIN_CONST_DATA data_seg(".text", "CODE")
#define END_CONST_DATA data_seg(".data", "DATA")
/*
* Arithmetic on pointers.
*/
#define pvSubPvCb(pv, cb) ((PV)((PBYTE)pv - (cb)))
#define pvAddPvCb(pv, cb) ((PV)((PBYTE)pv + (cb)))
#define cbSubPvPv(p1, p2) ((PBYTE)(p1) - (PBYTE)(p2))
/*
* Convert an object (X) to a count of bytes (cb).
*/
#define cbX(X) sizeof(X)
/*
* Convert an array name (A) to a generic count (c).
*/
#define cA(a) (cbX(a)/cbX(a[0]))
/*
* Convert a count of X's (cx) into a count of bytes.
*/
#define cbCxX(cx, X) ((cx) * cbX(X))
/*
* Convert a count of chars (cch), tchars (ctch), wchars (cwch),
* or dwords (cdw) into a count of bytes.
*/
#define cbCch(cch) cbCxX( cch, CHAR)
#define cbCwch(cwch) cbCxX(cwch, WCHAR)
#define cbCtch(ctch) cbCxX(ctch, TCHAR)
#define cbCdw(cdw) cbCxX( cdw, DWORD)
/*
* Zero an arbitrary buffer. It is a common error to get the second
* and third parameters to memset backwards.
*/
#define ZeroBuf(pv, cb) memset(pv, 0, cb)
/*
* Zero an arbitrary object.
*/
#define ZeroX(x) ZeroBuf(&(x), cbX(x))
/*
* land -- Logical and. Evaluate the first. If the first is zero,
* then return zero. Otherwise, return the second.
*/
#define fLandFF(f1, f2) ((f1) ? (f2) : 0)
/*
* limp - logical implication. True unless the first is nonzero and
* the second is zero.
*/
#define fLimpFF(f1, f2) (!(f1) || (f2))
/*
* leqv - logical equivalence. True if both are zero or both are nonzero.
*/
#define fLeqvFF(f1, f2) (!(f1) == !(f2))
/*
* fInOrder - checks that i1 <= i2 < i3.
*/
#define fInOrder(i1, i2, i3) ((unsigned)((i2)-(i1)) < (unsigned)((i3)-(i1)))
/*
* Words to keep preprocessor happy.
*/
#define comma ,
#define empty
/*
* Atomically exchange one value for another.
*/
#define pvExchangePpvPv(ppv, pv) \
(PV)InterlockedExchangePointer((PPV)(ppv), (PV)(pv))
/*
* Creating HRESULTs from a USHORT or from a LASTERROR.
*/
#define hresUs(us) MAKE_HRESULT(SEVERITY_SUCCESS, 0, (USHORT)(us))
#define hresLe(le) MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, (USHORT)(le))
/***************************************************************************
*
* Debug / RDebug / Retail
*
* If either DEBUG or RDEBUG, set MAXDEBUG.
*
* Retail defines nothing.
*
***************************************************************************/
#if defined(DEBUG) || defined(RDEBUG)
//#define MAXDEBUG
#endif
/***************************************************************************
*
* Validation Code....
*
* "If it crashes in retail, it must crash in debug."
*
* What we don't want is an app that works fine under debug, but crashes
* under retail.
*
* So if we find an invalid parameter in debug that would not have been
* detected by retail, let it pass through after a warning. That way,
* the invalid parameter continues onward through the system and creates
* as much (or more) havoc in debug as it would under retail.
*
* The _fFastValidXxx functions perform cursory validation.
* The _fFullValidXxx functions perform full validation.
*
* In retail, fFastValidXxx maps to _fFastValidXxx.
*
* In debug, fFastValidXxx performs a full validation and throws away
* the error value, then returns the value of _fFastValidXxx.
*
* The hresFullValidXxx functions return HRESULTs instead of BOOLs.
*
* Values for Xxx:
*
* Hwnd - hwnd = window handle
* Pdw - pdw = pointer to a dword
* PdwOut - pdw = pointer to a dword that will be set initially to 0
* Pfn - pfn = function pointer
* riid - riid = pointer to IID
* guid - pguid = pointer to GUID
*
* ReadPx - p -> structure for reading, X = structure name
* WritePx - p -> structure for writing, X = structure name
*
* ReadPxCb - p -> structure for reading, X = structure name
* first field of structure is dwSize which must be
* equal to cbX(X).
*
* WritePxCb - p -> structure for writing, X = structure name
* first field of structure is dwSize which must be
* equal to cbX(X).
*
* ReadPvCb - p -> buffer, cb = size of buffer
* WritePvCb - p -> buffer, cb = size of buffer
*
* Pobj - p -> internal interface
*
* fl - fl = incoming flags, flV = valid flags
*
***************************************************************************/
#ifndef MAXDEBUG
/*
* Wrappers that throw away the szProc and iarg info.
*/
#define hresFullValidHwnd_(hwnd, z, i) \
_hresFullValidHwnd_(hwnd) \
#define hresFullValidPdwOut_(pdw, z, i) \
_hresFullValidPdwOut_(pdw) \
#define hresFullValidReadPxCb_(pv, cb, pszProc, iarg) \
_hresFullValidReadPxCb_(pv, cb) \
#define hresFullValidReadPvCb_(pv, cb, pszProc, iarg) \
_hresFullValidReadPvCb_(pv, cb) \
#define hresFullValidWritePxCb_(pv, cb, pszProc, iarg) \
_hresFullValidWritePxCb_(pv, cb) \
#define hresFullValidWritePvCb_(pv, cb, pszProc, iarg) \
_hresFullValidWritePvCb_(pv, cb) \
#define hresFullValidFl_(fl, flV, pszProc, iarg) \
_hresFullValidFl_(fl, flV) \
#define hresFullValidPfn_(pfn, pszProc, iarg) \
_hresFullValidPfn_(pfn) \
#define hresFullValidPitf_(punk, pszProc, iarg) \
_hresFullValidPitf_(punk) \
#define hresFullValidHwnd0_(hwnd, pszProc, iarg) \
_hresFullValidHwnd0_(hwnd) \
#define hresFullValidPitf0_(punk, pszProc, iarg) \
_hresFullValidPitf0_(punk) \
#endif
/*
* The actual functions.
*/
STDMETHODIMP hresFullValidHwnd_(HWND hwnd, LPCSTR pszProc, int iarg);
STDMETHODIMP hresFullValidPdwOut_(PV pdw, LPCSTR pszProc, int iarg);
STDMETHODIMP hresFullValidReadPxCb_(PCV pv, UINT cb, LPCSTR pszProc, int iarg);
STDMETHODIMP hresFullValidReadPvCb_(PCV pv, UINT cb, LPCSTR pszProc, int iarg);
STDMETHODIMP hresFullValidWritePxCb_(PV pv, UINT cb, LPCSTR pszProc, int iarg);
STDMETHODIMP hresFullValidWritePvCb_(PV pv, UINT cb, LPCSTR pszProc, int iarg);
STDMETHODIMP hresFullValidFl_(DWORD fl, DWORD flV, LPCSTR pszProc, int iarg);
STDMETHODIMP hresFullValidPfn_(FARPROC pfn, LPCSTR pszProc, int iarg);
STDMETHODIMP hresFullValidPitf_(PUNK punk, LPCSTR pszProc, int iarg);
HRESULT INLINE
hresFullValidHwnd0_(HWND hwnd, LPCSTR pszProc, int iarg)
{
HRESULT hres;
if (hwnd) {
hres = hresFullValidHwnd_(hwnd, pszProc, iarg);
} else {
hres = S_OK;
}
return hres;
}
HRESULT INLINE
hresFullValidPitf0_(PUNK punk, LPCSTR pszProc, int iarg)
{
HRESULT hres;
if (punk) {
hres = hresFullValidPitf_(punk, pszProc, iarg);
} else {
hres = S_OK;
}
return hres;
}
/*
* Wrappers for derived types.
*/
#define hresFullValidRiid_(riid, s_szProc, iarg) \
hresFullValidReadPvCb_(riid, cbX(IID), s_szProc, iarg) \
/*
* Wrapers that add the szProc and iarg info.
*/
#define hresFullValidHwnd(hwnd, iarg) \
hresFullValidHwnd_(hwnd, s_szProc, iarg) \
#define hresFullValidPdwOut(pdw, i) \
hresFullValidPdwOut_(pdw, s_szProc, i) \
#define hresFullValidReadPdw_(pdw, z, i) \
hresFullValidReadPvCb_(pdw, cbX(DWORD), z, i) \
#define hresFullValidRiid(riid, iarg) \
hresFullValidRiid_(riid, s_szProc, iarg) \
#define hresFullValidGuid(pguid, iarg) \
hresFullValidReadPvCb_(pguid, cbX(GUID), s_szProc, iarg) \
#define hresFullValidReadPxCb(pv, X, iarg) \
hresFullValidReadPxCb_(pv, cbX(X), s_szProc, iarg) \
#define hresFullValidReadPvCb(pv, cb, iarg) \
hresFullValidReadPvCb_(pv, cb, s_szProc, iarg) \
#define hresFullValidReadPx(pv, X, iarg) \
hresFullValidReadPvCb_(pv, cbX(X), s_szProc, iarg) \
#define hresFullValidWritePxCb(pv, X, iarg) \
hresFullValidWritePxCb_(pv, cbX(X), s_szProc, iarg) \
#define hresFullValidWritePvCb(pv, cb, iarg) \
hresFullValidWritePvCb_(pv, cb, s_szProc, iarg) \
#define hresFullValidWritePx(pv, X, iarg) \
hresFullValidWritePvCb_(pv, cbX(X), s_szProc, iarg) \
#define hresFullValidReadPdw(pdw, iarg) \
hresFullValidReadPdw_(pdw, s_szProc, iarg) \
#define hresFullValidFl(fl, flV, iarg) \
hresFullValidFl_(fl, flV, s_szProc, iarg) \
#define hresFullValidPfn(pfn, iarg) \
hresFullValidPfn_((FARPROC)(pfn), s_szProc, iarg) \
#define hresFullValidPitf(pitf, iarg) \
hresFullValidPitf_((PUNK)(pitf), s_szProc, iarg) \
#define hresFullValidHwnd0(hwnd, iarg) \
hresFullValidHwnd0_(hwnd, s_szProc, iarg) \
#define hresFullValidPitf0(pitf, iarg) \
hresFullValidPitf0_((PUNK)(pitf), s_szProc, iarg) \
/*****************************************************************************
*
* @doc INTERNAL
*
* @func void | ValidationException |
*
* Raises a parameter validation exception in MAXDEBUG.
*
*****************************************************************************/
#define ecValidation (ERROR_SEVERITY_ERROR | hresLe(ERROR_INVALID_PARAMETER))
#ifdef MAXDEBUG
#define ValidationException() RaiseException(ecValidation, 0, 0, 0)
#else
#define ValidationException()
#endif
/*
* TFORM(x) expands to x##A if ANSI or x##W if UNICODE.
* This T-izes a symbol, in the sense of TCHAR or PTSTR.
*
* SFORM(x) expands to x##W if ANSI or x##A if UNICODE.
* This anti-T-izes a symbol.
*/
#ifdef UNICODE
#define _TFORM(x) x##W
#define _SFORM(x) x##A
#else
#define _TFORM(x) x##A
#define _SFORM(x) x##W
#endif
#define TFORM(x) _TFORM(x)
#define SFORM(x) _SFORM(x)
/*
* SToT(dst, cchDst, src) - convert S to T
* TToS(dst, cchDst, src) - convert T to S
*
* Remember, "T" means "ANSI if ANSI, or UNICODE if UNICODE",
* and "S" is the anti-T.
*
* So SToT converts to the preferred character set, and TToS converts
* to the alternate character set.
*
*/
#define AToU(dst, cchDst, src) \
MultiByteToWideChar(CP_ACP, 0, src, -1, dst, cchDst)
#define UToA(dst, cchDst, src) \
WideCharToMultiByte(CP_ACP, 0, src, -1, dst, cchDst, 0, 0)
#ifdef UNICODE
#define SToT AToU
#define TToS UToA
#define AToT AToU
#define TToU(dst, cchDst, src) lstrcpyn(dst, src, cchDst)
#else
#define SToT UToA
#define TToS AToU
#define AToT(dst, cchDst, src) lstrcpyn(dst, src, cchDst)
#define TToU AToU
#endif
/*****************************************************************************
*
* Unicode wrappers for Win95
*
*****************************************************************************/
#ifndef UNICODE
#define LoadStringW _LoadStringW
int EXTERNAL LoadStringW(HINSTANCE hinst, UINT ids, LPWSTR pwsz, int cwch);
#endif
//
// Migration function
//
BOOL
RegisterSTIAppForWIAEvents(
WCHAR *pszName,
WCHAR *pszWide,
BOOL fSetAsDefault
);
HRESULT RunRegisterProcess(
CHAR *szAppName,
CHAR *szCmdLine);
//
// C specific macros, not needed in C++ code
//
#ifndef __cplusplus
/*****************************************************************************
*
* Common Object Managers for the Component Object Model
*
* OLE wrapper macros and structures. For more information, see
* the beginning of common.c
*
*****************************************************************************/
/*****************************************************************************
*
* Pre-vtbl structures
*
* Careful! If you change these structures, you must also adjust
* common.c accordingly.
*
*****************************************************************************/
typedef struct PREVTBL { /* Shared vtbl prefix */
RIID riid; /* Type of this object */
ULONG lib; /* offset from start of object */
} PREVTBL, *PPREVTBL;
typedef struct PREVTBLP { /* Prefix for primary vtbl */
PPV rgvtbl; /* Array of standard vtbls */
UINT cbvtbl; /* Size of vtbl array in bytes */
STDMETHOD(QIHelper)(PV pv, RIID riid, PPV ppvOut); /* QI helper */
STDMETHOD_(void,FinalizeProc)(PV pv);/* Finalization procedure */
PREVTBL prevtbl; /* lib must be zero */
} PREVTBLP, *PPREVTBLP;
/*
* A fuller implementation is in common.c. Out here, we need only
* concern ourselves with getting to the primary interface.
*/
#define _thisPv(pitf) \
pvSubPvCb(pitf, (*(PPREVTBL*)(pitf))[-1].lib)
#define _thisPvNm(pitf, nm) \
pvSubPvCb(pitf, FIELD_OFFSET(ThisClass, nm)) \
#ifndef MAXDEBUG
#define hresPvVtbl_(pv, vtbl, pszProc) \
_hresPvVtbl_(pv, vtbl) \
#endif
HRESULT EXTERNAL
hresPvVtbl_(PV pv, PV vtbl, LPCSTR pszProc);
#define hresPvVtbl(pv, vtbl) \
hresPvVtbl_(pv, vtbl, s_szProc) \
#define hresPvI(pv, I) \
hresPvVtbl(pv, Class_Vtbl(ThisClass, I)) \
#define hresPv(pv) \
hresPvI(pv, ThisInterface) \
#ifdef MAXDEBUG
#define hresPvT(pv) \
hresPvVtbl(pv, vtblExpected) \
#else
#define hresPvT(pv) \
hresPv(pv) \
#endif
/*****************************************************************************
*
* Declaring interfaces
*
* The extra level of indirection on _Primary_Interface et al
* allow the interface name to be a macro which expands to the
* *real* name of the interface.
*
*****************************************************************************/
#define __Class_Vtbl(C, I) &c_##I##_##C##VI.vtbl
#define _Class_Vtbl(C, I) __Class_Vtbl(C, I)
#define Class_Vtbl(C, I) _Class_Vtbl(C, I)
#define Num_Interfaces(C) cA(c_rgpv##C##Vtbl)
#ifdef DEBUG
#define Simple_Interface(C) Primary_Interface(C, IUnknown); \
Default_QueryInterface(C) \
Default_AddRef(C) \
Default_Release(C)
#define Simple_Vtbl(C) Class_Vtbl(C)
#define Simple_Interface_Begin(C) Primary_Interface_Begin(C, IUnknown)
#define Simple_Interface_End(C) Primary_Interface_End(C, IUnknown)
#else
#define Simple_Interface(C) Primary_Interface(C, IUnknown)
#define Simple_Vtbl(C) Class_Vtbl(C)
#define Simple_Interface_Begin(C) \
struct S_##C##Vtbl c_##I##_##C##VI = { { \
c_rgpv##C##Vtbl, \
cbX(c_rgpv##C##Vtbl), \
C##_QIHelper, \
C##_Finalize, \
{ &IID_##IUnknown, 0 }, \
}, { \
Common##_QueryInterface, \
Common##_AddRef, \
Common##_Release, \
#define Simple_Interface_End(C) \
} }; \
#endif
#define _Primary_Interface(C, I) \
extern struct S_##C##Vtbl { \
PREVTBLP prevtbl; \
I##Vtbl vtbl; \
} c_##I##_##C##VI \
#define Primary_Interface(C, I) \
_Primary_Interface(C, I) \
#define _Primary_Interface_Begin(C, I) \
struct S_##C##Vtbl c_##I##_##C##VI = { { \
c_rgpv##C##Vtbl, \
cbX(c_rgpv##C##Vtbl), \
C##_QIHelper, \
C##_Finalize, \
{ &IID_##I, 0, }, \
}, { \
C##_QueryInterface, \
C##_AddRef, \
C##_Release, \
#define Primary_Interface_Begin(C, I) \
_Primary_Interface_Begin(C, I) \
#define Primary_Interface_End(C, I) \
} }; \
#define _Secondary_Interface(C, I) \
extern struct S_##I##_##C##Vtbl { \
PREVTBL prevtbl; \
I##Vtbl vtbl; \
} c_##I##_##C##VI \
#define Secondary_Interface(C, I) \
_Secondary_Interface(C, I) \
/*
* Secret backdoor for the "private" IUnknown in common.c
*/
#define _Secondary_Interface_Begin(C, I, ofs, Pfx) \
struct S_##I##_##C##Vtbl c_##I##_##C##VI = { { \
&IID_##I, \
ofs, \
}, { \
Pfx##QueryInterface, \
Pfx##AddRef, \
Pfx##Release, \
#define Secondary_Interface_Begin(C, I, nm) \
_Secondary_Interface_Begin(C, I, FIELD_OFFSET(C, nm), Common_) \
#define _Secondary_Interface_End(C, I) \
} }; \
#define Secondary_Interface_End(C, I, nm) \
_Secondary_Interface_End(C, I) \
#define Interface_Template_Begin(C) \
PV c_rgpv##C##Vtbl[] = { \
#define Primary_Interface_Template(C, I) \
Class_Vtbl(C, I), \
#define Secondary_Interface_Template(C, I) \
Class_Vtbl(C, I), \
#define Interface_Template_End(C) \
}; \
STDMETHODIMP Common_QueryInterface(PV, RIID, PPV);
STDMETHODIMP_(ULONG) Common_AddRef(PV pv);
STDMETHODIMP_(ULONG) Common_Release(PV pv);
STDMETHODIMP Common_QIHelper(PV, RIID, PPV);
void EXTERNAL Common_Finalize(PV);
#ifndef MAXDEBUG
#define _Common_New_(cb, punkOuter, vtbl, pvpObj, z) \
__Common_New_(cb, punkOuter, vtbl, pvpObj) \
#define _Common_NewRiid_(cb, vtbl, punkOuter, riid, pvpObj, z) \
__Common_NewRiid_(cb, vtbl, punkOuter, riid, pvpObj) \
#endif
STDMETHODIMP
_Common_New_(ULONG cb, PUNK punkOuter, PV vtbl, PPV ppvObj, LPCSTR s_szProc);
STDMETHODIMP
_Common_NewRiid_(ULONG cb, PV vtbl, PUNK punkOuter, RIID riid, PPV pvpObj,
LPCSTR s_szProc);
#define Common_NewCb(cb, C, punkOuter, ppvObj) \
_Common_New_(cb, punkOuter, Class_Vtbl(C, ThisInterface), ppvObj, s_szProc)
#define Common_New(C, punkOuter, ppvObj) \
Common_NewCb(cbX(C), C, punkOuter, ppvObj) \
#define Common_NewCbRiid(cb, C, punkOuter, riid, ppvObj) \
_Common_NewRiid_(cb, Class_Vtbl(C, ThisInterface), punkOuter, riid, ppvObj, s_szProc)
#define Common_NewRiid(C, punkOuter, riid, ppvObj) \
_Common_NewRiid_(cbX(C), Class_Vtbl(C, ThisInterface), punkOuter, riid, ppvObj, s_szProc)
#ifdef DEBUG
PV EXTERNAL Common_IsType(PV pv);
#else
#define Common_IsType
#endif
#define Assert_CommonType Common_IsType
STDMETHODIMP Forward_QueryInterface(PV pv, RIID riid, PPV ppvObj);
STDMETHODIMP_(ULONG) Forward_AddRef(PV pv);
STDMETHODIMP_(ULONG) Forward_Release(PV pv);
void EXTERNAL Invoke_Release(PPV pv);
#define Common_DumpObjects()
/*****************************************************************************
*
* OLE wrappers
*
* These basically do the same as IUnknown_Mumble, except that they
* avoid side-effects in evaluation by being inline functions.
*
*****************************************************************************/
HRESULT INLINE
OLE_QueryInterface(PV pv, RIID riid, PPV ppvObj)
{
PUNK punk = pv;
return punk->lpVtbl->QueryInterface(punk, riid, ppvObj);
}
ULONG INLINE
OLE_AddRef(PV pv)
{
PUNK punk = pv;
return punk->lpVtbl->AddRef(punk);
}
ULONG INLINE
OLE_Release(PV pv)
{
PUNK punk = pv;
return punk->lpVtbl->Release(punk);
}
/*****************************************************************************
*
* Macros that forward to the common handlers after DebugOuting.
* Use these only in DEBUG.
*
* It is assumed that DbgFl has been #define'd to the appropriate DbgFl.
*
*****************************************************************************/
#ifdef DEBUG
#define Default_QueryInterface(Class) \
STDMETHODIMP \
Class##_QueryInterface(PV pv, RIID riid, PPV ppvObj) \
{ \
DebugOutPtszV(DbgFl, TEXT(#Class) TEXT("_QueryInterface()")); \
return Common_QueryInterface(pv, riid, ppvObj); \
} \
#define Default_AddRef(Class) \
STDMETHODIMP_(ULONG) \
Class##_AddRef(PV pv) \
{ \
ULONG ulRc = Common_AddRef(pv); \
DebugOutPtszV(DbgFl, TEXT(#Class) \
TEXT("_AddRef(%08x) -> %d"), pv, ulRc); \
return ulRc; \
} \
#define Default_Release(Class) \
STDMETHODIMP_(ULONG) \
Class##_Release(PV pv) \
{ \
ULONG ulRc = Common_Release(pv); \
DebugOutPtszV(DbgFl, TEXT(#Class) \
TEXT("_Release(%08x) -> %d"), pv, ulRc); \
return ulRc; \
} \
#endif
/*****************************************************************************
*
* Paranoid callbacks
*
* Callback() performs a callback. The callback must accept exactly
* two parameters, both pointers. (All our callbacks are like this.)
* And it must return a BOOL.
*
*****************************************************************************/
typedef BOOL (FAR PASCAL * STICALLBACKPROC)(LPVOID, LPVOID);
#ifdef MAXDEBUG
BOOL EXTERNAL Callback(STICALLBACKPROC, PVOID, PVOID);
#else
#define Callback(pec, pv1, pv2) pec(pv1, pv2)
#endif
/*
* Describes the CLSIDs we provide to OLE.
*/
typedef STDMETHOD(CREATEFUNC)(PUNK punkOuter, RIID riid, PPV ppvOut);
typedef struct CLSIDMAP {
REFCLSID rclsid; /* The clsid */
CREATEFUNC pfnCreate; /* How to create it */
UINT ids; /* String that describes it */
} CLSIDMAP, *PCLSIDMAP;
#define cclsidmap 1 /* CLSID_Sti */
extern CLSIDMAP c_rgclsidmap[cclsidmap];
/*****************************************************************************
*
* sti.c - Basic DLL stuff
*
*****************************************************************************/
void EXTERNAL DllEnterCrit(void);
void EXTERNAL DllLeaveCrit(void);
void EXTERNAL DllAddRef(void);
void EXTERNAL DllRelease(void);
BOOL EXTERNAL DllInitializeCOM(void);
BOOL EXTERNAL DllUnInitializeCOM(void);
extern CHAR szProcessCommandLine[];
#ifdef DEBUG
extern UINT g_thidCrit;
#define InCrit() (g_thidCrit == GetCurrentThreadId())
#endif
/*****************************************************************************
*
* sticf.c - IClassFactory implementation
*
*****************************************************************************/
STDMETHODIMP CSti_Factory_New(CREATEFUNC pfnCreate, RIID riid, PPV ppvObj);
/*****************************************************************************
*
* device.c - IStiDevice implementation
*
*****************************************************************************/
#define STI_MUTEXNAME_PREFIX L"STIDeviceMutex_"
STDMETHODIMP CStiDevice_New(PUNK punkOuter, RIID riid, PPV ppvObj);
STDMETHODIMP OpenDeviceRegistryKey(LPCWSTR pwszDeviceName,LPCWSTR pwszSubKeyName,HKEY *phkeyDeviceParameters);
/*****************************************************************************
*
* passusd.c - Pass through USD
*
*****************************************************************************/
#define StiReadControlInfo STI_RAW_RESERVED+1
#define StiWriteControlInfo STI_RAW_RESERVED+2
#define StiTransact STI_RAW_RESERVED+3
STDMETHODIMP CStiEmptyUSD_New(PUNK punkOuter, RIID riid, PPV ppvObj);
/*****************************************************************************
*
* hel.c - Hardware emulation layer
*
*****************************************************************************/
//
// Device types
//
#define HEL_DEVICE_TYPE_WDM 1
#define HEL_DEVICE_TYPE_PARALLEL 2
#define HEL_DEVICE_TYPE_SERIAL 3
//
// Device open flags
//
#define STI_HEL_OPEN_CONTROL 0x00000001
#define STI_HEL_OPEN_DATA 0x00000002
STDMETHODIMP NewDeviceControl(DWORD dwDeviceType,DWORD dwMode,LPCWSTR pwszPortName,DWORD dwFlags,PSTIDEVICECONTROL *ppDevCtl);
STDMETHODIMP CWDMDeviceControl_New(PUNK punkOuter, RIID riid, PPV ppvObj);
STDMETHODIMP CCommDeviceControl_New(PUNK punkOuter, RIID riid, PPV ppvObj);
/*****************************************************************************
*
* util.c - Misc utilities
*
*****************************************************************************/
#define ctchGuid (1 + 8 + 1 + 4 + 1 + 4 + 1 + 4 + 1 + 12 + 1 + 1)
#ifndef MAXDEBUG
#define hresValidInstanceVer_(hinst, dwVer, z) \
_hresValidInstanceVer_(hinst, dwVer) \
#endif
HRESULT EXTERNAL
hresValidInstanceVer_(HINSTANCE hinst, DWORD dwVersion, LPCSTR s_szProc);
#define hresValidInstanceVer(hinst, dwVer) \
hresValidInstanceVer_(hinst, dwVer, s_szProc) \
HRESULT
EXTERNAL
DupEventHandle(HANDLE h, LPHANDLE phOut);
PV EXTERNAL
pvFindResource(HINSTANCE hinst, DWORD id, LPCTSTR rt);
HRESULT
ParseCommandLine(LPSTR lpszCmdLine,UINT *pargc,LPTSTR *argv);
void WINAPI
StiLogTrace(
DWORD dwType,
DWORD idMessage,
...
);
#endif // __cplusplus
/*****************************************************************************
*
* olesupp.c - Misc utilities
*
*****************************************************************************/
STDMETHODIMP
MyCoCreateInstanceW(
LPWSTR pwszClsid,
LPUNKNOWN punkOuter,
RIID riid,
PPV ppvOut,
HINSTANCE *phinst
);
STDMETHODIMP
MyCoCreateInstanceA(
LPSTR ptszClsid,
LPUNKNOWN punkOuter,
RIID riid,
PPV ppvOut,
HINSTANCE *phinst
);
/*****************************************************************************
*
* osutil.c - Misc utilities , specific for platform
*
*****************************************************************************/
BOOL EXTERNAL OSUtil_IsPlatformUnicode(VOID);
HRESULT WINAPI EXTERNAL OSUtil_GetWideString(LPWSTR *ppszWide,LPCSTR pszAnsi);
HRESULT WINAPI EXTERNAL OSUtil_GetAnsiString(LPSTR * ppszAnsi,LPCWSTR lpszWide);
HRESULT WINAPI
OSUtil_RegOpenKeyExW(HKEY hKey,LPCWSTR lpszKeyStrW,DWORD dwReserved,REGSAM samDesired,PHKEY phkResult);
LONG WINAPI
OSUtil_RegCreateKeyExW(
HKEY hKey, LPWSTR lpszSubKeyW, DWORD dwReserved, LPWSTR lpszClassW, DWORD dwOptions,
REGSAM samDesired, LPSECURITY_ATTRIBUTES lpSecurityAttributes, PHKEY phkResult, LPDWORD lpdwDisposition);
LONG WINAPI
OSUtil_RegQueryValueExW(HKEY hKey,LPCWSTR lpszValueNameW,DWORD *pdwType,BYTE* lpData,DWORD *pcbData,BOOL fUnicodeCaller);
LONG WINAPI
OSUtil_RegSetValueExW(HKEY hKey,LPCWSTR lpszValueNameW,DWORD dwType,BYTE* lpData,DWORD cbData,BOOL fUnicodeCaller);
HRESULT
ReadRegistryStringA(HKEY hkey,LPCWSTR pszValueNameW,LPCWSTR pszDefaultValueW,BOOL fExpand,LPWSTR * ppwszResult);
HRESULT
ReadRegistryStringW(HKEY hkey,LPCWSTR pszValueNameW,LPCWSTR pszDefaultValueW,BOOL fExpand,LPWSTR * ppwszResult);
#ifdef UNICODE
#define ReadRegistryString ReadRegistryStringW
#else
#define ReadRegistryString ReadRegistryStringA
#endif
DWORD
ReadRegistryDwordW( HKEY hkey,LPCWSTR pszValueNameW,DWORD dwDefaultValue );
DWORD
WriteRegistryStringA(
IN HKEY hkey,
IN LPCSTR pszValueName,
IN LPCSTR pszValue,
IN DWORD cbValue,
IN DWORD fdwType);
DWORD
WriteRegistryStringW(IN HKEY hkey,
IN LPCWSTR pszValueNameW,IN LPCWSTR pszValueW,IN DWORD cbValue,IN DWORD fdwType);
LONG WINAPI
OSUtil_RegDeleteValueW(HKEY hKey,LPWSTR lpszValueNameW);
HANDLE WINAPI
OSUtil_CreateFileW(
LPCWSTR lpszFileNameW,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile);
HRESULT
WINAPI
ExtractCommandLineArgumentW(
LPCSTR lpszSwitchName,
LPWSTR pwszSwitchValue
);
HRESULT
WINAPI
ExtractCommandLineArgumentA(
LPCSTR lpszSwitchName,
LPSTR pszSwitchValue
);
/*****************************************************************************
*
* string.c - Misc utilities , specific for platform
* Nb: Prorotypes for Cruntime string functions are in string.h
*
*****************************************************************************/
#pragma intrinsic(memcmp,memset,memcpy)
#define OSUtil_StrLenW wcslen
#define OSUtil_StrCmpW wcscmp
#define OSUtil_lstrcpyW wcscpy
#define OSUtil_lstrcatW wcscat
#define OSUtil_lstrcpynW wcsncpy
// Security.c
DWORD
CreateWellKnownSids(
VOID
);
VOID
FreeWellKnownSids(
VOID
);
DWORD
CreateGlobalSyncObjectSD(
OUT PSECURITY_DESCRIPTOR *NewDescriptor
);
/*****************************************************************************
*
* mem.c - Memory management
*
* Be extremely careful with FreePv, because it doesn't work if
* the pointer is null.
*
*****************************************************************************/
HRESULT INLINE
AllocCbPpv(UINT cb, PPV ppv)
{
HRESULT hres;
*ppv = LocalAlloc(LPTR, cb);
hres = *ppv ? NOERROR : E_OUTOFMEMORY;
return hres;
}
#define FreePv(pv) LocalFree((HLOCAL)(pv))
void INLINE
FreePpv(PPV ppv)
{
PV pv = (PV)InterlockedExchangePointer(ppv,(PV) 0);
if (pv) {
FreePv(pv);
}
}
#if 0
#define NEED_REALLOC
STDMETHODIMP EXTERNAL ReallocCbPpv(UINT cb, PV ppvObj);
STDMETHODIMP EXTERNAL AllocCbPpv(UINT cb, PV ppvObj);
#ifdef NEED_REALLOC
#define FreePpv(ppv) (void)ReallocCbPpv(0, ppv)
#else
void EXTERNAL FreePpv(PV ppv);
#define FreePpv(ppv) FreePpv(ppv)
#endif
#endif
#ifdef __cplusplus
};
#endif