David Elliott dfe@tgwbd.org writes:
Anyway, if you think the patch you have might help me get RSAENH.DLL loaded and a bit further then I could probably have https sites working in IE shortly.
If rasenh.dll has the same problem as rsabase.dll, I think this should help:
Index: loader/module.c =================================================================== RCS file: /opt/cvs-commit/wine/loader/module.c,v retrieving revision 1.144 diff -u -r1.144 module.c --- loader/module.c 2001/12/20 00:19:42 1.144 +++ loader/module.c 2001/12/20 16:08:04 @@ -1284,7 +1284,18 @@ NULL, OPEN_EXISTING, 0, 0 ); if (hFile != INVALID_HANDLE_VALUE) { - hmod = PE_LoadImage( hFile, filename, flags ); + DWORD type; + MODULE_GetBinaryType( hFile, filename, &type ); + if (type == SCS_32BIT_BINARY) + { + HANDLE mapping = CreateFileMappingA( hFile, NULL, PAGE_READONLY, + 0, 0, NULL ); + if (mapping) + { + hmod = (HMODULE)MapViewOfFile( mapping, FILE_MAP_READ, 0, 0, 0 ); + CloseHandle( mapping ); + } + } CloseHandle( hFile ); } if (hmod) return (HMODULE)((ULONG_PTR)hmod + 1); Index: loader/pe_resource.c =================================================================== RCS file: /opt/cvs-commit/wine/loader/pe_resource.c,v retrieving revision 1.34 diff -u -r1.34 pe_resource.c --- loader/pe_resource.c 2001/10/14 16:18:53 1.34 +++ loader/pe_resource.c 2001/12/20 16:08:05 @@ -48,6 +48,39 @@
/********************************************************************** + * is_data_file_module + * + * Check if a module handle is for a LOAD_LIBRARY_AS_DATAFILE module. + */ +inline static int is_data_file_module( HMODULE hmod ) +{ + return (ULONG_PTR)hmod & 1; +} + + +/********************************************************************** + * get_data_file_ptr + * + * Get a pointer to a given offset in a file mapped as data file. + */ +static const void *get_data_file_ptr( const void *base, DWORD offset ) +{ + const IMAGE_NT_HEADERS *nt = PE_HEADER(base); + const IMAGE_SECTION_HEADER *sec = (IMAGE_SECTION_HEADER *)((char *)&nt->OptionalHeader + + nt->FileHeader.SizeOfOptionalHeader); + int i; + + /* find the section containing the virtual address */ + for (i = 0; i < nt->FileHeader.NumberOfSections; i++, sec++) + { + if ((sec->VirtualAddress <= offset) && (sec->VirtualAddress + sec->SizeOfRawData > offset)) + return (char *)base + sec->PointerToRawData + (offset - sec->VirtualAddress); + } + return NULL; +} + + +/********************************************************************** * get_resdir * * Get the resource directory of a PE module @@ -62,7 +95,10 @@ { dir = &PE_HEADER(base)->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE]; if (dir->Size && dir->VirtualAddress) - ret = (IMAGE_RESOURCE_DIRECTORY *)((char *)base + dir->VirtualAddress); + { + if (is_data_file_module(hmod)) ret = get_data_file_ptr( base, dir->VirtualAddress ); + else ret = (IMAGE_RESOURCE_DIRECTORY *)((char *)base + dir->VirtualAddress); + } } return ret; } @@ -272,9 +308,17 @@ */ HGLOBAL PE_LoadResource( HMODULE hmod, HRSRC hRsrc ) { + DWORD offset; const void *base = get_module_base( hmod ); - if (!hRsrc) return 0; - return (HANDLE)((char *)base + ((PIMAGE_RESOURCE_DATA_ENTRY)hRsrc)->OffsetToData); + + if (!hRsrc || !base) return 0; + + offset = ((PIMAGE_RESOURCE_DATA_ENTRY)hRsrc)->OffsetToData; + + if (is_data_file_module(hmod)) + return (HANDLE)get_data_file_ptr( base, offset ); + else + return (HANDLE)((char *)base + offset); }