diff --git a/base/setup/usetup/inicache.c b/base/setup/usetup/inicache.c index 16f3e2e4e0b..f509e59606b 100644 --- a/base/setup/usetup/inicache.c +++ b/base/setup/usetup/inicache.c @@ -467,21 +467,13 @@ IniCacheGetKeyValue( /* PUBLIC FUNCTIONS *********************************************************/ NTSTATUS -IniCacheLoad( +IniCacheLoadFromMemory( PINICACHE *Cache, - PWCHAR FileName, + PCHAR FileBuffer, + ULONG FileLength, BOOLEAN String) { - UNICODE_STRING Name; - OBJECT_ATTRIBUTES ObjectAttributes; - FILE_STANDARD_INFORMATION FileInfo; - IO_STATUS_BLOCK IoStatusBlock; - HANDLE FileHandle; - NTSTATUS Status; - PCHAR FileBuffer; - ULONG FileLength; PCHAR Ptr; - LARGE_INTEGER FileOffset; PINICACHESECTION Section; PINICACHEKEY Key; @@ -495,6 +487,96 @@ IniCacheLoad( PCHAR KeyValue; ULONG KeyValueSize; + /* Allocate inicache header */ + *Cache = (PINICACHE)RtlAllocateHeap(ProcessHeap, + HEAP_ZERO_MEMORY, + sizeof(INICACHE)); + if (*Cache == NULL) + { + DPRINT("RtlAllocateHeap() failed\n"); + return STATUS_INSUFFICIENT_RESOURCES; + } + + /* Parse ini file */ + Section = NULL; + Ptr = FileBuffer; + while (Ptr != NULL && *Ptr != 0) + { + Ptr = IniCacheSkipWhitespace(Ptr); + if (Ptr == NULL) + continue; + + if (*Ptr == '[') + { + Section = NULL; + Ptr++; + + Ptr = IniCacheGetSectionName(Ptr, + &SectionName, + &SectionNameSize); + + DPRINT1("[%.*s]\n", SectionNameSize, SectionName); + + Section = IniCacheAddSection(*Cache, + SectionName, + SectionNameSize); + if (Section == NULL) + { + DPRINT("IniCacheAddSection() failed\n"); + Ptr = IniCacheSkipToNextSection(Ptr); + continue; + } + } + else + { + if (Section == NULL) + { + Ptr = IniCacheSkipToNextSection(Ptr); + continue; + } + + Ptr = IniCacheGetKeyName(Ptr, + &KeyName, + &KeyNameSize); + + Ptr = IniCacheGetKeyValue(Ptr, + &KeyValue, + &KeyValueSize, + String); + + DPRINT1("'%.*s' = '%.*s'\n", KeyNameSize, KeyName, KeyValueSize, KeyValue); + + Key = IniCacheAddKey(Section, + KeyName, + KeyNameSize, + KeyValue, + KeyValueSize); + if (Key == NULL) + { + DPRINT("IniCacheAddKey() failed\n"); + } + } + } + + return STATUS_SUCCESS; +} + +NTSTATUS +IniCacheLoad( + PINICACHE *Cache, + PWCHAR FileName, + BOOLEAN String) +{ + UNICODE_STRING Name; + OBJECT_ATTRIBUTES ObjectAttributes; + FILE_STANDARD_INFORMATION FileInfo; + IO_STATUS_BLOCK IoStatusBlock; + HANDLE FileHandle; + NTSTATUS Status; + PCHAR FileBuffer; + ULONG FileLength; + LARGE_INTEGER FileOffset; + *Cache = NULL; /* Open ini file */ @@ -568,84 +650,18 @@ IniCacheLoad( if (!NT_SUCCESS(Status)) { DPRINT("NtReadFile() failed (Status %lx)\n", Status); - RtlFreeHeap(ProcessHeap, 0, FileBuffer); - return Status; + goto Quit; } - /* Allocate inicache header */ - *Cache = (PINICACHE)RtlAllocateHeap(ProcessHeap, - HEAP_ZERO_MEMORY, - sizeof(INICACHE)); - if (*Cache == NULL) - { - DPRINT("RtlAllocateHeap() failed\n"); - return STATUS_INSUFFICIENT_RESOURCES; - } - - /* Parse ini file */ - Section = NULL; - Ptr = FileBuffer; - while (Ptr != NULL && *Ptr != 0) + Status = IniCacheLoadFromMemory(Cache, FileBuffer, FileLength, String); + if (!NT_SUCCESS(Status)) { - Ptr = IniCacheSkipWhitespace(Ptr); - if (Ptr == NULL) - continue; - - if (*Ptr == '[') - { - Section = NULL; - Ptr++; - - Ptr = IniCacheGetSectionName(Ptr, - &SectionName, - &SectionNameSize); - - DPRINT1("[%.*s]\n", SectionNameSize, SectionName); - - Section = IniCacheAddSection(*Cache, - SectionName, - SectionNameSize); - if (Section == NULL) - { - DPRINT("IniCacheAddSection() failed\n"); - Ptr = IniCacheSkipToNextSection(Ptr); - continue; - } - } - else - { - if (Section == NULL) - { - Ptr = IniCacheSkipToNextSection(Ptr); - continue; - } - - Ptr = IniCacheGetKeyName(Ptr, - &KeyName, - &KeyNameSize); - - Ptr = IniCacheGetKeyValue(Ptr, - &KeyValue, - &KeyValueSize, - String); - - DPRINT1("'%.*s' = '%.*s'\n", KeyNameSize, KeyName, KeyValueSize, KeyValue); - - Key = IniCacheAddKey(Section, - KeyName, - KeyNameSize, - KeyValue, - KeyValueSize); - if (Key == NULL) - { - DPRINT("IniCacheAddKey() failed\n"); - } - } + DPRINT1("IniCacheLoadFromMemory() failed (Status %lx)\n", Status); } - /* Free file buffer */ +Quit: + /* Free the file buffer, and return */ RtlFreeHeap(ProcessHeap, 0, FileBuffer); - return Status; } diff --git a/base/setup/usetup/inicache.h b/base/setup/usetup/inicache.h index 3a26332ab92..8e12103e287 100644 --- a/base/setup/usetup/inicache.h +++ b/base/setup/usetup/inicache.h @@ -73,6 +73,13 @@ typedef enum /* FUNCTIONS ****************************************************************/ +NTSTATUS +IniCacheLoadFromMemory( + PINICACHE *Cache, + PCHAR FileBuffer, + ULONG FileLength, + BOOLEAN String); + NTSTATUS IniCacheLoad( PINICACHE *Cache,