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.
 
 
 
 
 
 

450 lines
12 KiB

//+---------------------------------------------------------------------------
//
// Microsoft Windows NT Security
// Copyright (C) Microsoft Corporation, 1997 - 1999
//
// File: async.cpp
//
// Contents: Async Parameter Management
//
// History: 05-Aug-97 kirtd Created
//
//----------------------------------------------------------------------------
#include <global.hxx>
#include <async.h>
//+---------------------------------------------------------------------------
//
// Function: CryptCreateAsyncHandle
//
// Synopsis: create async param handle
//
//----------------------------------------------------------------------------
BOOL WINAPI
CryptCreateAsyncHandle (
IN DWORD dwFlags,
OUT PHCRYPTASYNC phAsync
)
{
CCryptAsyncHandle* pAsyncHandle;
pAsyncHandle = new CCryptAsyncHandle( dwFlags );
if ( pAsyncHandle == NULL )
{
SetLastError( (DWORD) E_OUTOFMEMORY );
return( FALSE );
}
*phAsync = pAsyncHandle;
return( TRUE );
}
//+---------------------------------------------------------------------------
//
// Function: CryptSetAsyncParam
//
// Synopsis: set async parameter
//
//----------------------------------------------------------------------------
BOOL WINAPI
CryptSetAsyncParam (
IN HCRYPTASYNC hAsync,
IN LPSTR pszParamOid,
IN LPVOID pvParam,
IN OPTIONAL PFN_CRYPT_ASYNC_PARAM_FREE_FUNC pfnFree
)
{
return( ( ( CCryptAsyncHandle* )hAsync )->SetAsyncParam(
pszParamOid,
pvParam,
pfnFree
) );
}
//+---------------------------------------------------------------------------
//
// Function: CryptGetAsyncParam
//
// Synopsis: get async parameter
//
//----------------------------------------------------------------------------
BOOL WINAPI
CryptGetAsyncParam (
IN HCRYPTASYNC hAsync,
IN LPSTR pszParamOid,
OUT LPVOID* ppvParam,
OUT OPTIONAL PFN_CRYPT_ASYNC_PARAM_FREE_FUNC* ppfnFree
)
{
return( ( ( CCryptAsyncHandle* )hAsync )->GetAsyncParam(
pszParamOid,
ppvParam,
ppfnFree
) );
}
//+---------------------------------------------------------------------------
//
// Function: CryptCloseAsyncHandle
//
// Synopsis: close async handle
//
//----------------------------------------------------------------------------
BOOL WINAPI
CryptCloseAsyncHandle (
IN HCRYPTASYNC hAsync
)
{
delete ( CCryptAsyncHandle * )hAsync;
return( TRUE );
}
//+---------------------------------------------------------------------------
//
// Member: CCryptAsyncHandle::CCryptAsyncHandle, public
//
// Synopsis: Constructor
//
//----------------------------------------------------------------------------
CCryptAsyncHandle::CCryptAsyncHandle (DWORD dwFlags)
{
m_pConstOidList = NULL;
m_pStrOidList = NULL;
Pki_InitializeCriticalSection( &m_AsyncLock );
}
//+---------------------------------------------------------------------------
//
// Member: CCryptAsyncHandle::~CCryptAsyncHandle, public
//
// Synopsis: Destructor
//
//----------------------------------------------------------------------------
CCryptAsyncHandle::~CCryptAsyncHandle ()
{
FreeOidList( m_pConstOidList, TRUE );
FreeOidList( m_pStrOidList, FALSE );
DeleteCriticalSection( &m_AsyncLock );
}
//+---------------------------------------------------------------------------
//
// Member: CCryptAsyncHandle::SetAsyncParam, public
//
// Synopsis: set an async parameter, if the pvParam is NULL then
// the parameter is removed and freed if a free function
// has been specified
//
//----------------------------------------------------------------------------
BOOL
CCryptAsyncHandle::SetAsyncParam (
LPSTR pszParamOid,
LPVOID pvParam,
PFN_CRYPT_ASYNC_PARAM_FREE_FUNC pfnFree
)
{
BOOL fReturn = FALSE;
PCRYPT_ASYNC_PARAM pParam = NULL;
BOOL fConstOid = ( (DWORD_PTR)pszParamOid <= 0xFFFF );
EnterCriticalSection( &m_AsyncLock );
pParam = FindAsyncParam( pszParamOid, fConstOid );
if ( pvParam == NULL )
{
if ( pParam != NULL )
{
RemoveAsyncParam( pParam );
FreeAsyncParam( pParam, fConstOid );
fReturn = TRUE;
}
else
{
SetLastError( (DWORD) E_INVALIDARG );
}
LeaveCriticalSection( &m_AsyncLock );
return( fReturn );
}
if ( pParam != NULL )
{
if ( pParam->pfnFree != NULL )
{
(*pParam->pfnFree)( pszParamOid, pvParam );
}
pParam->pvParam = pvParam;
LeaveCriticalSection( &m_AsyncLock );
return( TRUE );
}
if ( AllocAsyncParam(
pszParamOid,
fConstOid,
pvParam,
pfnFree,
&pParam
) == TRUE )
{
AddAsyncParam( pParam, fConstOid );
fReturn = TRUE;
}
else
{
fReturn = FALSE;
}
LeaveCriticalSection( &m_AsyncLock );
return( fReturn );
}
//+---------------------------------------------------------------------------
//
// Member: CCryptAsyncHandle::GetAsyncParam, public
//
// Synopsis: get an async parameter
//
//----------------------------------------------------------------------------
BOOL
CCryptAsyncHandle::GetAsyncParam (
LPSTR pszParamOid,
LPVOID* ppvParam,
PFN_CRYPT_ASYNC_PARAM_FREE_FUNC* ppfnFree
)
{
PCRYPT_ASYNC_PARAM pFoundParam = NULL;
BOOL fConstOid = ( (DWORD_PTR)pszParamOid <= 0xFFFF );
EnterCriticalSection( &m_AsyncLock );
pFoundParam = FindAsyncParam( pszParamOid, fConstOid );
if ( pFoundParam == NULL )
{
LeaveCriticalSection( &m_AsyncLock );
SetLastError( (DWORD) E_INVALIDARG );
return( FALSE );
}
*ppvParam = pFoundParam->pvParam;
if ( ppfnFree != NULL )
{
*ppfnFree = pFoundParam->pfnFree;
}
LeaveCriticalSection( &m_AsyncLock );
return( TRUE );
}
//+---------------------------------------------------------------------------
//
// Member: CCryptAsyncHandle::AllocAsyncParam, private
//
// Synopsis: allocate an async parameter block
//
//----------------------------------------------------------------------------
BOOL
CCryptAsyncHandle::AllocAsyncParam (
LPSTR pszParamOid,
BOOL fConstOid,
LPVOID pvParam,
PFN_CRYPT_ASYNC_PARAM_FREE_FUNC pfnFree,
PCRYPT_ASYNC_PARAM* ppParam
)
{
HRESULT hr = S_OK;
PCRYPT_ASYNC_PARAM pParam;
pParam = new CRYPT_ASYNC_PARAM;
if ( pParam != NULL )
{
memset( pParam, 0, sizeof( CRYPT_ASYNC_PARAM ) );
if ( fConstOid == FALSE )
{
pParam->pszOid = new CHAR [strlen( pszParamOid ) + 1];
if ( pParam->pszOid != NULL )
{
strcpy( pParam->pszOid, pszParamOid );
}
else
{
hr = E_OUTOFMEMORY;
}
}
else
{
pParam->pszOid = pszParamOid;
}
}
else
{
hr = E_OUTOFMEMORY;
}
if ( hr != S_OK )
{
SetLastError( hr );
return( FALSE );
}
pParam->pvParam = pvParam,
pParam->pfnFree = pfnFree;
*ppParam = pParam;
return( TRUE );
}
//+---------------------------------------------------------------------------
//
// Member: CCryptAsyncHandle::FreeAsyncParam, private
//
// Synopsis: free an async param
//
//----------------------------------------------------------------------------
VOID
CCryptAsyncHandle::FreeAsyncParam (
PCRYPT_ASYNC_PARAM pParam,
BOOL fConstOid
)
{
if ( pParam->pfnFree != NULL )
{
(*pParam->pfnFree)( pParam->pszOid, pParam->pvParam );
}
if ( fConstOid == FALSE )
{
delete pParam->pszOid;
}
delete pParam;
}
//+---------------------------------------------------------------------------
//
// Member: CCryptAsyncHandle::AddAsyncParam, private
//
// Synopsis: add an async parameter
//
//----------------------------------------------------------------------------
VOID
CCryptAsyncHandle::AddAsyncParam (
PCRYPT_ASYNC_PARAM pParam,
BOOL fConstOid
)
{
PCRYPT_ASYNC_PARAM* ppOidList;
if ( fConstOid == TRUE )
{
ppOidList = &m_pConstOidList;
}
else
{
ppOidList = &m_pStrOidList;
}
pParam->pNext = *ppOidList;
pParam->pPrev = NULL;
*ppOidList = pParam;
}
//+---------------------------------------------------------------------------
//
// Member: CCryptAsyncHandle::RemoveAsyncParam, private
//
// Synopsis: remove an async parameter
//
//----------------------------------------------------------------------------
VOID
CCryptAsyncHandle::RemoveAsyncParam (
PCRYPT_ASYNC_PARAM pParam
)
{
if ( pParam->pPrev != NULL )
{
pParam->pPrev->pNext = pParam->pNext;
}
if ( pParam->pNext != NULL )
{
pParam->pNext->pPrev = pParam->pPrev;
}
}
//+---------------------------------------------------------------------------
//
// Member: CCryptAsyncHandle::FindAsyncParam, private
//
// Synopsis: find an async parameter
//
//----------------------------------------------------------------------------
PCRYPT_ASYNC_PARAM
CCryptAsyncHandle::FindAsyncParam (
LPSTR pszParamOid,
BOOL fConstOid
)
{
PCRYPT_ASYNC_PARAM pParam;
if ( fConstOid == TRUE )
{
pParam = m_pConstOidList;
}
else
{
pParam = m_pStrOidList;
}
while ( pParam != NULL )
{
if ( fConstOid == TRUE )
{
if ( pParam->pszOid == pszParamOid )
{
break;
}
}
else
{
if ( _stricmp( pParam->pszOid, pszParamOid ) == 0 )
{
break;
}
}
pParam = pParam->pNext;
}
return( pParam );
}
//+---------------------------------------------------------------------------
//
// Member: CCryptAsyncHandle::FreeOidList, private
//
// Synopsis: free an OID list
//
//----------------------------------------------------------------------------
VOID
CCryptAsyncHandle::FreeOidList (
PCRYPT_ASYNC_PARAM pOidList,
BOOL fConstOidList
)
{
PCRYPT_ASYNC_PARAM pParam;
PCRYPT_ASYNC_PARAM pParamNext;
pParam = pOidList;
while ( pParam != NULL )
{
pParamNext = pParam->pNext;
FreeAsyncParam( pParam, fConstOidList );
pParam = pParamNext;
}
}