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 /* PRIVATE FUNCTIONS ********************************************************/
19 static int InfpHeapRefCount
;
26 InfpHeap
= RtlCreateHeap(HEAP_GROWABLE
, NULL
, 0, 0, NULL
, NULL
);
28 if (0 <= InfpHeapRefCount
)
35 /* PUBLIC FUNCTIONS *********************************************************/
40 InfSetHeap(PVOID Heap
)
45 InfpHeapRefCount
= -1;
51 InfOpenBufferedFile(PHINF InfHandle
,
63 *ErrorLine
= (ULONG
)-1;
65 /* Allocate file buffer */
66 FileBuffer
= MALLOC(BufferSize
+ 1);
67 if (FileBuffer
== NULL
)
69 DPRINT1("MALLOC() failed\n");
70 return(INF_STATUS_INSUFFICIENT_RESOURCES
);
73 MEMCPY(FileBuffer
, Buffer
, BufferSize
);
75 /* Append string terminator */
76 FileBuffer
[BufferSize
] = 0;
78 /* Allocate infcache header */
79 Cache
= (PINFCACHE
)MALLOC(sizeof(INFCACHE
));
82 DPRINT("MALLOC() failed\n");
84 return(INF_STATUS_INSUFFICIENT_RESOURCES
);
87 /* Initialize inicache header */
91 /* Parse the inf buffer */
92 Status
= InfpParseBuffer (Cache
,
94 FileBuffer
+ BufferSize
,
96 if (!INF_SUCCESS(Status
))
102 /* Free file buffer */
105 *InfHandle
= (HINF
)Cache
;
112 InfOpenFile(PHINF InfHandle
,
113 PUNICODE_STRING FileName
,
116 OBJECT_ATTRIBUTES ObjectAttributes
;
117 FILE_STANDARD_INFORMATION FileInfo
;
118 IO_STATUS_BLOCK IoStatusBlock
;
123 LARGE_INTEGER FileOffset
;
129 *ErrorLine
= (ULONG
)-1;
131 /* Open the inf file */
132 InitializeObjectAttributes(&ObjectAttributes
,
138 Status
= NtOpenFile(&FileHandle
,
139 GENERIC_READ
| SYNCHRONIZE
,
143 FILE_SYNCHRONOUS_IO_NONALERT
| FILE_NON_DIRECTORY_FILE
);
144 if (!INF_SUCCESS(Status
))
146 DPRINT("NtOpenFile() failed (Status %lx)\n", Status
);
150 DPRINT("NtOpenFile() successful\n");
152 /* Query file size */
153 Status
= NtQueryInformationFile(FileHandle
,
156 sizeof(FILE_STANDARD_INFORMATION
),
157 FileStandardInformation
);
158 if (!INF_SUCCESS(Status
))
160 DPRINT("NtQueryInformationFile() failed (Status %lx)\n", Status
);
165 FileLength
= FileInfo
.EndOfFile
.u
.LowPart
;
167 DPRINT("File size: %lu\n", FileLength
);
169 /* Allocate file buffer */
170 FileBuffer
= MALLOC(FileLength
+ 1);
171 if (FileBuffer
== NULL
)
173 DPRINT1("MALLOC() failed\n");
175 return(INF_STATUS_INSUFFICIENT_RESOURCES
);
179 FileOffset
.QuadPart
= 0ULL;
180 Status
= NtReadFile(FileHandle
,
190 /* Append string terminator */
191 FileBuffer
[FileLength
] = 0;
195 if (!INF_SUCCESS(Status
))
197 DPRINT("NtReadFile() failed (Status %lx)\n", Status
);
202 /* Allocate infcache header */
203 Cache
= (PINFCACHE
)MALLOC(sizeof(INFCACHE
));
206 DPRINT("MALLOC() failed\n");
208 return(INF_STATUS_INSUFFICIENT_RESOURCES
);
211 /* Initialize inicache header */
215 /* Parse the inf buffer */
216 Status
= InfpParseBuffer (Cache
,
218 FileBuffer
+ FileLength
,
220 if (!INF_SUCCESS(Status
))
226 /* Free file buffer */
229 *InfHandle
= (HINF
)Cache
;
236 InfCloseFile(HINF InfHandle
)
240 Cache
= (PINFCACHE
)InfHandle
;
247 while (Cache
->FirstSection
!= NULL
)
249 Cache
->FirstSection
= InfpFreeSection(Cache
->FirstSection
);
251 Cache
->LastSection
= NULL
;
255 if (0 < InfpHeapRefCount
)
258 if (0 == InfpHeapRefCount
)
260 RtlDestroyHeap(InfpHeap
);