mirror of
https://github.com/reactos/reactos.git
synced 2024-10-30 11:35:58 +00:00
225 lines
5.6 KiB
C
225 lines
5.6 KiB
C
/*
|
|
* ReactOS kernel
|
|
* Copyright (C) 2003, 2006 ReactOS Team
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*/
|
|
/*
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
* PROJECT: ReactOS hive maker
|
|
* FILE: tools/mkhive/mkhive.c
|
|
* PURPOSE: Hive maker
|
|
* PROGRAMMERS: Eric Kohl
|
|
* Hervé Poussineau
|
|
* Hermès Bélusca-Maïto
|
|
*/
|
|
|
|
/* INCLUDES *****************************************************************/
|
|
|
|
#include <limits.h>
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
|
|
#include "mkhive.h"
|
|
|
|
#ifdef _MSC_VER
|
|
#include <stdlib.h>
|
|
#define PATH_MAX _MAX_PATH
|
|
#endif // _MSC_VER
|
|
|
|
#ifndef _WIN32
|
|
#ifndef PATH_MAX
|
|
#define PATH_MAX 260
|
|
#endif
|
|
#define DIR_SEPARATOR_CHAR '/'
|
|
#define DIR_SEPARATOR_STRING "/"
|
|
#else
|
|
#define DIR_SEPARATOR_CHAR '\\'
|
|
#define DIR_SEPARATOR_STRING "\\"
|
|
#endif
|
|
|
|
/* FUNCTIONS ****************************************************************/
|
|
|
|
void usage(void)
|
|
{
|
|
printf("Usage: mkhive [-?] -h:hive1[,hiveN...] [-u] -d:<dstdir> <inffiles>\n\n"
|
|
" -h:hiveN - Comma-separated list of hives to create. Possible values are:\n"
|
|
" SETUPREG, SYSTEM, SOFTWARE, DEFAULT, SAM, SECURITY, BCD.\n"
|
|
" -u - Generate file names in uppercase (default: lowercase) (TEMPORARY FLAG!).\n"
|
|
" -d:dstdir - The binary hive files are created in this directory.\n"
|
|
" inffiles - List of INF files with full path.\n"
|
|
" -? - Displays this help screen.\n");
|
|
}
|
|
|
|
void convert_path(char *dst, char *src)
|
|
{
|
|
int i;
|
|
|
|
i = 0;
|
|
while (src[i] != 0)
|
|
{
|
|
#ifdef _WIN32
|
|
if (src[i] == '/')
|
|
{
|
|
dst[i] = '\\';
|
|
}
|
|
#else
|
|
if (src[i] == '\\')
|
|
{
|
|
dst[i] = '/';
|
|
}
|
|
#endif
|
|
else
|
|
{
|
|
dst[i] = src[i];
|
|
}
|
|
|
|
i++;
|
|
}
|
|
dst[i] = 0;
|
|
}
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
INT ret;
|
|
INT i;
|
|
PSTR ptr;
|
|
BOOL UpperCaseFileName = FALSE;
|
|
PCSTR HiveList = NULL;
|
|
CHAR DestPath[PATH_MAX] = "";
|
|
CHAR FileName[PATH_MAX];
|
|
|
|
if (argc < 4)
|
|
{
|
|
usage();
|
|
return -1;
|
|
}
|
|
|
|
printf("Binary hive maker\n");
|
|
|
|
/* Read the options */
|
|
for (i = 1; i < argc && *argv[i] == '-'; i++)
|
|
{
|
|
if (argv[i][1] == '?' && argv[i][2] == 0)
|
|
{
|
|
usage();
|
|
return 0;
|
|
}
|
|
|
|
if (argv[i][1] == 'u' && argv[i][2] == 0)
|
|
{
|
|
UpperCaseFileName = TRUE;
|
|
}
|
|
else
|
|
if (argv[i][1] == 'h' && (argv[i][2] == ':' || argv[i][2] == '='))
|
|
{
|
|
HiveList = argv[i] + 3;
|
|
}
|
|
else if (argv[i][1] == 'd' && (argv[i][2] == ':' || argv[i][2] == '='))
|
|
{
|
|
convert_path(DestPath, argv[i] + 3);
|
|
}
|
|
else
|
|
{
|
|
fprintf(stderr, "Unrecognized option: %s\n", argv[i]);
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
/* Check whether we have all the parameters needed */
|
|
if (!HiveList || !*HiveList)
|
|
{
|
|
fprintf(stderr, "The mandatory list of hives is missing.\n");
|
|
return -1;
|
|
}
|
|
if (!*DestPath)
|
|
{
|
|
fprintf(stderr, "The mandatory output directory is missing.\n");
|
|
return -1;
|
|
}
|
|
if (i >= argc)
|
|
{
|
|
fprintf(stderr, "Not enough parameters, or the list of INF files is missing.\n");
|
|
return -1;
|
|
}
|
|
|
|
/* Initialize the registry */
|
|
RegInitializeRegistry(HiveList);
|
|
|
|
/* Default to failure */
|
|
ret = -1;
|
|
|
|
/* Now we should have the list of INF files: parse it */
|
|
for (; i < argc; ++i)
|
|
{
|
|
convert_path(FileName, argv[i]);
|
|
if (!ImportRegistryFile(FileName))
|
|
goto Quit;
|
|
}
|
|
|
|
for (i = 0; i < MAX_NUMBER_OF_REGISTRY_HIVES; ++i)
|
|
{
|
|
/* Skip this registry hive if it's not in the list */
|
|
if (!strstr(HiveList, RegistryHives[i].HiveName))
|
|
continue;
|
|
|
|
strcpy(FileName, DestPath);
|
|
strcat(FileName, DIR_SEPARATOR_STRING);
|
|
|
|
ptr = FileName + strlen(FileName);
|
|
|
|
strcat(FileName, RegistryHives[i].HiveName);
|
|
|
|
/* Exception for the special setup registry hive */
|
|
// if (strcmp(RegistryHives[i].HiveName, "SETUPREG") == 0)
|
|
if (i == 0)
|
|
strcat(FileName, ".HIV");
|
|
|
|
/* Adjust file name case if needed */
|
|
if (UpperCaseFileName)
|
|
{
|
|
for (; *ptr; ++ptr)
|
|
*ptr = toupper(*ptr);
|
|
}
|
|
else
|
|
{
|
|
for (; *ptr; ++ptr)
|
|
*ptr = tolower(*ptr);
|
|
}
|
|
|
|
if (!ExportBinaryHive(FileName, RegistryHives[i].CmHive))
|
|
goto Quit;
|
|
|
|
/* If we happen to deal with the special setup registry hive, stop there */
|
|
// if (strcmp(RegistryHives[i].HiveName, "SETUPREG") == 0)
|
|
if (i == 0)
|
|
break;
|
|
}
|
|
|
|
/* Success */
|
|
ret = 0;
|
|
|
|
Quit:
|
|
/* Shut down the registry */
|
|
RegShutdownRegistry();
|
|
|
|
if (ret == 0)
|
|
printf(" Done.\n");
|
|
|
|
return ret;
|
|
}
|
|
|
|
/* EOF */
|