mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 10:04:49 +00:00
[INFLIB] Fix INFCONTEXT structure to be compatible with the official definition (#1603)
* [INFLIB] Fix INFCONTEXT structure to be compatible with the official definition. This makes inflib work on x64.
This commit is contained in:
parent
a9c4c07955
commit
a75e4db855
4 changed files with 136 additions and 40 deletions
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue