[INFLIB] Fix INFCONTEXT structure to be compatible with the official definition ...
authorTimo Kreuzer <timo.kreuzer@reactos.org>
Sun, 23 Jun 2019 20:35:19 +0000 (22:35 +0200)
committerGitHub <noreply@github.com>
Sun, 23 Jun 2019 20:35:19 +0000 (22:35 +0200)
* [INFLIB] Fix INFCONTEXT structure to be compatible with the official definition.

This makes inflib work on x64.

sdk/lib/inflib/infcore.c
sdk/lib/inflib/infget.c
sdk/lib/inflib/infpriv.h
sdk/lib/inflib/infput.c

index 7e18735..7618f9e 100644 (file)
@@ -191,6 +191,7 @@ InfpAddSection(PINFCACHE Cache,
     }
   ZEROMEMORY (Section,
               Size);
+  Section->Id = ++Cache->NextSectionId;
 
   /* Copy section name */
   strcpyW(Section->Name, Name);
@@ -231,6 +232,7 @@ InfpAddLine(PINFCACHESECTION Section)
     }
   ZEROMEMORY(Line,
              sizeof(INFCACHELINE));
+  Line->Id = ++Section->NextLineId;
 
   /* Append line */
   if (Section->FirstLine == NULL)
@@ -249,6 +251,74 @@ InfpAddLine(PINFCACHESECTION Section)
   return Line;
 }
 
+PINFCACHESECTION
+InfpFindSectionById(PINFCACHE Cache, UINT Id)
+{
+    PINFCACHESECTION Section;
+
+    for (Section = Cache->FirstSection;
+         Section != NULL;
+         Section = Section->Next)
+    {
+        if (Section->Id == Id)
+        {
+            return Section;
+        }
+    }
+
+    return NULL;
+}
+
+PINFCACHESECTION
+InfpGetSectionForContext(PINFCONTEXT Context)
+{
+    PINFCACHE Cache;
+
+    if (Context == NULL)
+    {
+        return NULL;
+    }
+
+    Cache = (PINFCACHE)Context->Inf;
+    if (Cache == NULL)
+    {
+        return NULL;
+    }
+
+    return InfpFindSectionById(Cache, Context->Section);
+}
+
+PINFCACHELINE
+InfpFindLineById(PINFCACHESECTION Section, UINT Id)
+{
+    PINFCACHELINE Line;
+
+    for (Line = Section->FirstLine;
+         Line != NULL;
+         Line = Line->Next)
+    {
+        if (Line->Id == Id)
+        {
+            return Line;
+        }
+    }
+
+    return NULL;
+}
+
+PINFCACHELINE
+InfpGetLineForContext(PINFCONTEXT Context)
+{
+    PINFCACHESECTION Section;
+
+    Section = InfpGetSectionForContext(Context);
+    if (Section == NULL)
+    {
+        return NULL;
+    }
+
+    return InfpFindLineById(Section, Context->Line);
+}
 
 PVOID
 InfpAddKeyToLine(PINFCACHELINE Line,
index 70b3473..b1f963e 100644 (file)
@@ -213,8 +213,8 @@ InfpFindFirstLine(PINFCACHE Cache,
       return INF_STATUS_NO_MEMORY;
     }
   (*Context)->Inf = (PVOID)Cache;
-  (*Context)->Section = (PVOID)CacheSection;
-  (*Context)->Line = (PVOID)CacheLine;
+  (*Context)->Section = CacheSection->Id;
+  (*Context)->Line = CacheLine->Id;
 
   return INF_STATUS_SUCCESS;
 }
@@ -229,10 +229,10 @@ InfpFindNextLine(PINFCONTEXT ContextIn,
   if (ContextIn == NULL || ContextOut == NULL)
     return INF_STATUS_INVALID_PARAMETER;
 
-  if (ContextIn->Line == NULL)
+  CacheLine = InfpGetLineForContext(ContextIn);
+  if (CacheLine == NULL)
     return INF_STATUS_INVALID_PARAMETER;
 
-  CacheLine = (PINFCACHELINE)ContextIn->Line;
   if (CacheLine->Next == NULL)
     return INF_STATUS_NOT_FOUND;
 
@@ -241,7 +241,7 @@ InfpFindNextLine(PINFCONTEXT ContextIn,
       ContextOut->Inf = ContextIn->Inf;
       ContextOut->Section = ContextIn->Section;
     }
-  ContextOut->Line = (PVOID)(CacheLine->Next);
+  ContextOut->Line = CacheLine->Next->Id;
 
   return INF_STATUS_SUCCESS;
 }
