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