Release 970202
Sun Feb 2 12:31:03 1997 Alexandre Julliard <julliard@lrc.epfl.ch>
* [files/drive.c]
Fixed SetCurrentDirectory() to also change the current drive.
* [win32/except.c] [tools/build.c]
Use Win32 register functions to implement exception handling.
Fixed UnhandledExceptionFilter.
Fri Jan 31 15:42:41 1997 David Faure <david.faure@ihamy.insa-lyon.fr>
* [windows/keyboard.c]
Added KEYBOARD_GenerateMsg to generate Caps Lock and NumLock events
Added calls to KEYBOARD_GenerateMsg when the key is pressed/released
or when the state has changed, out of wine.
Changed type 3-state 'ToggleKeyState' to boolean. The On/Off is given
by InputKeyStateTable.
Wed Jan 29 21:53:04 1997 Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>
* [loader/*resource.c][if1632/thunk.c]
EnumResource* added.
* [loader/pe_resource.] [loader/resource.c]
SizeofResource32(), LoadAccelerators32() added.
* [misc/lstr.c]
FormatMessage %n added.
* [misc/crtdll.c][include/ctrdll.h][if1632/crtdll.spec]
_chdrive,_errno,_isctype added.
* [misc/cpu.c]
Replaced runtime_cpu by GetSystemInfo().
* [windows/hook.c][include/hook.h]
Fixed mapping of hooks to win32/unicode.
* [windows/keyboard.c] [windows/defwnd.c]
Updated to win32 standard.
ALT-<Menukey> fixed.
* [windows/queue.c]
GetWindowThreadProcessId() implemented.
Mon Jan 27 16:42:49 1997 John Harvey <john@division.co.uk>
* [graphics/metafiledrv/*] [graphics/x11drv/*]
[objects/bitmap.c] [objects/brush.c] [objects/font.c]
[objects/gdiobj.c] [objects/pen.c]
Moved SelectObject to graphics drivers. Printer support now works
in a few cases but is definitely not complete. Generic/text driver
works. The postscript driver works if true type fonts are disabled
from the control panel. To enable printer support add Printer=on
to the wine section of your wine.conf file. This causes write not
to work properly. I know that several other printer drivers do not
work.
* [tools/build.c]
Make .stabs not used for svr4 since it doesn't use GNU assembler.
* [misc/fontengine.c]
Make sure a printf doesn't crash the system.
Sat Jan 25 15:53:35 1997 Huw D M Davies <h.davies1@physics.oxford.ac.uk>
* [objects/metafile.c]
Fixed some problems with PlayMetaFileRecord().
* [objects/dc.c]
hClipRgn gets initialized in GetDCState().
Fri Jan 24 21:22:26 1997 Philippe De Muyter <phdm@info.ucl.ac.be>
* [debugger/stabs.c]
Handle file names beginning with '/'.
Fri Jan 24 18:33:04 1997 Robert Pouliot <krynos@clic.net>
* [*/*]
Some more patches for OS/2 support.
Fri Jan 24 11:30:41 1997 Bang Jun-Young <bangjy@nownuri.nowcom.co.kr>
* [resources/sysres_Ko.rc]
Updated support for Korean (Ko) language.
diff --git a/loader/main.c b/loader/main.c
index f78ee78..1c1ee9c 100644
--- a/loader/main.c
+++ b/loader/main.c
@@ -61,7 +61,6 @@
extern BOOL32 WIN16DRV_Init(void);
extern BOOL32 SIGNAL_Init(void);
extern BOOL32 WIDGETS_Init(void);
- extern int KERN32_Init(void);
int queueSize;
@@ -144,9 +143,6 @@
/* Initialize message spying */
if (!SPY_Init()) return 0;
- /* Initialize Win32 data structures */
- if (!KERN32_Init()) return 0;
-
/* Create system message queue */
queueSize = GetProfileInt32A( "windows", "TypeAhead", 120 );
if (!QUEUE_CreateSysMsgQueue( queueSize )) return 0;
diff --git a/loader/pe_image.c b/loader/pe_image.c
index 9d4816c..d30b09b 100644
--- a/loader/pe_image.c
+++ b/loader/pe_image.c
@@ -17,9 +17,6 @@
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
-#ifndef __EMX__
-#include <sys/mman.h>
-#endif
#include "windows.h"
#include "winbase.h"
#include "callback.h"
@@ -65,14 +62,14 @@
if (i<pe_exports->NumberOfNames) {
ename=(char*)RVA(*name++);
dprintf_win32(stddeb,"%-32s %4d %8.8lx (%8.8lx)\n",ename,*ordinal,functions[*ordinal],*function);
- sprintf(buffer,"%s.%s",Module,ename);
+ sprintf(buffer,"%s_%s",Module,ename);
daddr.off=RVA(functions[*ordinal]);
ordinal++;
function++;
} else {
/* ordinals/names no longer valid, but we still got functions */
dprintf_win32(stddeb,"%-32s %4s %8s %8.8lx\n","","","",*function);
- sprintf(buffer,"%s.%d",Module,i);
+ sprintf(buffer,"%s_%d",Module,i);
daddr.off=RVA(*functions);
function++;
}
@@ -541,7 +538,7 @@
if (pe->pe_export) {
/* add start of sections as debugsymbols */
for(i=0;i<pe->pe_header->FileHeader.NumberOfSections;i++) {
- sprintf(buffer,"%s.%s",
+ sprintf(buffer,"%s_%s",
(char*)RVA(pe->pe_export->Name),
pe->pe_seg[i].Name
);
@@ -549,7 +546,7 @@
DEBUG_AddSymbol(buffer,&daddr, NULL, SYM_WIN32 | SYM_FUNC);
}
/* add entry point */
- sprintf(buffer,"%s.EntryPoint",(char*)RVA(pe->pe_export->Name));
+ sprintf(buffer,"%s_EntryPoint",(char*)RVA(pe->pe_export->Name));
daddr.off=RVA(pe->pe_header->OptionalHeader.AddressOfEntryPoint);
DEBUG_AddSymbol(buffer,&daddr, NULL, SYM_WIN32 | SYM_FUNC);
/* add start of DLL */
diff --git a/loader/pe_resource.c b/loader/pe_resource.c
index 7c7e6af..08655d0 100644
--- a/loader/pe_resource.c
+++ b/loader/pe_resource.c
@@ -8,8 +8,7 @@
* 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!
+ * Copyright 1997 Marcus Meissner
*/
#include <sys/types.h>
@@ -18,22 +17,28 @@
#include "pe_image.h"
#include "module.h"
#include "heap.h"
-#include "handle32.h"
#include "libres.h"
#include "stackframe.h"
#include "neexe.h"
-#include "accel.h"
-#include "xmalloc.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)
+/**********************************************************************
+ * HMODULE32toPE_MODULE
+ *
+ * small helper function to get a PE_MODULE from a passed HMODULE32
+ */
+static PE_MODULE*
+HMODULE32toPE_MODULE(HMODULE32 hmod) {
+ NE_MODULE *pModule;
+
+ if (!hmod) hmod = GetTaskDS(); /* FIXME: correct? */
+ hmod = GetExePtr( hmod ); /* In case we were passed an hInstance */
+
+ if (!(pModule = MODULE_GetPtr( hmod ))) return 0;
+ if (!(pModule->flags & NE_FFLAGS_WIN32)) return 0;
+ return pModule->pe_module;
+}
/**********************************************************************
* GetResDirEntryW
@@ -87,50 +92,18 @@
}
/**********************************************************************
- * GetResDirEntryA
- *
- * Helper function - goes down one level of PE resource tree
- *
- */
-LPIMAGE_RESOURCE_DIRECTORY GetResDirEntryA(LPIMAGE_RESOURCE_DIRECTORY resdirptr,
- LPCSTR name,
- DWORD root)
-{
- LPWSTR xname;
- LPIMAGE_RESOURCE_DIRECTORY ret;
-
- if (HIWORD((DWORD)name))
- xname = HEAP_strdupAtoW( GetProcessHeap(), 0, name );
- else
- xname = (LPWSTR)name;
-
- ret=GetResDirEntryW(resdirptr,xname,root);
- if (HIWORD((DWORD)name))
- HeapFree( GetProcessHeap(), 0, xname );
- return ret;
-}
-
-/**********************************************************************
* PE_FindResourceEx32W
*/
HANDLE32 PE_FindResourceEx32W(
HINSTANCE32 hModule,LPCWSTR name,LPCWSTR type,WORD lang
) {
- PE_MODULE *pe;
- NE_MODULE *pModule;
LPIMAGE_RESOURCE_DIRECTORY resdirptr;
DWORD root;
HANDLE32 result;
+ PE_MODULE *pe = HMODULE32toPE_MODULE(hModule);
- 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;
+ if (!pe || !pe->pe_resource)
+ return 0;
resdirptr = pe->pe_resource;
root = (DWORD) resdirptr;
@@ -151,18 +124,287 @@
*/
HANDLE32 PE_LoadResource32( HINSTANCE32 hModule, HANDLE32 hRsrc )
{
- NE_MODULE *pModule;
- PE_MODULE *pe;
+ PE_MODULE *pe = HMODULE32toPE_MODULE(hModule);
- 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 (!pe || !pe->pe_resource)
+ return 0;
+ if (!hRsrc)
+ return 0;
+ return (HANDLE32) (pe->load_addr+((LPIMAGE_RESOURCE_DATA_ENTRY)hRsrc)->OffsetToData);
+}
+
+
+/**********************************************************************
+ * PE_SizeofResource32
+ */
+void
+_check_ptr(DWORD x,DWORD start,LPDWORD lastmax) {
+ if ((x>start) && (x<*lastmax))
+ *lastmax=x;
+}
+
+static void
+walk_resdir(DWORD loadaddr,DWORD rootresdir,DWORD xres,DWORD data,DWORD lvl,LPDWORD max){
+ LPIMAGE_RESOURCE_DIRECTORY resdir;
+ LPIMAGE_RESOURCE_DATA_ENTRY dataent;
+ LPIMAGE_RESOURCE_DIRECTORY_ENTRY et;
+ int i;
+
+ if (lvl==3) {
+ dataent = (LPIMAGE_RESOURCE_DATA_ENTRY)(rootresdir+xres);
+ _check_ptr(loadaddr+dataent->OffsetToData,data,max);
+ return;
+ }
+ resdir = (LPIMAGE_RESOURCE_DIRECTORY)(rootresdir+xres);
+ et =(LPIMAGE_RESOURCE_DIRECTORY_ENTRY)((LPBYTE)resdir+sizeof(IMAGE_RESOURCE_DIRECTORY));
+ for (i=0;i<resdir->NumberOfNamedEntries+resdir->NumberOfIdEntries;i++)
+ walk_resdir(loadaddr,rootresdir,(lvl==2)?et[i].u2.OffsetToData:et[i].u2.s.OffsetToDirectory,data,lvl+1,max);
+}
+
+DWORD PE_SizeofResource32( HINSTANCE32 hModule, HANDLE32 hRsrc )
+{
+ PE_MODULE *pe = HMODULE32toPE_MODULE(hModule);
+ DWORD max,data;
+ IMAGE_DATA_DIRECTORY dir;
+
+ if (!pe || !pe->pe_resource)
+ return 0;
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+((LPIMAGE_RESOURCE_DATA_ENTRY)hRsrc)->OffsetToData);
+ max=(DWORD)-1;
+ dir=pe->pe_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE];
+ if(dir.Size)
+ max=(DWORD)pe->pe_resource+dir.Size;
+
+ data=((DWORD)pe->load_addr+((LPIMAGE_RESOURCE_DATA_ENTRY)hRsrc)->OffsetToData);
+ walk_resdir(pe->load_addr,(DWORD)pe->pe_resource,0,data,0,&max);
+ return max-data;
+}
+
+/**********************************************************************
+ * PE_EnumResourceTypes32A
+ */
+BOOL32
+PE_EnumResourceTypes32A(HMODULE32 hmod,ENUMRESTYPEPROC32A lpfun,LONG lparam) {
+ PE_MODULE *pe = HMODULE32toPE_MODULE(hmod);
+ int i;
+ LPIMAGE_RESOURCE_DIRECTORY resdir;
+ LPIMAGE_RESOURCE_DIRECTORY_ENTRY et;
+ BOOL32 ret;
+ HANDLE32 heap = GetProcessHeap();
+
+ if (!pe || !pe->pe_resource)
+ return FALSE;
+
+ resdir = (LPIMAGE_RESOURCE_DIRECTORY)pe->pe_resource;
+ et =(LPIMAGE_RESOURCE_DIRECTORY_ENTRY)((LPBYTE)resdir+sizeof(IMAGE_RESOURCE_DIRECTORY));
+ ret = FALSE;
+ for (i=0;i<resdir->NumberOfNamedEntries+resdir->NumberOfIdEntries;i++) {
+ LPSTR name;
+
+ if (HIWORD(et[i].u1.Name))
+ name = HEAP_strdupWtoA(heap,0,(LPWSTR)((LPBYTE)pe->pe_resource+et[i].u1.Name));
+ else
+ name = (LPSTR)et[i].u1.Name;
+ ret = lpfun(hmod,name,lparam);
+ if (HIWORD(name))
+ HeapFree(heap,0,name);
+ if (!ret)
+ break;
+ }
+ return ret;
+}
+
+/**********************************************************************
+ * PE_EnumResourceTypes32W
+ */
+BOOL32
+PE_EnumResourceTypes32W(HMODULE32 hmod,ENUMRESTYPEPROC32W lpfun,LONG lparam) {
+ PE_MODULE *pe = HMODULE32toPE_MODULE(hmod);
+ int i;
+ LPIMAGE_RESOURCE_DIRECTORY resdir;
+ LPIMAGE_RESOURCE_DIRECTORY_ENTRY et;
+ BOOL32 ret;
+
+ if (!pe || !pe->pe_resource)
+ return FALSE;
+
+ resdir = (LPIMAGE_RESOURCE_DIRECTORY)pe->pe_resource;
+ et =(LPIMAGE_RESOURCE_DIRECTORY_ENTRY)((LPBYTE)resdir+sizeof(IMAGE_RESOURCE_DIRECTORY));
+ ret = FALSE;
+ for (i=0;i<resdir->NumberOfNamedEntries+resdir->NumberOfIdEntries;i++) {
+ LPWSTR type;
+ if (HIWORD(et[i].u1.Name))
+ type = (LPWSTR)((LPBYTE)pe->pe_resource+et[i].u1.Name);
+ else
+ type = (LPWSTR)et[i].u1.Name;
+
+ ret = lpfun(hmod,type,lparam);
+ if (!ret)
+ break;
+ }
+ return ret;
+}
+
+/**********************************************************************
+ * PE_EnumResourceNames32A
+ */
+BOOL32
+PE_EnumResourceNames32A(
+ HMODULE32 hmod,LPCSTR type,ENUMRESNAMEPROC32A lpfun,LONG lparam
+) {
+ PE_MODULE *pe = HMODULE32toPE_MODULE(hmod);
+ int i;
+ LPIMAGE_RESOURCE_DIRECTORY resdir;
+ LPIMAGE_RESOURCE_DIRECTORY_ENTRY et;
+ BOOL32 ret;
+ HANDLE32 heap = GetProcessHeap();
+ LPWSTR typeW;
+
+ if (!pe || !pe->pe_resource)
+ return FALSE;
+ resdir = (LPIMAGE_RESOURCE_DIRECTORY)pe->pe_resource;
+ if (HIWORD(type))
+ typeW = HEAP_strdupAtoW(heap,0,type);
+ else
+ typeW = (LPWSTR)type;
+ resdir = GetResDirEntryW(resdir,typeW,(DWORD)pe->pe_resource);
+ if (HIWORD(typeW))
+ HeapFree(heap,0,typeW);
+ if (!resdir)
+ return FALSE;
+ et =(LPIMAGE_RESOURCE_DIRECTORY_ENTRY)((LPBYTE)resdir+sizeof(IMAGE_RESOURCE_DIRECTORY));
+ ret = FALSE;
+ for (i=0;i<resdir->NumberOfNamedEntries+resdir->NumberOfIdEntries;i++) {
+ LPSTR name;
+
+ if (HIWORD(et[i].u1.Name))
+ name = HEAP_strdupWtoA(heap,0,(LPWSTR)((LPBYTE)pe->pe_resource+et[i].u1.Name));
+ else
+ name = (LPSTR)et[i].u1.Name;
+ ret = lpfun(hmod,type,name,lparam);
+ if (HIWORD(name)) HeapFree(heap,0,name);
+ if (!ret)
+ break;
+ }
+ return ret;
+}
+
+/**********************************************************************
+ * PE_EnumResourceNames32W
+ */
+BOOL32
+PE_EnumResourceNames32W(
+ HMODULE32 hmod,LPCWSTR type,ENUMRESNAMEPROC32W lpfun,LONG lparam
+) {
+ PE_MODULE *pe = HMODULE32toPE_MODULE(hmod);
+ int i;
+ LPIMAGE_RESOURCE_DIRECTORY resdir;
+ LPIMAGE_RESOURCE_DIRECTORY_ENTRY et;
+ BOOL32 ret;
+
+ if (!pe || !pe->pe_resource)
+ return FALSE;
+
+ resdir = (LPIMAGE_RESOURCE_DIRECTORY)pe->pe_resource;
+ resdir = GetResDirEntryW(resdir,type,(DWORD)pe->pe_resource);
+ if (!resdir)
+ return FALSE;
+ et =(LPIMAGE_RESOURCE_DIRECTORY_ENTRY)((LPBYTE)resdir+sizeof(IMAGE_RESOURCE_DIRECTORY));
+ ret = FALSE;
+ for (i=0;i<resdir->NumberOfNamedEntries+resdir->NumberOfIdEntries;i++) {
+ LPWSTR name;
+ if (HIWORD(et[i].u1.Name))
+ name = (LPWSTR)((LPBYTE)pe->pe_resource+et[i].u1.Name);
+ else
+ name = (LPWSTR)et[i].u1.Name;
+ ret = lpfun(hmod,type,name,lparam);
+ if (!ret)
+ break;
+ }
+ return ret;
+}
+
+/**********************************************************************
+ * PE_EnumResourceNames32A
+ */
+BOOL32
+PE_EnumResourceLanguages32A(
+ HMODULE32 hmod,LPCSTR name,LPCSTR type,ENUMRESLANGPROC32A lpfun,
+ LONG lparam
+) {
+ PE_MODULE *pe = HMODULE32toPE_MODULE(hmod);
+ int i;
+ LPIMAGE_RESOURCE_DIRECTORY resdir;
+ LPIMAGE_RESOURCE_DIRECTORY_ENTRY et;
+ BOOL32 ret;
+ HANDLE32 heap = GetProcessHeap();
+ LPWSTR nameW,typeW;
+
+ if (!pe || !pe->pe_resource)
+ return FALSE;
+
+ resdir = (LPIMAGE_RESOURCE_DIRECTORY)pe->pe_resource;
+ if (HIWORD(name))
+ nameW = HEAP_strdupAtoW(heap,0,name);
+ else
+ nameW = (LPWSTR)name;
+ resdir = GetResDirEntryW(resdir,nameW,(DWORD)pe->pe_resource);
+ if (HIWORD(nameW))
+ HeapFree(heap,0,nameW);
+ if (!resdir)
+ return FALSE;
+ if (HIWORD(type))
+ typeW = HEAP_strdupAtoW(heap,0,type);
+ else
+ typeW = (LPWSTR)type;
+ resdir = GetResDirEntryW(resdir,typeW,(DWORD)pe->pe_resource);
+ if (HIWORD(typeW))
+ HeapFree(heap,0,typeW);
+ if (!resdir)
+ return FALSE;
+ et =(LPIMAGE_RESOURCE_DIRECTORY_ENTRY)((LPBYTE)resdir+sizeof(IMAGE_RESOURCE_DIRECTORY));
+ ret = FALSE;
+ for (i=0;i<resdir->NumberOfNamedEntries+resdir->NumberOfIdEntries;i++) {
+ /* languages are just ids... I hope */
+ ret = lpfun(hmod,name,type,et[i].u1.Id,lparam);
+ if (!ret)
+ break;
+ }
+ return ret;
+}
+
+/**********************************************************************
+ * PE_EnumResourceLanguages32W
+ */
+BOOL32
+PE_EnumResourceLanguages32W(
+ HMODULE32 hmod,LPCWSTR name,LPCWSTR type,ENUMRESLANGPROC32W lpfun,
+ LONG lparam
+) {
+ PE_MODULE *pe = HMODULE32toPE_MODULE(hmod);
+ int i;
+ LPIMAGE_RESOURCE_DIRECTORY resdir;
+ LPIMAGE_RESOURCE_DIRECTORY_ENTRY et;
+ BOOL32 ret;
+
+ if (!pe || !pe->pe_resource)
+ return FALSE;
+
+ resdir = (LPIMAGE_RESOURCE_DIRECTORY)pe->pe_resource;
+ resdir = GetResDirEntryW(resdir,name,(DWORD)pe->pe_resource);
+ if (!resdir)
+ return FALSE;
+ resdir = GetResDirEntryW(resdir,type,(DWORD)pe->pe_resource);
+ if (!resdir)
+ return FALSE;
+ et =(LPIMAGE_RESOURCE_DIRECTORY_ENTRY)((LPBYTE)resdir+sizeof(IMAGE_RESOURCE_DIRECTORY));
+ ret = FALSE;
+ for (i=0;i<resdir->NumberOfNamedEntries+resdir->NumberOfIdEntries;i++) {
+ ret = lpfun(hmod,name,type,et[i].u1.Id,lparam);
+ if (!ret)
+ break;
+ }
+ return ret;
}
#endif
diff --git a/loader/resource.c b/loader/resource.c
index de289b6..d2f50fe 100644
--- a/loader/resource.c
+++ b/loader/resource.c
@@ -345,8 +345,12 @@
hModule = GetExePtr( hModule ); /* In case we were passed an hInstance */
dprintf_resource(stddeb, "SizeofResource32: module=%04x res=%04x\n",
hModule, hRsrc );
+#ifndef WINELIB
+ return PE_SizeofResource32(hModule,hRsrc);
+#else
fprintf(stderr,"SizeofResource32: not implemented\n");
return 0;
+#endif
}
@@ -441,10 +445,15 @@
/**********************************************************************
* LoadAccelerators32W [USER.177]
+ * The image layout seems to look like this (not 100% sure):
+ * 00: BYTE type type of accelerator
+ * 01: BYTE pad (to WORD boundary)
+ * 02: WORD event
+ * 04: WORD IDval
+ * 06: WORD pad (to DWORD boundary)
*/
HACCEL32 LoadAccelerators32W(HINSTANCE32 instance,LPCWSTR lpTableName)
{
-#if 0
HACCEL32 hAccel;
HGLOBAL32 rsc_mem;
HRSRC32 hRsrc;
@@ -471,11 +480,12 @@
lpAccelTbl = (LPACCELHEADER)GlobalLock16(hAccel);
lpAccelTbl->wCount = 0;
for (i = 0; i < n; i++) {
- lpAccelTbl->tbl[i].type = *(lp++);
+ lpAccelTbl->tbl[i].type = *lp;
+ lp += 2;
lpAccelTbl->tbl[i].wEvent = *((WORD *)lp);
lp += 2;
lpAccelTbl->tbl[i].wIDval = *((WORD *)lp);
- lp += 2;
+ lp += 4;
if (lpAccelTbl->tbl[i].wEvent == 0) break;
dprintf_accel(stddeb,
"Accelerator #%u / event=%04X id=%04X type=%02X \n",
@@ -486,10 +496,6 @@
GlobalUnlock16(hAccel);
FreeResource32(rsc_mem);
return hAccel;
-#else
- fprintf(stderr,"LoadAcceleratorsW: not implemented\n");
- return 0x100; /* Return something anyway */
-#endif
}
HACCEL32 LoadAccelerators32A(HINSTANCE32 instance,LPCSTR lpTableName)
@@ -744,3 +750,51 @@
fprintf(stderr,"SetResourceHandler(%04x,0x%04x,%p), empty STUB!\n",instance,LOWORD(s),farproc);
return NULL;
}
+
+#ifndef WINELIB
+/**********************************************************************
+ * EnumResourceTypesA (KERNEL32.90)
+ */
+BOOL32
+EnumResourceTypes32A(HMODULE32 hmodule,ENUMRESTYPEPROC32A lpfun,LONG lParam) {
+ return PE_EnumResourceTypes32A(hmodule,lpfun,lParam);
+}
+
+/**********************************************************************
+ * EnumResourceTypesW (KERNEL32.91)
+ */
+BOOL32
+EnumResourceTypes32W(HMODULE32 hmodule,ENUMRESTYPEPROC32W lpfun,LONG lParam) {
+ return PE_EnumResourceTypes32W(hmodule,lpfun,lParam);
+}
+
+/**********************************************************************
+ * EnumResourceNamesA (KERNEL32.88)
+ */
+BOOL32
+EnumResourceNames32A(HMODULE32 hmodule,LPCSTR type,ENUMRESNAMEPROC32A lpfun,LONG lParam) {
+ return PE_EnumResourceNames32A(hmodule,type,lpfun,lParam);
+}
+/**********************************************************************
+ * EnumResourceNamesW (KERNEL32.89)
+ */
+BOOL32
+EnumResourceNames32W(HMODULE32 hmodule,LPCWSTR type,ENUMRESNAMEPROC32W lpfun,LONG lParam) {
+ return PE_EnumResourceNames32W(hmodule,type,lpfun,lParam);
+}
+
+/**********************************************************************
+ * EnumResourceLanguagesA (KERNEL32.86)
+ */
+BOOL32
+EnumResourceLanguages32A(HMODULE32 hmodule,LPCSTR type,LPCSTR name,ENUMRESLANGPROC32A lpfun,LONG lParam) {
+ return PE_EnumResourceLanguages32A(hmodule,type,name,lpfun,lParam);
+}
+/**********************************************************************
+ * EnumResourceLanguagesW (KERNEL32.87)
+ */
+BOOL32
+EnumResourceLanguages32W(HMODULE32 hmodule,LPCWSTR type,LPCWSTR name,ENUMRESLANGPROC32W lpfun,LONG lParam) {
+ return PE_EnumResourceLanguages32W(hmodule,type,name,lpfun,lParam);
+}
+#endif /* WINELIB */
diff --git a/loader/signal.c b/loader/signal.c
index 2d97ed5..769b510 100644
--- a/loader/signal.c
+++ b/loader/signal.c
@@ -143,7 +143,6 @@
static void SIGNAL_fault(int signal, int code, SIGCONTEXT *context)
{
#endif
-#ifndef __EMX__ /* FIXME: XX_sig(constext)=pointer to incomplete type (EMX) */
if (CS_sig(context) == WINE_CODE_SELECTOR)
{
fprintf( stderr, "Segmentation fault in Wine program (%x:%lx)."
@@ -157,7 +156,6 @@
CS_sig(context), EIP_sig(context) );
}
wine_debug( signal, context );
-#endif
}
diff --git a/loader/task.c b/loader/task.c
index 0b721e6..864abad 100644
--- a/loader/task.c
+++ b/loader/task.c
@@ -361,7 +361,6 @@
/* FIXME: all this is an ugly hack */
extern void InitTask( CONTEXT *context );
- extern void PE_InitializeDLLs( HMODULE16 hModule );
InitTask( NULL );
InitApp( pTask->hModule );
@@ -536,7 +535,15 @@
/* Create the Win32 part of the task */
pdb32 = PROCESS_Create( pTask );
- pTask->thdb = THREAD_Create( pdb32, 0 );
+ if (pModule->flags & NE_FFLAGS_WIN32)
+ {
+ LPTHREAD_START_ROUTINE start =
+ (LPTHREAD_START_ROUTINE)(pModule->pe_module->load_addr +
+ pModule->pe_module->pe_header->OptionalHeader.AddressOfEntryPoint);
+ pTask->thdb = THREAD_Create( pdb32, 0, start );
+ }
+ else
+ pTask->thdb = THREAD_Create( pdb32, 0, NULL );
/* Create the 32-bit stack frame */
@@ -1274,21 +1281,31 @@
/***********************************************************************
- * SetErrorMode (KERNEL.107)
+ * SetErrorMode16 (KERNEL.107)
*/
-UINT SetErrorMode( UINT mode )
+UINT16 SetErrorMode16( UINT16 mode )
{
TDB *pTask;
- UINT oldMode;
+ UINT16 oldMode;
if (!(pTask = (TDB *)GlobalLock16( hCurrentTask ))) return 0;
oldMode = pTask->error_mode;
pTask->error_mode = mode;
+ pTask->thdb->process->error_mode = mode;
return oldMode;
}
/***********************************************************************
+ * SetErrorMode32 (KERNEL32.486)
+ */
+UINT32 SetErrorMode32( UINT32 mode )
+{
+ return SetErrorMode16( (UINT16)mode );
+}
+
+
+/***********************************************************************
* GetDOSEnvironment (KERNEL.131)
*/
SEGPTR GetDOSEnvironment(void)