in BoostTestAdapter/Utility/DebugHelperNative.cs [289:351]
private static bool MapAndLoad(string imageName, out NativeMethods.LoadedImage loadedImage)
{
loadedImage = new NativeMethods.LoadedImage();
long fileSize;
IntPtr mapAddr;
using (var hFile = NativeMethods.CreateFile(imageName, NativeMethods.GENERIC_READ,
NativeMethods.FILE_SHARE_READ, IntPtr.Zero, NativeMethods.OPEN_EXISTING, 0, IntPtr.Zero))
{
if (hFile.IsInvalid)
return false;
if (!NativeMethods.GetFileSizeEx(hFile, out fileSize))
return false;
using (var hMapping = NativeMethods.CreateFileMapping(hFile, IntPtr.Zero, NativeMethods.PAGE_READONLY, 0, 0, null))
{
if (hMapping.IsInvalid)
return false;
mapAddr = NativeMethods.MapViewOfFile(hMapping, NativeMethods.FILE_MAP_READ, 0, 0, UIntPtr.Zero);
if (mapAddr == IntPtr.Zero)
return false;
}
}
unsafe
{
if (fileSize < Marshal.SizeOf<NativeMethods.IMAGE_DOS_HEADER>())
return false;
var dosHeader = (NativeMethods.IMAGE_DOS_HEADER*)mapAddr;
NativeMethods.IMAGE_NT_HEADERS* rawFileHeader;
if (dosHeader->e_magic == NativeMethods.IMAGE_DOS_SIGNATURE)
{
if (dosHeader->e_lfanew <= 0
|| fileSize < dosHeader->e_lfanew + Marshal.SizeOf<NativeMethods.IMAGE_NT_HEADERS>())
{
return false;
}
rawFileHeader = (NativeMethods.IMAGE_NT_HEADERS*)((byte*)mapAddr + dosHeader->e_lfanew);
}
else if (dosHeader->e_magic == NativeMethods.IMAGE_NT_SIGNATURE)
{
if (fileSize < Marshal.SizeOf<NativeMethods.IMAGE_NT_HEADERS>())
return false;
rawFileHeader = (NativeMethods.IMAGE_NT_HEADERS*)mapAddr;
}
else
{
return false;
}
if (rawFileHeader->Signature != NativeMethods.IMAGE_NT_SIGNATURE)
return false;
loadedImage.MappedAddress = mapAddr;
loadedImage.FileHeader = (IntPtr)rawFileHeader;
return true;
}
}