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.
260 lines
6.3 KiB
260 lines
6.3 KiB
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 1996 - 1999
|
|
//
|
|
// File: hshstrss.cpp
|
|
//
|
|
// Contents: Hashing Stress
|
|
//
|
|
// History: 21-Nov-1997 pberkman created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
#include "global.hxx"
|
|
|
|
#include "crypthlp.h"
|
|
|
|
|
|
BOOL _HashFile(HANDLE hFile, HCRYPTPROV hProv, char *pszFile);
|
|
|
|
BOOL fVerbose = FALSE;
|
|
DWORD dwTotalBytes = 0;
|
|
|
|
extern "C" int __cdecl wmain(int argc, WCHAR **wargv)
|
|
{
|
|
cWArgv_ *pArgs;
|
|
WCHAR *pwszFile;
|
|
BOOL fFailed;
|
|
DWORD dwTotal;
|
|
HANDLE hFile;
|
|
int iRet;
|
|
|
|
BOOL fFind;
|
|
HANDLE hFind;
|
|
WIN32_FIND_DATA sFindData;
|
|
HCRYPTPROV hProv;
|
|
|
|
COleDateTime tStart;
|
|
COleDateTime tEnd;
|
|
COleDateTimeSpan tsTotal;
|
|
|
|
iRet = 1; // cmd fail
|
|
dwTotal = 0;
|
|
hFind = INVALID_HANDLE_VALUE;
|
|
|
|
if (!(pArgs = new cWArgv_((HINSTANCE)GetModuleHandle(NULL), &fFailed)))
|
|
{
|
|
goto MemoryError;
|
|
}
|
|
|
|
if (fFailed)
|
|
{
|
|
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);
|
|
|
|
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));
|
|
|
|
if (!(pwszFile = pArgs->GetFileName()))
|
|
{
|
|
wprintf(L"%s", pArgs->GetUsageString());
|
|
goto ParamError;
|
|
}
|
|
|
|
//
|
|
// start our timer
|
|
//
|
|
tStart = COleDateTime::GetCurrentTime();
|
|
|
|
if (fVerbose)
|
|
{
|
|
printf("\nProcessing:");
|
|
}
|
|
|
|
char szFile[MAX_PATH];
|
|
|
|
szFile[0] = NULL;
|
|
WideCharToMultiByte(0, 0, pwszFile, -1, &szFile[0], MAX_PATH, NULL, NULL);
|
|
|
|
if ((hFind = FindFirstFile(&szFile[0], &sFindData)) == INVALID_HANDLE_VALUE)
|
|
{
|
|
goto FileFindError;
|
|
}
|
|
|
|
fFind = TRUE;
|
|
|
|
hProv = I_CryptGetDefaultCryptProv(0);
|
|
|
|
while (fFind)
|
|
{
|
|
if (!(sFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
|
|
{
|
|
hFile = CreateFile(sFindData.cFileName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
|
|
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
|
|
if (hFile != INVALID_HANDLE_VALUE)
|
|
{
|
|
if (_HashFile(hFile, hProv, sFindData.cFileName))
|
|
{
|
|
dwTotal++;
|
|
}
|
|
}
|
|
}
|
|
|
|
fFind = FindNextFile(hFind, &sFindData);
|
|
}
|
|
|
|
//
|
|
// end timer
|
|
//
|
|
tEnd = COleDateTime::GetCurrentTime();
|
|
tsTotal = tEnd - tStart;
|
|
|
|
printf("\n");
|
|
printf("\nTiming:");
|
|
printf("\nTotal files: %ld", dwTotal);
|
|
printf("\nProcessing time: %s", (LPCSTR)tsTotal.Format("%D:%H:%M:%S"));
|
|
printf("\nAverage per file: %f", (double)tsTotal.GetTotalSeconds() / (double)dwTotal);
|
|
printf("\nTotal bytes: %ld (k)", dwTotalBytes / 1000L);
|
|
printf("\nAverage per (k): %f", (double)tsTotal.GetTotalSeconds() / (double)(dwTotalBytes / 1000L));
|
|
printf("\nAverage bytes per file (k): %f", (double)(dwTotalBytes / 1000L) / (double)dwTotal);
|
|
printf("\n");
|
|
|
|
iRet = 0;
|
|
|
|
CommonReturn:
|
|
DELETE_OBJECT(pArgs);
|
|
|
|
if (hFind != INVALID_HANDLE_VALUE)
|
|
{
|
|
FindClose(hFind);
|
|
}
|
|
|
|
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, FileFindError);
|
|
TRACE_ERROR_EX(DBG_SS_APP, NeededHelp);
|
|
}
|
|
|
|
|
|
BOOL _HashFile(HANDLE hFile, HCRYPTPROV hProv, char *pszFile)
|
|
{
|
|
HCRYPTHASH hHash;
|
|
DWORD cbHash;
|
|
BYTE bHash[30];
|
|
BYTE *pbFile;
|
|
DWORD cbFile;
|
|
HANDLE hMappedFile;
|
|
BOOL fRet;
|
|
|
|
pbFile = NULL;
|
|
hMappedFile = NULL;
|
|
hHash = NULL;
|
|
|
|
if (fVerbose)
|
|
{
|
|
printf("\n %s ", pszFile);
|
|
}
|
|
|
|
hMappedFile = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
|
|
|
|
if (!(hMappedFile) || (hMappedFile == INVALID_HANDLE_VALUE))
|
|
{
|
|
hMappedFile = NULL;
|
|
goto CreateMapError;
|
|
}
|
|
|
|
if (!(pbFile = (BYTE *)MapViewOfFile(hMappedFile, FILE_MAP_READ, 0, 0, 0)))
|
|
{
|
|
goto MapViewError;
|
|
}
|
|
|
|
cbFile = GetFileSize(hFile, NULL);
|
|
|
|
if (!(CryptCreateHash(hProv, CALG_SHA1, NULL, 0, &hHash)))
|
|
{
|
|
goto CreateHashError;
|
|
}
|
|
|
|
if (!(CryptHashData(hHash, pbFile, cbFile, 0)))
|
|
{
|
|
goto HashDataError;
|
|
}
|
|
|
|
cbHash = 30;
|
|
|
|
if (!(CryptGetHashParam(hHash, HP_HASHVAL, bHash, &cbHash, 0)))
|
|
{
|
|
goto HashParamError;
|
|
}
|
|
|
|
dwTotalBytes += cbFile;
|
|
|
|
if (fVerbose)
|
|
{
|
|
DWORD i;
|
|
|
|
for (i = 0; i < cbHash; i++)
|
|
{
|
|
printf("%02.2X", bHash[i]);
|
|
}
|
|
}
|
|
|
|
fRet = TRUE;
|
|
|
|
CommonReturn:
|
|
|
|
if (hHash)
|
|
{
|
|
CryptDestroyHash(hHash);
|
|
}
|
|
|
|
if (hMappedFile)
|
|
{
|
|
CloseHandle(hMappedFile);
|
|
}
|
|
|
|
if (pbFile)
|
|
{
|
|
UnmapViewOfFile(pbFile);
|
|
}
|
|
|
|
return(fRet);
|
|
|
|
ErrorReturn:
|
|
if (fVerbose)
|
|
{
|
|
printf("*failed*");
|
|
}
|
|
|
|
fRet = FALSE;
|
|
goto CommonReturn;
|
|
|
|
TRACE_ERROR_EX(DBG_SS_APP, CreateMapError);
|
|
TRACE_ERROR_EX(DBG_SS_APP, MapViewError);
|
|
TRACE_ERROR_EX(DBG_SS_APP, CreateHashError);
|
|
TRACE_ERROR_EX(DBG_SS_APP, HashDataError);
|
|
TRACE_ERROR_EX(DBG_SS_APP, HashParamError);
|
|
}
|