Crypt Library Demo 1.00
Defines | Functions

CryptographyExt.h File Reference

#include <afxdb_.h>
#include <WinCrypt.h>
Include dependency graph for CryptographyExt.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Defines

#define CRYPT_LIBRARY_NAME   _T("Crypt")
#define MD5CHECKSUM_LENGTH   0x10
#define SHA1CHECKSUM_LENGTH   0x14
#define MAX_STR_BUFFER   0x1000
#define MAX_CRYPT_TAIL   0x1000

Functions

void TraceLastError (LPCTSTR lpszLibrary, LPCTSTR lpszOperation, DWORD dwLastError)
CString GetComputerID ()
BOOL ConvertHexaToBinary (LPBYTE lpszOutputBuffer, DWORD dwOutputLength, LPCTSTR lpszInputBuffer, DWORD dwInputLength)
BOOL ConvertHexaToBinary (CLongBinary *pTargetBinary, CLongBinary *pSourceBinary)
BOOL ConvertBinaryToHexa (LPTSTR lpszOutputBuffer, DWORD dwOutputLength, LPBYTE lpszInputBuffer, DWORD dwInputLength)
BOOL ConvertBinaryToHexa (CLongBinary *pTargetBinary, CLongBinary *pSourceBinary)
BOOL GetChecksumBuffer (ALG_ID nAlgorithm, LPBYTE lpszOutputBuffer, DWORD &dwOutputLength, LPBYTE lpszInputBuffer, DWORD dwInputLength)
BOOL GetChecksumString (ALG_ID nAlgorithm, CString &strResult, CString strBuffer)
BOOL GetChecksumFile (ALG_ID nAlgorithm, CString &strResult, CString strPathName)
BOOL EncryptBuffer (ALG_ID nAlgorithm, LPBYTE lpszOutputBuffer, DWORD &dwOutputLength, LPBYTE lpszInputBuffer, DWORD dwInputLength, LPBYTE lpszSecretKey, DWORD dwSecretKey)
BOOL EncryptFile (ALG_ID nAlgorithm, CString strOutputName, CString strInputName, LPBYTE lpszSecretKey, DWORD dwSecretKey)
BOOL DecryptBuffer (ALG_ID nAlgorithm, LPBYTE lpszOutputBuffer, DWORD &dwOutputLength, LPBYTE lpszInputBuffer, DWORD dwInputLength, LPBYTE lpszSecretKey, DWORD dwSecretKey)
BOOL DecryptFile (ALG_ID nAlgorithm, CString strOutputName, CString strInputName, LPBYTE lpszSecretKey, DWORD dwSecretKey)

Define Documentation

#define CRYPT_LIBRARY_NAME   _T("Crypt")

Definition at line 19 of file CryptographyExt.h.

#define MAX_CRYPT_TAIL   0x1000

Definition at line 23 of file CryptographyExt.h.

#define MAX_STR_BUFFER   0x1000

Definition at line 22 of file CryptographyExt.h.

#define MD5CHECKSUM_LENGTH   0x10

Definition at line 20 of file CryptographyExt.h.

#define SHA1CHECKSUM_LENGTH   0x14

Definition at line 21 of file CryptographyExt.h.


Function Documentation

BOOL ConvertBinaryToHexa ( LPTSTR  lpszOutputBuffer,
DWORD  dwOutputLength,
LPBYTE  lpszInputBuffer,
DWORD  dwInputLength 
)

Definition at line 200 of file CryptographyExt.cpp.

{
    ASSERT(lpszOutputBuffer != NULL);
    ASSERT(lpszInputBuffer != NULL);
    ASSERT(dwOutputLength >= (2 * dwInputLength));

    BYTE nDataValue;
    UINT nDataIndex;

    const CString strHexaDigit = _T("0123456789ABCDEF");

    for (UINT nIndex = 0; nIndex < dwInputLength; nIndex++)
    {
        nDataIndex = nIndex << 1;  // multiply be two
        nDataValue = lpszInputBuffer[nIndex];

        lpszOutputBuffer[nDataIndex] = strHexaDigit.GetAt((nDataValue & 0xFF) / 0x10);

        lpszOutputBuffer[nDataIndex + 1] = strHexaDigit.GetAt((nDataValue & 0xFF) % 0x10);
    }

    lpszOutputBuffer[2 * dwInputLength] = _T('\0');

    return TRUE;
}
BOOL ConvertBinaryToHexa ( CLongBinary *  pTargetBinary,
CLongBinary *  pSourceBinary 
)

