diff --git a/chrome_elf/pe_image_safe/pe_image_safe.h b/chrome_elf/pe_image_safe/pe_image_safe.h index 67733008c89c1..666ec4bb5dd2e 100644 --- a/chrome_elf/pe_image_safe/pe_image_safe.h +++ b/chrome_elf/pe_image_safe/pe_image_safe.h @@ -10,7 +10,7 @@ #include <windows.h> // https://msdn.microsoft.com/library/windows/desktop/ms684179.aspx -#define LDR_IS_IMAGEMAPPING(handle) (((ULONG_PTR)(handle)) & (ULONG_PTR)2) +#define LDR_IS_DATAFILE(handle) (((ULONG_PTR)(handle)) & (ULONG_PTR)1) namespace pe_image_safe { @@ -40,7 +40,14 @@ class PEImageSafe { PEImageSafe(void* buffer, DWORD buffer_size) : image_size_(buffer_size) { image_ = reinterpret_cast<HMODULE>(buffer); - ldr_image_mapping_ = LDR_IS_IMAGEMAPPING(image_); + } + + // Some functions can only be used on images that have been memory mapped by + // the NT Loader (e.g. LoadLibrary). This constructor must be used to enable + // that functionality. + PEImageSafe(HMODULE buffer, DWORD buffer_size) + : image_(buffer), image_size_(buffer_size) { + ldr_image_mapping_ = !LDR_IS_DATAFILE(buffer); } // Return a pointer to the PE Dos Header.