@@ -252,15 +252,17 @@ InfpFindFirstMatchLine(PINFCONTEXT ContextIn,
                        PCWSTR Key,
                        PINFCONTEXT ContextOut)
 {
+  PINFCACHESECTION Section;
   PINFCACHELINE CacheLine;
 
   if (ContextIn == NULL || ContextOut == NULL || Key == NULL || *Key == 0)
     return INF_STATUS_INVALID_PARAMETER;
 
-  if (ContextIn->Inf == NULL || ContextIn->Section == NULL)
-    return INF_STATUS_INVALID_PARAMETER;
+  Section = InfpGetSectionForContext(ContextIn);
+  if (Section == NULL)
+      return INF_STATUS_INVALID_PARAMETER;
 
-  CacheLine = ((PINFCACHESECTION)(ContextIn->Section))->FirstLine;
+  CacheLine = Section->FirstLine;
   while (CacheLine != NULL)
     {
       if (CacheLine->Key != NULL && strcmpiW (CacheLine->Key, Key) == 0)
@@ -271,7 +273,7 @@ InfpFindFirstMatchLine(PINFCONTEXT ContextIn,
               ContextOut->Inf = ContextIn->Inf;
               ContextOut->Section = ContextIn->Section;
             }
-          ContextOut->Line = (PVOID)CacheLine;
+          ContextOut->Line = CacheLine->Id;
 
           return INF_STATUS_SUCCESS;
         }
@@ -288,15 +290,17 @@ InfpFindNextMatchLine(PINFCONTEXT ContextIn,
                       PCWSTR Key,
                       PINFCONTEXT ContextOut)
 {
+  PINFCACHESECTION Section;
   PINFCACHELINE CacheLine;
 
   if (ContextIn == NULL || ContextOut == NULL || Key == NULL || *Key == 0)
     return INF_STATUS_INVALID_PARAMETER;
 
-  if (ContextIn->Inf == NULL || ContextIn->Section == NULL || ContextIn->Line == NULL)
-    return INF_STATUS_INVALID_PARAMETER;
+  Section = InfpGetSectionForContext(ContextIn);
+  if (Section == NULL)
+      return INF_STATUS_INVALID_PARAMETER;
 
-  CacheLine = (PINFCACHELINE)ContextIn->Line;
+  CacheLine = InfpGetLineForContext(ContextIn);
   while (CacheLine != NULL)
     {
       if (CacheLine->Key != NULL && strcmpiW (CacheLine->Key, Key) == 0)
@@ -307,7 +311,7 @@ InfpFindNextMatchLine(PINFCONTEXT ContextIn,
               ContextOut->Inf = ContextIn->Inf;
               ContextOut->Section = ContextIn->Section;
             }
-          ContextOut->Line = (PVOID)CacheLine;
+          ContextOut->Line = CacheLine->Id;
 
           return INF_STATUS_SUCCESS;
         }
@@ -360,10 +364,12 @@ InfpGetLineCount(HINF InfHandle,
 LONG
 InfpGetFieldCount(PINFCONTEXT Context)
 {
-  if (Context == NULL || Context->Line == NULL)
-    return 0;
+  PINFCACHELINE Line;
 
-  return ((PINFCACHELINE)Context->Line)->FieldCount;
+  Line = InfpGetLineForContext(Context);
+  if (Line == NULL)
+    return 0;
+  return Line->FieldCount;
 }
 
 
@@ -380,7 +386,7 @@ InfpGetBinaryField(PINFCONTEXT Context,
   ULONG Size;
   PUCHAR Ptr;
 
-  if (Context == NULL || Context->Line == NULL || FieldIndex == 0)
+  if (Context == NULL || FieldIndex == 0)
     {
       DPRINT("Invalid parameter\n");
       return INF_STATUS_INVALID_PARAMETER;
@@ -389,7 +395,7 @@ InfpGetBinaryField(PINFCONTEXT Context,
   if (RequiredSize != NULL)
     *RequiredSize = 0;
 
-  CacheLine = (PINFCACHELINE)Context->Line;
+  CacheLine = InfpGetLineForContext(Context);
 
   if (FieldIndex > (ULONG)CacheLine->FieldCount)
     return INF_STATUS_NOT_FOUND;
@@ -433,13 +439,13 @@ InfpGetIntField(PINFCONTEXT Context,
   ULONG Index;
   PWCHAR Ptr;
 
-  if (Context == NULL || Context->Line == NULL || IntegerValue == NULL)
+  if (Context == NULL || IntegerValue == NULL)
     {
       DPRINT("Invalid parameter\n");
       return INF_STATUS_INVALID_PARAMETER;
     }
 
-  CacheLine = (PINFCACHELINE)Context->Line;
+  CacheLine = InfpGetLineForContext(Context);
 
   if (FieldIndex > (ULONG)CacheLine->FieldCount)
     {
@@ -480,7 +486,7 @@ InfpGetMultiSzField(PINFCONTEXT Context,
   ULONG Size;
   PWCHAR Ptr;
 
-  if (Context == NULL || Context->Line == NULL || FieldIndex == 0)
+  if (Context == NULL || FieldIndex == 0)
     {
       DPRINT("Invalid parameter\n");
       return INF_STATUS_INVALID_PARAMETER;
@@ -489,7 +495,7 @@ InfpGetMultiSzField(PINFCONTEXT Context,
   if (RequiredSize != NULL)
     *RequiredSize = 0;
 
-  CacheLine = (PINFCACHELINE)Context->Line;
+  CacheLine = InfpGetLineForContext(Context);
 
   if (FieldIndex > (ULONG)CacheLine->FieldCount)
     return INF_STATUS_INVALID_PARAMETER;
@@ -548,7 +554,7 @@ InfpGetStringField(PINFCONTEXT Context,
   PWCHAR Ptr;
   SIZE_T Size;
 
-  if (Context == NULL || Context->Line == NULL)
+  if (Context == NULL)
     {
       DPRINT("Invalid parameter\n");
       return INF_STATUS_INVALID_PARAMETER;
@@ -557,7 +563,7 @@ InfpGetStringField(PINFCONTEXT Context,
   if (RequiredSize != NULL)
     *RequiredSize = 0;
 
-  CacheLine = (PINFCACHELINE)Context->Line;
+  CacheLine = InfpGetLineForContext(Context);
 
   if (FieldIndex > (ULONG)CacheLine->FieldCount)
     return INF_STATUS_INVALID_PARAMETER;
@@ -607,13 +613,13 @@ InfpGetData(PINFCONTEXT Context,
 {
   PINFCACHELINE CacheKey;
 
-  if (Context == NULL || Context->Line == NULL || Data == NULL)
+  if (Context == NULL || Data == NULL)
     {
       DPRINT("Invalid parameter\n");
       return INF_STATUS_INVALID_PARAMETER;
     }
 
-  CacheKey = (PINFCACHELINE)Context->Line;
+  CacheKey = InfpGetLineForContext(Context);
   if (Key != NULL)
     *Key = CacheKey->Key;
 
@@ -642,13 +648,13 @@ InfpGetDataField(PINFCONTEXT Context,
   PINFCACHEFIELD CacheField;
   ULONG Index;
 
-  if (Context == NULL || Context->Line == NULL || Data == NULL)
+  if (Context == NULL || Data == NULL)
     {
       DPRINT("Invalid parameter\n");
       return INF_STATUS_INVALID_PARAMETER;
     }
 
-  CacheLine = (PINFCACHELINE)Context->Line;
+  CacheLine = InfpGetLineForContext(Context);
 
   if (FieldIndex > (ULONG)CacheLine->FieldCount)
     return INF_STATUS_INVALID_PARAMETER;
index 1df8bb4..a91a1ae 100644 (file)
@@ -30,6 +30,7 @@ typedef struct _INFCACHELINE
 {
   struct _INFCACHELINE *Next;
   struct _INFCACHELINE *Prev;
+  UINT Id;
 
   LONG FieldCount;
 
@@ -47,8 +48,10 @@ typedef struct _INFCACHESECTION
 
   PINFCACHELINE FirstLine;
   PINFCACHELINE LastLine;
+  UINT Id;
 
   LONG LineCount;
+  UINT NextLineId;
 
   WCHAR Name[1];
 } INFCACHESECTION, *PINFCACHESECTION;
@@ -58,6 +61,7 @@ typedef struct _INFCACHE
   LANGID LanguageId;
   PINFCACHESECTION FirstSection;
   PINFCACHESECTION LastSection;
+  UINT NextSectionId;
 
   PINFCACHESECTION StringsSection;
 } INFCACHE, *PINFCACHE;
@@ -66,8 +70,8 @@ typedef struct _INFCONTEXT
 {
   PINFCACHE Inf;
   PINFCACHE CurrentInf;
-  PINFCACHESECTION Section;
-  PINFCACHELINE Line;
+  UINT Section;
+  UINT Line;
 } INFCONTEXT;
 
 typedef int INFSTATUS;
@@ -142,5 +146,11 @@ extern INFSTATUS InfpAddLineWithKey(PINFCONTEXT Context, PCWSTR Key);
 extern INFSTATUS InfpAddField(PINFCONTEXT Context, PCWSTR Data);
 
 extern VOID InfpFreeContext(PINFCONTEXT Context);
+PINFCACHELINE
+InfpFindLineById(PINFCACHESECTION Section, UINT Id);
+PINFCACHESECTION
+InfpGetSectionForContext(PINFCONTEXT Context);
+PINFCACHELINE
+InfpGetLineForContext(PINFCONTEXT Context);
 
 /* EOF */
index c049f3f..7661582 100644 (file)
@@ -191,6 +191,7 @@ InfpFindOrAddSection(PINFCACHE Cache,
                      PCWSTR Section,
                      PINFCONTEXT *Context)
 {
+  PINFCACHESECTION CacheSection;
   DPRINT("InfpFindOrAddSection section %S\n", Section);
 
   *Context = MALLOC(sizeof(INFCONTEXT));
@@ -201,13 +202,13 @@ InfpFindOrAddSection(PINFCACHE Cache,
     }
 
   (*Context)->Inf = Cache;
-  (*Context)->Section = InfpFindSection(Cache, Section);
-  (*Context)->Line = NULL;
-  if (NULL == (*Context)->Section)
+  (*Context)->Line = 0;
+  CacheSection = InfpFindSection(Cache, Section);
+  if (NULL == CacheSection)
     {
       DPRINT("Section not found, creating it\n");
-      (*Context)->Section = InfpAddSection(Cache, Section);
-      if (NULL == (*Context)->Section)
+      CacheSection = InfpAddSection(Cache, Section);
+      if (NULL == CacheSection)
         {
           DPRINT("Failed to create section\n");
           FREE(*Context);
@@ -215,26 +216,32 @@ InfpFindOrAddSection(PINFCACHE Cache,
         }
     }
 
+  (*Context)->Section = CacheSection->Id;
   return INF_STATUS_SUCCESS;
 }
 
 INFSTATUS
 InfpAddLineWithKey(PINFCONTEXT Context, PCWSTR Key)
 {
+  PINFCACHESECTION Section;
+  PINFCACHELINE Line;
+
   if (NULL == Context)
     {
       DPRINT1("Invalid parameter\n");
       return INF_STATUS_INVALID_PARAMETER;
     }
 
-  Context->Line = InfpAddLine(Context->Section);
-  if (NULL == Context->Line)
+  Section = InfpGetSectionForContext(Context);
+  Line = InfpAddLine(Section);
+  if (NULL == Line)
     {
       DPRINT("Failed to create line\n");
       return INF_STATUS_NO_MEMORY;
     }
+  Context->Line = Line->Id;
 
-  if (NULL != Key && NULL == InfpAddKeyToLine(Context->Line, Key))
+  if (NULL != Key && NULL == InfpAddKeyToLine(Line, Key))
     {
       DPRINT("Failed to add key\n");
       return INF_STATUS_NO_MEMORY;
@@ -246,13 +253,16 @@ InfpAddLineWithKey(PINFCONTEXT Context, PCWSTR Key)
 INFSTATUS
 InfpAddField(PINFCONTEXT Context, PCWSTR Data)
 {
-  if (NULL == Context || NULL == Context->Line)
+  PINFCACHELINE Line;
+
+  if (NULL == Context)
     {
       DPRINT1("Invalid parameter\n");
       return INF_STATUS_INVALID_PARAMETER;
     }
 
-  if (NULL == InfpAddFieldToLine(Context->Line, Data))
+  Line = InfpGetLineForContext(Context);
+  if (NULL == InfpAddFieldToLine(Line, Data))
     {
       DPRINT("Failed to add field\n");
       return INF_STATUS_NO_MEMORY;