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
13 #include "../include/debug.h"
27 return FindResourceExA (hModule
, lpType
, lpName
, 0);
49 RtlInitUnicodeString (&NameU
,
51 RtlInitUnicodeString (&TypeU
,
54 if (HIWORD(lpName
) != 0)
56 RtlInitAnsiString (&Name
,
58 RtlAnsiStringToUnicodeString (&NameU
,
63 NameU
.Buffer
= (PWSTR
)lpName
;
65 if (HIWORD(lpType
) != 0)
67 RtlInitAnsiString (&Type
,
69 RtlAnsiStringToUnicodeString (&TypeU
,
74 TypeU
.Buffer
= (PWSTR
)lpType
;
76 Res
= FindResourceExW (hModule
,
81 if (HIWORD(lpName
) != 0)
82 RtlFreeUnicodeString (&NameU
);
84 if (HIWORD(lpType
) != 0)
85 RtlFreeUnicodeString (&TypeU
);
102 return FindResourceExW (hModule
, lpType
, lpName
, 0);
118 PIMAGE_RESOURCE_DATA_ENTRY ResourceDataEntry
= NULL
;
119 LDR_RESOURCE_INFO ResourceInfo
;
122 if ( hModule
== NULL
)
123 hModule
= (HINSTANCE
)GetModuleHandleW(NULL
);
125 if ( !IS_INTRESOURCE(lpName
) && lpName
[0] == L
'#' ) {
126 lpName
= MAKEINTRESOURCEW(wcstoul(lpName
+ 1, NULL
, 10));
128 if ( !IS_INTRESOURCE(lpType
) && lpType
[0] == L
'#' ) {
129 lpType
= MAKEINTRESOURCEW(wcstoul(lpType
+ 1, NULL
, 10));
132 ResourceInfo
.Type
= (ULONG
)lpType
;
133 ResourceInfo
.Name
= (ULONG
)lpName
;
134 ResourceInfo
.Language
= (ULONG
)wLanguage
;
136 Status
= LdrFindResource_U (hModule
,
140 if (!NT_SUCCESS(Status
))
142 SetLastErrorByStatus (Status
);
146 return (HRSRC
)ResourceDataEntry
;
162 PIMAGE_RESOURCE_DATA_ENTRY ResInfo
= (PIMAGE_RESOURCE_DATA_ENTRY
)hResInfo
;
166 hModule
= (HINSTANCE
)GetModuleHandleW(NULL
);
169 Status
= LdrAccessResource (hModule
, ResInfo
, &Data
, NULL
);
170 if (!NT_SUCCESS(Status
))
172 SetLastErrorByStatus (Status
);
190 return ((PIMAGE_RESOURCE_DATA_ENTRY
)hResInfo
)->Size
;
225 BeginUpdateResourceW (
227 BOOL bDeleteExistingResources
230 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
240 BeginUpdateResourceA (
242 BOOL bDeleteExistingResources
245 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
260 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
275 return EndUpdateResourceW(
287 EnumResourceLanguagesW (
291 ENUMRESLANGPROCW lpEnumFunc
,
295 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
302 EnumResourceLanguagesA (
306 ENUMRESLANGPROCA lpEnumFunc
,
310 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
316 /* retrieve the resource name to pass to the ntdll functions */
317 static NTSTATUS
get_res_nameA( LPCSTR name
, UNICODE_STRING
*str
)
321 str
->Buffer
= (LPWSTR
)name
;
322 return STATUS_SUCCESS
;
327 if (RtlCharToInteger( name
+ 1, 10, &value
) != STATUS_SUCCESS
|| HIWORD(value
))
328 return STATUS_INVALID_PARAMETER
;
329 str
->Buffer
= (LPWSTR
)value
;
330 return STATUS_SUCCESS
;
332 RtlCreateUnicodeStringFromAsciiz( str
, name
);
333 RtlUpcaseUnicodeString( str
, str
, FALSE
);
334 return STATUS_SUCCESS
;
337 /* retrieve the resource name to pass to the ntdll functions */
338 static NTSTATUS
get_res_nameW( LPCWSTR name
, UNICODE_STRING
*str
)
342 str
->Buffer
= (LPWSTR
)name
;
343 return STATUS_SUCCESS
;
348 RtlInitUnicodeString( str
, name
+ 1 );
349 if (RtlUnicodeStringToInteger( str
, 10, &value
) != STATUS_SUCCESS
|| HIWORD(value
))
350 return STATUS_INVALID_PARAMETER
;
351 str
->Buffer
= (LPWSTR
)value
;
352 return STATUS_SUCCESS
;
354 RtlCreateUnicodeString( str
, name
);
355 RtlUpcaseUnicodeString( str
, str
, FALSE
);
356 return STATUS_SUCCESS
;
359 /**********************************************************************
360 * EnumResourceNamesA (KERNEL32.@)
362 BOOL STDCALL
EnumResourceNamesA( HMODULE hmod
, LPCSTR type
, ENUMRESNAMEPROCA lpfun
, LONG_PTR lparam
)
366 DWORD len
= 0, newlen
;
369 UNICODE_STRING typeW
;
370 LDR_RESOURCE_INFO info
;
371 PIMAGE_RESOURCE_DIRECTORY basedir
, resdir
;
372 const IMAGE_RESOURCE_DIRECTORY_ENTRY
*et
;
373 const IMAGE_RESOURCE_DIR_STRING_U
*str
;
375 DPRINT( "%p %s %p %lx\n", hmod
, type
, lpfun
, lparam
);
377 if (!hmod
) hmod
= GetModuleHandleA( NULL
);
379 if ((status
= LdrFindResourceDirectory_U( hmod
, NULL
, 0, &basedir
)) != STATUS_SUCCESS
)
381 if ((status
= get_res_nameA( type
, &typeW
)) != STATUS_SUCCESS
)
383 info
.Type
= (ULONG
)typeW
.Buffer
;
384 if ((status
= LdrFindResourceDirectory_U( hmod
, &info
, 1, &resdir
)) != STATUS_SUCCESS
)
387 et
= (IMAGE_RESOURCE_DIRECTORY_ENTRY
*)(resdir
+ 1);
388 for (i
= 0; i
< resdir
->NumberOfNamedEntries
+resdir
->NumberOfIdEntries
; i
++)
390 if (et
[i
].NameIsString
)
392 str
= (IMAGE_RESOURCE_DIR_STRING_U
*) ((LPBYTE
) basedir
+ et
[i
].NameOffset
);
393 newlen
= WideCharToMultiByte(CP_ACP
, 0, str
->NameString
, str
->Length
, NULL
, 0, NULL
, NULL
);
394 if (newlen
+ 1 > len
)
397 HeapFree( GetProcessHeap(), 0, name
);
398 if (!(name
= HeapAlloc(GetProcessHeap(), 0, len
+ 1 )))
404 WideCharToMultiByte( CP_ACP
, 0, str
->NameString
, str
->Length
, name
, len
, NULL
, NULL
);
406 ret
= lpfun(hmod
,type
,name
,lparam
);
410 ret
= lpfun( hmod
, type
, (LPSTR
)(int)et
[i
].Id
, lparam
);
415 HeapFree( GetProcessHeap(), 0, name
);
416 if (HIWORD(typeW
.Buffer
)) HeapFree( GetProcessHeap(), 0, typeW
.Buffer
);
417 if (status
!= STATUS_SUCCESS
) SetLastError( RtlNtStatusToDosError(status
) );
422 /**********************************************************************
423 * EnumResourceNamesW (KERNEL32.@)
425 BOOL STDCALL
EnumResourceNamesW( HMODULE hmod
, LPCWSTR type
, ENUMRESNAMEPROCW lpfun
, LONG_PTR lparam
)
431 UNICODE_STRING typeW
;
432 LDR_RESOURCE_INFO info
;
433 PIMAGE_RESOURCE_DIRECTORY basedir
, resdir
;
434 const IMAGE_RESOURCE_DIRECTORY_ENTRY
*et
;
435 const IMAGE_RESOURCE_DIR_STRING_U
*str
;
437 DPRINT( "%p %s %p %lx\n", hmod
, type
, lpfun
, lparam
);
439 if (!hmod
) hmod
= GetModuleHandleW( NULL
);
441 if ((status
= LdrFindResourceDirectory_U( hmod
, NULL
, 0, &basedir
)) != STATUS_SUCCESS
)
443 if ((status
= get_res_nameW( type
, &typeW
)) != STATUS_SUCCESS
)
445 info
.Type
= (ULONG
)typeW
.Buffer
;
446 if ((status
= LdrFindResourceDirectory_U( hmod
, &info
, 1, &resdir
)) != STATUS_SUCCESS
)
449 et
= (PIMAGE_RESOURCE_DIRECTORY_ENTRY
)(resdir
+ 1);
450 for (i
= 0; i
< resdir
->NumberOfNamedEntries
+resdir
->NumberOfIdEntries
; i
++)
452 if (et
[i
].NameIsString
)
454 str
= (IMAGE_RESOURCE_DIR_STRING_U
*) ((LPBYTE
) basedir
+ et
[i
].NameOffset
);
455 if (str
->Length
+ 1 > len
)
457 len
= str
->Length
+ 1;
458 HeapFree( GetProcessHeap(), 0, name
);
459 if (!(name
= HeapAlloc( GetProcessHeap(), 0, len
* sizeof(WCHAR
) )))
465 memcpy(name
, str
->NameString
, str
->Length
* sizeof (WCHAR
));
466 name
[str
->Length
] = 0;
467 ret
= lpfun(hmod
,type
,name
,lparam
);
471 ret
= lpfun( hmod
, type
, (LPWSTR
)(int)et
[i
].Id
, lparam
);
476 HeapFree( GetProcessHeap(), 0, name
);
477 if (HIWORD(typeW
.Buffer
)) HeapFree( GetProcessHeap(), 0, typeW
.Buffer
);
478 if (status
!= STATUS_SUCCESS
) SetLastError( RtlNtStatusToDosError(status
) );
489 ENUMRESTYPEPROCW lpEnumFunc
,
493 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
505 ENUMRESTYPEPROCA lpEnumFunc
,
509 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
528 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
547 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);