212 lines
4.2 KiB
C
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;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|