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