//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 1996 - 1999 // // File: makecat.cpp // // Contents: Microsoft Internet Security Catalog Utilities // // Functions: main // // History: 05-May-1999 reidk created // //-------------------------------------------------------------------------- #include #include #include #include #include #include #include "unicode.h" #include "wincrypt.h" #include "wintrust.h" #include "softpub.h" #include "mssip.h" #include "mscat.h" #include "dbgdef.h" #include "gendefs.h" #include "printfu.hxx" #include "cwargv.hxx" #include "resource.h" static void Usage(void) { printf("Usage: chckhash [options] filename\n"); printf("Options are:\n"); printf(" -? - This message\n"); printf(" -catdb - The catroot to search (default is the system DB)\n"); printf(" -r [0|1] - Called from regress, 0 implies not found is expected, 1 implies found is expected\n"); printf(" -l - Filename is a list of hyphen seperated files\n"); printf(" -p - Expect 'paused' failure\n"); printf("\n"); } int __cdecl main(int argc, char * argv[]) { int cMember; BYTE pbHash[40]; DWORD cbHash = sizeof(pbHash); HANDLE hFile; HCATINFO hCatInfo; BOOL fFileFound = FALSE; CATALOG_INFO sCatInfo; LPSTR pszGUID = NULL; LPWSTR pwszGUID = NULL; BOOL fCalledFromRegress = FALSE; BOOL fFoundExpected = FALSE; BOOL fFileList = FALSE; BOOL fExpectPaused = FALSE; char *pszFile = NULL; int iRet = 1; GUID guidPassedIn = DRIVER_ACTION_VERIFY; GUID *pguidCatRoot = NULL; HCATADMIN hCatAdmin = NULL; char *pChar = NULL; while (--argc>0) { if (**++argv == '-') { switch(argv[0][1]) { case 'c': case 'C': argv++; argc--; pszGUID = argv[0]; break; case 'r': case 'R': argv++; argc--; fCalledFromRegress = TRUE; fFoundExpected = (argv[0][0] == '1'); break; case 'l': case 'L': fFileList = TRUE; break; case 'p': case 'P': fExpectPaused = TRUE; break; case '?': default: Usage(); return 1; } } else { pszFile = argv[0]; } } SetLastError(0); // // get provider // if (pszGUID != NULL) { if (NULL == (pwszGUID = MkWStr(pszGUID))) { goto ErrorReturn; } if (!(wstr2guid(pwszGUID, &guidPassedIn))) { FreeWStr(pwszGUID); goto ErrorReturn; } FreeWStr(pwszGUID); } pguidCatRoot = &guidPassedIn; if (!(CryptCATAdminAcquireContext(&hCatAdmin, pguidCatRoot, 0))) { printf("CryptCATAdminAcquireContext failure\nGLE = %lx\n", GetLastError()); goto ErrorReturn; } while (pszFile != NULL) { if (fFileList) { pChar = strchr(pszFile, '-'); if (pChar != NULL) { *pChar = '\0'; } } // // Open the file who's hash is being looked up, then calculate its hash // if ((hFile = CreateFileA(pszFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE) { printf("Cannot open file\nGLE = %lx\n", GetLastError()); goto CATCloseError; } if (!CryptCATAdminCalcHashFromFileHandle(hFile, &cbHash, pbHash, 0)) { printf("Cannot calculate file hash\nGLE = %lx\n", GetLastError()); goto CATCloseError; } hCatInfo = NULL; while (hCatInfo = CryptCATAdminEnumCatalogFromHash(hCatAdmin, pbHash, cbHash, 0, &hCatInfo)) { fFileFound = TRUE; memset(&sCatInfo, 0x00, sizeof(CATALOG_INFO)); sCatInfo.cbStruct = sizeof(CATALOG_INFO); if (!(CryptCATCatalogInfoFromContext(hCatInfo, &sCatInfo, 0))) { // should do something (??) continue; } if (!fCalledFromRegress) { printf("%S contains %s\n", &sCatInfo.wszCatalogFile[0], pszFile); } } if (fCalledFromRegress) { if (fFileFound) { if (fFoundExpected) { printf("Succeeded\n"); iRet = 1; } else { printf("Failed: %s should NOT have been found\n", pszFile); iRet = 0; } } else { if (fFoundExpected) { printf("Failed: %s was not found: GLE - %lx\n", pszFile, GetLastError()); iRet = 0; } else if ((GetLastError() == ERROR_SHARING_PAUSED) && (fExpectPaused)) { printf("Succeeded\n"); iRet = 1; } else if (GetLastError() == ERROR_NOT_FOUND) { printf("Succeeded\n"); iRet = 1; } else { if (fExpectPaused) { printf("Failed: ERROR_SHARING_PAUSED expected, but got %lx\n", GetLastError()); } else { printf("Failed: ERROR_NOT_FOUND expected, but got %lx\n", GetLastError()); } } } } else if (!fFileFound) { printf("There are no catalog files registered that contain %s: GLE - %lx\n", pszFile, GetLastError()); } if (fFileList) { if (pChar != NULL) { pszFile = ((LPSTR) pChar) + 1; } else { pszFile = NULL; } } else { pszFile = NULL; } } CommonReturn: if (hCatAdmin) { CryptCATAdminReleaseContext(hCatAdmin, 0); } return(iRet); ErrorReturn: iRet = 0; goto CommonReturn; TRACE_ERROR_EX(DBG_SS_APP, CATCloseError); }