diff --git a/reactos/ntoskrnl/cm/import.c b/reactos/ntoskrnl/cm/import.c index b25faee7b37..6c8e189eeae 100644 --- a/reactos/ntoskrnl/cm/import.c +++ b/reactos/ntoskrnl/cm/import.c @@ -1,4 +1,4 @@ -/* $Id: import.c,v 1.2 2001/08/30 20:38:18 dwelch Exp $ +/* $Id: import.c,v 1.3 2001/09/04 21:05:26 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -236,9 +236,12 @@ computeKeyValueDataSize (PCHAR regChunk, PCHAR dataFormat) regChunk++; while (*regChunk != 0 && *regChunk != '\"') { + dataSize++; dataSize++; regChunk++; } + dataSize++; + dataSize++; } else if (strcmp (dataFormat, "hex") == 0) { @@ -252,6 +255,7 @@ computeKeyValueDataSize (PCHAR regChunk, PCHAR dataFormat) regChunk++; if (*regChunk == '\\') { + regChunk++; regChunk = skipWhitespaceInChunk (regChunk); } } @@ -278,19 +282,24 @@ allocateDataBuffer (PVOID * data, int * dataBufferSize, int dataSize) return TRUE; } - -static PCHAR + +static PCHAR getKeyValueDataFromChunk (PCHAR regChunk, PCHAR dataFormat, PCHAR data) { char dataValue; - + PWCHAR ptr; + if (strcmp (dataFormat, "string") == 0) { + /* convert quoted string to zero-terminated Unicode string */ + ptr = (PWCHAR)data; regChunk++; while (*regChunk != 0 && *regChunk != '\"') { - *data++ = *regChunk++; + *ptr++ = (WCHAR)*regChunk++; } + *ptr = 0; + regChunk++; } else if (strcmp (dataFormat, "hex") == 0) { @@ -308,6 +317,7 @@ getKeyValueDataFromChunk (PCHAR regChunk, PCHAR dataFormat, PCHAR data) regChunk++; if (*regChunk == '\\') { + regChunk++; regChunk = skipWhitespaceInChunk (regChunk); } } @@ -349,8 +359,9 @@ setKeyValue (HANDLE currentKey, return TRUE; } -VOID -CmImportHive(PCHAR regChunk) +VOID +CmImportHive(PCHAR ChunkBase, + ULONG ChunkSize) { HANDLE currentKey = INVALID_HANDLE_VALUE; int newKeySize; @@ -360,12 +371,15 @@ CmImportHive(PCHAR regChunk) int dataSize = 0; int dataBufferSize = 0; PVOID data = 0; + PCHAR regChunk; - regChunk = checkAndSkipMagic (regChunk); + DPRINT("ChunkBase %p ChunkSize %lx\n", ChunkBase, ChunkSize); + + regChunk = checkAndSkipMagic (ChunkBase); if (regChunk == 0) return; - while (regChunk != 0 && *regChunk != 0) + while (regChunk != 0 && *regChunk != 0 && (((ULONG)regChunk-(ULONG)ChunkBase) < ChunkSize)) { regChunk = skipWhitespaceInChunk (regChunk); if (regChunk == 0) @@ -375,6 +389,7 @@ CmImportHive(PCHAR regChunk) { if (currentKey != INVALID_HANDLE_VALUE) { + DPRINT("Closing current key: 0x%lx\n", currentKey); NtClose (currentKey); currentKey = INVALID_HANDLE_VALUE; } diff --git a/reactos/ntoskrnl/include/internal/ntoskrnl.h b/reactos/ntoskrnl/include/internal/ntoskrnl.h index 19d05b35a46..c9db57d3f56 100644 --- a/reactos/ntoskrnl/include/internal/ntoskrnl.h +++ b/reactos/ntoskrnl/include/internal/ntoskrnl.h @@ -50,7 +50,7 @@ VOID PsInit(VOID); VOID CmInitializeRegistry(VOID); VOID CmInitializeRegistry2(VOID); VOID CmShutdownRegistry(VOID); -VOID CmImportHive(PCHAR); +VOID CmImportHive(PCHAR ChunkBase, ULONG ChunkSize); VOID KdInitSystem(ULONG Reserved, PLOADER_PARAMETER_BLOCK LoaderBlock); NTSTATUS RtlpInitNlsSections(ULONG Mod1Start, diff --git a/reactos/ntoskrnl/ke/main.c b/reactos/ntoskrnl/ke/main.c index b51ae8faf45..4c1f4406805 100644 --- a/reactos/ntoskrnl/ke/main.c +++ b/reactos/ntoskrnl/ke/main.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: main.c,v 1.104 2001/09/01 15:36:44 chorns Exp $ +/* $Id: main.c,v 1.105 2001/09/04 21:06:27 ekohl Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/ke/main.c @@ -905,12 +905,13 @@ ExpInitializeExecutive(VOID) for (i = 1; i < KeLoaderBlock.ModsCount; i++) { start = KeLoaderModules[i].ModStart; + length = KeLoaderModules[i].ModEnd - start; name = (PCHAR)KeLoaderModules[i].String; if (RtlpCheckFileNameExtension(name, "") || RtlpCheckFileNameExtension(name, ".hiv")) { CPRINT("Process registry chunk at %08lx\n", start); - CmImportHive((PCHAR) start); + CmImportHive((PCHAR)start, length); } }