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.
 
 
 
 
 
 

229 lines
3.9 KiB

#include "precomp.h"
CRefCount::CRefCount(DWORD dwStampID)
:
#ifndef SHIP_BUILD
m_dwStampID(dwStampID),
#endif
m_cRefs(1),
m_cLocks(0)
{
}
// though it is pure virtual, we still need to have a destructor.
CRefCount::~CRefCount(void)
{
}
LONG CRefCount::AddRef(void)
{
ASSERT(0 < m_cRefs);
::InterlockedIncrement(&m_cRefs);
return m_cRefs;
}
LONG CRefCount::Release(void)
{
ASSERT(NULL != this);
ASSERT(0 < m_cRefs);
if (0 == ::InterlockedDecrement(&m_cRefs))
{
ASSERT(0 == m_cLocks);
delete this;
return 0;
}
return m_cRefs;
}
void CRefCount::ReleaseNow(void)
{
ASSERT(NULL != this);
ASSERT(0 < m_cRefs);
m_cRefs = 0;
delete this;
}
LONG CRefCount::Lock(void)
{
AddRef();
ASSERT(0 <= m_cLocks);
::InterlockedIncrement(&m_cLocks);
return m_cLocks;
}
LONG CRefCount::Unlock(BOOL fRelease)
{
ASSERT(0 < m_cLocks);
::InterlockedDecrement(&m_cLocks);
LONG c = m_cLocks; // in case Release() frees the object
if (fRelease)
{
Release();
}
return c;
}
UINT My_strlenA(LPCSTR pszSrc)
{
UINT cch = 0;
if (NULL != pszSrc)
{
cch = lstrlenA(pszSrc);
}
return cch;
}
#if defined(_DEBUG)
LPSTR _My_strdupA(LPCSTR pszSrc, LPSTR pszFileName, UINT nLineNumber)
#else
LPSTR My_strdupA(LPCSTR pszSrc)
#endif
{
if (NULL == pszSrc)
{
return NULL;
}
UINT cch = lstrlenA(pszSrc) + 1;
#if defined(_DEBUG)
LPSTR pszDst = (LPSTR) DbgMemAlloc(cch, NULL, pszFileName, nLineNumber);
#else
LPSTR pszDst = new char[cch];
#endif
if (NULL != pszDst)
{
CopyMemory(pszDst, pszSrc, cch);
}
return pszDst;
}
UINT My_strlenW(LPCWSTR pszSrc)
{
UINT cch = 0;
if (NULL != pszSrc)
{
cch = lstrlenW(pszSrc);
}
return cch;
}
#if defined(_DEBUG)
LPWSTR _My_strdupW(LPCWSTR pszSrc, LPSTR pszFileName, UINT nLineNumber)
#else
LPWSTR My_strdupW(LPCWSTR pszSrc)
#endif
{
if (NULL == pszSrc)
{
return NULL;
}
UINT cch = lstrlenW(pszSrc) + 1;
#if defined(_DEBUG)
LPWSTR pszDst = (LPWSTR) DbgMemAlloc(cch * sizeof(WCHAR), NULL, pszFileName, nLineNumber);
#else
LPWSTR pszDst = new WCHAR[cch];
#endif
if (NULL != pszDst)
{
CopyMemory(pszDst, pszSrc, cch * sizeof(WCHAR));
}
return pszDst;
}
//
// LONCHANC: This is to provide backward compatibility to UnicodeString
// in protocol structures. hopefully, we can remove this hack later.
//
#if defined(_DEBUG)
LPWSTR _My_strdupW2(UINT cchSrc, LPCWSTR pszSrc, LPSTR pszFileName, UINT nLineNumber)
#else
LPWSTR My_strdupW2(UINT cchSrc, LPCWSTR pszSrc)
#endif
{
#if defined(_DEBUG)
LPWSTR pwsz = (LPWSTR) DbgMemAlloc((cchSrc+1) * sizeof(WCHAR), NULL, pszFileName, nLineNumber);
#else
LPWSTR pwsz = new WCHAR[cchSrc+1];
#endif
if (NULL != pwsz)
{
CopyMemory(pwsz, pszSrc, cchSrc * sizeof(WCHAR));
}
pwsz[cchSrc] = 0;
return pwsz;
}
int My_strcmpW(LPCWSTR pwsz1, LPCWSTR pwsz2)
{
if (NULL == pwsz1 || NULL == pwsz2)
{
return -1;
}
WCHAR ch;
while (0 == (ch = *pwsz1 - *pwsz2) &&
NULL != *pwsz1++ &&
NULL != *pwsz2++)
;
return (int) ch;
}
#if defined(_DEBUG)
LPOSTR _My_strdupO2(LPBYTE lpbSrc, UINT cOctets, LPSTR pszFileName, UINT nLineNumber)
#else
LPOSTR My_strdupO2(LPBYTE lpbSrc, UINT cOctets)
#endif
{
#if defined(_DEBUG)
LPOSTR poszDst = (LPOSTR) DbgMemAlloc(sizeof(OSTR) + cOctets + 1, NULL, pszFileName, nLineNumber);
#else
LPOSTR poszDst = (LPOSTR) new char[sizeof(OSTR) + cOctets + 1];
#endif
if (NULL != poszDst)
{
poszDst->length = cOctets;
poszDst->value = (LPBYTE) (poszDst + 1);
::CopyMemory(poszDst->value, lpbSrc, cOctets);
}
return poszDst;
}
INT My_strcmpO(LPOSTR posz1, LPOSTR posz2)
{
if (NULL == posz1 || NULL == posz2)
{
return -1;
}
if (posz1->length != posz2->length)
{
return -1;
}
UINT cnt = posz1->length;
LPBYTE lpb1 = posz1->value, lpb2 = posz2->value;
BYTE b = 0;
while (cnt--)
{
if (0 != (b = *lpb1++ - *lpb2++))
{
break;
}
}
return (INT) b;
}