mirror of https://github.com/tongzx/nt5src
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.
124 lines
3.1 KiB
124 lines
3.1 KiB
#ifndef __MS_UTIL_H__
|
|
#define __MS_UTIL_H__
|
|
|
|
extern "C"
|
|
{
|
|
#include "t120.h"
|
|
}
|
|
|
|
//
|
|
// GUI message boxes kill us when we hit an assert or error, because they
|
|
// have a message pump that causes messages to get dispatched, making it
|
|
// very difficult for us to debug problems when they occur. Therefore
|
|
// we redefine ERROR_OUT and ASSERT
|
|
//
|
|
#ifdef _DEBUG
|
|
|
|
__inline void MyDebugBreak(void) { DebugBreak(); }
|
|
|
|
#endif // _DEBUG
|
|
|
|
|
|
|
|
|
|
/*
|
|
* Macro used to force values to four byte boundaries. This macro will need to
|
|
* be considered when portability issues arise.
|
|
*/
|
|
#define ROUNDTOBOUNDARY(num) (((UINT)(num) + 0x03) & 0xfffffffcL)
|
|
|
|
|
|
// the following create a dword that will look like "abcd" in debugger
|
|
#ifdef SHIP_BUILD
|
|
#define MAKE_STAMP_ID(a,b,c,d)
|
|
#else
|
|
#define MAKE_STAMP_ID(a,b,c,d) MAKELONG(MAKEWORD(a,b),MAKEWORD(c,d))
|
|
#endif // SHIP_BUILD
|
|
|
|
class CRefCount
|
|
{
|
|
public:
|
|
|
|
#ifdef SHIP_BUILD
|
|
CRefCount(void);
|
|
#else
|
|
CRefCount(DWORD dwStampID);
|
|
#endif
|
|
virtual ~CRefCount(void) = 0;
|
|
|
|
LONG AddRef(void);
|
|
LONG Release(void);
|
|
|
|
void ReleaseNow(void);
|
|
|
|
protected:
|
|
|
|
LONG GetRefCount(void) { return m_cRefs; }
|
|
BOOL IsRefCountZero(void) { return (0 == m_cRefs); }
|
|
|
|
LONG Lock(void);
|
|
LONG Unlock(BOOL fRelease = TRUE);
|
|
|
|
LONG GetLockCount(void) { return m_cLocks; }
|
|
BOOL IsLocked(void) { return (0 == m_cLocks); }
|
|
|
|
private:
|
|
|
|
#ifndef SHIP_BUILD
|
|
DWORD m_dwStampID;// to remove before we ship it
|
|
#endif
|
|
LONG m_cRefs; // reference count
|
|
LONG m_cLocks; // lock count of the essential contents
|
|
};
|
|
|
|
|
|
extern HINSTANCE g_hDllInst;
|
|
|
|
__inline void My_CloseHandle(HANDLE hdl)
|
|
{
|
|
if (NULL != hdl)
|
|
{
|
|
CloseHandle(hdl);
|
|
}
|
|
}
|
|
|
|
|
|
#if defined(_DEBUG)
|
|
LPSTR _My_strdupA(LPCSTR pszSrc, LPSTR pszFileName, UINT nLineNumber);
|
|
LPWSTR _My_strdupW(LPCWSTR pszSrc, LPSTR pszFileName, UINT nLineNumber);
|
|
LPWSTR _My_strdupW2(UINT cchSrc, LPCWSTR pszSrc, LPSTR pszFileName, UINT nLineNumber);
|
|
LPOSTR _My_strdupO2(LPBYTE lpbSrc, UINT cOctets, LPSTR pszFileName, UINT nLineNumber);
|
|
|
|
#define My_strdupA(pszSrc) _My_strdupA(pszSrc, __FILE__, __LINE__)
|
|
#define My_strdupW(pszSrc) _My_strdupW(pszSrc, __FILE__, __LINE__)
|
|
#define My_strdupW2(cchSrc,pszSrc) _My_strdupW2(cchSrc, pszSrc, __FILE__, __LINE__)
|
|
#define My_strdupO2(lpbSrc,cOctets) _My_strdupO2(lpbSrc, cOctets, __FILE__, __LINE__)
|
|
#define My_strdupO(poszSrc) _My_strdupO2(poszSrc->value, poszSrc->length, __FILE__, __LINE__)
|
|
#else
|
|
LPSTR My_strdupA(LPCSTR pszSrc);
|
|
LPWSTR My_strdupW(LPCWSTR pszSrc);
|
|
LPWSTR My_strdupW2(UINT cchSrc, LPCWSTR pszSrc); // backward compatible to UnicodeString
|
|
LPOSTR My_strdupO2(LPBYTE lpbSrc, UINT cOctets);
|
|
__inline LPOSTR My_strdupO(LPOSTR poszSrc) { return My_strdupO2(poszSrc->value, poszSrc->length); }
|
|
#endif
|
|
|
|
UINT My_strlenA(LPCSTR pszSrc);
|
|
UINT My_strlenW(LPCWSTR pszSrc);
|
|
int My_strcmpW(LPCWSTR pwsz1, LPCWSTR pwsz2);
|
|
|
|
#ifdef _UNICODE
|
|
#define My_strdup My_strdupW
|
|
#define My_strlen My_strlenW
|
|
#define My_strcmp My_strcmpW
|
|
#else
|
|
#define My_strdup My_strdupA
|
|
#define My_strlen My_strlenA
|
|
#define My_strcmp lstrcmpA
|
|
#endif
|
|
|
|
INT My_strcmpO(LPOSTR posz1, LPOSTR posz2);
|
|
|
|
|
|
|
|
#endif // __MS_UTIL_H__
|
|
|