//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 1996 - 1999 // // File: mscat32.cpp // // Contents: Microsoft Internet Security Catalog Utilities // // Functions: DllMain // DllRegisterServer // DllUnregisterServer // // *** local functions *** // CatalogNew // CatalogFreeMember // CatalogFreeAttribute // CatalogCheckForDuplicateMember // // History: 25-Apr-1997 pberkman created // //-------------------------------------------------------------------------- #include "global.hxx" #include "mscat32.h" CRITICAL_SECTION MSCAT_CriticalSection; HINSTANCE hInst; ////////////////////////////////////////////////////////////////////////////////////// // // standard DLL exports ... // // BOOL WINAPI mscat32DllMain(HANDLE hInstDLL,DWORD fdwReason,LPVOID lpvReserved) { BOOL fRet; BOOL fCritSecInitialized = FALSE; switch (fdwReason) { case DLL_PROCESS_ATTACH: hInst = (HINSTANCE)hInstDLL; __try { InitializeCriticalSection(&MSCAT_CriticalSection); fCritSecInitialized = TRUE; } __except(EXCEPTION_EXECUTE_HANDLER) { fRet = FALSE; goto Return; } break; case DLL_PROCESS_DETACH: DeleteCriticalSection(&MSCAT_CriticalSection); break; } fRet = CatAdminDllMain(hInstDLL, fdwReason, lpvReserved); if (!fRet && fCritSecInitialized) { DeleteCriticalSection(&MSCAT_CriticalSection); } Return: return fRet; } STDAPI mscat32DllRegisterServer(void) { return(S_OK); } STDAPI mscat32DllUnregisterServer(void) { return(S_OK); } ////////////////////////////////////////////////////////////////////////////////////// // // local utility functions // // void *CatalogNew(DWORD cbSize) { void *pvRet; pvRet = (void *)new BYTE[cbSize]; if (!(pvRet)) { assert(pvRet); SetLastError(ERROR_NOT_ENOUGH_MEMORY); } return(pvRet); } BOOL CatalogFreeAttribute(CRYPTCATATTRIBUTE *pCatAttr) { if (!(pCatAttr) || (pCatAttr->cbStruct != sizeof(CRYPTCATATTRIBUTE))) { SetLastError((DWORD)ERROR_INVALID_PARAMETER); return(FALSE); } DELETE_OBJECT(pCatAttr->pwszReferenceTag); DELETE_OBJECT(pCatAttr->pbValue); pCatAttr->cbValue = 0; pCatAttr->dwAttrTypeAndAction = 0; pCatAttr->dwReserved = 0; return(TRUE); } BOOL CatalogFreeMember(CRYPTCATMEMBER *pCatMember) { if (!(pCatMember) || (pCatMember->cbStruct != sizeof(CRYPTCATMEMBER))) { SetLastError((DWORD)ERROR_INVALID_PARAMETER); return(FALSE); } // // reference tag // DELETE_OBJECT(pCatMember->pwszReferenceTag); // // file name // DELETE_OBJECT(pCatMember->pwszFileName); // // free indirect data // if (pCatMember->pIndirectData) { // Data.pszObjId DELETE_OBJECT(pCatMember->pIndirectData->Data.pszObjId); // Data.Value.pbData DELETE_OBJECT(pCatMember->pIndirectData->Data.Value.pbData); // DigestAlgorithm.pszObjId DELETE_OBJECT(pCatMember->pIndirectData->DigestAlgorithm.pszObjId); // Digest.pbData DELETE_OBJECT(pCatMember->pIndirectData->Digest.pbData); // the structure itself! DELETE_OBJECT(pCatMember->pIndirectData); } // // free encoded indirect data // DELETE_OBJECT(pCatMember->sEncodedIndirectData.pbData); pCatMember->sEncodedIndirectData.cbData = 0; // // free encoded member info // DELETE_OBJECT(pCatMember->sEncodedMemberInfo.pbData); pCatMember->sEncodedMemberInfo.cbData = 0; // // free attribute data // if (pCatMember->hReserved) { Stack_ *ps; DWORD cStack; CRYPTCATATTRIBUTE *pAttr; ps = (Stack_ *)pCatMember->hReserved; cStack = 0; while (pAttr = (CRYPTCATATTRIBUTE *)ps->Get(cStack)) { CatalogFreeAttribute(pAttr); cStack++; } DELETE_OBJECT(ps); pCatMember->hReserved = NULL; } return(TRUE); } BOOL CatalogCheckForDuplicateMember(Stack_ *pMembers, WCHAR *pwszReferenceTag) { CRYPTCATMEMBER *pMem; DWORD iCur; DWORD ccRT; ccRT = wcslen(pwszReferenceTag); iCur = 0; while (iCur < pMembers->Count()) { pMem = (CRYPTCATMEMBER *)pMembers->Get(iCur); if (pMem) { if (ccRT == (DWORD)wcslen(pMem->pwszReferenceTag)) { if (wcscmp(pwszReferenceTag, pMem->pwszReferenceTag) == 0) { return(TRUE); } } } // // increment our index! // iCur++; } return(FALSE); } WCHAR aHexDigit[] = { L'0', L'1', L'2', L'3', L'4', L'5', L'6', L'7', L'8', L'9', L'A', L'B', L'C', L'D', L'E', L'F' }; VOID ByteToWHex (IN LPBYTE pbDigest, IN DWORD iByte, OUT LPWSTR pwszHashTag) { DWORD iTag; DWORD iHexDigit1; DWORD iHexDigit2; iTag = iByte * 2; iHexDigit1 = ( pbDigest[ iByte ] & 0xF0 ) >> 4; iHexDigit2 = ( pbDigest[ iByte ] & 0x0F ); pwszHashTag[ iTag ] = aHexDigit[ iHexDigit1 ]; pwszHashTag[ iTag + 1 ] = aHexDigit[ iHexDigit2 ]; } BOOL MsCatConstructHashTag (IN DWORD cbDigest, IN LPBYTE pbDigest, OUT LPWSTR* ppwszHashTag) { DWORD cwTag; LPWSTR pwszHashTag; DWORD cCount; cwTag = ( ( cbDigest * 2 ) + 1 ); pwszHashTag = (LPWSTR)CatalogNew( cwTag * sizeof( WCHAR ) ); if ( pwszHashTag == NULL ) { SetLastError( E_OUTOFMEMORY ); return( FALSE ); } for ( cCount = 0; cCount < cbDigest; cCount++ ) { ByteToWHex( pbDigest, cCount, pwszHashTag ); } pwszHashTag[ cwTag - 1 ] = L'\0'; *ppwszHashTag = pwszHashTag; return( TRUE ); } VOID MsCatFreeHashTag (IN LPWSTR pwszHashTag) { DELETE_OBJECT(pwszHashTag); }