Definition at line 162 of file CryptographyExt.cpp.

{
    BYTE nDataValue;
    UINT nDataIndex;

    const CString strHexaDigit = _T("0123456789ABCDEF");

    if (!pTargetBinary || !pSourceBinary)
        return FALSE;

    pTargetBinary->m_hData = NULL;
    pTargetBinary->m_dwDataLength = pSourceBinary->m_dwDataLength * 2 * sizeof(TCHAR);

    if (!pSourceBinary->m_dwDataLength)
        return TRUE;

    pTargetBinary->m_hData = GlobalAlloc(GPTR, pTargetBinary->m_dwDataLength + sizeof(TCHAR));

    BYTE * pSourceArray = (BYTE *) GlobalLock(pSourceBinary->m_hData);
    TCHAR * pTargetArray = (TCHAR *) GlobalLock(pTargetBinary->m_hData);
    ASSERT((pSourceArray != NULL) && (pTargetArray != NULL));

    for (UINT nIndex = 0; nIndex < pSourceBinary->m_dwDataLength; nIndex++)
    {
        nDataIndex = nIndex << 1;  // multiply be two
        nDataValue = pSourceArray[nIndex];

        pTargetArray[nDataIndex] = strHexaDigit.GetAt((nDataValue & 0xFF) / 0x10);

        pTargetArray[nDataIndex + 1] = strHexaDigit.GetAt((nDataValue & 0xFF) % 0x10);
    }

    VERIFY(GlobalUnlock(pTargetBinary->m_hData));
    VERIFY(GlobalUnlock(pSourceBinary->m_hData));

    return TRUE;
}

Here is the caller graph for this function:

BOOL ConvertHexaToBinary ( LPBYTE  lpszOutputBuffer,
DWORD  dwOutputLength,
LPCTSTR  lpszInputBuffer,
DWORD  dwInputLength 
)

Definition at line 131 of file CryptographyExt.cpp.

{
    ASSERT(lpszOutputBuffer != NULL);
    ASSERT(lpszInputBuffer != NULL);
    ASSERT(dwInputLength <= (2 * dwOutputLength));

    BYTE nDataValue;
    UINT nDataIndex;
    TCHAR chUpperNibble;
    TCHAR chLowerNibble;

    const CString strHexaDigit = _T("0123456789ABCDEF");

    for (UINT nIndex = 0; nIndex < dwInputLength / 2; nIndex++)
    {
        nDataIndex = nIndex << 1; // multiply be two

        chUpperNibble = lpszInputBuffer[nDataIndex];
        ASSERT(strHexaDigit.Find(chUpperNibble) != -1);
        nDataValue = (BYTE)(strHexaDigit.Find(chUpperNibble) * 0x10);

        chLowerNibble = lpszInputBuffer[nDataIndex + 1];
        ASSERT(strHexaDigit.Find(chLowerNibble) != -1);
        nDataValue = (BYTE)(nDataValue + strHexaDigit.Find(chLowerNibble));

        lpszOutputBuffer[nIndex] = nDataValue;
    }

    return TRUE;
}
BOOL ConvertHexaToBinary ( CLongBinary *  pTargetBinary,
CLongBinary *  pSourceBinary 
)

Definition at line 86 of file CryptographyExt.cpp.

