windows-nt/Source/XPSP1/NT/base/ntsetup/win95upg/tools/signcabs/signcabs.c
2020-09-26 16:20:57 +08:00

212 lines
4.2 KiB
C

/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
signcabs.c
Abstract:
Signcabs enumerates all of the cabinet files in a directory, expands them, and creates the .lst file
neeeded by the build signing tools.
Author:
Marc R. Whitten (marcw) 31-Jul-1998
Revision History:
--*/
#include "pch.h"
BOOL
Init (
VOID
)
{
HINSTANCE hInstance;
hInstance = GetModuleHandle (NULL);
return TRUE;
}
VOID
Terminate (
VOID
)
{
HINSTANCE hInstance;
hInstance = GetModuleHandle (NULL);
}
BOOL
pDeleteAllFiles (
IN PCWSTR DirPath
)
{
TREE_ENUM e;
BOOL dirsFirst = FALSE;
if (EnumFirstFileInTree (&e, DirPath, TEXT("*"), dirsFirst)) {
do {
if (e.Directory) {
pDeleteAllFiles (e.FullPath);
SetFileAttributes (e.FullPath, FILE_ATTRIBUTE_NORMAL);
RemoveDirectory (e.FullPath);
}
else {
SetFileAttributes (e.FullPath, FILE_ATTRIBUTE_NORMAL);
DeleteFile (e.FullPath);
}
} while (EnumNextFileInTree (&e));
}
return TRUE;
}
void
usage (
VOID
)
{
printf (
"Command Line Usage:\n"
"signcabs [-ch] [filedir] [tempdir]\n\n"
" -c - Clean out temporary directory if it exists.\n"
" -h - This message.\n"
" filedir - Directory containing files to be processed.\n"
" tempdir - Directory to store results.\n"
);
}
INT
__cdecl
wmain (
INT argc,
WCHAR *argv[]
)
{
PWSTR tempDir = NULL;
PWSTR fileDir = NULL;
TREE_ENUM e;
HANDLE h = INVALID_HANDLE_VALUE;
PWSTR listFilePath;
BOOL clean = FALSE;
INT i;
if (!Init()) {
wprintf (L"Unable to initialize!\n");
return 255;
}
//
// Parse command line.
//
for (i = 1; i < argc; i++) {
if (argv[i][0] == L'-' || argv[i][0] == L'\\') {
switch (argv[i][1]) {
case L'c': case L'C':
clean = TRUE;
break;
default:
usage();
return 0;
break;
}
}
else if (!fileDir) {
fileDir = argv[i];
}
else if (!tempDir) {
tempDir = argv[i];
}
else {
usage();
return 0;
}
}
//
// One of the nice things about writing the tool is that you get to create silly
// defaults that only work for you.
//
if (!tempDir) tempDir = L"e:\\signcabs";
if (!fileDir) fileDir = L"e:\\nt\\private\\redist\\migdlls\\mapi";
//
// First, check to see if the temporary directory exists.
//
if (CreateDirectory (tempDir, NULL) == 0) {
if (GetLastError () == ERROR_ALREADY_EXISTS) {
if (clean) {
pDeleteAllFiles (tempDir);
}
}
else {
wprintf (L"SIGNCABS: Cannot create directory %ws. (gle: %d)\n", tempDir, GetLastError ());
}
}
wprintf (L"SIGNCABS: Creating .lst file for all cabs found under %ws.\n",fileDir);
if (!ExpandAllFiles (fileDir, tempDir)) {
wprintf (L"SIGNCABS: Error while expanding cabinet files from %ws to %ws (%d)\n",fileDir, tempDir, GetLastError ());
}
//
// Now, enumerate through all of the files and create the lst file.
//
listFilePath = JoinPaths (tempDir, L"cabs.lst");
h = CreateFile (listFilePath, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (h == INVALID_HANDLE_VALUE) {
wprintf (L"SIGNCABS: Error while trying to create %ws. (%d)\n", listFilePath, GetLastError());
return GetLastError();
}
FreePathString (listFilePath);
if (EnumFirstFileInTree (&e, tempDir, TEXT("*"), FALSE)) {
do {
if (!e.Directory) {
WriteFileString (h, L"<hash>");
WriteFileString (h, e.FullPath);
WriteFileString (h, L"=");
WriteFileString (h, e.FullPath);
WriteFileString (h, L"\r\n");
}
} while (EnumNextFileInTree (&e));
}
CloseHandle (h);
wprintf (L"SIGNCABS: Done.\n");
Terminate();
return 0;
}