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.
 
 
 
 
 
 

159 lines
4.5 KiB

// LockWrap.cpp: implementation of the CLockWrap class.
// LockWrap.cpp: implementation of the CIOPCriticalSection class.
// LockWrap.cpp: implementation of the CIOPMutex class.
// LockWrap.cpp: implementation of the CSCardLock class.
//
//////////////////////////////////////////////////////////////////////
#include "NoWarning.h"
#include "LockWrap.h"
#include "SmartCard.h"
using namespace iop;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CLockWrap::CLockWrap(CIOPLock *pIOPLock)
: m_IOPCritSect(pIOPLock),
m_IOPMutex(pIOPLock),
m_SCardLock(pIOPLock),
m_pIOPLock(pIOPLock)
{
if (0 == m_pIOPLock->RefCount())
m_pIOPLock->SmartCard()->ResetSelect();
m_pIOPLock->IncrementRefCount();
}
CLockWrap::~CLockWrap()
{
try {
m_pIOPLock->DecrementRefCount();
}
catch(...) {};
}
CIOPCriticalSection::CIOPCriticalSection(CIOPLock *pIOPLock)
: m_pIOPLock(pIOPLock)
{
#if defined(SLBIOP_RM_HANG_AT_PROCESS_DEATH)
EnterCriticalSection(m_pIOPLock->CriticalSection());
#endif
}
CIOPCriticalSection::~CIOPCriticalSection()
{
#if defined(SLBIOP_RM_HANG_AT_PROCESS_DEATH)
try {
LeaveCriticalSection(m_pIOPLock->CriticalSection());
}
catch(...) {};
#endif
}
CIOPMutex::CIOPMutex(CIOPLock *pIOPLock) : m_pIOPLock(pIOPLock)
{
#if defined(SLBIOP_RM_HANG_AT_PROCESS_DEATH)
if (0 == m_pIOPLock->RefCount())
{
if (WaitForSingleObject(m_pIOPLock->MutexHandle(),
INFINITE) == WAIT_FAILED)
throw scu::OsException(GetLastError());
}
#endif
}
CIOPMutex::~CIOPMutex()
{
#if defined(SLBIOP_RM_HANG_AT_PROCESS_DEATH)
try
{
if (0 == m_pIOPLock->RefCount())
ReleaseMutex(m_pIOPLock->MutexHandle());
}
catch (...)
{}
#endif
}
CSCardLock::CSCardLock(CIOPLock *pIOPLock) : m_pIOPLock(pIOPLock)
{
if (0 == m_pIOPLock->RefCount())
{
HRESULT hResult;
SCARDHANDLE hCard = m_pIOPLock->SmartCard()->getCardHandle();
hResult = SCardBeginTransaction(hCard);
if (hResult != SCARD_S_SUCCESS)
{
DWORD dwState;
DWORD dwProtocol;
BYTE bATR[CSmartCard::cMaxAtrLength];
DWORD dwATRLen = sizeof bATR / sizeof *bATR;
DWORD dwReaderNameLen = 0;
HRESULT hr = SCardStatus(hCard, NULL, &dwReaderNameLen,
&dwState, &dwProtocol, bATR,
&dwATRLen);
if (hr == SCARD_W_RESET_CARD)
{
m_pIOPLock->SmartCard()->ResetSelect();
m_pIOPLock->SmartCard()->ReConnect();
}
else
throw scu::OsException(hResult);
hr = SCardBeginTransaction(hCard);
if (hr != SCARD_S_SUCCESS)
throw scu::OsException(hResult);
}
// set the dirty flag on the card to indicate that no data
// on the card has changed since the beginning if the
// transaction.
m_pIOPLock->SmartCard()->Dirty(false);
}
}
CSCardLock::~CSCardLock()
{
try
{
if (0 == m_pIOPLock->RefCount())
{
HRESULT hResult;
SCARDHANDLE hCard = m_pIOPLock->SmartCard()->getCardHandle();
hResult = SCardEndTransaction(hCard, SCARD_LEAVE_CARD);
if (hResult != SCARD_S_SUCCESS)
{
DWORD dwState;
DWORD dwProtocol;
BYTE bATR[CSmartCard::cMaxAtrLength];
DWORD dwATRLen = sizeof bATR / sizeof *bATR;
DWORD dwReaderNameLen = 0;
HRESULT hr = SCardStatus(hCard, NULL,
&dwReaderNameLen, &dwState,
&dwProtocol, bATR,
&dwATRLen);
// ignore failures since in destructor.
if (hr == SCARD_W_RESET_CARD)
{
m_pIOPLock->SmartCard()->ResetSelect();
m_pIOPLock->SmartCard()->ReConnect();
hr = SCardEndTransaction(hCard, SCARD_LEAVE_CARD);
}
}
}
}
catch (...)
{}
}