From c8ea82d67b7bd65b633164d94e577c9dddd54bb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sun, 21 May 2017 23:48:09 +0000 Subject: [PATCH] [USETUP] Improve the inicache module. From the existing IniCacheLoad() function, introduce a IniCacheLoadFromMemory() function that just does the same (initialize an INI file cache and parse the INI file), but takes the input from a memory buffer. Then, rewrite the IniCacheLoad() function to just open the file given in input, and then fall back to calling IniCacheLoadFromMemory. The IniCacheLoadFromMemory() function will be used later. svn path=/branches/setup_improvements/; revision=74620 --- base/setup/usetup/inicache.c | 186 +++++++++++++++++++---------------- base/setup/usetup/inicache.h | 7 ++ 2 files changed, 108 insertions(+), 85 deletions(-) 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 @@ -466,6 +466,101 @@ IniCacheGetKeyValue( /* PUBLIC FUNCTIONS *********************************************************/ +NTSTATUS +IniCacheLoadFromMemory( + PINICACHE *Cache, + PCHAR FileBuffer, + ULONG FileLength, + BOOLEAN String) +{ + PCHAR Ptr; + + PINICACHESECTION Section; + PINICACHEKEY Key; + + PCHAR SectionName; + ULONG SectionNameSize; + + PCHAR KeyName; + ULONG KeyNameSize; + + 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, @@ -480,21 +575,8 @@ IniCacheLoad( NTSTATUS Status; PCHAR FileBuffer; ULONG FileLength; - PCHAR Ptr; LARGE_INTEGER FileOffset; - PINICACHESECTION Section; - PINICACHEKEY Key; - - PCHAR SectionName; - ULONG SectionNameSize; - - PCHAR KeyName; - ULONG KeyNameSize; - - PCHAR KeyValue; - ULONG KeyValueSize; - *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) + Status = IniCacheLoadFromMemory(Cache, FileBuffer, FileLength, String); + if (!NT_SUCCESS(Status)) { - DPRINT("RtlAllocateHeap() failed\n"); - return STATUS_INSUFFICIENT_RESOURCES; + DPRINT1("IniCacheLoadFromMemory() failed (Status %lx)\n", Status); } - /* 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"); - } - } - } - - /* 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,