2 * PROJECT: .inf file parser
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PROGRAMMER: Royce Mitchell III
6 * Ge van Geldorp <gvg@reactos.org>
9 /* INCLUDES *****************************************************************/
17 /* PUBLIC FUNCTIONS *********************************************************/
20 InfHostOpenBufferedFile(PHINF InfHandle
,
32 *ErrorLine
= (ULONG
)-1;
34 /* Allocate file buffer */
35 FileBufferSize
= BufferSize
+ 2;
36 FileBuffer
= MALLOC(FileBufferSize
);
37 if (FileBuffer
== NULL
)
39 DPRINT1("MALLOC() failed\n");
40 return(INF_STATUS_INSUFFICIENT_RESOURCES
);
43 MEMCPY(FileBuffer
, Buffer
, BufferSize
);
45 /* Append string terminator */
46 FileBuffer
[BufferSize
] = 0;
47 FileBuffer
[BufferSize
+ 1] = 0;
49 /* Allocate infcache header */
50 Cache
= (PINFCACHE
)MALLOC(sizeof(INFCACHE
));
53 DPRINT1("MALLOC() failed\n");
55 return(INF_STATUS_INSUFFICIENT_RESOURCES
);
58 /* Initialize inicache header */
62 Cache
->LanguageId
= LanguageId
;
64 /* Parse the inf buffer */
65 if (!RtlIsTextUnicode(FileBuffer
, (INT
)FileBufferSize
, NULL
))
67 // static const BYTE utf8_bom[3] = { 0xef, 0xbb, 0xbf };
69 // UINT codepage = CP_ACP;
72 // if (BufferSize > sizeof(utf8_bom) && !memcmp(FileBuffer, utf8_bom, sizeof(utf8_bom) ))
74 // codepage = CP_UTF8;
75 // offset = sizeof(utf8_bom);
78 new_buff
= MALLOC(FileBufferSize
* sizeof(WCHAR
));
82 Status
= RtlMultiByteToUnicodeN(new_buff
,
83 FileBufferSize
* sizeof(WCHAR
),
85 (char *)FileBuffer
+ offset
,
86 FileBufferSize
- offset
);
88 Status
= InfpParseBuffer(Cache
,
90 new_buff
+ len
/ sizeof(WCHAR
),
95 Status
= INF_STATUS_INSUFFICIENT_RESOURCES
;
99 WCHAR
*new_buff
= (WCHAR
*)FileBuffer
;
100 /* UCS-16 files should start with the Unicode BOM; we should skip it */
101 if (*new_buff
== 0xfeff)
104 FileBufferSize
-= sizeof(WCHAR
);
106 Status
= InfpParseBuffer(Cache
,
108 (WCHAR
*)((char*)new_buff
+ FileBufferSize
),
112 if (!INF_SUCCESS(Status
))
118 /* Free file buffer */
121 *InfHandle
= (HINF
)Cache
;
123 return INF_SUCCESS(Status
) ? 0 : -1;
128 InfHostOpenFile(PHINF InfHandle
,
129 const CHAR
*FileName
,
136 ULONG FileBufferLength
;
138 INFSTATUS Status
= INF_STATUS_SUCCESS
;
141 *ErrorLine
= (ULONG
)-1;
143 /* Open the inf file */
144 File
= fopen(FileName
, "rb");
147 DPRINT1("fopen() failed (errno %d)\n", errno
);
151 DPRINT("fopen() successful\n");
153 /* Query file size */
154 if (fseek(File
, (size_t)0, SEEK_END
))
156 DPRINT1("fseek() to EOF failed (errno %d)\n", errno
);
161 FileLength
= (ULONG
)ftell(File
);
162 if ((ULONG
) -1 == FileLength
)
164 DPRINT1("ftell() failed (errno %d)\n", errno
);
168 DPRINT("File size: %u\n", (UINT
)FileLength
);
171 if (fseek(File
, (size_t)0, SEEK_SET
))
173 DPRINT1("fseek() to BOF failed (errno %d)\n", errno
);
178 /* Allocate file buffer */
179 FileBufferLength
= FileLength
+ 2;
180 FileBuffer
= MALLOC(FileBufferLength
);
181 if (FileBuffer
== NULL
)
183 DPRINT1("MALLOC() failed\n");
189 if (FileLength
!= fread(FileBuffer
, (size_t)1, (size_t)FileLength
, File
))
191 DPRINT1("fread() failed (errno %d)\n", errno
);
199 /* Append string terminator */
200 FileBuffer
[FileLength
] = 0;
201 FileBuffer
[FileLength
+ 1] = 0;
203 /* Allocate infcache header */
204 Cache
= (PINFCACHE
)MALLOC(sizeof(INFCACHE
));
207 DPRINT1("MALLOC() failed\n");
212 /* Initialize inicache header */
216 Cache
->LanguageId
= LanguageId
;
218 /* Parse the inf buffer */
219 if (!RtlIsTextUnicode(FileBuffer
, (INT
)FileBufferLength
, NULL
))
221 // static const BYTE utf8_bom[3] = { 0xef, 0xbb, 0xbf };
223 // UINT codepage = CP_ACP;
226 // if (FileLength > sizeof(utf8_bom) && !memcmp(FileBuffer, utf8_bom, sizeof(utf8_bom) ))
228 // codepage = CP_UTF8;
229 // offset = sizeof(utf8_bom);
232 new_buff
= MALLOC(FileBufferLength
* sizeof(WCHAR
));
233 if (new_buff
!= NULL
)
236 Status
= RtlMultiByteToUnicodeN(new_buff
,
237 FileBufferLength
* sizeof(WCHAR
),
239 (char *)FileBuffer
+ offset
,
240 FileBufferLength
- offset
);
242 Status
= InfpParseBuffer(Cache
,
244 new_buff
+ len
/ sizeof(WCHAR
),
250 Status
= INF_STATUS_INSUFFICIENT_RESOURCES
;
254 WCHAR
*new_buff
= (WCHAR
*)FileBuffer
;
255 /* UCS-16 files should start with the Unicode BOM; we should skip it */
256 if (*new_buff
== 0xfeff)
259 FileBufferLength
-= sizeof(WCHAR
);
261 Status
= InfpParseBuffer(Cache
,
263 (WCHAR
*)((char*)new_buff
+ FileBufferLength
),
267 if (!INF_SUCCESS(Status
))
273 /* Free file buffer */
276 *InfHandle
= (HINF
)Cache
;
278 return INF_SUCCESS(Status
) ? 0 : -1;
283 InfHostCloseFile(HINF InfHandle
)
287 Cache
= (PINFCACHE
)InfHandle
;
294 while (Cache
->FirstSection
!= NULL
)
296 Cache
->FirstSection
= InfpFreeSection(Cache
->FirstSection
);
298 Cache
->LastSection
= NULL
;