Rewrote mapping of module into memory using only NTDLL APIs.
diff --git a/loader/pe_image.c b/loader/pe_image.c
index 721bec2..7db893c 100644
--- a/loader/pe_image.c
+++ b/loader/pe_image.c
@@ -375,15 +375,34 @@
IMAGE_NT_HEADERS *nt;
HMODULE hModule;
HANDLE mapping;
- void *base;
+ void *base = NULL;
+ OBJECT_ATTRIBUTES attr;
+ LARGE_INTEGER lg_int;
+ DWORD len = 0;
+ NTSTATUS nts;
TRACE_(module)( "loading %s\n", filename );
- mapping = CreateFileMappingA( hFile, NULL, SEC_IMAGE, 0, 0, NULL );
- if (!mapping) return 0;
- base = MapViewOfFile( mapping, FILE_MAP_READ, 0, 0, 0 );
- CloseHandle( mapping );
- if (!base) return 0;
+ attr.Length = sizeof(attr);
+ attr.RootDirectory = 0;
+ attr.ObjectName = NULL;
+ attr.Attributes = 0;
+ attr.SecurityDescriptor = NULL;
+ attr.SecurityQualityOfService = NULL;
+
+ lg_int.QuadPart = 0;
+
+ if (NtCreateSection( &mapping,
+ STANDARD_RIGHTS_REQUIRED | SECTION_QUERY | SECTION_MAP_READ,
+ &attr, &lg_int, 0, SEC_IMAGE, hFile ) != STATUS_SUCCESS)
+ return 0;
+
+ nts = NtMapViewOfSection( mapping, GetCurrentProcess(),
+ &base, 0, 0, &lg_int, &len, ViewShare, 0,
+ PAGE_READONLY );
+
+ NtClose( mapping );
+ if (nts != STATUS_SUCCESS) return 0;
/* virus check */
@@ -662,6 +681,7 @@
/* the address has been relocated already */
return addr;
}
+
void PE_InitTls( void )
{
WINE_MODREF *wm;
@@ -688,7 +708,8 @@
}
datasize= pdir->EndAddressOfRawData-pdir->StartAddressOfRawData;
size = datasize + pdir->SizeOfZeroFill;
- mem=VirtualAlloc(0,size,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);
+ NtAllocateVirtualMemory( GetCurrentProcess(), &mem, NULL, &size,
+ MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE );
memcpy(mem,_fixup_address(&(peh->OptionalHeader),delta,(LPVOID)pdir->StartAddressOfRawData),datasize);
if (pdir->AddressOfCallBacks) {
PIMAGE_TLS_CALLBACK *cbs;