Emanuele Aliberti <ea@reactos.com>
[reactos.git] / reactos / lib / kernel32 / misc / res.c
1 /* $Id: res.c,v 1.22 2004/09/11 17:06:33 gvg Exp $
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT : ReactOS user mode libraries
5 * MODULE : kernel32.dll
6 * FILE : reactos/lib/kernel32/misc/res.c
7 * AUTHOR : ???
8 */
9
10 #include <k32.h>
11
12 #define NDEBUG
13 #include "../include/debug.h"
14
15
16 /*
17 * @implemented
18 */
19 HRSRC
20 STDCALL
21 FindResourceA (
22 HINSTANCE hModule,
23 LPCSTR lpName,
24 LPCSTR lpType
25 )
26 {
27 return FindResourceExA (hModule, lpType, lpName, 0);
28 }
29
30
31 /*
32 * @implemented
33 */
34 HRSRC
35 STDCALL
36 FindResourceExA(
37 HINSTANCE hModule,
38 LPCSTR lpType,
39 LPCSTR lpName,
40 WORD wLanguage
41 )
42 {
43 UNICODE_STRING TypeU;
44 UNICODE_STRING NameU;
45 ANSI_STRING Type;
46 ANSI_STRING Name;
47 HRSRC Res;
48
49 RtlInitUnicodeString (&NameU,
50 NULL);
51 RtlInitUnicodeString (&TypeU,
52 NULL);
53
54 if (HIWORD(lpName) != 0)
55 {
56 RtlInitAnsiString (&Name,
57 (LPSTR)lpName);
58 RtlAnsiStringToUnicodeString (&NameU,
59 &Name,
60 TRUE);
61 }
62 else
63 NameU.Buffer = (PWSTR)lpName;
64
65 if (HIWORD(lpType) != 0)
66 {
67 RtlInitAnsiString (&Type,
68 (LPSTR)lpType);
69 RtlAnsiStringToUnicodeString (&TypeU,
70 &Type,
71 TRUE);
72 }
73 else
74 TypeU.Buffer = (PWSTR)lpType;
75
76 Res = FindResourceExW (hModule,
77 TypeU.Buffer,
78 NameU.Buffer,
79 wLanguage);
80
81 if (HIWORD(lpName) != 0)
82 RtlFreeUnicodeString (&NameU);
83
84 if (HIWORD(lpType) != 0)
85 RtlFreeUnicodeString (&TypeU);
86
87 return Res;
88 }
89
90
91 /*
92 * @implemented
93 */
94 HRSRC
95 STDCALL
96 FindResourceW (
97 HINSTANCE hModule,
98 LPCWSTR lpName,
99 LPCWSTR lpType
100 )
101 {
102 return FindResourceExW (hModule, lpType, lpName, 0);
103 }
104
105
106 /*
107 * @implemented
108 */
109 HRSRC
110 STDCALL
111 FindResourceExW (
112 HINSTANCE hModule,
113 LPCWSTR lpType,
114 LPCWSTR lpName,
115 WORD wLanguage
116 )
117 {
118 PIMAGE_RESOURCE_DATA_ENTRY ResourceDataEntry = NULL;
119 LDR_RESOURCE_INFO ResourceInfo;
120 NTSTATUS Status;
121
122 if ( hModule == NULL )
123 hModule = (HINSTANCE)GetModuleHandleW(NULL);
124
125 if ( !IS_INTRESOURCE(lpName) && lpName[0] == L'#' ) {
126 lpName = MAKEINTRESOURCEW(wcstoul(lpName + 1, NULL, 10));
127 }
128 if ( !IS_INTRESOURCE(lpType) && lpType[0] == L'#' ) {
129 lpType = MAKEINTRESOURCEW(wcstoul(lpType + 1, NULL, 10));
130 }
131
132 ResourceInfo.Type = (ULONG)lpType;
133 ResourceInfo.Name = (ULONG)lpName;
134 ResourceInfo.Language = (ULONG)wLanguage;
135
136 Status = LdrFindResource_U (hModule,
137 &ResourceInfo,
138 RESOURCE_DATA_LEVEL,
139 &ResourceDataEntry);
140 if (!NT_SUCCESS(Status))
141 {
142 SetLastErrorByStatus (Status);
143 return NULL;
144 }
145
146 return (HRSRC)ResourceDataEntry;
147 }
148
149
150 /*
151 * @implemented
152 */
153 HGLOBAL
154 STDCALL
155 LoadResource (
156 HINSTANCE hModule,
157 HRSRC hResInfo
158 )
159 {
160 NTSTATUS Status;
161 PVOID Data;
162 PIMAGE_RESOURCE_DATA_ENTRY ResInfo = (PIMAGE_RESOURCE_DATA_ENTRY)hResInfo;
163
164 if (hModule == NULL)
165 {
166 hModule = (HINSTANCE)GetModuleHandleW(NULL);
167 }
168
169 Status = LdrAccessResource (hModule, ResInfo, &Data, NULL);
170 if (!NT_SUCCESS(Status))
171 {
172 SetLastErrorByStatus (Status);
173 return NULL;
174 }
175
176 return Data;
177 }
178
179
180 /*
181 * @implemented
182 */
183 DWORD
184 STDCALL
185 SizeofResource (
186 HINSTANCE hModule,
187 HRSRC hResInfo
188 )
189 {
190 return ((PIMAGE_RESOURCE_DATA_ENTRY)hResInfo)->Size;
191 }
192
193
194 /*
195 * @unimplemented
196 */
197 BOOL
198 STDCALL
199 FreeResource (
200 HGLOBAL hResData
201 )
202 {
203 return TRUE;
204 }
205
206
207 /*
208 * @unimplemented
209 */
210 LPVOID
211 STDCALL
212 LockResource (
213 HGLOBAL hResData
214 )
215 {
216 return hResData;
217 }
218
219
220 /*
221 * @unimplemented
222 */
223 HANDLE
224 STDCALL
225 BeginUpdateResourceW (
226 LPCWSTR pFileName,
227 BOOL bDeleteExistingResources
228 )
229 {
230 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
231 return FALSE;
232 }
233
234
235 /*
236 * @unimplemented
237 */
238 HANDLE
239 STDCALL
240 BeginUpdateResourceA (
241 LPCSTR pFileName,
242 BOOL bDeleteExistingResources
243 )
244 {
245 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
246 return FALSE;
247 }
248
249
250 /*
251 * @unimplemented
252 */
253 BOOL
254 STDCALL
255 EndUpdateResourceW (
256 HANDLE hUpdate,
257 BOOL fDiscard
258 )
259 {
260 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
261 return FALSE;
262 }
263
264
265 /*
266 * @unimplemented
267 */
268 BOOL
269 STDCALL
270 EndUpdateResourceA (
271 HANDLE hUpdate,
272 BOOL fDiscard
273 )
274 {
275 return EndUpdateResourceW(
276 hUpdate,
277 fDiscard
278 );
279 }
280
281
282 /*
283 * @unimplemented
284 */
285 BOOL
286 STDCALL
287 EnumResourceLanguagesW (
288 HINSTANCE hModule,
289 LPCWSTR lpType,
290 LPCWSTR lpName,
291 ENUMRESLANGPROCW lpEnumFunc,
292 LONG lParam
293 )
294 {
295 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
296 return FALSE;
297 }
298
299
300 BOOL
301 STDCALL
302 EnumResourceLanguagesA (
303 HINSTANCE hModule,
304 LPCSTR lpType,
305 LPCSTR lpName,
306 ENUMRESLANGPROCA lpEnumFunc,
307 LONG lParam
308 )
309 {
310 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
311 return FALSE;
312 }
313
314
315 /*
316 * @unimplemented
317 */
318 BOOL
319 STDCALL
320 EnumResourceNamesW (
321 HINSTANCE hModule,
322 LPCWSTR lpType,
323 ENUMRESNAMEPROCW lpEnumFunc,
324 LONG lParam
325 )
326 {
327 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
328 return FALSE;
329 }
330
331
332 /*
333 * @unimplemented
334 */
335 BOOL
336 STDCALL
337 EnumResourceNamesA (
338 HINSTANCE hModule,
339 LPCSTR lpType,
340 ENUMRESNAMEPROCA lpEnumFunc,
341 LONG lParam
342 )
343 {
344 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
345 return FALSE;
346 }
347
348
349 /*
350 * @unimplemented
351 */
352 BOOL
353 STDCALL
354 EnumResourceTypesW (
355 HINSTANCE hModule,
356 ENUMRESTYPEPROCW lpEnumFunc,
357 LONG lParam
358 )
359 {
360 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
361 return FALSE;
362 }
363
364
365 /*
366 * @unimplemented
367 */
368 BOOL
369 STDCALL
370 EnumResourceTypesA (
371 HINSTANCE hModule,
372 ENUMRESTYPEPROCA lpEnumFunc,
373 LONG lParam
374 )
375 {
376 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
377 return FALSE;
378 }
379
380
381 /*
382 * @unimplemented
383 */
384 BOOL
385 STDCALL
386 UpdateResourceA (
387 HANDLE hUpdate,
388 LPCSTR lpType,
389 LPCSTR lpName,
390 WORD wLanguage,
391 LPVOID lpData,
392 DWORD cbData
393 )
394 {
395 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
396 return FALSE;
397 }
398
399
400 /*
401 * @unimplemented
402 */
403 BOOL
404 STDCALL
405 UpdateResourceW (
406 HANDLE hUpdate,
407 LPCWSTR lpType,
408 LPCWSTR lpName,
409 WORD wLanguage,
410 LPVOID lpData,
411 DWORD cbData
412 )
413 {
414 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
415 return FALSE;
416 }
417
418 /* EOF */