{
    BYTE nDataValue;
    UINT nDataIndex;
    TCHAR chUpperNibble;
    TCHAR chLowerNibble;

    const CString strHexaDigit = _T("0123456789ABCDEF");

    if (!pTargetBinary || !pSourceBinary)
        return FALSE;

    pTargetBinary->m_hData = NULL;
    pTargetBinary->m_dwDataLength = pSourceBinary->m_dwDataLength / 2 / sizeof(TCHAR);

    if (!pSourceBinary->m_dwDataLength)
        return TRUE;

    pTargetBinary->m_hData = GlobalAlloc(GPTR, pTargetBinary->m_dwDataLength + sizeof(BYTE));

    TCHAR * pSourceArray = (TCHAR *) GlobalLock(pSourceBinary->m_hData);
    BYTE * pTargetArray = (BYTE *) GlobalLock(pTargetBinary->m_hData);
    ASSERT((pSourceArray != NULL) && (pTargetArray != NULL));

    for (UINT nIndex = 0; nIndex < pTargetBinary->m_dwDataLength; nIndex++)
    {
        nDataIndex = nIndex << 1; // multiply be two

        chUpperNibble = pSourceArray[nDataIndex];
        ASSERT(strHexaDigit.Find(chUpperNibble) != -1);
        nDataValue = (BYTE)(strHexaDigit.Find(chUpperNibble) * 0x10);

        chLowerNibble = pSourceArray[nDataIndex + 1];
        ASSERT(strHexaDigit.Find(chLowerNibble) != -1);
        nDataValue = (BYTE)(nDataValue + strHexaDigit.Find(chLowerNibble));

        pTargetArray[nIndex] = nDataValue;
    }

    VERIFY(GlobalUnlock(pTargetBinary->m_hData));
    VERIFY(GlobalUnlock(pSourceBinary->m_hData));

    return TRUE;
}
BOOL DecryptBuffer ( ALG_ID  nAlgorithm,
LPBYTE  lpszOutputBuffer,
DWORD &  dwOutputLength,
LPBYTE  lpszInputBuffer,
DWORD  dwInputLength,
LPBYTE  lpszSecretKey,
DWORD  dwSecretKey 
)

Definition at line 480 of file CryptographyExt.cpp.

