[FREELDR] Add an INI helper that allows modifying an existing setting's value in...
authorHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Fri, 2 Aug 2019 21:32:30 +0000 (23:32 +0200)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Tue, 6 Aug 2019 21:39:53 +0000 (23:39 +0200)
boot/freeldr/freeldr/include/inifile.h
boot/freeldr/freeldr/lib/inifile/inifile.c

index 9bed700..0bc8e60 100644 (file)
@@ -81,4 +81,5 @@ BOOLEAN    IniReadSettingByNumber(ULONG_PTR SectionId, ULONG SettingNumber, PCHA
 BOOLEAN    IniReadSettingByName(ULONG_PTR SectionId, PCSTR SettingName, PCHAR Buffer, ULONG BufferSize);
 BOOLEAN    IniAddSection(PCSTR SectionName, ULONG_PTR* SectionId);
 BOOLEAN    IniAddSettingValueToSection(ULONG_PTR SectionId, PCSTR SettingName, PCSTR SettingValue);
+BOOLEAN IniModifySettingValue(ULONG_PTR SectionId, PCSTR SettingName, PCSTR SettingValue);
 VOID IniCleanup(VOID);
index ba1d5b2..fa231e8 100644 (file)
@@ -289,3 +289,44 @@ BOOLEAN IniAddSettingValueToSection(ULONG_PTR SectionId, PCSTR SettingName, PCST
 
     return TRUE;
 }
+
+BOOLEAN IniModifySettingValue(ULONG_PTR SectionId, PCSTR SettingName, PCSTR SettingValue)
+{
+    PINI_SECTION        Section = (PINI_SECTION)SectionId;
+    PINI_SECTION_ITEM    SectionItem;
+    PCHAR NewItemValue;
+
+    // Loop through each section item and find the one we want
+    SectionItem = CONTAINING_RECORD(Section->SectionItemList.Flink, INI_SECTION_ITEM, ListEntry);
+    while (&SectionItem->ListEntry != &Section->SectionItemList)
+    {
+        // Check to see if this is the setting we want
+        if (_stricmp(SectionItem->ItemName, SettingName) == 0)
+        {
+            break;
+        }
+
+        // Nope, keep going
+        // Get the next section item in the list
+        SectionItem = CONTAINING_RECORD(SectionItem->ListEntry.Flink, INI_SECTION_ITEM, ListEntry);
+    }
+    // If the section item does not exist, create it
+    if (&SectionItem->ListEntry == &Section->SectionItemList)
+    {
+        return IniAddSettingValueToSection(SectionId, SettingName, SettingValue);
+    }
+
+    // Reallocate the new setting value buffer
+    NewItemValue = FrLdrTempAlloc(strlen(SettingValue) + 1, TAG_INI_VALUE);
+    if (!NewItemValue)
+    {
+        // We failed, bail out
+        return FALSE;
+    }
+    FrLdrTempFree(SectionItem->ItemValue, TAG_INI_VALUE);
+    SectionItem->ItemValue = NewItemValue;
+
+    strcpy(SectionItem->ItemValue, SettingValue);
+
+    return TRUE;
+}