Windows2000/private/ispu/pkitrust/tools/makecat/makecat.cpp
2020-09-30 17:12:32 +02:00

279 lines
8.2 KiB
C++

// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996 - 1999
// File: makecat.cpp
// Contents: Microsoft Internet Security Catalog Utilities
// Functions: wmain
// History: 05-May-1997 pberkman created
#include <stdio.h>
#include <windows.h>
#include <io.h>
#include <wchar.h>
#include "unicode.h"
#include "wincrypt.h"
#include "wintrust.h"
#include "mssip.h"
#include "mscat.h"
#include "dbgdef.h"
#include "gendefs.h"
#include "printfu.hxx"
#include "cwargv.hxx"
#include "resource.h"
BOOL fVerbose = FALSE;
BOOL fFailAllErrors = FALSE;
BOOL fParseError = FALSE;
BOOL fTesting = FALSE;
DWORD dwExpectedError = 0;
WCHAR *pwszCDFFile = NULL;
PrintfU_ *pPrint = NULL;
int iRet = 0;
void WINAPI DisplayParseError(DWORD dwErrorArea, DWORD dwLocalError, WCHAR *wszName);
extern "C" CRYPTCATATTRIBUTE * WINAPI CryptCATCDFEnumAttributesWithCDFTag(CRYPTCATCDF *pCDF, LPWSTR pwszMemberTag, CRYPTCATMEMBER *pMember,
CRYPTCATATTRIBUTE *pPrevAttr,
PFN_CDF_PARSE_ERROR_CALLBACK pfnParseError);
extern "C" LPWSTR WINAPI CryptCATCDFEnumMembersByCDFTagEx(CRYPTCATCDF *pCDF, LPWSTR pwszPrevCDFTag,
PFN_CDF_PARSE_ERROR_CALLBACK pfnParseError,
CRYPTCATMEMBER** ppMember, BOOL fContinueOnError,
LPVOID pvReserved);
extern "C" int __cdecl wmain(int argc, WCHAR **wargv)
{
int cMember;
cWArgv_ *pArgs;
CRYPTCATCDF *pCDF;
CRYPTCATMEMBER *pMember;
LPWSTR pwszMemberTag;
CRYPTCATATTRIBUTE *pAttr;
BOOL fContinueOnError;
pCDF = NULL;
if (!(pArgs = new cWArgv_((HINSTANCE)GetModuleHandle(NULL))))
{
goto MemoryError;
}
pArgs->AddUsageText(IDS_USAGETEXT_USAGE, IDS_USAGETEXT_OPTIONS,
IDS_USAGETEXT_CMDFILE, IDS_USAGETEXT_ADD,
IDS_USAGETEXT_OPTPARAM);
pArgs->Add2List(IDS_PARAM_HELP, IDS_PARAMTEXT_HELP, WARGV_VALUETYPE_BOOL, (void *)FALSE);
pArgs->Add2List(IDS_PARAM_VERBOSE, IDS_PARAMTEXT_VERBOSE, WARGV_VALUETYPE_BOOL, (void *)FALSE);
pArgs->Add2List(IDS_PARAM_FAILALWAYS, IDS_PARAMTEXT_FAILALWAYS, WARGV_VALUETYPE_BOOL, (void *)FALSE);
pArgs->Add2List(IDS_PARAM_EXPERROR, IDS_PARAMTEXT_EXPERROR, WARGV_VALUETYPE_DWORDH, NULL, TRUE);
pArgs->Add2List(IDS_PARAM_NOSTOPONERROR, IDS_PARAMTEXT_NOSTOPONERROR, WARGV_VALUETYPE_BOOL, (void *)FALSE);
pArgs->Fill(argc, wargv);
if (!(pArgs->Fill(argc, wargv)) ||
(pArgs->GetValue(IDS_PARAM_HELP)))
{
wprintf(L"%s", pArgs->GetUsageString());
goto NeededHelp;
}
fVerbose = (BOOL)((DWORD_PTR)pArgs->GetValue(IDS_PARAM_VERBOSE));
fFailAllErrors = (BOOL)((DWORD_PTR)pArgs->GetValue(IDS_PARAM_FAILALWAYS));
fContinueOnError = (BOOL)((DWORD_PTR)pArgs->GetValue(IDS_PARAM_NOSTOPONERROR));
if (pArgs->IsSet(IDS_PARAM_EXPERROR))
{
dwExpectedError = (DWORD)((DWORD_PTR)pArgs->GetValue(IDS_PARAM_EXPERROR));
fTesting = TRUE;
}
if (!(pwszCDFFile = pArgs->GetFileName()))
{
wprintf(L"%s", pArgs->GetUsageString());
goto ParamError;
}
pPrint = new PrintfU_;
if (pPrint == NULL)
{
goto MemoryError;
}
SetLastError(0);
if (!(pCDF = CryptCATCDFOpen(pwszCDFFile, DisplayParseError)))
{
if (fVerbose)
{
pPrint->Display(IDS_ERROR_FUNCTION, L"CryptCATCDFOpen", GetLastError());
}
goto CDFOpenError;
}
if (fVerbose)
{
pPrint->Display(IDS_STATUS_FMT, pPrint->get_String(IDS_STATUS_OPENED), pwszCDFFile);
}
pAttr = NULL;
while (pAttr = CryptCATCDFEnumCatAttributes(pCDF, pAttr, DisplayParseError))
{
if (fVerbose)
{
pPrint->Display(IDS_STATUS_FMT, pPrint->get_String(IDS_STATUS_ATTR),
pAttr->pwszReferenceTag);
}
}
pMember = NULL;
pwszMemberTag = NULL;
cMember = 0;
while (pwszMemberTag = CryptCATCDFEnumMembersByCDFTagEx(pCDF, pwszMemberTag, DisplayParseError, &pMember, fContinueOnError, NULL))
{
if (fVerbose)
{
pPrint->Display(IDS_STATUS_FMT, pPrint->get_String(IDS_STATUS_PROCESSED), pwszMemberTag);
}
cMember++;
pAttr = NULL;
while (pAttr = CryptCATCDFEnumAttributesWithCDFTag(pCDF, pwszMemberTag, pMember, pAttr, DisplayParseError))
{
if (fVerbose)
{
pPrint->Display(IDS_STATUS_FMT, pPrint->get_String(IDS_STATUS_ATTR),
pAttr->pwszReferenceTag);
}
}
}
if ((fVerbose) && (cMember == 0))
{
pPrint->Display(IDS_ERROR_FUNCTION, pPrint->get_String(IDS_ERROR_NOMEMBERS), GetLastError());
}
if (!(CryptCATCDFClose(pCDF)))
{
if (fVerbose)
{
pPrint->Display(IDS_ERROR_FUNCTION, L"CryptCATCDFClose", GetLastError());
}
if (fFailAllErrors)
{
goto CATCloseError;
}
}
if (fTesting)
{
pPrint->Display(IDS_FILEREF, pwszCDFFile);
if (GetLastError() != dwExpectedError)
{
iRet = 1;
pPrint->Display(IDS_EXPECTED_HRESULT, dwExpectedError, GetLastError());
}
else
{
iRet = 0;
pPrint->Display(IDS_STATUS_FMT, pPrint->get_String(IDS_SUCCEEDED), L"");
}
}
else if ((cMember > 0) && (!(fParseError)))
{
pPrint->Display(IDS_STATUS_FMT, pPrint->get_String(IDS_SUCCEEDED), L"");
}
else
{
if (fParseError)
{
pPrint->Display(IDS_ERROR_PARSE);
}
else
{
pPrint->Display(IDS_FAILED, GetLastError(), GetLastError());
}
iRet = 1;
}
if ((fFailAllErrors) && (cMember == 0) && !(fTesting))
{
iRet = 1;
}
CommonReturn:
DELETE_OBJECT(pArgs);
DELETE_OBJECT(pPrint);
return(iRet);
ErrorReturn:
iRet = 1;
goto CommonReturn;
TRACE_ERROR_EX(DBG_SS_APP, MemoryError);
TRACE_ERROR_EX(DBG_SS_APP, ParamError);
TRACE_ERROR_EX(DBG_SS_APP, NeededHelp);
TRACE_ERROR_EX(DBG_SS_APP, CATCloseError);
TRACE_ERROR_EX(DBG_SS_APP, CDFOpenError);
}
void WINAPI DisplayParseError(DWORD dwWhichArea, DWORD dwLocalError, WCHAR *pwszLine)
{
DWORD idErr;
DWORD idFmt;
fParseError = TRUE;
switch (dwWhichArea)
{
case CRYPTCAT_E_AREA_HEADER: idFmt = IDS_PARSE_E_HEADER_FMT; break;
case CRYPTCAT_E_AREA_MEMBER: idFmt = IDS_PARSE_E_MEMBER_FMT; break;
case CRYPTCAT_E_AREA_ATTRIBUTE: idFmt = IDS_PARSE_E_ATTRIBUTE_FMT; break;
default: idFmt = IDS_PARSE_E_ATTRIBUTE_FMT; break;
}
switch (dwLocalError)
{
case CRYPTCAT_E_CDF_MEMBER_FILE_PATH: idErr = IDS_PARSE_ERROR_FILE_PATH; break;
case CRYPTCAT_E_CDF_MEMBER_INDIRECTDATA: idErr = IDS_PARSE_ERROR_INDIRECTDATA; break;
case CRYPTCAT_E_CDF_MEMBER_FILENOTFOUND: idErr = IDS_PARSE_ERROR_FILENOTFOUND; break;
case CRYPTCAT_E_CDF_BAD_GUID_CONV: idErr = IDS_PARSE_ERROR_GUID_CONV; break;
case CRYPTCAT_E_CDF_ATTR_TYPECOMBO: idErr = IDS_PARSE_ERROR_TYPECOMBO; break;
case CRYPTCAT_E_CDF_ATTR_TOOFEWVALUES: idErr = IDS_PARSE_ERROR_TOOFEWVALUES; break;
case CRYPTCAT_E_CDF_UNSUPPORTED: idErr = IDS_PARSE_ERROR_UNSUPPORTED; break;
case CRYPTCAT_E_CDF_DUPLICATE: idErr = IDS_PARSE_ERROR_DUPLICATE; break;
case CRYPTCAT_E_CDF_TAGNOTFOUND: idErr = IDS_PARSE_ERROR_NOTAG; break;
default: idErr = IDS_PARSE_ERROR_UNKNOWN; break;
}
pPrint->Display(idFmt, pPrint->get_String(idErr), pwszLine);
if (fFailAllErrors)
{
iRet = 1;
}
}