mirror of
https://github.com/reactos/wine.git
synced 2025-02-08 05:08:16 +00:00
![Alexandre Julliard](/assets/img/avatar_default.png)
Sun Jul 28 17:57:19 1996 Alexandre Julliard <julliard@lrc.epfl.ch> * [loader/task.c] [include/task.h] Implemented SwitchStackTo()/SwitchStackBack(). * [include/wintypes.h] [loader/main.c] Added __winelib variable to distinguish between emulator and library at run-time. Later on, this should avoid some recompilations when building Winelib. * [windows/property.c] Implemented Win32 functions for window properties. Fri Jul 26 18:00:00 1996 Alex Korobka <alex@phm30.pharm.sunysb.edu> * [controls/listbox.c] Implemented LBS_SORT style, WM_COMPAREITEM, and WM_DELETEITEM messages. * [controls/menu.c] Call TranslateMessage() to enable shortcuts (on WM_CHAR). * [include/cursoricon.h] Moved #pragma pack(1) back to where it belongs. * [objects/palette.c] RealizeDefaultPalette() maps to system colors only. Do not broadcast palette notifications when in TrueColor. * [objects/color.c] [include/palette.h] Miscellaneous optimizations. Had to fix several "improvements" made to my patch for previous release. * [objects/dib.c] Reverse dib bits order for 24-bit SetDIBits(). * [objects/dc.c] GetDeviceCaps() does not return RC_PALETTE when in TrueColor. * [windows/scroll.c] Scroll update region too. * [windows/message.c] Include QS_MOUSE into the event mask for nonclient mouse message filter. Fixes problems with Word 6 freezing when mouse hits nonclient area. * [windows/win.c] Allow top-level windows to be linked as HWND_TOP in CreateWindow(). * [windows/winpos.c] [windows/mdi.c] Attempt to fix control menu duplication. Fri Jul 26 09:49:35 1996 Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de> * [files/drive.c] GetDriveType32A(): return value for CDROM fixed. * [files/file.c] SearchPath* added. * [if1632/gdi32.spec] [objects/brush.c] SetBrushOrgEx() added. * [loader/pe_resource.c] If even loading the default entry fails, we just use the first entry from the resource directory. [loader/task.c] SetSigHandler() stub added, Paradox 4.5 now starts up. * [misc/comm.c] [include/windows.h] [if1632/kernel32.spec] COMM functions updated to win32, not complete. * [misc/lstr.c] FormatMessageA partially implemented. * [include/miscemu.h] [memory/selector.c] [memory/global.c] [miscemu/dosmem.c] DOS memory handling changed: 1MB preallocated block, real-mode segment handling possible, SetSelectorBase into lower physical 1MB possible. * [miscemu/dpmi.c] Real-mode segments changed, real-mode int 21,ax=6506 added. AX=0x0303 added. * [multimedia/time.c] Fixed bug in killTimer. * [objects/bitmap.c] LoadImageA partially implemented. Wed Jul 24 18:20:24 1996 Albrecht Kleine <kleine@ak.sax.de> * [include/dde_mem.h][include/dde_proc.h] [ipc/dde_atom.c][ipc/dde_proc.c][windows/message.c] [ipc/generic_hash.h][library/miscstubs.c] Changes for error free compilation using "--with-ipc": replaced some names with *16-equivalent (e.g. MSG to MSG16), modified prototype of function DDE_GlobalFree() . * [objects/palette.c] Added check for metafile-DC in GDISelectPalette(), GDIRealizePalette(),RealizeDefaultPalette() and IsDCCurrentPalette(). Tue Jul 23 22:46:53 1996 Andrew Lewycky <plewycky@oise.utoronto.ca> * [controls/edit.c] EDIT_WM_Create: Don't EDIT_EM_ReplaceSel if created with lParam = "", fixes Winhelp. * [windows/dialog.c] DIALOG_CreateIndirect: Initialise dlgProc before creating children.
173 lines
5.1 KiB
C
173 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 "kernel32.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"
|
|
|
|
int language = 0x0409;
|
|
|
|
#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_FindResource32W
|
|
*/
|
|
HANDLE32 PE_FindResource32W( HINSTANCE hModule, LPCWSTR name, LPCWSTR type )
|
|
{
|
|
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)language, 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
|