summaryrefslogtreecommitdiff
path: root/src/libw32dll/wine/pe_image.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libw32dll/wine/pe_image.c')
-rw-r--r--src/libw32dll/wine/pe_image.c82
1 files changed, 56 insertions, 26 deletions
diff --git a/src/libw32dll/wine/pe_image.c b/src/libw32dll/wine/pe_image.c
index 095abf244..d30b5f2bc 100644
--- a/src/libw32dll/wine/pe_image.c
+++ b/src/libw32dll/wine/pe_image.c
@@ -175,7 +175,7 @@ FARPROC PE_FindExportedFunction(
ename = RVA(name[i]);
if (!strcmp( ename, funcName ))
{
- ERR( "%s.%s required a linear search\n", wm->modname, funcName );
+ ERR( "%s.%s required a linear search\n", wm->modname, funcName );
ordinal = ordinals[i];
goto found;
}
@@ -280,7 +280,7 @@ static DWORD fixup_imports( WINE_MODREF *wm )
*/
for (i = 0, pe_imp = pem->pe_import; pe_imp->Name ; pe_imp++) {
- // WINE_MODREF *wmImp;
+ WINE_MODREF *wmImp;
IMAGE_IMPORT_BY_NAME *pe_name;
PIMAGE_THUNK_DATA import_list,thunk_list;
char *name = (char *) RVA(pe_imp->Name);
@@ -302,13 +302,11 @@ static DWORD fixup_imports( WINE_MODREF *wm )
// TRACE("--- Ordinal %s,%d\n", name, ordinal);
- thunk_list->u1.Function=LookupExternal(
- name, ordinal);
+ thunk_list->u1.Function=LookupExternal(name, ordinal);
} else {
pe_name = (PIMAGE_IMPORT_BY_NAME)RVA(import_list->u1.AddressOfData);
// TRACE("--- %s %s.%d\n", pe_name->Name, name, pe_name->Hint);
- thunk_list->u1.Function=LookupExternalByName(
- name, pe_name->Name);
+ thunk_list->u1.Function=LookupExternalByName(name, pe_name->Name);
}
import_list++;
thunk_list++;
@@ -334,8 +332,6 @@ static DWORD fixup_imports( WINE_MODREF *wm )
thunk_list++;
}
}
-
-
}
return 0;
}
@@ -381,7 +377,7 @@ static void do_relocations( unsigned int load_addr, IMAGE_BASE_RELOCATION *r )
char *page = (char*) RVA(r->VirtualAddress);
int count = (r->SizeOfBlock - 8)/2;
int i;
- TRACE_(fixup,"%x relocations for page %lx\n",
+ TRACE_(fixup)("%x relocations for page %lx\n",
count, r->VirtualAddress);
for(i=0;i<count;i++)
@@ -439,7 +435,7 @@ HMODULE PE_LoadImage( int handle, LPCSTR filename, WORD *version )
IMAGE_NT_HEADERS *nt;
IMAGE_SECTION_HEADER *pe_sec;
IMAGE_DATA_DIRECTORY *dir;
- // BY_HANDLE_FILE_INFORMATION bhfi;
+ BY_HANDLE_FILE_INFORMATION bhfi;
int i, rawsize, lowest_va, vma_size, file_size = 0;
DWORD load_addr = 0, aoep, reloc = 0;
// struct get_read_fd_request *req = get_req_buffer();
@@ -596,15 +592,15 @@ HMODULE PE_LoadImage( int handle, LPCSTR filename, WORD *version )
MEM_RESERVE | MEM_COMMIT,
PAGE_EXECUTE_READWRITE );
if (!load_addr) {
- FIXME_(win32,
- "FATAL: Couldn't load module %s (out of memory, %d needed)!\n", filename, vma_size);
+ FIXME_(win32)(
+ "FATAL: Couldn't load module %s (out of memory, %d needed)!\n", filename, vma_size);
goto error;
}
}
TRACE("Load addr is %lx (base %lx), range %x\n",
load_addr, nt->OptionalHeader.ImageBase, vma_size );
- TRACE_(segment,"Loading %s at %lx, range %x\n",
+ TRACE_(segment)("Loading %s at %lx, range %x\n",
filename, load_addr, vma_size );
#if 0
@@ -622,7 +618,7 @@ HMODULE PE_LoadImage( int handle, LPCSTR filename, WORD *version )
0, 0, PROT_EXEC | PROT_WRITE | PROT_READ,
MAP_PRIVATE | MAP_FIXED ) != (void*)load_addr)
{
- ERR_(win32, "Critical Error: failed to map PE header to necessary address.\n");
+ ERR_(win32)( "Critical Error: failed to map PE header to necessary address.\n");
goto error;
}
@@ -640,7 +636,7 @@ HMODULE PE_LoadImage( int handle, LPCSTR filename, WORD *version )
MAP_PRIVATE | MAP_FIXED ) != (void*)RVA(pe_sec->VirtualAddress))
{
- ERR_(win32, "Critical Error: failed to map PE section to necessary address.\n");
+ ERR_(win32)( "Critical Error: failed to map PE section to necessary address.\n");
goto error;
}
if ((pe_sec->SizeOfRawData < pe_sec->Misc.VirtualSize) &&
@@ -670,7 +666,8 @@ HMODULE PE_LoadImage( int handle, LPCSTR filename, WORD *version )
error:
if (unix_handle != -1) close( unix_handle );
- if (load_addr) VirtualFree( (LPVOID)load_addr, 0, MEM_RELEASE );
+ if (load_addr)
+ VirtualFree( (LPVOID)load_addr, 0, MEM_RELEASE );
UnmapViewOfFile( (LPVOID)hModule );
return 0;
}
@@ -698,7 +695,10 @@ WINE_MODREF *PE_CreateModule( HMODULE hModule,
IMAGE_EXPORT_DIRECTORY *pe_export = NULL;
IMAGE_RESOURCE_DIRECTORY *pe_resource = NULL;
WINE_MODREF *wm;
- // int result;
+ int result;
+
+
+
dir = nt->OptionalHeader.DataDirectory+IMAGE_DIRECTORY_ENTRY_EXPORT;
if (dir->Size)
@@ -852,6 +852,7 @@ WINE_MODREF *PE_LoadLibraryExA (LPCSTR name, DWORD flags)
return NULL;
}
close(hFile);
+ //printf("^^^^^^^^^^^^^^^^Alloc VM1 %p\n", wm);
return wm;
}
@@ -865,9 +866,14 @@ void PE_UnloadLibrary(WINE_MODREF *wm)
{
TRACE(" unloading %s\n", wm->filename);
- HeapFree( GetProcessHeap(), 0, wm->filename );
- HeapFree( GetProcessHeap(), 0, wm->short_filename );
+ if (wm->filename)
+ free(wm->filename);
+ if (wm->short_filename)
+ free(wm->short_filename);
+ HeapFree( GetProcessHeap(), 0, wm->deps );
+ VirtualFree( (LPVOID)wm->module, 0, MEM_RELEASE );
HeapFree( GetProcessHeap(), 0, wm );
+ //printf("^^^^^^^^^^^^^^^^Free VM1 %p\n", wm);
}
/*****************************************************************************
@@ -876,6 +882,27 @@ void PE_UnloadLibrary(WINE_MODREF *wm)
* due to the PROCESS_Create stuff.
*/
+
+/*
+ * This is a dirty hack.
+ * The win32 DLLs contain an alloca routine, that first probes the soon
+ * to be allocated new memory *below* the current stack pointer in 4KByte
+ * increments. After the mem probing below the current %esp, the stack
+ * pointer is finally decremented to make room for the "alloca"ed memory.
+ * Maybe the probing code is intended to extend the stack on a windows box.
+ * Anyway, the linux kernel does *not* extend the stack by simply accessing
+ * memory below %esp; it segfaults.
+ * The extend_stack_for_dll_alloca() routine just preallocates a big chunk
+ * of memory on the stack, for use by the DLLs alloca routine.
+ */
+static void extend_stack_for_dll_alloca(void)
+{
+#ifndef __FreeBSD__
+ void* mem=alloca(0x20000);
+ *(int*)mem=0x1234;
+#endif
+}
+
/* Called if the library is loaded or freed.
* NOTE: if a thread attaches a DLL, the current thread will only do
* DLL_PROCESS_ATTACH. Only new created threads do DLL_THREAD_ATTACH
@@ -895,25 +922,28 @@ WIN_BOOL PE_InitDLL( WINE_MODREF *wm, DWORD type, LPVOID lpReserved )
if(entry==NULL)
entry = (void*)RVA_PTR( wm->module,OptionalHeader.AddressOfEntryPoint );
- TRACE_(relay,"CallTo32(entryproc=%p,module=%08x,type=%ld,res=%p)\n",
+ TRACE_(relay)("CallTo32(entryproc=%p,module=%08x,type=%ld,res=%p)\n",
entry, wm->module, type, lpReserved );
- printf("Entering DllMain(");
+
+
+ TRACE("Entering DllMain(");
switch(type)
{
case DLL_PROCESS_DETACH:
- printf("DLL_PROCESS_DETACH) ");
+ TRACE("DLL_PROCESS_DETACH) ");
break;
case DLL_PROCESS_ATTACH:
- printf("DLL_PROCESS_ATTACH) ");
+ TRACE("DLL_PROCESS_ATTACH) ");
break;
case DLL_THREAD_DETACH:
- printf("DLL_THREAD_DETACH) ");
+ TRACE("DLL_THREAD_DETACH) ");
break;
case DLL_THREAD_ATTACH:
- printf("DLL_THREAD_ATTACH) ");
+ TRACE("DLL_THREAD_ATTACH) ");
break;
}
- printf("for %s\n", wm->filename);
+ TRACE("for %s\n", wm->filename);
+ extend_stack_for_dll_alloca();
retv = entry( wm->module, type, lpReserved );
}