[USETUP] Improvements for the File-queues code.
[reactos.git] / base / setup / usetup / spapisup / infsupp.c
1 /*
2 * ReactOS kernel
3 * Copyright (C) 2002 ReactOS Team
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19 /*
20 * COPYRIGHT: See COPYING in the top level directory
21 * PROJECT: ReactOS text-mode setup
22 * FILE: base/setup/lib/infsupp.c
23 * PURPOSE: Interfacing with Setup* API .INF Files support functions
24 * PROGRAMMERS: Hervé Poussineau
25 * Hermes Belusca-Maito (hermes.belusca@sfr.fr)
26 */
27
28 /* INCLUDES ******************************************************************/
29
30 #include "usetup.h"
31
32 #define NDEBUG
33 #include <debug.h>
34
35 /* SETUP* API COMPATIBILITY FUNCTIONS ****************************************/
36
37 /* Functions from the INFLIB library */
38
39 extern VOID InfCloseFile(HINF InfHandle);
40 // #define SetupCloseInfFile InfCloseFile
41 VOID
42 WINAPI
43 SetupCloseInfFile(
44 IN HINF InfHandle)
45 {
46 InfCloseFile(InfHandle);
47 }
48
49 // #define SetupFindFirstLineW InfpFindFirstLineW
50 BOOL
51 WINAPI
52 SetupFindFirstLineW(
53 IN HINF InfHandle,
54 IN PCWSTR Section,
55 IN PCWSTR Key,
56 IN OUT PINFCONTEXT Context)
57 {
58 PINFCONTEXT pContext;
59 BOOL ret;
60
61 ret = InfFindFirstLine(InfHandle, Section, Key, &pContext);
62 if (!ret)
63 return FALSE;
64
65 memcpy(Context, pContext, sizeof(INFCONTEXT));
66 InfFreeContext(pContext);
67 return TRUE;
68 }
69
70 extern BOOLEAN InfFindNextLine(PINFCONTEXT ContextIn,
71 PINFCONTEXT ContextOut);
72 // #define SetupFindNextLine InfFindNextLine
73 BOOL
74 WINAPI
75 SetupFindNextLine(
76 IN PINFCONTEXT ContextIn,
77 OUT PINFCONTEXT ContextOut)
78 {
79 return !!InfFindNextLine(ContextIn, ContextOut);
80 }
81
82 extern LONG InfGetFieldCount(PINFCONTEXT Context);
83 // #define SetupGetFieldCount InfGetFieldCount
84 ULONG
85 WINAPI
86 SetupGetFieldCount(
87 IN PINFCONTEXT Context)
88 {
89 return (ULONG)InfGetFieldCount(Context);
90 }
91
92 /*
93 * This function corresponds to an undocumented but exported SetupAPI function
94 * that exists since WinNT4 and is still present in Win10.
95 * The returned string pointer is a read-only pointer to a string in the
96 * maintained INF cache, and is always in UNICODE (on NT systems).
97 */
98 extern BOOLEAN InfGetDataField(PINFCONTEXT Context,
99 ULONG FieldIndex,
100 PWCHAR *Data);
101 PCWSTR
102 WINAPI
103 pSetupGetField(
104 IN PINFCONTEXT Context,
105 IN ULONG FieldIndex)
106 {
107 PWCHAR Data = NULL;
108 if (!InfGetDataField(Context, FieldIndex, &Data))
109 return NULL;
110 return Data;
111 }
112
113 extern BOOLEAN InfGetBinaryField(PINFCONTEXT Context,
114 ULONG FieldIndex,
115 PUCHAR ReturnBuffer,
116 ULONG ReturnBufferSize,
117 PULONG RequiredSize);
118 // #define SetupGetBinaryField InfGetBinaryField
119 BOOL
120 WINAPI
121 SetupGetBinaryField(
122 IN PINFCONTEXT Context,
123 IN ULONG FieldIndex,
124 OUT PUCHAR ReturnBuffer,
125 IN ULONG ReturnBufferSize,
126 OUT PULONG RequiredSize)
127 {
128 return !!InfGetBinaryField(Context,
129 FieldIndex,
130 ReturnBuffer,
131 ReturnBufferSize,
132 RequiredSize);
133 }
134
135 extern BOOLEAN InfGetIntField(PINFCONTEXT Context,
136 ULONG FieldIndex,
137 INT *IntegerValue);
138 // #define SetupGetIntField InfGetIntField
139 BOOL
140 WINAPI
141 SetupGetIntField(
142 IN PINFCONTEXT Context,
143 IN ULONG FieldIndex,
144 OUT INT *IntegerValue) // PINT
145 {
146 return !!InfGetIntField(Context, FieldIndex, IntegerValue);
147 }
148
149 extern BOOLEAN InfGetMultiSzField(PINFCONTEXT Context,
150 ULONG FieldIndex,
151 PWSTR ReturnBuffer,
152 ULONG ReturnBufferSize,
153 PULONG RequiredSize);
154 // #define SetupGetMultiSzFieldW InfGetMultiSzField
155 BOOL
156 WINAPI
157 SetupGetMultiSzFieldW(
158 IN PINFCONTEXT Context,
159 IN ULONG FieldIndex,
160 OUT PWSTR ReturnBuffer,
161 IN ULONG ReturnBufferSize,
162 OUT PULONG RequiredSize)
163 {
164 return !!InfGetMultiSzField(Context,
165 FieldIndex,
166 ReturnBuffer,
167 ReturnBufferSize,
168 RequiredSize);
169 }
170
171 extern BOOLEAN InfGetStringField(PINFCONTEXT Context,
172 ULONG FieldIndex,
173 PWSTR ReturnBuffer,
174 ULONG ReturnBufferSize,
175 PULONG RequiredSize);
176 // #define SetupGetStringFieldW InfGetStringField
177 BOOL
178 WINAPI
179 SetupGetStringFieldW(
180 IN PINFCONTEXT Context,
181 IN ULONG FieldIndex,
182 OUT PWSTR ReturnBuffer,
183 IN ULONG ReturnBufferSize,
184 OUT PULONG RequiredSize)
185 {
186 return !!InfGetStringField(Context,
187 FieldIndex,
188 ReturnBuffer,
189 ReturnBufferSize,
190 RequiredSize);
191 }
192
193 /* SetupOpenInfFileW with support for a user-provided LCID */
194 // #define SetupOpenInfFileExW InfpOpenInfFileW
195 HINF
196 WINAPI
197 SetupOpenInfFileExW(
198 IN PCWSTR FileName,
199 IN PCWSTR InfClass,
200 IN DWORD InfStyle,
201 IN LCID LocaleId,
202 OUT PUINT ErrorLine)
203 {
204 HINF hInf = NULL;
205 UNICODE_STRING FileNameU;
206 ULONG ErrorLineUL;
207 NTSTATUS Status;
208
209 RtlInitUnicodeString(&FileNameU, FileName);
210 Status = InfOpenFile(&hInf,
211 &FileNameU,
212 LANGIDFROMLCID(LocaleId),
213 &ErrorLineUL);
214 *ErrorLine = (UINT)ErrorLineUL;
215 if (!NT_SUCCESS(Status))
216 return INVALID_HANDLE_VALUE;
217
218 return hInf;
219 }
220
221
222 /* GLOBALS *******************************************************************/
223
224 pSpInfCloseInfFile SpInfCloseInfFile = SetupCloseInfFile;
225 pSpInfFindFirstLine SpInfFindFirstLine = SetupFindFirstLineW;
226 pSpInfFindNextLine SpInfFindNextLine = SetupFindNextLine;
227 pSpInfGetFieldCount SpInfGetFieldCount = SetupGetFieldCount;
228 pSpInfGetBinaryField SpInfGetBinaryField = SetupGetBinaryField;
229 pSpInfGetIntField SpInfGetIntField = SetupGetIntField;
230 pSpInfGetMultiSzField SpInfGetMultiSzField = SetupGetMultiSzFieldW;
231 pSpInfGetStringField SpInfGetStringField = SetupGetStringFieldW;
232 pSpInfGetField SpInfGetField = pSetupGetField;
233 pSpInfOpenInfFile SpInfOpenInfFile = SetupOpenInfFileExW;
234
235
236 /* HELPER FUNCTIONS **********************************************************/
237
238 HINF WINAPI
239 INF_OpenBufferedFileA(
240 IN PSTR FileBuffer,
241 IN ULONG FileSize,
242 IN PCSTR InfClass,
243 IN DWORD InfStyle,
244 IN LCID LocaleId,
245 OUT PUINT ErrorLine)
246 {
247 HINF hInf = NULL;
248 ULONG ErrorLineUL;
249 NTSTATUS Status;
250
251 Status = InfOpenBufferedFile(&hInf,
252 FileBuffer,
253 FileSize,
254 LANGIDFROMLCID(LocaleId),
255 &ErrorLineUL);
256 *ErrorLine = (UINT)ErrorLineUL;
257 if (!NT_SUCCESS(Status))
258 return INVALID_HANDLE_VALUE;
259
260 return hInf;
261 }
262
263 /* EOF */