[FORMATTING] Fix spaces/tabs mess

No code change.

svn path=/trunk/; revision=28667
This commit is contained in:
Hervé Poussineau 2007-08-30 08:38:30 +00:00
parent 157fa523ae
commit 7395ac2cc6
2 changed files with 439 additions and 432 deletions

View file

@ -49,127 +49,126 @@
void usage (void)
{
printf ("Usage: mkhive <srcdir> <dstdir> [addinf]\n\n");
printf (" srcdir - inf files are read from this directory\n");
printf (" dstdir - binary hive files are created in this directory\n");
printf (" addinf - additional inf files with full path\n");
printf ("Usage: mkhive <srcdir> <dstdir> [addinf]\n\n");
printf (" srcdir - inf files are read from this directory\n");
printf (" dstdir - binary hive files are created in this directory\n");
printf (" addinf - additional inf files with full path\n");
}
void convert_path(char *dst, char *src)
{
int i;
int i;
i = 0;
while (src[i] != 0)
{
i = 0;
while (src[i] != 0)
{
#ifdef WINDOWS_HOST
if (src[i] == '/')
{
dst[i] = '\\';
}
if (src[i] == '/')
{
dst[i] = '\\';
}
#else
if (src[i] == '\\')
{
dst[i] = '/';
}
if (src[i] == '\\')
{
dst[i] = '/';
}
#endif
else
{
dst[i] = src[i];
else
{
dst[i] = src[i];
}
i++;
}
i++;
}
dst[i] = 0;
dst[i] = 0;
}
int main (int argc, char *argv[])
{
char FileName[PATH_MAX];
int Param;
char FileName[PATH_MAX];
int Param;
printf ("Binary hive maker\n");
printf ("Binary hive maker\n");
if (argc < 3)
{
usage ();
return 1;
}
if (argc < 3)
{
usage ();
return 1;
}
RegInitializeRegistry ();
RegInitializeRegistry ();
convert_path (FileName, argv[1]);
strcat (FileName, DIR_SEPARATOR_STRING);
strcat (FileName, "hivesys.inf");
ImportRegistryFile (FileName);
convert_path (FileName, argv[1]);
strcat (FileName, DIR_SEPARATOR_STRING);
strcat (FileName, "hivesys.inf");
ImportRegistryFile (FileName);
convert_path (FileName, argv[1]);
strcat (FileName, DIR_SEPARATOR_STRING);
strcat (FileName, "hivecls.inf");
ImportRegistryFile (FileName);
convert_path (FileName, argv[1]);
strcat (FileName, DIR_SEPARATOR_STRING);
strcat (FileName, "hivecls.inf");
ImportRegistryFile (FileName);
convert_path (FileName, argv[1]);
strcat (FileName, DIR_SEPARATOR_STRING);
strcat (FileName, "hivesft.inf");
ImportRegistryFile (FileName);
convert_path (FileName, argv[1]);
strcat (FileName, DIR_SEPARATOR_STRING);
strcat (FileName, "hivesft.inf");
ImportRegistryFile (FileName);
convert_path (FileName, argv[1]);
strcat (FileName, DIR_SEPARATOR_STRING);
strcat (FileName, "hivedef.inf");
ImportRegistryFile (FileName);
convert_path (FileName, argv[1]);
strcat (FileName, DIR_SEPARATOR_STRING);
strcat (FileName, "hivedef.inf");
ImportRegistryFile (FileName);
for (Param = 3; Param < argc; Param++)
{
convert_path (FileName, argv[Param]);
ImportRegistryFile (FileName);
}
for (Param = 3; Param < argc; Param++)
{
convert_path (FileName, argv[Param]);
ImportRegistryFile (FileName);
}
convert_path (FileName, argv[2]);
strcat (FileName, DIR_SEPARATOR_STRING);
strcat (FileName, "default");
if (!ExportBinaryHive (FileName, &DefaultHive))
{
return 1;
}
convert_path (FileName, argv[2]);
strcat (FileName, DIR_SEPARATOR_STRING);
strcat (FileName, "default");
if (!ExportBinaryHive (FileName, &DefaultHive))
{
return 1;
}
convert_path (FileName, argv[2]);
strcat (FileName, DIR_SEPARATOR_STRING);
strcat (FileName, "sam");
if (!ExportBinaryHive (FileName, &SamHive))
{
return 1;
}
convert_path (FileName, argv[2]);
strcat (FileName, DIR_SEPARATOR_STRING);
strcat (FileName, "sam");
if (!ExportBinaryHive (FileName, &SamHive))
{
return 1;
}
convert_path (FileName, argv[2]);
strcat (FileName, DIR_SEPARATOR_STRING);
strcat (FileName, "security");
if (!ExportBinaryHive (FileName, &SecurityHive))
{
return 1;
}
convert_path (FileName, argv[2]);
strcat (FileName, DIR_SEPARATOR_STRING);
strcat (FileName, "security");
if (!ExportBinaryHive (FileName, &SecurityHive))
{
return 1;
}
convert_path (FileName, argv[2]);
strcat (FileName, DIR_SEPARATOR_STRING);
strcat (FileName, "software");
if (!ExportBinaryHive (FileName, &SoftwareHive))
{
return 1;
}
convert_path (FileName, argv[2]);
strcat (FileName, DIR_SEPARATOR_STRING);
strcat (FileName, "software");
if (!ExportBinaryHive (FileName, &SoftwareHive))
{
return 1;
}
convert_path (FileName, argv[2]);
strcat (FileName, DIR_SEPARATOR_STRING);
strcat (FileName, "system");
if (!ExportBinaryHive (FileName, &SystemHive))
{
return 1;
}
convert_path (FileName, argv[2]);
strcat (FileName, DIR_SEPARATOR_STRING);
strcat (FileName, "system");
if (!ExportBinaryHive (FileName, &SystemHive))
{
return 1;
}
// RegShutdownRegistry ();
//RegShutdownRegistry ();
printf (" Done.\n");
printf (" Done.\n");
return 0;
return 0;
}
/* EOF */

View file

@ -53,33 +53,33 @@
static BOOL
GetRootKey (PCHAR Name)
{
if (!strcasecmp (Name, "HKCR"))
{
strcpy (Name, "\\Registry\\Machine\\SOFTWARE\\Classes\\");
return TRUE;
}
if (!strcasecmp (Name, "HKCR"))
{
strcpy (Name, "\\Registry\\Machine\\SOFTWARE\\Classes\\");
return TRUE;
}
if (!strcasecmp (Name, "HKCU"))
{
strcpy (Name, "\\Registry\\User\\.DEFAULT\\");
return TRUE;
}
if (!strcasecmp (Name, "HKCU"))
{
strcpy (Name, "\\Registry\\User\\.DEFAULT\\");
return TRUE;
}
if (!strcasecmp (Name, "HKLM"))
{
strcpy (Name, "\\Registry\\Machine\\");
return TRUE;
}
if (!strcasecmp (Name, "HKLM"))
{
strcpy (Name, "\\Registry\\Machine\\");
return TRUE;
}
if (!strcasecmp (Name, "HKU"))
{
strcpy (Name, "\\Registry\\User\\");
return TRUE;
}
if (!strcasecmp (Name, "HKU"))
{
strcpy (Name, "\\Registry\\User\\");
return TRUE;
}
#if 0
if (!strcasecmp (Name, "HKR"))
return FALSE;
if (!strcasecmp (Name, "HKR"))
return FALSE;
#endif
return FALSE;
@ -92,74 +92,78 @@ GetRootKey (PCHAR Name)
* Append a multisz string to a multisz registry value.
*/
static VOID
AppendMultiSzValue (HKEY KeyHandle,
PCHAR ValueName,
PCHAR Strings,
SIZE_T StringSize)
AppendMultiSzValue (
IN HKEY KeyHandle,
IN PCHAR ValueName,
IN PCHAR Strings,
IN SIZE_T StringSize)
{
SIZE_T Size;
ULONG Type;
size_t Total;
PCHAR Buffer;
PCHAR p;
size_t len;
LONG Error;
SIZE_T Size;
ULONG Type;
size_t Total;
PCHAR Buffer;
PCHAR p;
size_t len;
LONG Error;
Error = RegQueryValueExA (KeyHandle,
ValueName,
NULL,
&Type,
NULL,
&Size);
if ((Error != ERROR_SUCCESS) ||
(Type != REG_MULTI_SZ))
return;
Error = RegQueryValueExA (
KeyHandle,
ValueName,
NULL,
&Type,
NULL,
&Size);
if ((Error != ERROR_SUCCESS) ||
(Type != REG_MULTI_SZ))
return;
Buffer = malloc (Size + StringSize);
if (Buffer == NULL)
return;
Buffer = malloc (Size + StringSize);
if (Buffer == NULL)
return;
Error = RegQueryValueExA (KeyHandle,
ValueName,
NULL,
NULL,
(PUCHAR)Buffer,
&Size);
if (Error != ERROR_SUCCESS)
goto done;
Error = RegQueryValueExA (
KeyHandle,
ValueName,
NULL,
NULL,
(PUCHAR)Buffer,
&Size);
if (Error != ERROR_SUCCESS)
goto done;
/* compare each string against all the existing ones */
Total = Size;
while (*Strings != 0)
{
len = strlen (Strings) + 1;
/* compare each string against all the existing ones */
Total = Size;
while (*Strings != 0)
{
len = strlen (Strings) + 1;
for (p = Buffer; *p != 0; p += strlen (p) + 1)
if (!strcasecmp (p, Strings))
break;
for (p = Buffer; *p != 0; p += strlen (p) + 1)
if (!strcasecmp (p, Strings))
break;
if (*p == 0) /* not found, need to append it */
{
memcpy (p, Strings, len);
p[len] = 0;
Total += len;
}
Strings += len;
}
if (*p == 0) /* not found, need to append it */
{
memcpy (p, Strings, len);
p[len] = 0;
Total += len;
}
Strings += len;
}
if (Total != Size)
{
DPRINT ("setting value %s to %s\n", ValueName, Buffer);
RegSetValueExA (KeyHandle,
ValueName,
0,
REG_MULTI_SZ,
(PCHAR)Buffer,
(ULONG)Total);
}
if (Total != Size)
{
DPRINT ("setting value %s to %s\n", ValueName, Buffer);
RegSetValueExA (
KeyHandle,
ValueName,
0,
REG_MULTI_SZ,
(PCHAR)Buffer,
(ULONG)Total);
}
done:
free (Buffer);
free (Buffer);
}
@ -169,201 +173,205 @@ done:
* Perform an add/delete registry operation depending on the flags.
*/
static BOOL
do_reg_operation(HKEY KeyHandle,
PCHAR ValueName,
PINFCONTEXT Context,
ULONG Flags)
do_reg_operation(
IN HKEY KeyHandle,
IN PCHAR ValueName,
IN PINFCONTEXT Context,
IN ULONG Flags)
{
CHAR EmptyStr = (CHAR)0;
ULONG Type;
SIZE_T Size;
LONG Error;
CHAR EmptyStr = (CHAR)0;
ULONG Type;
SIZE_T Size;
LONG Error;
if (Flags & FLG_ADDREG_DELVAL) /* deletion */
{
if (ValueName)
if (Flags & FLG_ADDREG_DELVAL) /* deletion */
{
RegDeleteValueA (KeyHandle,
ValueName);
}
else
{
RegDeleteKeyA (KeyHandle,
NULL);
if (ValueName)
{
RegDeleteValueA (KeyHandle, ValueName);
}
else
{
RegDeleteKeyA (KeyHandle, NULL);
}
return TRUE;
}
return TRUE;
}
if (Flags & FLG_ADDREG_KEYONLY)
return TRUE;
if (Flags & (FLG_ADDREG_NOCLOBBER | FLG_ADDREG_OVERWRITEONLY))
{
Error = RegQueryValueExA (KeyHandle,
ValueName,
NULL,
NULL,
NULL,
NULL);
if ((Error == ERROR_SUCCESS) &&
(Flags & FLG_ADDREG_NOCLOBBER))
return TRUE;
if ((Error != ERROR_SUCCESS) &&
(Flags & FLG_ADDREG_OVERWRITEONLY))
return TRUE;
}
switch (Flags & FLG_ADDREG_TYPE_MASK)
{
case FLG_ADDREG_TYPE_SZ:
Type = REG_SZ;
break;
case FLG_ADDREG_TYPE_MULTI_SZ:
Type = REG_MULTI_SZ;
break;
case FLG_ADDREG_TYPE_EXPAND_SZ:
Type = REG_EXPAND_SZ;
break;
case FLG_ADDREG_TYPE_BINARY:
Type = REG_BINARY;
break;
case FLG_ADDREG_TYPE_DWORD:
Type = REG_DWORD;
break;
case FLG_ADDREG_TYPE_NONE:
Type = REG_NONE;
break;
default:
Type = Flags >> 16;
break;
}
if (!(Flags & FLG_ADDREG_BINVALUETYPE) ||
(Type == REG_DWORD && InfHostGetFieldCount (Context) == 5))
{
PCHAR Str = NULL;
if (Type == REG_MULTI_SZ)
{
if (InfHostGetMultiSzField (Context, 5, NULL, 0, &Size) != 0)
Size = 0;
if (Size)
{
Str = malloc (Size);
if (Str == NULL)
return FALSE;
InfHostGetMultiSzField (Context, 5, Str, (ULONG)Size, NULL);
}
if (Flags & FLG_ADDREG_APPEND)
{
if (Str == NULL)
if (Flags & FLG_ADDREG_KEYONLY)
return TRUE;
AppendMultiSzValue (KeyHandle,
ValueName,
Str,
Size);
free (Str);
return TRUE;
}
/* else fall through to normal string handling */
}
else
if (Flags & (FLG_ADDREG_NOCLOBBER | FLG_ADDREG_OVERWRITEONLY))
{
if (InfHostGetStringField (Context, 5, NULL, 0, &Size) != 0)
Size = 0;
Error = RegQueryValueExA (
KeyHandle,
ValueName,
NULL,
NULL,
NULL,
NULL);
if ((Error == ERROR_SUCCESS) &&
(Flags & FLG_ADDREG_NOCLOBBER))
return TRUE;
if (Size)
{
Str = malloc (Size);
if (Str == NULL)
return FALSE;
InfHostGetStringField (Context, 5, Str, (ULONG)Size, NULL);
}
if ((Error != ERROR_SUCCESS) &&
(Flags & FLG_ADDREG_OVERWRITEONLY))
return TRUE;
}
if (Type == REG_DWORD)
switch (Flags & FLG_ADDREG_TYPE_MASK)
{
ULONG dw = Str ? strtoul (Str, NULL, 0) : 0;
case FLG_ADDREG_TYPE_SZ:
Type = REG_SZ;
break;
DPRINT("setting dword %s to %lx\n", ValueName, dw);
case FLG_ADDREG_TYPE_MULTI_SZ:
Type = REG_MULTI_SZ;
break;
RegSetValueExA (KeyHandle,
ValueName,
0,
Type,
(const PUCHAR)&dw,
sizeof(ULONG));
case FLG_ADDREG_TYPE_EXPAND_SZ:
Type = REG_EXPAND_SZ;
break;
case FLG_ADDREG_TYPE_BINARY:
Type = REG_BINARY;
break;
case FLG_ADDREG_TYPE_DWORD:
Type = REG_DWORD;
break;
case FLG_ADDREG_TYPE_NONE:
Type = REG_NONE;
break;
default:
Type = Flags >> 16;
break;
}
else
if (!(Flags & FLG_ADDREG_BINVALUETYPE) ||
(Type == REG_DWORD && InfHostGetFieldCount (Context) == 5))
{
DPRINT("setting value %s to %s\n", ValueName, Str);
PCHAR Str = NULL;
if (Str)
{
RegSetValueExA (KeyHandle,
ValueName,
0,
Type,
(PVOID)Str,
(ULONG)Size);
}
else
{
RegSetValueExA (KeyHandle,
ValueName,
0,
Type,
(PVOID)&EmptyStr,
(ULONG)sizeof(CHAR));
}
if (Type == REG_MULTI_SZ)
{
if (InfHostGetMultiSzField (Context, 5, NULL, 0, &Size) != 0)
Size = 0;
if (Size)
{
Str = malloc (Size);
if (Str == NULL)
return FALSE;
InfHostGetMultiSzField (Context, 5, Str, (ULONG)Size, NULL);
}
if (Flags & FLG_ADDREG_APPEND)
{
if (Str == NULL)
return TRUE;
AppendMultiSzValue (
KeyHandle,
ValueName,
Str,
Size);
free (Str);
return TRUE;
}
/* else fall through to normal string handling */
}
else
{
if (InfHostGetStringField (Context, 5, NULL, 0, &Size) != 0)
Size = 0;
if (Size)
{
Str = malloc (Size);
if (Str == NULL)
return FALSE;
InfHostGetStringField (Context, 5, Str, (ULONG)Size, NULL);
}
}
if (Type == REG_DWORD)
{
ULONG dw = Str ? strtoul (Str, NULL, 0) : 0;
DPRINT("setting dword %s to %lx\n", ValueName, dw);
RegSetValueExA (
KeyHandle,
ValueName,
0,
Type,
(const PUCHAR)&dw,
sizeof(ULONG));
}
else
{
DPRINT("setting value %s to %s\n", ValueName, Str);
if (Str)
{
RegSetValueExA (
KeyHandle,
ValueName,
0,
Type,
(PVOID)Str,
(ULONG)Size);
}
else
{
RegSetValueExA (
KeyHandle,
ValueName,
0,
Type,
(PVOID)&EmptyStr,
(ULONG)sizeof(CHAR));
}
}
free (Str);
}
free (Str);
}
else /* get the binary data */
{
PCHAR Data = NULL;
if (InfHostGetBinaryField (Context, 5, NULL, 0, &Size) != 0)
Size = 0;
if (Size)
else /* get the binary data */
{
Data = malloc (Size);
if (Data == NULL)
return FALSE;
PCHAR Data = NULL;
DPRINT("setting binary data %s len %lu\n", ValueName, Size);
InfHostGetBinaryField (Context, 5, Data, (ULONG)Size, NULL);
if (InfHostGetBinaryField (Context, 5, NULL, 0, &Size) != 0)
Size = 0;
if (Size)
{
Data = malloc (Size);
if (Data == NULL)
return FALSE;
DPRINT("setting binary data %s len %lu\n", ValueName, Size);
InfHostGetBinaryField (Context, 5, Data, (ULONG)Size, NULL);
}
RegSetValueExA (
KeyHandle,
ValueName,
0,
Type,
(PVOID)Data,
(ULONG)Size);
free (Data);
}
RegSetValueExA (KeyHandle,
ValueName,
0,
Type,
(PVOID)Data,
(ULONG)Size);
free (Data);
}
return TRUE;
return TRUE;
}
/***********************************************************************
* registry_callback
*
@ -372,114 +380,114 @@ do_reg_operation(HKEY KeyHandle,
static BOOL
registry_callback (HINF hInf, PCHAR Section, BOOL Delete)
{
CHAR Buffer[MAX_INF_STRING_LENGTH];
PCHAR ValuePtr;
ULONG Flags;
size_t Length;
CHAR Buffer[MAX_INF_STRING_LENGTH];
PCHAR ValuePtr;
ULONG Flags;
size_t Length;
PINFCONTEXT Context = NULL;
HKEY KeyHandle;
BOOL Ok;
PINFCONTEXT Context = NULL;
HKEY KeyHandle;
BOOL Ok;
Ok = InfHostFindFirstLine (hInf, Section, NULL, &Context) == 0;
if (!Ok)
return TRUE; /* Don't fail if the section isn't present */
Ok = InfHostFindFirstLine (hInf, Section, NULL, &Context) == 0;
if (!Ok)
return TRUE; /* Don't fail if the section isn't present */
for (;Ok; Ok = (InfHostFindNextLine (Context, Context) == 0))
{
/* get root */
if (InfHostGetStringField (Context, 1, Buffer, MAX_INF_STRING_LENGTH, NULL) != 0)
continue;
if (!GetRootKey (Buffer))
continue;
/* get key */
Length = strlen (Buffer);
if (InfHostGetStringField (Context, 2, Buffer + Length, MAX_INF_STRING_LENGTH - (ULONG)Length, NULL) != 0)
*Buffer = 0;
DPRINT("KeyName: <%s>\n", Buffer);
if (Delete)
{
Flags = FLG_ADDREG_DELVAL;
}
else
{
/* get flags */
if (InfHostGetIntField (Context, 4, (PLONG)&Flags) != 0)
Flags = 0;
}
DPRINT("Flags: %lx\n", Flags);
if (Delete || (Flags & FLG_ADDREG_OVERWRITEONLY))
for (;Ok; Ok = (InfHostFindNextLine (Context, Context) == 0))
{
if (RegOpenKeyA (NULL, Buffer, &KeyHandle) != ERROR_SUCCESS)
{
DPRINT("RegOpenKey(%s) failed\n", Buffer);
continue; /* ignore if it doesn't exist */
}
}
else
{
if (RegCreateKeyA (NULL, Buffer, &KeyHandle) != ERROR_SUCCESS)
{
DPRINT("RegCreateKey(%s) failed\n", Buffer);
continue;
}
/* get root */
if (InfHostGetStringField (Context, 1, Buffer, MAX_INF_STRING_LENGTH, NULL) != 0)
continue;
if (!GetRootKey (Buffer))
continue;
/* get key */
Length = strlen (Buffer);
if (InfHostGetStringField (Context, 2, Buffer + Length, MAX_INF_STRING_LENGTH - (ULONG)Length, NULL) != 0)
*Buffer = 0;
DPRINT("KeyName: <%s>\n", Buffer);
if (Delete)
{
Flags = FLG_ADDREG_DELVAL;
}
else
{
/* get flags */
if (InfHostGetIntField (Context, 4, (PLONG)&Flags) != 0)
Flags = 0;
}
DPRINT("Flags: %lx\n", Flags);
if (Delete || (Flags & FLG_ADDREG_OVERWRITEONLY))
{
if (RegOpenKeyA (NULL, Buffer, &KeyHandle) != ERROR_SUCCESS)
{
DPRINT("RegOpenKey(%s) failed\n", Buffer);
continue; /* ignore if it doesn't exist */
}
}
else
{
if (RegCreateKeyA (NULL, Buffer, &KeyHandle) != ERROR_SUCCESS)
{
DPRINT("RegCreateKey(%s) failed\n", Buffer);
continue;
}
}
/* get value name */
if (InfHostGetStringField (Context, 3, Buffer, MAX_INF_STRING_LENGTH, NULL) == 0)
{
ValuePtr = Buffer;
}
else
{
ValuePtr = NULL;
}
/* and now do it */
if (!do_reg_operation (KeyHandle, ValuePtr, Context, Flags))
{
return FALSE;
}
}
/* get value name */
if (InfHostGetStringField (Context, 3, Buffer, MAX_INF_STRING_LENGTH, NULL) == 0)
{
ValuePtr = Buffer;
}
else
{
ValuePtr = NULL;
}
InfHostFreeContext(Context);
/* and now do it */
if (!do_reg_operation (KeyHandle, ValuePtr, Context, Flags))
{
return FALSE;
}
}
InfHostFreeContext(Context);
return TRUE;
return TRUE;
}
BOOL
ImportRegistryFile(PCHAR FileName)
{
HINF hInf;
ULONG ErrorLine;
HINF hInf;
ULONG ErrorLine;
/* Load inf file from install media. */
if (InfHostOpenFile(&hInf, FileName, &ErrorLine) != 0)
{
DPRINT1 ("InfHostOpenFile() failed\n");
return FALSE;
}
/* Load inf file from install media. */
if (InfHostOpenFile(&hInf, FileName, &ErrorLine) != 0)
{
DPRINT1 ("InfHostOpenFile() failed\n");
return FALSE;
}
if (!registry_callback (hInf, "DelReg", TRUE))
{
DPRINT1 ("registry_callback() failed\n");
}
if (!registry_callback (hInf, "DelReg", TRUE))
{
DPRINT1 ("registry_callback() failed\n");
}
if (!registry_callback (hInf, "AddReg", FALSE))
{
DPRINT1 ("registry_callback() failed\n");
}
if (!registry_callback (hInf, "AddReg", FALSE))
{
DPRINT1 ("registry_callback() failed\n");
}
InfHostCloseFile (hInf);
InfHostCloseFile (hInf);
return TRUE;
return TRUE;
}
/* EOF */