#define NDEBUG
#include "mkhive.h"
-#define FLG_ADDREG_BINVALUETYPE 0x00000001
-#define FLG_ADDREG_NOCLOBBER 0x00000002
-#define FLG_ADDREG_DELVAL 0x00000004
-#define FLG_ADDREG_APPEND 0x00000008
-#define FLG_ADDREG_KEYONLY 0x00000010
-#define FLG_ADDREG_OVERWRITEONLY 0x00000020
-#define FLG_ADDREG_TYPE_SZ 0x00000000
-#define FLG_ADDREG_TYPE_MULTI_SZ 0x00010000
-#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)
+#define FLG_ADDREG_BINVALUETYPE 0x00000001
+#define FLG_ADDREG_NOCLOBBER 0x00000002
+#define FLG_ADDREG_DELVAL 0x00000004
+#define FLG_ADDREG_APPEND 0x00000008
+#define FLG_ADDREG_KEYONLY 0x00000010
+#define FLG_ADDREG_OVERWRITEONLY 0x00000020
+#define FLG_ADDREG_KEYONLY_COMMON 0x00002000
+#define FLG_DELREG_KEYONLY_COMMON FLG_ADDREG_KEYONLY_COMMON
+#define FLG_ADDREG_DELREG_BIT 0x00008000
+
+#define FLG_ADDREG_TYPE_SZ 0x00000000
+#define FLG_ADDREG_TYPE_MULTI_SZ 0x00010000
+#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 VOID
append_multi_sz_value(
IN HKEY KeyHandle,
- IN PWCHAR ValueName,
- IN PWCHAR Strings,
+ IN PCWSTR ValueName,
+ IN PCWSTR Strings,
IN ULONG StringSize) // In characters
{
ULONG Size, Total; // In bytes
static BOOL
do_reg_operation(
IN HKEY KeyHandle,
- IN PWCHAR ValueName,
+ IN PCWSTR ValueName,
IN PINFCONTEXT Context,
IN ULONG Flags)
{
ULONG Size;
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);
}
else
{
RegDeleteKeyW(KeyHandle, NULL);
}
-
return TRUE;
}
- if (Flags & FLG_ADDREG_KEYONLY)
+ if (Flags & (FLG_ADDREG_KEYONLY | FLG_ADDREG_KEYONLY_COMMON))
return TRUE;
if (Flags & (FLG_ADDREG_NOCLOBBER | FLG_ADDREG_OVERWRITEONLY))
NULL,
NULL,
NULL);
+
if ((Error == ERROR_SUCCESS) && (Flags & FLG_ADDREG_NOCLOBBER))
return TRUE;
* Called once for each AddReg and DelReg entry in a given section.
*/
static BOOL
-registry_callback(HINF hInf, PWCHAR Section, BOOL Delete)
+registry_callback(HINF hInf, PCWSTR Section, BOOL Delete)
{
WCHAR Buffer[MAX_INF_STRING_LENGTH];
PWCHAR ValuePtr;
if (!Ok)
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)
continue;
if (!get_root_key(Buffer))
continue;
- /* get key */
+ /* Get key */
Length = strlenW(Buffer);
if (InfHostGetStringField(Context, 2, Buffer + Length, sizeof(Buffer)/sizeof(WCHAR) - (ULONG)Length, NULL) != 0)
*Buffer = 0;
DPRINT("KeyName: <%S>\n", Buffer);
+ /* Get flags */
+ if (InfHostGetIntField(Context, 4, (INT*)&Flags) != 0)
+ Flags = 0;
+
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
{
- /* get flags */
- if (InfHostGetIntField(Context, 4, (INT *)&Flags) != 0)
- Flags = 0;
+ if (Flags & FLG_ADDREG_DELREG_BIT)
+ continue; /* ignore this entry */
}
DPRINT("Flags: 0x%x\n", Flags);
}
}
- /* get value name */
+ /* Get value name */
if (InfHostGetStringField(Context, 3, Buffer, sizeof(Buffer)/sizeof(WCHAR), NULL) == 0)
{
ValuePtr = Buffer;
ValuePtr = NULL;
}
- /* and now do it */
+ /* And now do it */
if (!do_reg_operation(KeyHandle, ValuePtr, Context, Flags))
{
+ RegCloseKey(KeyHandle);
return FALSE;
}
+
+ RegCloseKey(KeyHandle);
}
InfHostFreeContext(Context);