using System; using System.Collections.Generic; using System.Drawing; using System.IO; using System.Runtime.ConstrainedExecution; using System.Runtime.InteropServices; using System.Security.Permissions; using System.Text; using System.Windows.Forms; using Microsoft.Win32.SafeHandles; namespace PdfiumViewer { internal static partial class NativeMethods { static NativeMethods() { // First try the custom resolving mechanism. string fileName = PdfiumResolver.GetPdfiumFileName(); if (fileName != null && File.Exists(fileName) && LoadLibrary(fileName) != IntPtr.Zero) return; // Load the platform dependent Pdfium.dll if it exists. if (!TryLoadNativeLibrary(AppDomain.CurrentDomain.RelativeSearchPath)) TryLoadNativeLibrary(Path.GetDirectoryName(typeof(NativeMethods).Assembly.Location)); } private static bool TryLoadNativeLibrary(string path) { if (path == null) return false; path = Path.Combine(path, IntPtr.Size == 4 ? "x86" : "x64"); path = Path.Combine(path, "Pdfium.dll"); return File.Exists(path) && LoadLibrary(path) != IntPtr.Zero; } [DllImport("kernel32", SetLastError = true, CharSet = CharSet.Auto)] private static extern IntPtr LoadLibrary([MarshalAs(UnmanagedType.LPTStr)] string lpFileName); [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)] public static extern MemoryMappedHandle CreateFileMapping(SafeHandle hFile, IntPtr lpFileMappingAttributes, FileMapProtection flProtect, uint dwMaximumSizeHigh, uint dwMaximumSizeLow, [MarshalAs(UnmanagedType.LPTStr)] string lpName); [DllImport("kernel32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool CloseHandle(IntPtr hObject); [Flags] public enum FileMapProtection : uint { PageReadonly = 0x02, PageReadWrite = 0x04, PageWriteCopy = 0x08, PageExecuteRead = 0x20, PageExecuteReadWrite = 0x40, SectionCommit = 0x8000000, SectionImage = 0x1000000, SectionNoCache = 0x10000000, SectionReserve = 0x4000000, } [DllImport("kernel32.dll", SetLastError = true)] public static extern MappedViewHandle MapViewOfFile(SafeHandle hFileMappingObject, FileMapAccess dwDesiredAccess, uint dwFileOffsetHigh, uint dwFileOffsetLow, uint dwNumberOfBytesToMap); [Flags] public enum FileMapAccess : uint { FileMapCopy = 0x0001, FileMapWrite = 0x0002, FileMapRead = 0x0004, FileMapAllAccess = 0x001f, FileMapExecute = 0x0020, } [DllImport("kernel32.dll", SetLastError = true)] public static extern bool UnmapViewOfFile(IntPtr lpBaseAddress); [DllImport("user32.dll")] public static extern int ScrollWindowEx(IntPtr hWnd, int dx, int dy, RECT prcScroll, RECT prcClip, IntPtr hrgnUpdate, IntPtr prcUpdate, uint flags); [DllImport("user32.dll")] public static extern int ScrollWindowEx(IntPtr hWnd, int dx, int dy, IntPtr prcScroll, IntPtr prcClip, IntPtr hrgnUpdate, IntPtr prcUpdate, uint flags); [SecurityPermission(SecurityAction.InheritanceDemand, UnmanagedCode = true)] [SecurityPermission(SecurityAction.Demand, UnmanagedCode = true)] public class MemoryMappedHandle : SafeHandleZeroOrMinusOneIsInvalid { public MemoryMappedHandle() : base(true) { } [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] protected override bool ReleaseHandle() { return CloseHandle(handle); } } public class MappedViewHandle : SafeHandleZeroOrMinusOneIsInvalid { public MappedViewHandle() : base(true) { } protected override bool ReleaseHandle() { return UnmapViewOfFile(handle); } } public const int GM_ADVANCED = 2; [DllImport("gdi32.dll")] public static extern int SetGraphicsMode(IntPtr hdc, int iMode); [StructLayout(LayoutKind.Sequential)] public struct XFORM { public float eM11; public float eM12; public float eM21; public float eM22; public float eDx; public float eDy; } public const uint MWT_LEFTMULTIPLY = 2; [DllImport("gdi32.dll")] public static extern bool ModifyWorldTransform(IntPtr hdc, [In] ref XFORM lpXform, uint iMode); [StructLayout(LayoutKind.Sequential)] public struct POINT { public int X; public int Y; } [DllImport("gdi32.dll")] public static extern bool SetViewportOrgEx(IntPtr hdc, int X, int Y, out POINT lpPoint); public const uint SW_ERASE = 0x0004; public const uint SW_SMOOTHSCROLL = 0x0010; public const int WS_VSCROLL = 0x00200000; public const int WS_HSCROLL = 0x00100000; public const int WM_MOUSEWHEEL = 0x20a; public const int SB_HORZ = 0x0; public const int SB_VERT = 0x1; public const uint SW_INVALIDATE = 0x0002; public const uint SW_SCROLLCHILDREN = 0x0001; public const int SB_LINEUP = 0; public const int SB_LINELEFT = 0; public const int SB_LINEDOWN = 1; public const int SB_LINERIGHT = 1; public const int SB_PAGEUP = 2; public const int SB_PAGELEFT = 2; public const int SB_PAGEDOWN = 3; public const int SB_PAGERIGHT = 3; public const int SB_THUMBPOSITION = 4; public const int SB_THUMBTRACK = 5; public const int SB_TOP = 6; public const int SB_LEFT = 6; public const int SB_BOTTOM = 7; public const int SB_RIGHT = 7; public const int SB_ENDSCROLL = 8; public const int WM_HSCROLL = 0x114; public const int WM_VSCROLL = 0x115; public const int WM_SETCURSOR = 0x20; public const int SIF_TRACKPOS = 0x10; public const int SIF_RANGE = 0x1; public const int SIF_POS = 0x4; public const int SIF_PAGE = 0x2; public const int SIF_ALL = SIF_RANGE | SIF_PAGE | SIF_POS | SIF_TRACKPOS; [StructLayout(LayoutKind.Sequential)] public struct RECT { public int left; public int top; public int right; public int bottom; public RECT(Rectangle r) { left = r.Left; top = r.Top; right = r.Right; bottom = r.Bottom; } public Rectangle ToRectangle() { return new Rectangle(left, top, right - left, bottom - top); } } [StructLayout(LayoutKind.Sequential)] public class SCROLLINFO { public int cbSize = Marshal.SizeOf(typeof(SCROLLINFO)); public int fMask; public int nMin; public int nMax; public int nPage; public int nPos; public int nTrackPos; public SCROLLINFO() { } public SCROLLINFO(int mask, int min, int max, int page, int pos) { fMask = mask; nMin = min; nMax = max; nPage = page; nPos = pos; } } [DllImport("user32.dll")] public static extern int ScrollWindowEx(HandleRef hWnd, int dx, int dy, IntPtr prcScroll, ref RECT prcClip, IntPtr hrgnUpdate, ref RECT prcUpdate, uint flags); [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool GetScrollInfo(HandleRef hwnd, int fnBar, SCROLLINFO lpsi); [DllImport("user32.dll")] public static extern int SetScrollInfo(HandleRef hwnd, int fnBar, [In] SCROLLINFO lpsi, bool fRedraw); [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern UIntPtr SendMessage(IntPtr handle, int message, IntPtr wParam, IntPtr lParam); [DllImport("user32.dll")] public static extern IntPtr WindowFromPoint(Point pt); public static class Util { private static int LOWORD(int n) { return n & 0xffff; } public static int LOWORD(IntPtr n) { return LOWORD(unchecked((int)(long)n)); } } [DllImport("gdi32.dll")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool DeleteObject([In] IntPtr hObject); public const int LOGPIXELSX = 88; public const int LOGPIXELSY = 89; [DllImport("gdi32.dll")] public static extern int GetDeviceCaps(IntPtr hdc, int nIndex); [DllImport("gdi32.dll")] public static extern bool Rectangle(IntPtr hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect); [DllImport("gdi32.dll", SetLastError = true)] public static extern IntPtr CreateCompatibleDC([In] IntPtr hdc); [DllImport("user32.dll")] public static extern IntPtr GetDC(IntPtr hWnd); [DllImport("gdi32.dll")] public static extern IntPtr CreateCompatibleBitmap([In] IntPtr hdc, int nWidth, int nHeight); [DllImport("gdi32.dll")] public static extern IntPtr SelectObject([In] IntPtr hdc, [In] IntPtr hgdiobj); [DllImport("gdi32.dll")] public static extern IntPtr CreateSolidBrush(int crColor); public enum HitTestValues { HTERROR = -2, HTTRANSPARENT = -1, HTNOWHERE = 0, HTCLIENT = 1, HTCAPTION = 2, HTSYSMENU = 3, HTGROWBOX = 4, HTMENU = 5, HTHSCROLL = 6, HTVSCROLL = 7, HTMINBUTTON = 8, HTMAXBUTTON = 9, HTLEFT = 10, HTRIGHT = 11, HTTOP = 12, HTTOPLEFT = 13, HTTOPRIGHT = 14, HTBOTTOM = 15, HTBOTTOMLEFT = 16, HTBOTTOMRIGHT = 17, HTBORDER = 18, HTOBJECT = 19, HTCLOSE = 20, HTHELP = 21 } } }