mirror of
https://github.com/reactos/reactos.git
synced 2025-02-23 00:45:24 +00:00
[MKHIVE] Sync a bit more of reginf.c with the corresponding setupapi code.
This commit is contained in:
parent
81d435a181
commit
a965cf6e04
1 changed files with 41 additions and 30 deletions
|
@ -34,19 +34,23 @@
|
||||||
#define NDEBUG
|
#define NDEBUG
|
||||||
#include "mkhive.h"
|
#include "mkhive.h"
|
||||||
|
|
||||||
#define FLG_ADDREG_BINVALUETYPE 0x00000001
|
#define FLG_ADDREG_BINVALUETYPE 0x00000001
|
||||||
#define FLG_ADDREG_NOCLOBBER 0x00000002
|
#define FLG_ADDREG_NOCLOBBER 0x00000002
|
||||||
#define FLG_ADDREG_DELVAL 0x00000004
|
#define FLG_ADDREG_DELVAL 0x00000004
|
||||||
#define FLG_ADDREG_APPEND 0x00000008
|
#define FLG_ADDREG_APPEND 0x00000008
|
||||||
#define FLG_ADDREG_KEYONLY 0x00000010
|
#define FLG_ADDREG_KEYONLY 0x00000010
|
||||||
#define FLG_ADDREG_OVERWRITEONLY 0x00000020
|
#define FLG_ADDREG_OVERWRITEONLY 0x00000020
|
||||||
#define FLG_ADDREG_TYPE_SZ 0x00000000
|
#define FLG_ADDREG_KEYONLY_COMMON 0x00002000
|
||||||
#define FLG_ADDREG_TYPE_MULTI_SZ 0x00010000
|
#define FLG_DELREG_KEYONLY_COMMON FLG_ADDREG_KEYONLY_COMMON
|
||||||
#define FLG_ADDREG_TYPE_EXPAND_SZ 0x00020000
|
#define FLG_ADDREG_DELREG_BIT 0x00008000
|
||||||
#define FLG_ADDREG_TYPE_BINARY (0x00000000 | FLG_ADDREG_BINVALUETYPE)
|
|
||||||
#define FLG_ADDREG_TYPE_DWORD (0x00010000 | FLG_ADDREG_BINVALUETYPE)
|
#define FLG_ADDREG_TYPE_SZ 0x00000000
|
||||||
#define FLG_ADDREG_TYPE_NONE (0x00020000 | FLG_ADDREG_BINVALUETYPE)
|
#define FLG_ADDREG_TYPE_MULTI_SZ 0x00010000
|
||||||
#define FLG_ADDREG_TYPE_MASK (0xFFFF0000 | FLG_ADDREG_BINVALUETYPE)
|
#define FLG_ADDREG_TYPE_EXPAND_SZ 0x00020000
|
||||||
|
#define FLG_ADDREG_TYPE_BINARY (0x00000000 | FLG_ADDREG_BINVALUETYPE)
|
||||||
|
#define FLG_ADDREG_TYPE_DWORD (0x00010000 | FLG_ADDREG_BINVALUETYPE)
|
||||||
|
#define FLG_ADDREG_TYPE_NONE (0x00020000 | FLG_ADDREG_BINVALUETYPE)
|
||||||
|
#define FLG_ADDREG_TYPE_MASK (0xFFFF0000 | FLG_ADDREG_BINVALUETYPE)
|
||||||
|
|
||||||
|
|
||||||
static const WCHAR HKCR[] = {'H','K','C','R',0};
|
static const WCHAR HKCR[] = {'H','K','C','R',0};
|
||||||
|
@ -118,8 +122,8 @@ get_root_key(PWCHAR Name)
|
||||||
static VOID
|
static VOID
|
||||||
append_multi_sz_value(
|
append_multi_sz_value(
|
||||||
IN HKEY KeyHandle,
|
IN HKEY KeyHandle,
|
||||||
IN PWCHAR ValueName,
|
IN PCWSTR ValueName,
|
||||||
IN PWCHAR Strings,
|
IN PCWSTR Strings,
|
||||||
IN ULONG StringSize) // In characters
|
IN ULONG StringSize) // In characters
|
||||||
{
|
{
|
||||||
ULONG Size, Total; // In bytes
|
ULONG Size, Total; // In bytes
|
||||||
|
@ -194,7 +198,7 @@ done:
|
||||||
static BOOL
|
static BOOL
|
||||||
do_reg_operation(
|
do_reg_operation(
|
||||||
IN HKEY KeyHandle,
|
IN HKEY KeyHandle,
|
||||||
IN PWCHAR ValueName,
|
IN PCWSTR ValueName,
|
||||||
IN PINFCONTEXT Context,
|
IN PINFCONTEXT Context,
|
||||||
IN ULONG Flags)
|
IN ULONG Flags)
|
||||||
{
|
{
|
||||||
|
@ -203,21 +207,21 @@ do_reg_operation(
|
||||||
ULONG Size;
|
ULONG Size;
|
||||||
LONG Error;
|
LONG Error;
|
||||||
|
|
||||||
if (Flags & FLG_ADDREG_DELVAL) /* deletion */
|
if (Flags & (FLG_ADDREG_DELREG_BIT | FLG_ADDREG_DELVAL)) /* deletion */
|
||||||
{
|
{
|
||||||
if (ValueName)
|
if (ValueName && *ValueName && !(Flags & FLG_DELREG_KEYONLY_COMMON))
|
||||||
{
|
{
|
||||||
|
// NOTE: We don't currently handle deleting sub-values inside multi-strings.
|
||||||
RegDeleteValueW(KeyHandle, ValueName);
|
RegDeleteValueW(KeyHandle, ValueName);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
RegDeleteKeyW(KeyHandle, NULL);
|
RegDeleteKeyW(KeyHandle, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Flags & FLG_ADDREG_KEYONLY)
|
if (Flags & (FLG_ADDREG_KEYONLY | FLG_ADDREG_KEYONLY_COMMON))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
if (Flags & (FLG_ADDREG_NOCLOBBER | FLG_ADDREG_OVERWRITEONLY))
|
if (Flags & (FLG_ADDREG_NOCLOBBER | FLG_ADDREG_OVERWRITEONLY))
|
||||||
|
@ -228,6 +232,7 @@ do_reg_operation(
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
if ((Error == ERROR_SUCCESS) && (Flags & FLG_ADDREG_NOCLOBBER))
|
if ((Error == ERROR_SUCCESS) && (Flags & FLG_ADDREG_NOCLOBBER))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
|
@ -390,7 +395,7 @@ do_reg_operation(
|
||||||
* Called once for each AddReg and DelReg entry in a given section.
|
* Called once for each AddReg and DelReg entry in a given section.
|
||||||
*/
|
*/
|
||||||
static BOOL
|
static BOOL
|
||||||
registry_callback(HINF hInf, PWCHAR Section, BOOL Delete)
|
registry_callback(HINF hInf, PCWSTR Section, BOOL Delete)
|
||||||
{
|
{
|
||||||
WCHAR Buffer[MAX_INF_STRING_LENGTH];
|
WCHAR Buffer[MAX_INF_STRING_LENGTH];
|
||||||
PWCHAR ValuePtr;
|
PWCHAR ValuePtr;
|
||||||
|
@ -405,30 +410,36 @@ registry_callback(HINF hInf, PWCHAR Section, BOOL Delete)
|
||||||
if (!Ok)
|
if (!Ok)
|
||||||
return TRUE; /* Don't fail if the section isn't present */
|
return TRUE; /* Don't fail if the section isn't present */
|
||||||
|
|
||||||
for (;Ok; Ok = (InfHostFindNextLine(Context, Context) == 0))
|
for (Ok = TRUE; Ok; Ok = (InfHostFindNextLine(Context, Context) == 0))
|
||||||
{
|
{
|
||||||
/* get root */
|
/* Get root */
|
||||||
if (InfHostGetStringField(Context, 1, Buffer, sizeof(Buffer)/sizeof(WCHAR), NULL) != 0)
|
if (InfHostGetStringField(Context, 1, Buffer, sizeof(Buffer)/sizeof(WCHAR), NULL) != 0)
|
||||||
continue;
|
continue;
|
||||||
if (!get_root_key(Buffer))
|
if (!get_root_key(Buffer))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* get key */
|
/* Get key */
|
||||||
Length = strlenW(Buffer);
|
Length = strlenW(Buffer);
|
||||||
if (InfHostGetStringField(Context, 2, Buffer + Length, sizeof(Buffer)/sizeof(WCHAR) - (ULONG)Length, NULL) != 0)
|
if (InfHostGetStringField(Context, 2, Buffer + Length, sizeof(Buffer)/sizeof(WCHAR) - (ULONG)Length, NULL) != 0)
|
||||||
*Buffer = 0;
|
*Buffer = 0;
|
||||||
|
|
||||||
DPRINT("KeyName: <%S>\n", Buffer);
|
DPRINT("KeyName: <%S>\n", Buffer);
|
||||||
|
|
||||||
|
/* Get flags */
|
||||||
|
if (InfHostGetIntField(Context, 4, (INT*)&Flags) != 0)
|
||||||
|
Flags = 0;
|
||||||
|
|
||||||
if (Delete)
|
if (Delete)
|
||||||
{
|
{
|
||||||
Flags = FLG_ADDREG_DELVAL;
|
if (!Flags)
|
||||||
|
Flags = FLG_ADDREG_DELREG_BIT;
|
||||||
|
else if (!(Flags & FLG_ADDREG_DELREG_BIT))
|
||||||
|
continue; /* ignore this entry */
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* get flags */
|
if (Flags & FLG_ADDREG_DELREG_BIT)
|
||||||
if (InfHostGetIntField(Context, 4, (INT *)&Flags) != 0)
|
continue; /* ignore this entry */
|
||||||
Flags = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DPRINT("Flags: 0x%x\n", Flags);
|
DPRINT("Flags: 0x%x\n", Flags);
|
||||||
|
@ -450,7 +461,7 @@ registry_callback(HINF hInf, PWCHAR Section, BOOL Delete)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* get value name */
|
/* Get value name */
|
||||||
if (InfHostGetStringField(Context, 3, Buffer, sizeof(Buffer)/sizeof(WCHAR), NULL) == 0)
|
if (InfHostGetStringField(Context, 3, Buffer, sizeof(Buffer)/sizeof(WCHAR), NULL) == 0)
|
||||||
{
|
{
|
||||||
ValuePtr = Buffer;
|
ValuePtr = Buffer;
|
||||||
|
@ -460,7 +471,7 @@ registry_callback(HINF hInf, PWCHAR Section, BOOL Delete)
|
||||||
ValuePtr = NULL;
|
ValuePtr = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* and now do it */
|
/* And now do it */
|
||||||
if (!do_reg_operation(KeyHandle, ValuePtr, Context, Flags))
|
if (!do_reg_operation(KeyHandle, ValuePtr, Context, Flags))
|
||||||
{
|
{
|
||||||
RegCloseKey(KeyHandle);
|
RegCloseKey(KeyHandle);
|
||||||
|
|
Loading…
Reference in a new issue