{
    BOOL retVal = FALSE;
    DWORD dwHowManyBytes = dwInputLength;

    ASSERT(lpszOutputBuffer != NULL);
    ASSERT(dwOutputLength != 0);
    ASSERT(lpszInputBuffer != NULL);
    ASSERT(dwInputLength != 0);
    ASSERT(lpszSecretKey != NULL);
    ASSERT(dwSecretKey != 0);

    HCRYPTPROV hCryptProv = NULL;
    HCRYPTHASH hCryptHash = NULL;
    HCRYPTKEY hCryptKey = NULL;

    ::CopyMemory(lpszOutputBuffer, lpszInputBuffer, dwHowManyBytes);

    if (CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
    {
        if (CryptCreateHash(hCryptProv, CALG_MD5, NULL, 0, &hCryptHash))
        {
            if (CryptHashData(hCryptHash, lpszSecretKey, dwSecretKey, 0))
            {
                if (CryptDeriveKey(hCryptProv, nAlgorithm, hCryptHash, CRYPT_EXPORTABLE, &hCryptKey))
                {
                    if (CryptDecrypt(hCryptKey, NULL, TRUE, 0, lpszOutputBuffer, &dwHowManyBytes))
                    {
                        dwOutputLength = dwHowManyBytes;
                        retVal = TRUE;
                    }
                    else
                    {
                        TraceLastError(CRYPT_LIBRARY_NAME, _T("CryptDecrypt"), GetLastError());
                    }
                    VERIFY(CryptDestroyKey(hCryptKey));
                }
                else
                {
                    TraceLastError(CRYPT_LIBRARY_NAME, _T("CryptDeriveKey"), GetLastError());
                }
            }
            else
            {
                TraceLastError(CRYPT_LIBRARY_NAME, _T("CryptHashData"), GetLastError());
            }
            VERIFY(CryptDestroyHash(hCryptHash));
        }
        else
        {
            TraceLastError(CRYPT_LIBRARY_NAME, _T("CryptCreateHash"), GetLastError());
        }
        VERIFY(CryptReleaseContext(hCryptProv, 0));
    }
    else
    {
        TraceLastError(CRYPT_LIBRARY_NAME, _T("CryptAcquireContext"), GetLastError());
    }

    return retVal;
}

Here is the call graph for this function:

Here is the caller graph for this function:

BOOL DecryptFile ( ALG_ID  nAlgorithm,
CString  strOutputName,
CString  strInputName,
LPBYTE  lpszSecretKey,
DWORD  dwSecretKey 
)

Definition at line 542 of file CryptographyExt.cpp.

{
    BOOL retVal = FALSE;

    BYTE* lpszOutput = NULL;
    BYTE* lpszInput = NULL;
    try
    {
        CFile pInputFile(strInputName, CFile::modeRead | CFile::typeBinary);
        const UINT dwInput = (UINT)pInputFile.GetLength();
        if (dwInput > 0)
        {
            lpszInput = new BYTE[dwInput];
            if (dwInput == pInputFile.Read(lpszInput, dwInput))
            {
                DWORD dwOutput = dwInput + MAX_CRYPT_TAIL;
                lpszOutput = new BYTE[dwOutput];
                if (DecryptBuffer(nAlgorithm, lpszOutput, dwOutput, lpszInput, dwInput, lpszSecretKey, dwSecretKey))
                {
                    CFile pOutputFile(strOutputName, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
                    pOutputFile.Write(lpszOutput, dwOutput);
                    pOutputFile.Close();
                    retVal = TRUE;
                }
            }
        }
        pInputFile.Close();
    }
    catch (CFileException * pFileException)
    {
        TCHAR lpszError[MAX_STR_BUFFER] = { 0 };
        pFileException->GetErrorMessage(lpszError, MAX_STR_BUFFER);
        pFileException->Delete();
        OutputDebugString(lpszError);
        retVal = FALSE;
    }

    if (lpszInput != NULL)
    {
        delete lpszInput;
        lpszInput = NULL;
    }

    if (lpszOutput != NULL)
    {
        delete lpszOutput;
        lpszOutput = NULL;
    }

    return retVal;
}

Here is the call graph for this function:

Here is the caller graph for this function:

BOOL EncryptBuffer ( ALG_ID  nAlgorithm,
LPBYTE  lpszOutputBuffer,
DWORD &  dwOutputLength,
LPBYTE  lpszInputBuffer,
DWORD  dwInputLength,
LPBYTE  lpszSecretKey,
DWORD  dwSecretKey 
)

Definition at line 366 of file CryptographyExt.cpp.

{
    BOOL retVal = FALSE;
    DWORD dwHowManyBytes = dwInputLength;

    ASSERT(lpszOutputBuffer != NULL);
    ASSERT(dwOutputLength != 0);
    ASSERT(lpszInputBuffer != NULL);
    ASSERT(dwInputLength != 0);
    ASSERT(lpszSecretKey != NULL);
    ASSERT(dwSecretKey != 0);

    HCRYPTPROV hCryptProv = NULL;
    HCRYPTHASH hCryptHash = NULL;
    HCRYPTKEY hCryptKey = NULL;

    ::CopyMemory(lpszOutputBuffer, lpszInputBuffer, dwHowManyBytes);

    if (CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
    {
        if (CryptCreateHash(hCryptProv, CALG_MD5, NULL, 0, &hCryptHash))
        {
            if (CryptHashData(hCryptHash, lpszSecretKey, dwSecretKey, 0))
            {
                if (CryptDeriveKey(hCryptProv, nAlgorithm, hCryptHash, CRYPT_EXPORTABLE, &hCryptKey))
                {
                    if (CryptEncrypt(hCryptKey, NULL, TRUE, 0, lpszOutputBuffer, &dwHowManyBytes, dwOutputLength))
                    {
                        dwOutputLength = dwHowManyBytes;
                        retVal = TRUE;
                    }
                    else
                    {
                        TraceLastError(CRYPT_LIBRARY_NAME, _T("CryptEncrypt"), GetLastError());
                    }
                    VERIFY(CryptDestroyKey(hCryptKey));
                }
                else
                {
                    TraceLastError(CRYPT_LIBRARY_NAME, _T("CryptDeriveKey"), GetLastError());
                }
            }
            else
            {
                TraceLastError(CRYPT_LIBRARY_NAME, _T("CryptHashData"), GetLastError());
            }
            VERIFY(CryptDestroyHash(hCryptHash));
        }
        else
        {
            TraceLastError(CRYPT_LIBRARY_NAME, _T("CryptCreateHash"), GetLastError());
        }
        VERIFY(CryptReleaseContext(hCryptProv, 0));
    }
    else
    {
        TraceLastError(CRYPT_LIBRARY_NAME, _T("CryptAcquireContext"), GetLastError());
    }

    return retVal;
}

Here is the call graph for this function:

Here is the caller graph for this function:

BOOL EncryptFile ( ALG_ID  nAlgorithm,
CString  strOutputName,
CString  strInputName,
LPBYTE  lpszSecretKey,
DWORD  dwSecretKey 
)

Definition at line 428 of file CryptographyExt.cpp.

{
    BOOL retVal = FALSE;

    BYTE* lpszOutput = NULL;
    BYTE* lpszInput = NULL;
    try
    {
        CFile pInputFile(strInputName, CFile::modeRead | CFile::typeBinary);
        const UINT dwInput = (UINT)pInputFile.GetLength();
        if (dwInput > 0)
        {
            lpszInput = new BYTE[dwInput];
            if (dwInput == pInputFile.Read(lpszInput, dwInput))
            {
                DWORD dwOutput = dwInput + MAX_CRYPT_TAIL;
                lpszOutput = new BYTE[dwOutput];
                if (EncryptBuffer(nAlgorithm, lpszOutput, dwOutput, lpszInput, dwInput, lpszSecretKey, dwSecretKey))
                {
                    CFile pOutputFile(strOutputName, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
                    pOutputFile.Write(lpszOutput, dwOutput);
                    pOutputFile.Close();
                    retVal = TRUE;
                }
            }
        }
        pInputFile.Close();
    }
    catch (CFileException * pFileException)
    {
        TCHAR lpszError[MAX_STR_BUFFER] = { 0 };
        pFileException->GetErrorMessage(lpszError, MAX_STR_BUFFER);
        pFileException->Delete();
        OutputDebugString(lpszError);
        retVal = FALSE;
    }

    if (lpszInput != NULL)
    {
        delete lpszInput;
        lpszInput = NULL;
    }

    if (lpszOutput != NULL)
    {
        delete lpszOutput;
        lpszOutput = NULL;
    }

    return retVal;
}

Here is the call graph for this function:

Here is the caller graph for this function:

BOOL GetChecksumBuffer ( ALG_ID  nAlgorithm,
LPBYTE  lpszOutputBuffer,
DWORD &  dwOutputLength,
LPBYTE  lpszInputBuffer,
DWORD  dwInputLength 
)

Definition at line 226 of file CryptographyExt.cpp.

{
    BOOL retVal = FALSE;

    ASSERT(lpszOutputBuffer != NULL);
    ASSERT(dwOutputLength != 0);
    ASSERT(lpszInputBuffer != NULL);
    ASSERT(dwInputLength != 0);

    HCRYPTPROV hCryptProv = NULL;
    HCRYPTHASH hCryptHash = NULL;

    if (CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
    {
        if (CryptCreateHash(hCryptProv, nAlgorithm, NULL, 0, &hCryptHash))
        {
            if (CryptHashData(hCryptHash, lpszInputBuffer, dwInputLength, 0))
            {
                if (CryptGetHashParam(hCryptHash, HP_HASHVAL, lpszOutputBuffer, &dwOutputLength, 0))
                {
                    retVal = TRUE;
                }
                else
                {
                    TraceLastError(CRYPT_LIBRARY_NAME, _T("CryptGetHashParam"), GetLastError());
                }
            }
            else
            {
                TraceLastError(CRYPT_LIBRARY_NAME, _T("CryptHashData"), GetLastError());
            }
            VERIFY(CryptDestroyHash(hCryptHash));
        }
        else
        {
            TraceLastError(CRYPT_LIBRARY_NAME, _T("CryptCreateHash"), GetLastError());
        }
        VERIFY(CryptReleaseContext(hCryptProv, 0));
    }
    else
    {
        TraceLastError(CRYPT_LIBRARY_NAME, _T("CryptAcquireContext"), GetLastError());
    }

    return retVal;
}

Here is the call graph for this function:

Here is the caller graph for this function:

BOOL GetChecksumFile ( ALG_ID  nAlgorithm,
CString &  strResult,
CString  strPathName 
)

Definition at line 311 of file CryptographyExt.cpp.

{
    BOOL retVal = FALSE;
    const int nChecksumLength = ((CALG_MD5 == nAlgorithm) ? MD5CHECKSUM_LENGTH : SHA1CHECKSUM_LENGTH);

    DWORD dwOutput = nChecksumLength;
    BYTE* lpszOutput = new BYTE[nChecksumLength];

    BYTE* lpszInput = NULL;
    try
    {
        CFile pInputFile(strPathName, CFile::modeRead | CFile::typeBinary);
        const UINT dwInput = (UINT)pInputFile.GetLength();
        if (dwInput > 0)
        {
            lpszInput = new BYTE[dwInput];
            if (dwInput == pInputFile.Read(lpszInput, dwInput))
            {
                if (GetChecksumBuffer(nAlgorithm, lpszOutput, dwOutput, lpszInput, dwInput))
                {
                    LPTSTR lpszString = strResult.GetBufferSetLength(2 * nChecksumLength + 1);
                    if (ConvertBinaryToHexa(lpszString, 2 * nChecksumLength + 1, lpszOutput, dwOutput))
                    {
                        strResult.ReleaseBuffer();
                        retVal = TRUE;
                    }
                }
            }
        }
        pInputFile.Close();
    }
    catch (CFileException * pFileException)
    {
        TCHAR lpszError[MAX_STR_BUFFER] = { 0 };
        pFileException->GetErrorMessage(lpszError, MAX_STR_BUFFER);
        pFileException->Delete();
        OutputDebugString(lpszError);
        retVal = FALSE;
    }

    if (lpszInput != NULL)
    {
        delete lpszInput;
        lpszInput = NULL;
    }

    if (lpszOutput != NULL)
    {
        delete lpszOutput;
        lpszOutput = NULL;
    }

    return retVal;
}

Here is the call graph for this function:

Here is the caller graph for this function:

BOOL GetChecksumString ( ALG_ID  nAlgorithm,
CString &  strResult,
CString  strBuffer 
)

Definition at line 273 of file CryptographyExt.cpp.

{
    BOOL retVal = FALSE;
    const int nChecksumLength = ((CALG_MD5 == nAlgorithm) ? MD5CHECKSUM_LENGTH : SHA1CHECKSUM_LENGTH);

    DWORD dwOutput = nChecksumLength;
    BYTE* lpszOutput = new BYTE[nChecksumLength];

    const DWORD dwInput = (strBuffer.GetLength() + 1) * sizeof(TCHAR);
    BYTE* lpszInput = new BYTE[dwInput];
    ::CopyMemory(lpszInput, strBuffer.GetBuffer(), dwInput);
    strBuffer.ReleaseBuffer();

    if (GetChecksumBuffer(nAlgorithm, lpszOutput, dwOutput, lpszInput, dwInput))
    {
        LPTSTR lpszString = strResult.GetBufferSetLength(2 * nChecksumLength + 1);
        if (ConvertBinaryToHexa(lpszString, 2 * nChecksumLength + 1, lpszOutput, dwOutput))
        {
            strResult.ReleaseBuffer();
            retVal = TRUE;
        }
    }

    if (lpszInput != NULL)
    {
        delete lpszInput;
        lpszInput = NULL;
    }

    if (lpszOutput != NULL)
    {
        delete lpszOutput;
        lpszOutput = NULL;
    }

    return retVal;
}

Here is the call graph for this function:

Here is the caller graph for this function:

CString GetComputerID ( )

Definition at line 61 of file CryptographyExt.cpp.

{
    CString strComputerID;
    DWORD dwLength = MAX_STR_BUFFER;
    TCHAR lpszComputer[MAX_STR_BUFFER] = { 0 };
    if (GetComputerNameEx(ComputerNameDnsFullyQualified, lpszComputer, &dwLength))
    {
        lpszComputer[dwLength] = 0;
        strComputerID = lpszComputer;
    }
    else
    {
        if (GetComputerName(lpszComputer, &dwLength))
        {
            lpszComputer[dwLength] = 0;
            strComputerID = lpszComputer;
        }
        else
        {
            strComputerID =  _T("MihaiMoga");
        }
    }
    return strComputerID;
}

Here is the caller graph for this function:

void TraceLastError ( LPCTSTR  lpszLibrary,
LPCTSTR  lpszOperation,
DWORD  dwLastError 
)

Definition at line 35 of file CryptographyExt.cpp.

{
    //Display a message and the last error in the TRACE. 
    LPVOID lpszErrorBuffer = NULL;
    CString strLastError;

    ::FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER | 
        FORMAT_MESSAGE_FROM_SYSTEM | 
        FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL,
        dwLastError,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        (LPTSTR) &lpszErrorBuffer,
        0,
        NULL);

    strLastError.Format(_T("[%s] %s: %s\n"), lpszLibrary, lpszOperation, lpszErrorBuffer);

    // free alocated buffer by FormatMessage
    LocalFree(lpszErrorBuffer); 

    //Display the last error.
    OutputDebugString(strLastError);
}

Here is the caller graph for this function:

 All Classes Files Functions Variables Enumerator Defines