mirror of
https://github.com/reactos/reactos.git
synced 2024-07-21 19:58:08 +00:00
implemented LoadResource
svn path=/trunk/; revision=776
This commit is contained in:
parent
614f99e406
commit
44744d8d36
182
reactos/lib/kernel32/misc/res.c
Normal file
182
reactos/lib/kernel32/misc/res.c
Normal file
|
@ -0,0 +1,182 @@
|
|||
#define WIN32_NO_STATUS
|
||||
#define WIN32_NO_PEHDR
|
||||
#include <windows.h>
|
||||
#include <ddk/ntddk.h>
|
||||
#include <pe.h>
|
||||
#include <ntdll/ldr.h>
|
||||
#include <kernel32/kernel32.h>
|
||||
|
||||
HRSRC
|
||||
STDCALL
|
||||
FindResourceA(
|
||||
HINSTANCE hModule,
|
||||
LPCSTR lpName,
|
||||
LPCSTR lpType
|
||||
)
|
||||
{
|
||||
return FindResourceExA(hModule,lpName,lpType,0);
|
||||
}
|
||||
|
||||
HRSRC
|
||||
STDCALL
|
||||
FindResourceExA(
|
||||
HINSTANCE hModule,
|
||||
LPCSTR lpType,
|
||||
LPCSTR lpName,
|
||||
WORD wLanguage
|
||||
)
|
||||
{
|
||||
WCHAR ResourceNameW[MAX_PATH];
|
||||
WCHAR TypeNameW[MAX_PATH];
|
||||
|
||||
WCHAR *ResourceName = ResourceNameW;
|
||||
WCHAR *TypeName = TypeNameW;
|
||||
|
||||
if ( HIWORD(lpName) != 0 ) {
|
||||
|
||||
if (!KERNEL32_AnsiToUnicode(ResourceNameW,
|
||||
lpName,
|
||||
MAX_PATH))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
ResourceName = (WCHAR *)lpName;
|
||||
|
||||
if ( HIWORD(lpType) != 0 ) {
|
||||
|
||||
if (!KERNEL32_AnsiToUnicode(TypeNameW,
|
||||
lpType,
|
||||
MAX_PATH))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
TypeName = lpType;
|
||||
|
||||
return FindResourceExW(hModule,TypeName,ResourceName,wLanguage);
|
||||
|
||||
}
|
||||
|
||||
HRSRC
|
||||
STDCALL
|
||||
FindResourceW(
|
||||
HINSTANCE hModule,
|
||||
LPCWSTR lpName,
|
||||
LPCWSTR lpType
|
||||
)
|
||||
{
|
||||
return FindResourceExW(hModule,lpName,lpType,0);
|
||||
}
|
||||
|
||||
HRSRC
|
||||
STDCALL
|
||||
FindResourceExW(
|
||||
HINSTANCE hModule,
|
||||
LPCWSTR lpType,
|
||||
LPCWSTR lpName,
|
||||
WORD wLanguage
|
||||
)
|
||||
{
|
||||
|
||||
IMAGE_RESOURCE_DATA_ENTRY *ResourceDataEntry;
|
||||
NTSTATUS Status;
|
||||
int i,l;
|
||||
ULONG nType = 0, nName = 0;
|
||||
|
||||
if ( hModule == NULL )
|
||||
hModule = GetModuleHandle(NULL);
|
||||
|
||||
|
||||
if ( HIWORD(lpName) != 0 ) {
|
||||
if ( lpName[0] == L'#' ) {
|
||||
l = lstrlenW(lpName) -1;
|
||||
|
||||
for(i=0;i<l;i++) {
|
||||
nName = lpName[i+1] - L'0';
|
||||
if ( i < l - 1 )
|
||||
nName*= 10;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
lpName = (LPWSTR)nName;
|
||||
}
|
||||
|
||||
|
||||
|
||||
if ( HIWORD(lpType) != 0 ) {
|
||||
if ( lpType[0] == L'#' ) {
|
||||
l = lstrlenW(lpType);
|
||||
|
||||
for(i=0;i<l;i++) {
|
||||
nType = lpType[i] - L'0';
|
||||
if ( i < l - 1 )
|
||||
nType*= 10;
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
else
|
||||
nType = lpType;
|
||||
|
||||
|
||||
|
||||
Status = LdrFindResource_U(hModule,&ResourceDataEntry,lpName, nType,wLanguage);
|
||||
if ( !NT_SUCCESS(Status ) ) {
|
||||
SetLastError(RtlNtStatusToDosError(Status));
|
||||
return NULL;
|
||||
}
|
||||
return ResourceDataEntry;
|
||||
}
|
||||
|
||||
|
||||
HGLOBAL
|
||||
STDCALL
|
||||
LoadResource(
|
||||
HINSTANCE hModule,
|
||||
HRSRC hResInfo
|
||||
)
|
||||
{
|
||||
void **Data;
|
||||
Data = HeapAlloc(GetProcessHeap(),0,sizeof(void *));
|
||||
|
||||
LdrAccessResource(hModule, hResInfo, Data);
|
||||
return *Data;
|
||||
}
|
||||
|
||||
DWORD
|
||||
STDCALL
|
||||
SizeofResource(
|
||||
HINSTANCE hModule,
|
||||
HRSRC hResInfo
|
||||
)
|
||||
{
|
||||
return ((PIMAGE_RESOURCE_DATA_ENTRY)hResInfo)->Size;
|
||||
}
|
||||
|
||||
WINBOOL
|
||||
STDCALL
|
||||
FreeResource (
|
||||
HGLOBAL hResData
|
||||
)
|
||||
{
|
||||
HeapFree(GetProcessHeap(),0,&hResData);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
LPVOID
|
||||
STDCALL
|
||||
LockResource (
|
||||
HGLOBAL hResData
|
||||
)
|
||||
{
|
||||
return hResData;
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in a new issue