Sun Aug 11 13:00:20 1996 Alexandre Julliard <julliard@lrc.epfl.ch> * [configure.in] [include/acconfig.h] [tools/build.c] Added check for underscore on external symbols. * [memory/selector.c] [memory/global.c] Fixed FreeSelector() to free only one selector. Added SELECTOR_FreeBlock() to free an array of selectors. * [objects/color.c] Fixed a bug in COLOR_ToLogical() that caused GetPixel() to fail on hi-color displays. * [tools/build.c] [if1632/crtdll.spec] Added 'extern' type, used for external variables or functions. * [windows/winpos.c] Allow de-activating a window in WINPOS_ChangeActiveWindow(). * [windows/winproc.c] Added 32-to-16 translation for button messages. Fixed WINPROC_GetPtr() to avoid crashes on 32-bit procedures that happen to be valid SEGPTRs. Sat Aug 10 18:22:25 1996 Albrecht Kleine <kleine@ak.sax.de> * [windows/message.c] Removed a FIXME in MSG_PeekHardwareMsg(): produces correct data for the JOURNALRECORD-hook (using EVENTMSG16 structure). * [if1632/gdi.spec] [include/windows.h] [objects/metafile.c] Introduced undocumented API function IsValidMetaFile(), plus a minor fix in last patch of CopyMetaFile(). * [objects/gdiobj.c] Removed a FIXME in IsGDIObject(): added magic word check. Sun Aug 10 18:10:10 1996 Bruce Milner <Bruce.Milner@genetics.utah.edu> * [controls/statuswin.c] First pass at implementing the StatusWindow class. * [include/commctrl.h] Header file for common controls. * [controls/widgets.c] Added InitCommonControls(). * [if1632/comctl32.spec] Add DrawStatusTextA, CreateStatusWindowA, InitCommonControls. * [win32/findfile.c] [if1632/kernel32.spec] Add FindNextFile32A, FindClose. Modified FindFirstFile32A so it works with FindNextFile32A. * [include/winbase.h] Fixed WIN32_FIND_DATA structure member names. Sat Aug 10 09:00:00 1996 Alex Korobka <alex@phm30.pharm.sunysb.edu> * [windows/scroll.c] Changed scrolling routines to benefit from DCE code update. Thu Aug 8 18:05:09 1996 Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de> * [files/file.c] SearchPath* could get NULL for lastpart argument. * [if1632/build-spec.txt] [documentation/debugging] Varargs documentation added, debugging hints updated. * [if1632/crtdll.spec][misc/crtdll.c][misc/Makefile.in] Started to implement CRTDLL. * [if1632/wsock32.spec] Some thunks to standard libc functions (structures have the same elements, but perhaps wrong offset due to packing). * [include/kernel32.h][include/windows.h][win32/*.c][loader/main.c] Merged kernel32.h into windows.h. * [misc/lstr.c] Enhanced FormatMessage(). * [misc/main.c] [if1632/kernel.spec] [include/windows.h] GetVersion() updated to new naming standard. Changed language handling to support language ids. * [misc/shell.c] Enhanced FindExecutable, so it finds files in the search path too. * [win32/environment.c] GetCommandLine* updated. * [loader/resource.c] [loader/pe_resource.c] FindResourceEx32* added. Loading of messagetables added. Language handling now uses Wine default language id.
171 lines
5.1 KiB
C
171 lines
5.1 KiB
C
#ifndef WINELIB
|
|
/*
|
|
* PE (Portable Execute) File Resources
|
|
*
|
|
* Copyright 1995 Thomas Sandford
|
|
* Copyright 1996 Martin von Loewis
|
|
*
|
|
* Based on the Win16 resource handling code in loader/resource.c
|
|
* Copyright 1993 Robert J. Amstadt
|
|
* Copyright 1995 Alexandre Julliard
|
|
*
|
|
* This is not even at ALPHA level yet. Don't expect it to work!
|
|
*/
|
|
|
|
#include <sys/types.h>
|
|
#include "wintypes.h"
|
|
#include "windows.h"
|
|
#include "pe_image.h"
|
|
#include "module.h"
|
|
#include "handle32.h"
|
|
#include "libres.h"
|
|
#include "resource32.h"
|
|
#include "stackframe.h"
|
|
#include "neexe.h"
|
|
#include "accel.h"
|
|
#include "xmalloc.h"
|
|
#include "string32.h"
|
|
#include "stddebug.h"
|
|
#include "debug.h"
|
|
|
|
#define PrintIdA(name) \
|
|
if (HIWORD((DWORD)name)) \
|
|
dprintf_resource( stddeb, "'%s'", name); \
|
|
else \
|
|
dprintf_resource( stddeb, "#%04x", LOWORD(name));
|
|
#define PrintIdW(name)
|
|
#define PrintId(name)
|
|
|
|
/**********************************************************************
|
|
* GetResDirEntryW
|
|
*
|
|
* Helper function - goes down one level of PE resource tree
|
|
*
|
|
*/
|
|
PIMAGE_RESOURCE_DIRECTORY GetResDirEntryW(PIMAGE_RESOURCE_DIRECTORY resdirptr,
|
|
LPCWSTR name,
|
|
DWORD root)
|
|
{
|
|
int entrynum;
|
|
PIMAGE_RESOURCE_DIRECTORY_ENTRY entryTable;
|
|
int namelen;
|
|
|
|
if (HIWORD(name)) {
|
|
/* FIXME: what about #xxx names? */
|
|
entryTable = (PIMAGE_RESOURCE_DIRECTORY_ENTRY) (
|
|
(BYTE *) resdirptr +
|
|
sizeof(IMAGE_RESOURCE_DIRECTORY));
|
|
namelen = lstrlen32W(name);
|
|
for (entrynum = 0; entrynum < resdirptr->NumberOfNamedEntries; entrynum++)
|
|
{
|
|
PIMAGE_RESOURCE_DIR_STRING_U str =
|
|
(PIMAGE_RESOURCE_DIR_STRING_U) (root +
|
|
(entryTable[entrynum].Name & 0x7fffffff));
|
|
if(namelen != str->Length)
|
|
continue;
|
|
if(lstrncmpi32W(name,str->NameString,str->Length)==0)
|
|
return (PIMAGE_RESOURCE_DIRECTORY) (
|
|
root +
|
|
(entryTable[entrynum].OffsetToData & 0x7fffffff));
|
|
}
|
|
return NULL;
|
|
} else {
|
|
entryTable = (PIMAGE_RESOURCE_DIRECTORY_ENTRY) (
|
|
(BYTE *) resdirptr +
|
|
sizeof(IMAGE_RESOURCE_DIRECTORY) +
|
|
resdirptr->NumberOfNamedEntries * sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
|
|
for (entrynum = 0; entrynum < resdirptr->NumberOfIdEntries; entrynum++)
|
|
if ((DWORD)entryTable[entrynum].Name == (DWORD)name)
|
|
return (PIMAGE_RESOURCE_DIRECTORY) (
|
|
root +
|
|
(entryTable[entrynum].OffsetToData & 0x7fffffff));
|
|
/* just use first entry if no default can be found */
|
|
if (!name && resdirptr->NumberOfIdEntries)
|
|
return (PIMAGE_RESOURCE_DIRECTORY) (
|
|
root +
|
|
(entryTable[0].OffsetToData & 0x7fffffff));
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
/**********************************************************************
|
|
* GetResDirEntryA
|
|
*
|
|
* Helper function - goes down one level of PE resource tree
|
|
*
|
|
*/
|
|
PIMAGE_RESOURCE_DIRECTORY GetResDirEntryA(PIMAGE_RESOURCE_DIRECTORY resdirptr,
|
|
LPCSTR name,
|
|
DWORD root)
|
|
{
|
|
LPWSTR xname;
|
|
PIMAGE_RESOURCE_DIRECTORY ret;
|
|
|
|
if (HIWORD((DWORD)name))
|
|
xname = STRING32_DupAnsiToUni(name);
|
|
else
|
|
xname = (LPWSTR)name;
|
|
|
|
ret=GetResDirEntryW(resdirptr,xname,root);
|
|
if (HIWORD((DWORD)name))
|
|
free(xname);
|
|
return ret;
|
|
}
|
|
|
|
/**********************************************************************
|
|
* PE_FindResourceEx32W
|
|
*/
|
|
HANDLE32 PE_FindResourceEx32W(
|
|
HINSTANCE hModule, LPCWSTR name, LPCWSTR type, WORD lang
|
|
)
|
|
{
|
|
PE_MODULE *pe;
|
|
NE_MODULE *pModule;
|
|
PIMAGE_RESOURCE_DIRECTORY resdirptr;
|
|
DWORD root;
|
|
HANDLE32 result;
|
|
|
|
hModule = GetExePtr( hModule ); /* In case we were passed an hInstance */
|
|
dprintf_resource(stddeb, "FindResource: module=%08x type=", hModule );
|
|
PrintId( type );
|
|
dprintf_resource( stddeb, " name=" );
|
|
PrintId( name );
|
|
dprintf_resource( stddeb, "\n" );
|
|
if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
|
|
if (!(pModule->flags & NE_FFLAGS_WIN32)) return 0; /* FIXME? */
|
|
if (!(pe = pModule->pe_module) || !pe->pe_resource) return 0;
|
|
|
|
resdirptr = (PIMAGE_RESOURCE_DIRECTORY) pe->pe_resource;
|
|
root = (DWORD) resdirptr;
|
|
if ((resdirptr = GetResDirEntryW(resdirptr, type, root)) == NULL)
|
|
return 0;
|
|
if ((resdirptr = GetResDirEntryW(resdirptr, name, root)) == NULL)
|
|
return 0;
|
|
result = (HANDLE32)GetResDirEntryW(resdirptr, (LPCWSTR)(UINT32)lang, root);
|
|
/* Try LANG_NEUTRAL, too */
|
|
if(!result)
|
|
return (HANDLE32)GetResDirEntryW(resdirptr, (LPCWSTR)0, root);
|
|
return result;
|
|
}
|
|
|
|
|
|
/**********************************************************************
|
|
* PE_LoadResource32
|
|
*/
|
|
HANDLE32 PE_LoadResource32( HINSTANCE hModule, HANDLE32 hRsrc )
|
|
{
|
|
NE_MODULE *pModule;
|
|
PE_MODULE *pe;
|
|
|
|
if (!hModule) hModule = GetTaskDS(); /* FIXME: see FindResource32W */
|
|
hModule = GetExePtr( hModule ); /* In case we were passed an hInstance */
|
|
dprintf_resource(stddeb, "PE_LoadResource32: module=%04x res=%04x\n",
|
|
hModule, hRsrc );
|
|
if (!hRsrc) return 0;
|
|
|
|
if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
|
|
if (!(pModule->flags & NE_FFLAGS_WIN32)) return 0; /* FIXME? */
|
|
if (!(pe = pModule->pe_module) || !pe->pe_resource) return 0;
|
|
return (HANDLE32) (pe->load_addr+((PIMAGE_RESOURCE_DATA_ENTRY)hRsrc)->OffsetToData);
|
|
}
|
|
#endif
|