fix a version info winetest by allowing non dll files to be loaded with LOAD_LIBRARY_AS_DATAFILE

svn path=/trunk/; revision=35976
This commit is contained in:
Christoph von Wittich 2008-09-06 10:27:40 +00:00
parent b0a663b4a6
commit b5c636ee01

View file

@ -650,38 +650,43 @@ LdrpMapDllImageFile(IN PWSTR SearchPath OPTIONAL,
0, 0,
FullNtFileName.Buffer); FullNtFileName.Buffer);
Status = NtReadFile(FileHandle, if (!MapAsDataFile)
NULL,
NULL,
NULL,
&IoStatusBlock,
BlockBuffer,
sizeof(BlockBuffer),
NULL,
NULL);
if (!NT_SUCCESS(Status))
{ {
DPRINT("Dll header read failed: Status = 0x%08lx\n", Status);
NtClose(FileHandle);
return Status;
}
/*
* Overlay DOS and NT headers structures to the
* buffer with DLL's header raw data.
*/
DosHeader = (PIMAGE_DOS_HEADER) BlockBuffer;
NTHeaders = (PIMAGE_NT_HEADERS) (BlockBuffer + DosHeader->e_lfanew);
/*
* Check it is a PE image file.
*/
if ((DosHeader->e_magic != IMAGE_DOS_SIGNATURE)
|| (DosHeader->e_lfanew == 0L)
|| (*(PULONG)(NTHeaders) != IMAGE_NT_SIGNATURE))
{
DPRINT("NTDLL format invalid\n");
NtClose(FileHandle);
return STATUS_UNSUCCESSFUL; Status = NtReadFile(FileHandle,
NULL,
NULL,
NULL,
&IoStatusBlock,
BlockBuffer,
sizeof(BlockBuffer),
NULL,
NULL);
if (!NT_SUCCESS(Status))
{
DPRINT("Dll header read failed: Status = 0x%08lx\n", Status);
NtClose(FileHandle);
return Status;
}
/*
* Overlay DOS and NT headers structures to the
* buffer with DLL's header raw data.
*/
DosHeader = (PIMAGE_DOS_HEADER) BlockBuffer;
NTHeaders = (PIMAGE_NT_HEADERS) (BlockBuffer + DosHeader->e_lfanew);
/*
* Check it is a PE image file.
*/
if ((DosHeader->e_magic != IMAGE_DOS_SIGNATURE)
|| (DosHeader->e_lfanew == 0L)
|| (*(PULONG)(NTHeaders) != IMAGE_NT_SIGNATURE))
{
DPRINT("NTDLL format invalid\n");
NtClose(FileHandle);
return STATUS_UNSUCCESSFUL;
}
} }
/* /*
@ -2058,15 +2063,18 @@ LdrpLoadModule(IN PWSTR SearchPath OPTIONAL,
{ {
*BaseAddress = ImageBase; *BaseAddress = ImageBase;
} }
/* Get and check the NT headers */ if (!MappedAsDataFile)
NtHeaders = RtlImageNtHeader(ImageBase);
if (NtHeaders == NULL)
{ {
DPRINT1("RtlImageNtHeaders() failed\n"); /* Get and check the NT headers */
NtUnmapViewOfSection (NtCurrentProcess (), ImageBase); NtHeaders = RtlImageNtHeader(ImageBase);
NtClose (SectionHandle); if (NtHeaders == NULL)
RtlFreeUnicodeString(&FullDosName); {
return STATUS_UNSUCCESSFUL; DPRINT1("RtlImageNtHeaders() failed\n");
NtUnmapViewOfSection (NtCurrentProcess (), ImageBase);
NtClose (SectionHandle);
RtlFreeUnicodeString(&FullDosName);
return STATUS_UNSUCCESSFUL;
}
} }
DPRINT("Mapped %wZ at %x\n", &FullDosName, ImageBase); DPRINT("Mapped %wZ at %x\n", &FullDosName, ImageBase);
if (MappedAsDataFile) if (MappedAsDataFile)