diff --git a/src/xpdev/ini_file.c b/src/xpdev/ini_file.c
index 0316088b6f8c35b62893d87a705b23a6863612ac..6c024da1a8aca54e6a2b1655e655ae5454079a14 100644
--- a/src/xpdev/ini_file.c
+++ b/src/xpdev/ini_file.c
@@ -1263,7 +1263,7 @@ void* iniFreeNamedStringList(named_string_t** list)
 	return(NULL);
 }
 
-str_list_t iniReadSectionList(FILE* fp, const char* prefix)
+static str_list_t ini_read_section_list(FILE* fp, const char* prefix, bool include_dupes)
 {
 	char*	p;
 	char	str[INI_MAX_LINE_LEN];
@@ -1288,7 +1288,7 @@ str_list_t iniReadSectionList(FILE* fp, const char* prefix)
 		if(prefix!=NULL)
 			if(strnicmp(p,prefix,strlen(prefix))!=0)
 				continue;
-		if(strListFind(lp, p, /* case_sensitive */false) >= 0)
+		if(!include_dupes && strListFind(lp, p, /* case_sensitive */false) >= 0)
 			continue;
 		if(strListAppend(&lp,p,items++)==NULL)
 			break;
@@ -1297,7 +1297,17 @@ str_list_t iniReadSectionList(FILE* fp, const char* prefix)
 	return(lp);
 }
 
-str_list_t iniGetSectionList(str_list_t list, const char* prefix)
+str_list_t iniReadSectionList(FILE* fp, const char* prefix)
+{
+	return  ini_read_section_list(fp, prefix, /* include dupes: */false);
+}
+
+str_list_t iniReadSectionListWithDupes(FILE* fp, const char* prefix)
+{
+	return  ini_read_section_list(fp, prefix, /* include dupes: */true);
+}
+
+static str_list_t ini_get_section_list(str_list_t list, const char* prefix, bool include_dupes)
 {
 	char*	p;
 	char	str[INI_MAX_LINE_LEN];
@@ -1319,7 +1329,7 @@ str_list_t iniGetSectionList(str_list_t list, const char* prefix)
 		if(prefix!=NULL)
 			if(strnicmp(p,prefix,strlen(prefix))!=0)
 				continue;
-		if(strListFind(lp, p, /* case_sensitive */false) >= 0)
+		if(include_dupes && strListFind(lp, p, /* case_sensitive */false) >= 0)
 			continue;
 		if(strListAppend(&lp,p,items++)==NULL)
 			break;
@@ -1328,6 +1338,16 @@ str_list_t iniGetSectionList(str_list_t list, const char* prefix)
 	return(lp);
 }
 
+str_list_t iniGetSectionList(str_list_t list, const char* prefix)
+{
+	return ini_get_section_list(list, prefix, /* include_dupes: */false);
+}
+
+str_list_t iniGetSectionListWithDupes(str_list_t list, const char* prefix)
+{
+	return ini_get_section_list(list, prefix, /* include_dupes: */true);
+}
+
 size_t iniGetSectionCount(str_list_t list, const char* prefix)
 {
 	char*	p;
diff --git a/src/xpdev/ini_file.h b/src/xpdev/ini_file.h
index c5cb7b6bb81ed95814f95cbb4a151ca886ce113c..a1f71b3dbf5689a21b47fabd31ec2d62e645abae 100644
--- a/src/xpdev/ini_file.h
+++ b/src/xpdev/ini_file.h
@@ -52,6 +52,7 @@ extern "C" {
 /* Read all section names and return as an allocated string list */
 /* Optionally (if prefix!=NULL), returns a subset of section names */
 DLLEXPORT str_list_t 	iniReadSectionList(FILE*, const char* prefix);
+DLLEXPORT str_list_t 	iniReadSectionListWithDupes(FILE*, const char* prefix);
 /* Returns number (count) of sections */
 DLLEXPORT size_t 		iniReadSectionCount(FILE*, const char* prefix);
 /* Read all key names and return as an allocated string list */
@@ -137,9 +138,10 @@ DLLEXPORT bool 			iniCloseFile(FILE*);
 
 /* StringList functions */
 DLLEXPORT str_list_t 	iniGetSectionList(str_list_t list, const char* prefix);
+DLLEXPORT str_list_t 	iniGetSectionListWithDupes(str_list_t list, const char* prefix);
 DLLEXPORT size_t 		iniGetSectionCount(str_list_t list, const char* prefix);
 DLLEXPORT str_list_t 	iniGetKeyList(str_list_t list, const char* section);
-DLLEXPORT named_string_t** 
+DLLEXPORT named_string_t**
 						iniGetNamedStringList(str_list_t list, const char* section);
 
 /* Return the unparsed value (string literals not supported): */