NativeMethods.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / CompMod / Microsoft / Win32 / NativeMethods.cs / 1305376 / NativeMethods.cs

                            //------------------------------------------------------------------------------ 
// 
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// 
//----------------------------------------------------------------------------- 

namespace Microsoft.Win32 { 
    using System; 
    using System.Runtime.InteropServices;
#if !SILVERLIGHT 
    using System.Text;
    using System.Threading;
    using System.Globalization;
    using System.Runtime.Remoting; 
    using System.Runtime.CompilerServices;
    using System.Runtime.ConstrainedExecution; 
    using System.Runtime.Versioning; 
    using System.Diagnostics;
    using System.Diagnostics.CodeAnalysis; 
    using System.ComponentModel;
    using System.Security.Permissions;
    using Microsoft.Win32.SafeHandles;
 
    // not public!
    [HostProtection(MayLeakOnAbort = true)] 
#endif 

    internal static class NativeMethods { 

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        internal class TEXTMETRIC {
            public int tmHeight = 0; 
            public int tmAscent = 0;
            public int tmDescent = 0; 
            public int tmInternalLeading = 0; 
            public int tmExternalLeading = 0;
            public int tmAveCharWidth = 0; 
            public int tmMaxCharWidth = 0;
            public int tmWeight = 0;
            public int tmOverhang = 0;
            public int tmDigitizedAspectX = 0; 
            public int tmDigitizedAspectY = 0;
            public char tmFirstChar = '\0'; 
            public char tmLastChar = '\0'; 
            public char tmDefaultChar = '\0';
            public char tmBreakChar = '\0'; 
            public byte tmItalic = 0;
            public byte tmUnderlined = 0;
            public byte tmStruckOut = 0;
            public byte tmPitchAndFamily = 0; 
            public byte tmCharSet = 0;
        } 
 
        public const int DEFAULT_GUI_FONT = 17;
        public const int SM_CYSCREEN = 1; 

#if !SILVERLIGHT
        public readonly static HandleRef NullHandleRef = new HandleRef(null, IntPtr.Zero);
 
        public static readonly IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1);
 
        public const int GENERIC_READ = unchecked(((int)0x80000000)); 
        public const int GENERIC_WRITE = (0x40000000);
 
        public const int FILE_SHARE_READ = 0x00000001;
        public const int FILE_SHARE_WRITE = 0x00000002;
        public const int FILE_SHARE_DELETE = 0x00000004;
 
        public const int S_OK = 0x0;
        public const int E_ABORT = unchecked ((int)0x80004004); 
        public const int E_NOTIMPL = unchecked((int)0x80004001); 

        public const int CREATE_ALWAYS = 2; 

        public const int FILE_ATTRIBUTE_NORMAL = 0x00000080;

        public const int STARTF_USESTDHANDLES = 0x00000100; 

        public const int STD_INPUT_HANDLE = -10; 
        public const int STD_OUTPUT_HANDLE = -11; 
        public const int STD_ERROR_HANDLE = -12;
 
        public const int STILL_ACTIVE = 0x00000103;
        public const int SW_HIDE = 0;

        public const int WAIT_OBJECT_0    = 0x00000000; 
        public const int WAIT_FAILED      = unchecked((int)0xFFFFFFFF);
        public const int WAIT_TIMEOUT     = 0x00000102; 
        public const int WAIT_ABANDONED   = 0x00000080; 
        public const int WAIT_ABANDONED_0 = WAIT_ABANDONED;
 
        // MoveFile Parameter
        public const int MOVEFILE_REPLACE_EXISTING = 0x00000001;

        // copied from winerror.h 
        public const int ERROR_CLASS_ALREADY_EXISTS = 1410;
        public const int ERROR_NONE_MAPPED = 1332; 
        public const int ERROR_INSUFFICIENT_BUFFER      = 122; 
        public const int ERROR_INVALID_NAME             = 0x7B; //123
        public const int ERROR_PROC_NOT_FOUND           = 127; 
        public const int ERROR_BAD_EXE_FORMAT           = 193;
        public const int ERROR_EXE_MACHINE_TYPE_MISMATCH= 216;
        public const int MAX_PATH                       = 260;
 

        [StructLayout(LayoutKind.Sequential)] 
        internal class STARTUPINFO { 
            public int cb;
            public IntPtr lpReserved = IntPtr.Zero; 
            public IntPtr lpDesktop = IntPtr.Zero;
            public IntPtr lpTitle = IntPtr.Zero;
            public int dwX = 0;
            public int dwY = 0; 
            public int dwXSize = 0;
            public int dwYSize = 0; 
            public int dwXCountChars = 0; 
            public int dwYCountChars = 0;
            public int dwFillAttribute = 0; 
            public int dwFlags = 0;
            public short wShowWindow = 0;
            public short cbReserved2 = 0;
            public IntPtr lpReserved2 = IntPtr.Zero; 
            public SafeFileHandle hStdInput = new SafeFileHandle(IntPtr.Zero, false);
            public SafeFileHandle hStdOutput = new SafeFileHandle(IntPtr.Zero, false); 
            public SafeFileHandle hStdError = new SafeFileHandle(IntPtr.Zero, false); 

            public STARTUPINFO() { 
                cb = Marshal.SizeOf(this);
            }

            public void Dispose() { 
                // close the handles created for child process
                if(hStdInput != null && !hStdInput.IsInvalid) { 
                    hStdInput.Close(); 
                    hStdInput = null;
                } 

                if(hStdOutput != null && !hStdOutput.IsInvalid) {
                    hStdOutput.Close();
                    hStdOutput = null; 
                }
 
                if(hStdError != null && !hStdError.IsInvalid) { 
                    hStdError.Close();
                    hStdError = null; 
                }
            }
        }
 
        //
        // DACL related stuff 
        // 
        [StructLayout(LayoutKind.Sequential)]
        internal class SECURITY_ATTRIBUTES { 
                public int nLength = 12;
                public SafeLocalMemHandle lpSecurityDescriptor = new SafeLocalMemHandle(IntPtr.Zero, false);
                public bool bInheritHandle = false;
        } 

        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)] 
        [ResourceExposure(ResourceScope.None)] 
        public static extern bool GetExitCodeProcess(SafeProcessHandle processHandle, out int exitCode);
 
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.None)]
        public static extern bool GetProcessTimes(SafeProcessHandle handle, out long creation, out long exit, out long kernel, out long user);
 
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.None)] 
        public static extern bool GetThreadTimes(SafeThreadHandle handle, out long creation, out long exit, out long kernel, out long user); 

        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Ansi, SetLastError=true)] 
        [ResourceExposure(ResourceScope.Process)]
        public static extern IntPtr GetStdHandle(int whichHandle);

        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)] 
        [ResourceExposure(ResourceScope.Process)]
        public static extern bool CreatePipe(out SafeFileHandle hReadPipe, out SafeFileHandle hWritePipe, SECURITY_ATTRIBUTES lpPipeAttributes, int nSize); 
 
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true, BestFitMapping=false)]
        [ResourceExposure(ResourceScope.Process)] 
        public static extern bool CreateProcess(
            [MarshalAs(UnmanagedType.LPTStr)]
            string lpApplicationName,                   // LPCTSTR
            StringBuilder lpCommandLine,                // LPTSTR - note: CreateProcess might insert a null somewhere in this string 
            SECURITY_ATTRIBUTES lpProcessAttributes,    // LPSECURITY_ATTRIBUTES
            SECURITY_ATTRIBUTES lpThreadAttributes,     // LPSECURITY_ATTRIBUTES 
            bool bInheritHandles,                        // BOOL 
            int dwCreationFlags,                        // DWORD
            IntPtr lpEnvironment,                       // LPVOID 
            [MarshalAs(UnmanagedType.LPTStr)]
            string lpCurrentDirectory,                  // LPCTSTR
            STARTUPINFO lpStartupInfo,                  // LPSTARTUPINFO
            SafeNativeMethods.PROCESS_INFORMATION lpProcessInformation    // LPPROCESS_INFORMATION 
        );
 
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)] 
        [ResourceExposure(ResourceScope.Machine)]
        public static extern bool TerminateProcess(SafeProcessHandle processHandle, int exitCode); 


        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto)]
        [ResourceExposure(ResourceScope.Process)] 
        public static extern int GetCurrentProcessId();
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Ansi, SetLastError=true)] 
        [ResourceExposure(ResourceScope.Process)] 
        public static extern IntPtr GetCurrentProcess();
 
#if !FEATURE_PAL
        [ResourceExposure(ResourceScope.Machine)]
        [ResourceConsumption(ResourceScope.Machine)]
        internal static string GetLocalPath(string fileName) { 
            System.Diagnostics.Debug.Assert(fileName != null && fileName.Length > 0, "Cannot get local path, fileName is not valid");
 
            Uri uri = new Uri(fileName); 
            return uri.LocalPath + uri.Fragment;
        } 

        [DllImport(ExternDll.Advapi32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true, BestFitMapping=false)]
        [System.Security.SuppressUnmanagedCodeSecurityAttribute()]
        [ResourceExposure(ResourceScope.Machine)] 
        public extern static bool CreateProcessAsUser(SafeHandle hToken,
            string lpApplicationName, 
            string lpCommandLine, 
            SECURITY_ATTRIBUTES lpProcessAttributes,
            SECURITY_ATTRIBUTES lpThreadAttributes, 
            bool bInheritHandles,
            int dwCreationFlags,
            HandleRef lpEnvironment,
            string lpCurrentDirectory, 
            STARTUPINFO lpStartupInfo,
            SafeNativeMethods.PROCESS_INFORMATION lpProcessInformation 
        ); 

        [DllImport(ExternDll.Advapi32, CharSet=CharSet.Unicode, ExactSpelling=true, SetLastError=true, BestFitMapping=false)] 
        [ResourceExposure(ResourceScope.Machine)]
        internal static extern bool CreateProcessWithLogonW(
            string userName,
            string domain, 
            IntPtr password,
            LogonFlags logonFlags, 
            [MarshalAs(UnmanagedType.LPTStr)] 
            string appName,
            StringBuilder cmdLine, 
            int creationFlags,
            IntPtr environmentBlock,
            [MarshalAs(UnmanagedType.LPTStr)]
            string lpCurrentDirectory,                  // LPCTSTR 
            STARTUPINFO lpStartupInfo,
            SafeNativeMethods.PROCESS_INFORMATION lpProcessInformation); 
 
        [Flags]
        internal enum LogonFlags { 
            LOGON_WITH_PROFILE         = 0x00000001,
            LOGON_NETCREDENTIALS_ONLY  = 0x00000002
        }
 
        public const int UIS_SET = 1,
        WSF_VISIBLE = 0x0001, 
        UIS_CLEAR = 2, 
        UISF_HIDEFOCUS = 0x1,
        UISF_HIDEACCEL = 0x2, 
        USERCLASSTYPE_FULL = 1,
        UOI_FLAGS = 1;

        public const int COLOR_WINDOW = 5; 
        public const int WS_POPUP = unchecked((int)0x80000000);
        public const int WS_VISIBLE = 0x10000000; 
        public const int WM_SETTINGCHANGE = 0x001A; 
        public const int WM_SYSCOLORCHANGE = 0x0015;
        public const int WM_QUERYENDSESSION = 0x0011; 
        public const int WM_QUIT = 0x0012;
        public const int WM_ENDSESSION = 0x0016;
        public const int WM_POWERBROADCAST = 0x0218;
        public const int WM_COMPACTING = 0x0041; 
        public const int WM_DISPLAYCHANGE = 0x007E;
        public const int WM_FONTCHANGE = 0x001D; 
        public const int WM_PALETTECHANGED = 0x0311; 
        public const int WM_TIMECHANGE = 0x001E;
        public const int WM_THEMECHANGED = 0x031A; 
        public const int WM_WTSSESSION_CHANGE = 0x02B1;

        public const int ENDSESSION_LOGOFF = unchecked((int)0x80000000);
        public const int WM_TIMER = 0x0113; 
        public const int WM_USER = 0x0400;
        public const int WM_CREATETIMER = WM_USER + 1; 
        public const int WM_KILLTIMER = WM_USER + 2; 
        public const int WM_REFLECT = WM_USER + 0x1C00;
 
        public const int WTS_CONSOLE_CONNECT              =  0x1;
        public const int WTS_CONSOLE_DISCONNECT           =  0x2;
        public const int WTS_REMOTE_CONNECT               =  0x3;
        public const int WTS_REMOTE_DISCONNECT            =  0x4; 
        public const int WTS_SESSION_LOGON                =  0x5;
        public const int WTS_SESSION_LOGOFF               =  0x6; 
        public const int WTS_SESSION_LOCK                 =  0x7; 
        public const int WTS_SESSION_UNLOCK               =  0x8;
        public const int WTS_SESSION_REMOTE_CONTROL       =  0x9; 

        public const int NOTIFY_FOR_THIS_SESSION          =  0x0;

        public const int CTRL_C_EVENT        = 0; 
        public const int CTRL_BREAK_EVENT    = 1;
        public const int CTRL_CLOSE_EVENT    = 2; 
        public const int CTRL_LOGOFF_EVENT   = 5; 
        public const int CTRL_SHUTDOWN_EVENT = 6;
 
        public const int SPI_GETBEEP                          =   1;
        public const int SPI_SETBEEP                          =   2;
        public const int SPI_GETMOUSE                         =   3;
        public const int SPI_SETMOUSE                         =   4; 
        public const int SPI_GETBORDER                        =   5;
        public const int SPI_SETBORDER                        =   6; 
        public const int SPI_GETKEYBOARDSPEED                 =  10; 
        public const int SPI_SETKEYBOARDSPEED                 =  11;
        public const int SPI_LANGDRIVER                       =  12; 
        public const int SPI_ICONHORIZONTALSPACING            =  13;
        public const int SPI_GETSCREENSAVETIMEOUT             =  14;
        public const int SPI_SETSCREENSAVETIMEOUT             =  15;
        public const int SPI_GETSCREENSAVEACTIVE              =  16; 
        public const int SPI_SETSCREENSAVEACTIVE              =  17;
        public const int SPI_GETGRIDGRANULARITY               =  18; 
        public const int SPI_SETGRIDGRANULARITY               =  19; 
        public const int SPI_SETDESKWALLPAPER                 =  20;
        public const int SPI_SETDESKPATTERN                   =  21; 
        public const int SPI_GETKEYBOARDDELAY                 =  22;
        public const int SPI_SETKEYBOARDDELAY                 =  23;
        public const int SPI_ICONVERTICALSPACING              =  24;
        public const int SPI_GETICONTITLEWRAP                 =  25; 
        public const int SPI_SETICONTITLEWRAP                 =  26;
        public const int SPI_GETMENUDROPALIGNMENT             =  27; 
        public const int SPI_SETMENUDROPALIGNMENT             =  28; 
        public const int SPI_SETDOUBLECLKWIDTH                =  29;
        public const int SPI_SETDOUBLECLKHEIGHT               =  30; 
        public const int SPI_GETICONTITLELOGFONT              =  31;
        public const int SPI_SETDOUBLECLICKTIME               =  32;
        public const int SPI_SETMOUSEBUTTONSWAP               =  33;
        public const int SPI_SETICONTITLELOGFONT              =  34; 
        public const int SPI_GETFASTTASKSWITCH                =  35;
        public const int SPI_SETFASTTASKSWITCH                =  36; 
        public const int SPI_SETDRAGFULLWINDOWS               =  37; 
        public const int SPI_GETDRAGFULLWINDOWS               =  38;
        public const int SPI_GETNONCLIENTMETRICS              =  41; 
        public const int SPI_SETNONCLIENTMETRICS              =  42;
        public const int SPI_GETMINIMIZEDMETRICS              =  43;
        public const int SPI_SETMINIMIZEDMETRICS              =  44;
        public const int SPI_GETICONMETRICS                   =  45; 
        public const int SPI_SETICONMETRICS                   =  46;
        public const int SPI_SETWORKAREA                      =  47; 
        public const int SPI_GETWORKAREA                      =  48; 
        public const int SPI_SETPENWINDOWS                    =  49;
        public const int SPI_GETHIGHCONTRAST                  =  66; 
        public const int SPI_SETHIGHCONTRAST                  =  67;
        public const int SPI_GETKEYBOARDPREF                  =  68;
        public const int SPI_SETKEYBOARDPREF                  =  69;
        public const int SPI_GETSCREENREADER                  =  70; 
        public const int SPI_SETSCREENREADER                  =  71;
        public const int SPI_GETANIMATION                     =  72; 
        public const int SPI_SETANIMATION                     =  73; 
        public const int SPI_GETFONTSMOOTHING                 =  74;
        public const int SPI_SETFONTSMOOTHING                 =  75; 
        public const int SPI_SETDRAGWIDTH                     =  76;
        public const int SPI_SETDRAGHEIGHT                    =  77;
        public const int SPI_SETHANDHELD                      =  78;
        public const int SPI_GETLOWPOWERTIMEOUT               =  79; 
        public const int SPI_GETPOWEROFFTIMEOUT               =  80;
        public const int SPI_SETLOWPOWERTIMEOUT               =  81; 
        public const int SPI_SETPOWEROFFTIMEOUT               =  82; 
        public const int SPI_GETLOWPOWERACTIVE                =  83;
        public const int SPI_GETPOWEROFFACTIVE                =  84; 
        public const int SPI_SETLOWPOWERACTIVE                =  85;
        public const int SPI_SETPOWEROFFACTIVE                =  86;
        public const int SPI_SETCURSORS                       =  87;
        public const int SPI_SETICONS                         =  88; 
        public const int SPI_GETDEFAULTINPUTLANG              =  89;
        public const int SPI_SETDEFAULTINPUTLANG              =  90; 
        public const int SPI_SETLANGTOGGLE                    =  91; 
        public const int SPI_GETWINDOW----TENSION              =  92;
        public const int SPI_SETMOUSETRAILS                   =  93; 
        public const int SPI_GETMOUSETRAILS                   =  94;
        public const int SPI_SETSCREENSAVERRUNNING            =  97;
        public const int SPI_SCREENSAVERRUNNING               =  SPI_SETSCREENSAVERRUNNING;
        public const int SPI_GETFILTERKEYS                    =  50; 
        public const int SPI_SETFILTERKEYS                    =  51;
        public const int SPI_GETTOGGLEKEYS                    =  52; 
        public const int SPI_SETTOGGLEKEYS                    =  53; 
        public const int SPI_GETMOUSEKEYS                     =  54;
        public const int SPI_SETMOUSEKEYS                     =  55; 
        public const int SPI_GETSHOWSOUNDS                    =  56;
        public const int SPI_SETSHOWSOUNDS                    =  57;
        public const int SPI_GETSTICKYKEYS                    =  58;
        public const int SPI_SETSTICKYKEYS                    =  59; 
        public const int SPI_GETACCESSTIMEOUT                 =  60;
        public const int SPI_SETACCESSTIMEOUT                 =  61; 
        public const int SPI_GETSERIALKEYS                    =  62; 
        public const int SPI_SETSERIALKEYS                    =  63;
        public const int SPI_GETSOUNDSENTRY                   =  64; 
        public const int SPI_SETSOUNDSENTRY                   =  65;
        public const int SPI_GETSNAPTODEFBUTTON               =  95;
        public const int SPI_SETSNAPTODEFBUTTON               =  96;
        public const int SPI_GETMOUSEHOVERWIDTH               =  98; 
        public const int SPI_SETMOUSEHOVERWIDTH               =  99;
        public const int SPI_GETMOUSEHOVERHEIGHT              = 100; 
        public const int SPI_SETMOUSEHOVERHEIGHT              = 101; 
        public const int SPI_GETMOUSEHOVERTIME                = 102;
        public const int SPI_SETMOUSEHOVERTIME                = 103; 
        public const int SPI_GETWHEELSCROLLLINES              = 104;
        public const int SPI_SETWHEELSCROLLLINES              = 105;
        public const int SPI_GETMENUSHOWDELAY                 = 106;
        public const int SPI_SETMENUSHOWDELAY                 = 107; 
        public const int SPI_GETSHOWIMEUI                     = 110;
        public const int SPI_SETSHOWIMEUI                     = 111; 
        public const int SPI_GETMOUSESPEED                    = 112; 
        public const int SPI_SETMOUSESPEED                    = 113;
        public const int SPI_GETSCREENSAVERRUNNING            = 114; 
        public const int SPI_GETDESKWALLPAPER                 = 115;
        public const int SPI_GETACTIVEWINDOWTRACKING          = 0x1000;
        public const int SPI_SETACTIVEWINDOWTRACKING          = 0x1001;
        public const int SPI_GETMENUANIMATION                 = 0x1002; 
        public const int SPI_SETMENUANIMATION                 = 0x1003;
        public const int SPI_GETCOMBOBOXANIMATION             = 0x1004; 
        public const int SPI_SETCOMBOBOXANIMATION             = 0x1005; 
        public const int SPI_GETLISTBOXSMOOTHSCROLLING        = 0x1006;
        public const int SPI_SETLISTBOXSMOOTHSCROLLING        = 0x1007; 
        public const int SPI_GETGRADIENTCAPTIONS              = 0x1008;
        public const int SPI_SETGRADIENTCAPTIONS              = 0x1009;
        public const int SPI_GETKEYBOARDCUES                  = 0x100A;
        public const int SPI_SETKEYBOARDCUES                  = 0x100B; 
        public const int SPI_GETMENUUNDERLINES                = SPI_GETKEYBOARDCUES;
        public const int SPI_SETMENUUNDERLINES                = SPI_SETKEYBOARDCUES; 
        public const int SPI_GETACTIVEWNDTRKZORDER            = 0x100C; 
        public const int SPI_SETACTIVEWNDTRKZORDER            = 0x100D;
        public const int SPI_GETHOTTRACKING                   = 0x100E; 
        public const int SPI_SETHOTTRACKING                   = 0x100F;
        public const int SPI_GETMENUFADE                      = 0x1012;
        public const int SPI_SETMENUFADE                      = 0x1013;
        public const int SPI_GETSELECTIONFADE                 = 0x1014; 
        public const int SPI_SETSELECTIONFADE                 = 0x1015;
        public const int SPI_GETTOOLTIPANIMATION              = 0x1016; 
        public const int SPI_SETTOOLTIPANIMATION              = 0x1017; 
        public const int SPI_GETTOOLTIPFADE                   = 0x1018;
        public const int SPI_SETTOOLTIPFADE                   = 0x1019; 
        public const int SPI_GETCURSORSHADOW                  = 0x101A;
        public const int SPI_SETCURSORSHADOW                  = 0x101B;
        public const int SPI_GETUIEFFECTS                     = 0x103E;
        public const int SPI_SETUIEFFECTS                     = 0x103F; 
        public const int SPI_GETFOREGROUNDLOCKTIMEOUT         = 0x2000;
        public const int SPI_SETFOREGROUNDLOCKTIMEOUT         = 0x2001; 
        public const int SPI_GETACTIVEWNDTRKTIMEOUT           = 0x2002; 
        public const int SPI_SETACTIVEWNDTRKTIMEOUT           = 0x2003;
        public const int SPI_GETFOREGROUNDFLASHCOUNT          = 0x2004; 
        public const int SPI_SETFOREGROUNDFLASHCOUNT          = 0x2005;
        public const int SPI_GETCARETWIDTH                    = 0x2006;
        public const int SPI_SETCARETWIDTH                    = 0x2007;
 
        public const uint STATUS_INFO_LENGTH_MISMATCH   =  0xC0000004;
 
        public const int PBT_APMQUERYSUSPEND           = 0x0000; 
        public const int PBT_APMQUERYSTANDBY           = 0x0001;
        public const int PBT_APMQUERYSUSPENDFAILED     = 0x0002; 
        public const int PBT_APMQUERYSTANDBYFAILED     = 0x0003;
        public const int PBT_APMSUSPEND                = 0x0004;
        public const int PBT_APMSTANDBY                = 0x0005;
        public const int PBT_APMRESUMECRITICAL         = 0x0006; 
        public const int PBT_APMRESUMESUSPEND          = 0x0007;
        public const int PBT_APMRESUMESTANDBY          = 0x0008; 
        public const int PBT_APMBATTERYLOW             = 0x0009; 
        public const int PBT_APMPOWERSTATUSCHANGE      = 0x000A;
        public const int PBT_APMOEMEVENT               = 0x000B; 

        public const int STARTF_USESHOWWINDOW = 0x00000001;
        public const int FILE_MAP_WRITE = 0x00000002;
        public const int FILE_MAP_READ = 0x00000004; 
        public const int PAGE_READWRITE = 0x00000004;
        public const int GENERIC_EXECUTE = (0x20000000); 
        public const int GENERIC_ALL = (0x10000000); 
        public const int ERROR_NOT_READY  = 21;
        public const int ERROR_LOCK_FAILED = 167; 
        public const int ERROR_BUSY        = 170;

        public const int IMPERSONATION_LEVEL_SecurityAnonymous = 0;
        public const int IMPERSONATION_LEVEL_SecurityIdentification = 1; 
        public const int IMPERSONATION_LEVEL_SecurityImpersonation = 2;
        public const int IMPERSONATION_LEVEL_SecurityDelegation = 3; 
 
        public const int TOKEN_TYPE_TokenPrimary = 1;
        public const int TOKEN_TYPE_TokenImpersonation = 2; 

        public const int TOKEN_ALL_ACCESS   = 0x000f01ff;
        public const int TOKEN_EXECUTE      = 0x00020000;
        public const int TOKEN_READ         = 0x00020008; 
        public const int TOKEN_IMPERSONATE  = 0x00000004;
 
        public const int PIPE_ACCESS_INBOUND = 0x00000001; 
        public const int PIPE_ACCESS_OUTBOUND = 0x00000002;
        public const int PIPE_ACCESS_DUPLEX = 0x00000003; 

        public const int PIPE_WAIT = 0x00000000;
        public const int PIPE_NOWAIT = 0x00000001;
        public const int PIPE_READMODE_BYTE = 0x00000000; 
        public const int PIPE_READMODE_MESSAGE = 0x00000002;
        public const int PIPE_TYPE_BYTE = 0x00000000; 
        public const int PIPE_TYPE_MESSAGE = 0x00000004; 

        public const int PIPE_SINGLE_INSTANCES = 1; 
        public const int PIPE_UNLIMITED_INSTANCES = 255;

        public const int FILE_FLAG_OVERLAPPED = 0x40000000;
 
        public const int PM_REMOVE = 0x0001;
 
        public const int QS_KEY = 0x0001, 
        QS_MOUSEMOVE = 0x0002,
        QS_MOUSEBUTTON = 0x0004, 
        QS_POSTMESSAGE = 0x0008,
        QS_TIMER = 0x0010,
        QS_PAINT = 0x0020,
        QS_SENDMESSAGE = 0x0040, 
        QS_HOTKEY = 0x0080,
        QS_ALLPOSTMESSAGE = 0x0100, 
        QS_MOUSE = QS_MOUSEMOVE | QS_MOUSEBUTTON, 
        QS_INPUT = QS_MOUSE | QS_KEY,
        QS_ALLEVENTS = QS_INPUT | QS_POSTMESSAGE | QS_TIMER | QS_PAINT | QS_HOTKEY, 
        QS_ALLINPUT = QS_INPUT | QS_POSTMESSAGE | QS_TIMER | QS_PAINT | QS_HOTKEY | QS_SENDMESSAGE;

        public const int MWMO_INPUTAVAILABLE = 0x0004;  // don't use MWMO_WAITALL, see ddb#176342
 
        // The following are unique to the SerialPort/SerialStream classes
        internal const byte ONESTOPBIT = 0; 
        internal const byte ONE5STOPBITS = 1; 
        internal const byte TWOSTOPBITS = 2;
 
        internal const int DTR_CONTROL_DISABLE = 0x00;
        internal const int DTR_CONTROL_ENABLE = 0x01;
        internal const int DTR_CONTROL_HANDSHAKE = 0x02;
 
        internal const int RTS_CONTROL_DISABLE = 0x00;
        internal const int RTS_CONTROL_ENABLE = 0x01; 
        internal const int RTS_CONTROL_HANDSHAKE = 0x02; 
        internal const int RTS_CONTROL_TOGGLE = 0x03;
 
        internal const int  MS_CTS_ON = 0x10;
        internal const int  MS_DSR_ON = 0x20;
        internal const int  MS_RING_ON = 0x40;
        internal const int  MS_RLSD_ON  = 0x80; 

        internal const byte EOFCHAR = (byte) 26; 
 
        // Since C# does not provide access to bitfields and the native DCB structure contains
        // a very necessary one, these are the positional offsets (from the right) of areas 
        // of the 32-bit integer used in SerialStream's SetDcbFlag() and GetDcbFlag() methods.
        internal const int FBINARY = 0;
        internal const int FPARITY = 1;
        internal const int FOUTXCTSFLOW = 2; 
        internal const int FOUTXDSRFLOW = 3;
        internal const int FDTRCONTROL = 4; 
        internal const int FDSRSENSITIVITY = 6; 
        internal const int FTXCONTINUEONXOFF = 7;
        internal const int FOUTX = 8; 
        internal const int FINX = 9;
        internal const int FERRORCHAR = 10;
        internal const int FNULL = 11;
        internal const int FRTSCONTROL = 12; 
        internal const int FABORTONOERROR = 14;
        internal const int FDUMMY2 = 15; 
 
        internal const int PURGE_TXABORT     =  0x0001;  // Kill the pending/current writes to the comm port.
        internal const int PURGE_RXABORT     =  0x0002;  // Kill the pending/current reads to the comm port. 
        internal const int PURGE_TXCLEAR     =  0x0004;  // Kill the transmit queue if there.
        internal const int PURGE_RXCLEAR     =  0x0008;  // Kill the typeahead buffer if there.

        internal const byte DEFAULTXONCHAR = (byte) 17; 
        internal const byte DEFAULTXOFFCHAR = (byte) 19;
 
        internal const int SETRTS = 3;       // Set RTS high 
        internal const int CLRRTS = 4;       // Set RTS low
        internal const int SETDTR = 5;       // Set DTR high 
        internal const int CLRDTR = 6;

        internal const int EV_RXCHAR = 0x01;
        internal const int EV_RXFLAG = 0x02; 
        internal const int EV_CTS = 0x08;
        internal const int EV_DSR = 0x10; 
        internal const int EV_RLSD = 0x20; 
        internal const int EV_BREAK = 0x40;
        internal const int EV_ERR = 0x80; 
        internal const int EV_RING = 0x100;
        internal const int ALL_EVENTS = 0x1fb;  // don't use EV_TXEMPTY

        internal const int CE_RXOVER = 0x01; 
        internal const int CE_OVERRUN = 0x02;
        internal const int CE_PARITY = 0x04; 
        internal const int CE_FRAME = 0x08; 
        internal const int CE_BREAK = 0x10;
        internal const int CE_TXFULL = 0x100; 

        internal const int MAXDWORD = -1;   // note this is 0xfffffff, or UInt32.MaxValue, here used as an int

        internal const int NOPARITY          = 0; 
        internal const int ODDPARITY         = 1;
        internal const int EVENPARITY        = 2; 
        internal const int MARKPARITY        = 3; 
        internal const int SPACEPARITY       = 4;
 
        [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)]
        internal class WNDCLASS_I {
            public int      style;
            public IntPtr   lpfnWndProc; 
            public int      cbClsExtra = 0;
            public int      cbWndExtra = 0; 
            public IntPtr   hInstance = IntPtr.Zero; 
            public IntPtr   hIcon = IntPtr.Zero;
            public IntPtr   hCursor = IntPtr.Zero; 
            public IntPtr   hbrBackground = IntPtr.Zero;
            public IntPtr   lpszMenuName = IntPtr.Zero;
            public IntPtr   lpszClassName = IntPtr.Zero;
        } 

        [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)] 
        internal class WNDCLASS { 
            public int      style;
            public WndProc  lpfnWndProc; 
            public int      cbClsExtra = 0;
            public int      cbWndExtra = 0;
            public IntPtr   hInstance = IntPtr.Zero;
            public IntPtr   hIcon = IntPtr.Zero; 
            public IntPtr   hCursor = IntPtr.Zero;
            public IntPtr   hbrBackground = IntPtr.Zero; 
            public string   lpszMenuName = null; 
            public string   lpszClassName = null;
        } 

        [StructLayout(LayoutKind.Sequential)]
        public struct MSG {
            public IntPtr   hwnd; 
            public int      message;
            public IntPtr   wParam; 
            public IntPtr   lParam; 
            public int      time;
            public int      pt_x; 
            public int      pt_y;
        }

        public enum StructFormatEnum { 
            Ansi = 1,
            Unicode = 2, 
            Auto = 3, 
        }
 
        internal const int SDDL_REVISION_1 = 1;

        public enum StructFormat {
            Ansi = 1, 
            Unicode = 2,
            Auto = 3, 
        } 

        public delegate IntPtr WndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); 

        public delegate int ConHndlr(int signalType);

        // file src\services\monitoring\system\diagnosticts\nativemethods.cs 
        public const int SECURITY_DESCRIPTOR_REVISION = 1;
        public const int HKEY_PERFORMANCE_DATA = unchecked((int)0x80000004); 
        public const int DWORD_SIZE = 4; 
        public const int LARGE_INTEGER_SIZE = 8;
 
        public const int PERF_NO_INSTANCES     =      -1;  // no instances (see NumInstances above)

        public const int PERF_SIZE_DWORD        = 0x00000000;
        public const int PERF_SIZE_LARGE        = 0x00000100; 
        public const int PERF_SIZE_ZERO         = 0x00000200;  // for Zero Length fields
        public const int PERF_SIZE_VARIABLE_LEN = 0x00000300;  // length is In CounterLength field 
 
        public const int PERF_NO_UNIQUE_ID = -1;
 
        //
        //  select one of the following values to indicate the counter field usage
        //
        public const int PERF_TYPE_NUMBER       = 0x00000000;  // a number (not a counter) 
        public const int PERF_TYPE_COUNTER      = 0x00000400;  // an increasing numeric value
        public const int PERF_TYPE_TEXT         = 0x00000800;  // a text field 
        public const int PERF_TYPE_ZERO         = 0x00000C00;  // displays a zero 

        // 
        //  If the PERF_TYPE_NUMBER field was selected, then select one of the
        //  following to describe the Number
        //
        public const int PERF_NUMBER_HEX        = 0x00000000;  // display as HEX value 
        public const int PERF_NUMBER_DECIMAL    = 0x00010000;  // display as a decimal integer
        public const int PERF_NUMBER_DEC_1000   = 0x00020000;  // display as a decimal/1000 
 
        //
        //  If the PERF_TYPE_COUNTER value was selected then select one of the 
        //  following to indicate the type of counter
        //
        public const int PERF_COUNTER_VALUE     = 0x00000000;  // display counter value
        public const int PERF_COUNTER_RATE      = 0x00010000;  // divide ctr / delta time 
        public const int PERF_COUNTER_FRACTION  = 0x00020000;  // divide ctr / base
        public const int PERF_COUNTER_BASE      = 0x00030000;  // base value used In fractions 
        public const int PERF_COUNTER_ELAPSED   = 0x00040000;  // subtract counter from current time 
        public const int PERF_COUNTER_QUEUELEN  = 0x00050000;  // Use Queuelen processing func.
        public const int PERF_COUNTER_HISTOGRAM = 0x00060000;  // Counter begins or ends a histogram 
        public const int PERF_COUNTER_PRECISION = 0x00070000;  // divide ctr / private clock

        //
        //  If the PERF_TYPE_TEXT value was selected, then select one of the 
        //  following to indicate the type of TEXT data.
        // 
        public const int PERF_TEXT_UNICODE      = 0x00000000;  // type of text In text field 
        public const int PERF_TEXT_ASCII        = 0x00010000;  // ASCII using the CodePage field
 
        //
        //  Timer SubTypes
        //
        public const int PERF_TIMER_TICK        = 0x00000000;  // use system perf. freq for base 
        public const int PERF_TIMER_100NS       = 0x00100000;  // use 100 NS timer time base units
        public const int PERF_OBJECT_TIMER      = 0x00200000;  // use the object timer freq 
 
        //
        //  Any types that have calculations performed can use one or more of 
        //  the following calculation modification flags listed here
        //
        public const int PERF_DELTA_COUNTER     = 0x00400000;  // compute difference first
        public const int PERF_DELTA_BASE        = 0x00800000;  // compute base diff as well 
        public const int PERF_INVERSE_COUNTER   = 0x01000000;  // show as 1.00-value (assumes:
        public const int PERF_MULTI_COUNTER     = 0x02000000;  // sum of multiple instances 
 
        //
        //  Select one of the following values to indicate the display suffix (if any) 
        //
        public const int PERF_DISPLAY_NO_SUFFIX = 0x00000000;  // no suffix
        public const int PERF_DISPLAY_PER_SEC   = 0x10000000;  // "/sec"
        public const int PERF_DISPLAY_PERCENT   = 0x20000000;  // "%" 
        public const int PERF_DISPLAY_SECONDS   = 0x30000000;  // "secs"
        public const int PERF_DISPLAY_NOSHOW    = 0x40000000;  // value is not displayed 
 
        //
        //  Predefined counter types 
        //

        // 32-bit Counter.  Divide delta by delta time.  Display suffix: "/sec"
        public const int PERF_COUNTER_COUNTER  = 
                (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_RATE |
                 PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_DISPLAY_PER_SEC); 
 

        // 64-bit Timer.  Divide delta by delta time.  Display suffix: "%" 
        public const int PERF_COUNTER_TIMER =
                (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE |
                PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_DISPLAY_PERCENT);
 
        // Queue Length Space-Time Product. Divide delta by delta time. No Display Suffix.
        public const int PERF_COUNTER_QUEUELEN_TYPE = 
                (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_QUEUELEN | 
                PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_DISPLAY_NO_SUFFIX);
 
        // Queue Length Space-Time Product. Divide delta by delta time. No Display Suffix.
        public const int PERF_COUNTER_LARGE_QUEUELEN_TYPE =
                (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_QUEUELEN |
                PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_DISPLAY_NO_SUFFIX); 

        // Queue Length Space-Time Product using 100 Ns timebase. 
        // Divide delta by delta time. No Display Suffix. 
        public const int PERF_COUNTER_100NS_QUEUELEN_TYPE =
                    (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_QUEUELEN | 
                    PERF_TIMER_100NS | PERF_DELTA_COUNTER | PERF_DISPLAY_NO_SUFFIX);

        // Queue Length Space-Time Product using Object specific timebase.
        // Divide delta by delta time. No Display Suffix. 
        public const int PERF_COUNTER_OBJ_TIME_QUEUELEN_TYPE =
                    (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_QUEUELEN | 
                    PERF_OBJECT_TIMER | PERF_DELTA_COUNTER | PERF_DISPLAY_NO_SUFFIX); 

        // 64-bit Counter.  Divide delta by delta time. Display Suffix: "/sec" 
        public const int PERF_COUNTER_BULK_COUNT =
                (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE |
                PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_DISPLAY_PER_SEC);
 
        // Indicates the counter is not a  counter but rather Unicode text Display as text.
        public const int PERF_COUNTER_TEXT = 
                (PERF_SIZE_VARIABLE_LEN | PERF_TYPE_TEXT | PERF_TEXT_UNICODE | 
                PERF_DISPLAY_NO_SUFFIX);
 
        // Indicates the data is a counter  which should not be
        // time averaged on display (such as an error counter on a serial line)
        // Display as is.  No Display Suffix.
        public const int PERF_COUNTER_RAWCOUNT = 
                (PERF_SIZE_DWORD | PERF_TYPE_NUMBER | PERF_NUMBER_DECIMAL |
                PERF_DISPLAY_NO_SUFFIX); 
 
        // Same as PERF_COUNTER_RAWCOUNT except its size is a large integer
        public const int PERF_COUNTER_LARGE_RAWCOUNT = 
                (PERF_SIZE_LARGE | PERF_TYPE_NUMBER | PERF_NUMBER_DECIMAL |
                PERF_DISPLAY_NO_SUFFIX);

        // Special case for RAWCOUNT that want to be displayed In hex 
        // Indicates the data is a counter  which should not be
        // time averaged on display (such as an error counter on a serial line) 
        // Display as is.  No Display Suffix. 
        public const int PERF_COUNTER_RAWCOUNT_HEX =
                (PERF_SIZE_DWORD | PERF_TYPE_NUMBER | PERF_NUMBER_HEX | 
                PERF_DISPLAY_NO_SUFFIX);

        // Same as PERF_COUNTER_RAWCOUNT_HEX except its size is a large integer
        public const int PERF_COUNTER_LARGE_RAWCOUNT_HEX = 
                (PERF_SIZE_LARGE | PERF_TYPE_NUMBER | PERF_NUMBER_HEX |
                PERF_DISPLAY_NO_SUFFIX); 
 
        // A count which is either 1 or 0 on each sampling interrupt (% busy)
        // Divide delta by delta base. Display Suffix: "%" 
        public const int PERF_SAMPLE_FRACTION =
                (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_FRACTION |
                PERF_DELTA_COUNTER | PERF_DELTA_BASE | PERF_DISPLAY_PERCENT);
 
        // A count which is sampled on each sampling interrupt (queue length)
        // Divide delta by delta time. No Display Suffix. 
        public const int PERF_SAMPLE_COUNTER = 
                (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_RATE |
                PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_DISPLAY_NO_SUFFIX); 

        // A label: no data is associated with this counter (it has 0 length)
        // Do not display.
        public const int PERF_COUNTER_NODATA = 
                (PERF_SIZE_ZERO | PERF_DISPLAY_NOSHOW);
 
        // 64-bit Timer inverse (e.g., idle is measured, but display busy %) 
        // Display 100 - delta divided by delta time.  Display suffix: "%"
        public const int PERF_COUNTER_TIMER_INV = 
                (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE |
                PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_INVERSE_COUNTER |
                PERF_DISPLAY_PERCENT);
 
        // The divisor for a sample, used with the previous counter to form a
        // sampled %.  You must check for >0 before dividing by this!  This 
        // counter will directly follow the  numerator counter.  It should not 
        // be displayed to the user.
        public const int PERF_SAMPLE_BASE = 
                (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_BASE |
                PERF_DISPLAY_NOSHOW |
                0x00000001);  // for compatibility with pre-beta versions
 
        // A timer which, when divided by an average base, produces a time
        // In seconds which is the average time of some operation.  This 
        // timer times total operations, and  the base is the number of opera- 
        // tions.  Display Suffix: "sec"
        public const int PERF_AVERAGE_TIMER = 
                (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_FRACTION |
                PERF_DISPLAY_SECONDS);

        // Used as the denominator In the computation of time or count 
        // averages.  Must directly follow the numerator counter.  Not dis-
        // played to the user. 
        public const int PERF_AVERAGE_BASE = 
                (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_BASE |
                PERF_DISPLAY_NOSHOW | 
                0x00000002);  // for compatibility with pre-beta versions


        // 64-bit Timer in object specific units. Display delta divided by 
        // delta time as returned in the object type header structure.  Display suffix: "%"
        public const int PERF_OBJ_TIME_TIMER = 
                    (PERF_SIZE_LARGE   | PERF_TYPE_COUNTER  | PERF_COUNTER_RATE | 
                     PERF_OBJECT_TIMER | PERF_DELTA_COUNTER | PERF_DISPLAY_PERCENT);
 
        // A bulk count which, when divided (typically) by the number of
        // operations, gives (typically) the number of bytes per operation.
        // No Display Suffix.
        public const int PERF_AVERAGE_BULK = 
                (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_FRACTION  |
                PERF_DISPLAY_NOSHOW); 
 
        // 64-bit Timer in object specific units. Display delta divided by
        // delta time as returned in the object type header structure.  Display suffix: "%" 
        public const int PERF_OBJ_TIME_TIME =
                    (PERF_SIZE_LARGE   | PERF_TYPE_COUNTER  | PERF_COUNTER_RATE |
                     PERF_OBJECT_TIMER | PERF_DELTA_COUNTER | PERF_DISPLAY_PERCENT);
 
        // 64-bit Timer In 100 nsec units. Display delta divided by
        // delta time.  Display suffix: "%" 
        public const int PERF_100NSEC_TIMER = 
                (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE |
                PERF_TIMER_100NS | PERF_DELTA_COUNTER | PERF_DISPLAY_PERCENT); 

        // 64-bit Timer inverse (e.g., idle is measured, but display busy %)
        // Display 100 - delta divided by delta time.  Display suffix: "%"
        public const int PERF_100NSEC_TIMER_INV = 
                (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE |
                PERF_TIMER_100NS | PERF_DELTA_COUNTER | PERF_INVERSE_COUNTER  | 
                PERF_DISPLAY_PERCENT); 

        // 64-bit Timer.  Divide delta by delta time.  Display suffix: "%" 
        // Timer for multiple instances, so result can exceed 100%.
        public const int PERF_COUNTER_MULTI_TIMER =
                (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE |
                PERF_DELTA_COUNTER | PERF_TIMER_TICK | PERF_MULTI_COUNTER | 
                PERF_DISPLAY_PERCENT);
 
        // 64-bit Timer inverse (e.g., idle is measured, but display busy %) 
        // Display 100 * _MULTI_BASE - delta divided by delta time.
        // Display suffix: "%" Timer for multiple instances, so result 
        // can exceed 100%.  Followed by a counter of type _MULTI_BASE.
        public const int PERF_COUNTER_MULTI_TIMER_INV =
                (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE |
                PERF_DELTA_COUNTER | PERF_MULTI_COUNTER | PERF_TIMER_TICK | 
                PERF_INVERSE_COUNTER | PERF_DISPLAY_PERCENT);
 
        // Number of instances to which the preceding _MULTI_..._INV counter 
        // applies.  Used as a factor to get the percentage.
        public const int PERF_COUNTER_MULTI_BASE = 
                (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_BASE |
                PERF_MULTI_COUNTER | PERF_DISPLAY_NOSHOW);

        // 64-bit Timer In 100 nsec units. Display delta divided by delta time. 
        // Display suffix: "%" Timer for multiple instances, so result can exceed 100%.
        public const int PERF_100NSEC_MULTI_TIMER = 
                (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_DELTA_COUNTER  | 
                PERF_COUNTER_RATE | PERF_TIMER_100NS | PERF_MULTI_COUNTER |
                PERF_DISPLAY_PERCENT); 

        // 64-bit Timer inverse (e.g., idle is measured, but display busy %)
        // Display 100 * _MULTI_BASE - delta divided by delta time.
        // Display suffix: "%" Timer for multiple instances, so result 
        // can exceed 100%.  Followed by a counter of type _MULTI_BASE.
        public const int PERF_100NSEC_MULTI_TIMER_INV = 
                (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_DELTA_COUNTER  | 
                PERF_COUNTER_RATE | PERF_TIMER_100NS | PERF_MULTI_COUNTER |
                PERF_INVERSE_COUNTER | PERF_DISPLAY_PERCENT); 

        // Indicates the data is a fraction of the following counter  which
        // should not be time averaged on display (such as free space over
        // total space.) Display as is.  Display the quotient as "%". 
        public const int PERF_RAW_FRACTION =
                (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_FRACTION | 
                PERF_DISPLAY_PERCENT); 

        public const int PERF_LARGE_RAW_FRACTION = 
                    (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_FRACTION |
                    PERF_DISPLAY_PERCENT);

        // Indicates the data is a base for the preceding counter which should 
        // not be time averaged on display (such as free space over total space.)
        public const int PERF_RAW_BASE = 
                (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_BASE | 
                PERF_DISPLAY_NOSHOW |
                0x00000003);  // for compatibility with pre-beta versions 

        public const int PERF_LARGE_RAW_BASE =
                    (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_BASE |
                    PERF_DISPLAY_NOSHOW ); 

        // The data collected In this counter is actually the start time of the 
        // item being measured. For display, this data is subtracted from the 
        // sample time to yield the elapsed time as the difference between the two.
        // In the definition below, the PerfTime field of the Object contains 
        // the sample time as indicated by the PERF_OBJECT_TIMER bit and the
        // difference is scaled by the PerfFreq of the Object to convert the time
        // units into seconds.
        public const int PERF_ELAPSED_TIME = 
                (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_ELAPSED |
                PERF_OBJECT_TIMER | PERF_DISPLAY_SECONDS); 
 
        //
        //  The following counter type can be used with the preceding types to 
        //  define a range of values to be displayed In a histogram.
        //

        // 
        //  This counter is used to display the difference from one sample
        //  to the next. The counter value is a constantly increasing number 
        //  and the value displayed is the difference between the current 
        //  value and the previous value. Negative numbers are not allowed
        //  which shouldn't be a problem as long as the counter value is 
        //  increasing or unchanged.
        //
        public const int PERF_COUNTER_DELTA =
                (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_VALUE | 
                PERF_DELTA_COUNTER | PERF_DISPLAY_NO_SUFFIX);
 
        public const int PERF_COUNTER_LARGE_DELTA = 
                (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_VALUE |
                PERF_DELTA_COUNTER | PERF_DISPLAY_NO_SUFFIX); 

        // The timer used has the same frequency as the System Performance Timer
        public const int PERF_PRECISION_SYSTEM_TIMER =
                (PERF_SIZE_LARGE    | PERF_TYPE_COUNTER     | PERF_COUNTER_PRECISION    | 
                 PERF_TIMER_TICK    | PERF_DELTA_COUNTER    | PERF_DISPLAY_PERCENT   );
 
        // 
        // The timer used has the same frequency as the 100 NanoSecond Timer
        public const int PERF_PRECISION_100NS_TIMER  = 
                (PERF_SIZE_LARGE    | PERF_TYPE_COUNTER     | PERF_COUNTER_PRECISION    |
                 PERF_TIMER_100NS   | PERF_DELTA_COUNTER    | PERF_DISPLAY_PERCENT   );
        //
        // The timer used is of the frequency specified in the Object header's 
        //  PerfFreq field (PerfTime is ignored)
        public const int PERF_PRECISION_OBJECT_TIMER = 
                (PERF_SIZE_LARGE    | PERF_TYPE_COUNTER     | PERF_COUNTER_PRECISION    | 
                 PERF_OBJECT_TIMER  | PERF_DELTA_COUNTER    | PERF_DISPLAY_PERCENT   );
 
        public const uint PDH_FMT_DOUBLE =  0x00000200;
        public const uint PDH_FMT_NOSCALE   =   0x00001000;
        public const uint PDH_FMT_NOCAP100  =   0x00008000;
 

 
        [StructLayout(LayoutKind.Sequential)] 
        public class PDH_RAW_COUNTER {
            public int CStatus = 0; 
            public long TimeStamp = 0;
            public long FirstValue = 0;
            public long SecondValue = 0;
            public int MultiCount = 0; 
        }
 
        [StructLayout(LayoutKind.Sequential)] 
        public class PDH_FMT_COUNTERVALUE {
            public int CStatus = 0; 
            public double data = 0;
        }

        // 
        //  The following are used to determine the level of detail associated
        //  with the counter.  The user will be setting the level of detail 
        //  that should be displayed at any given time. 
        //
        public const int PERF_DETAIL_NOVICE      =    100; // The uninformed can understand it 
        public const int PERF_DETAIL_ADVANCED    =    200; // For the advanced user
        public const int PERF_DETAIL_EXPERT      =    300; // For the expert user
        public const int PERF_DETAIL_WIZARD      =    400; // For the system designer
 
        [StructLayout(LayoutKind.Sequential)]
        internal class PERF_COUNTER_BLOCK { 
            public int ByteLength = 0; 
        }
 
        [StructLayout(LayoutKind.Sequential)]
        internal class PERF_COUNTER_DEFINITION {
            public int ByteLength = 0;
            public int CounterNameTitleIndex = 0; 

            // this one is kind of weird. It is defined as in SDK: 
            // #ifdef _WIN64 
            //  DWORD           CounterNameTitle;
            // #else 
            //  LPWSTR          CounterNameTitle;
            // #endif
            // so we can't use IntPtr here.
 
            public int CounterNameTitlePtr = 0;
            public int CounterHelpTitleIndex = 0; 
            public int CounterHelpTitlePtr = 0; 
            public int DefaultScale = 0;
            public int DetailLevel = 0; 
            public int CounterType = 0;
            public int CounterSize = 0;
            public int CounterOffset = 0;
        } 

        [StructLayout(LayoutKind.Sequential)] 
        internal class PERF_DATA_BLOCK { 
            public int Signature1 = 0;
            public int Signature2 = 0; 
            public int LittleEndian = 0;
            public int Version = 0;
            public int Revision = 0;
            public int TotalByteLength = 0; 
            public int HeaderLength = 0;
            public int NumObjectTypes = 0; 
            public int DefaultObject = 0; 
            public SYSTEMTIME SystemTime = null;
            public int pad1 = 0;  // Need to pad the struct to get quadword alignment for the 'long' after SystemTime 
            public long PerfTime = 0;
            public long PerfFreq = 0;
            public long PerfTime100nSec = 0;
            public int SystemNameLength = 0; 
            public int SystemNameOffset = 0;
        } 
 
        [StructLayout(LayoutKind.Sequential)]
        internal class PERF_INSTANCE_DEFINITION { 
            public int ByteLength = 0;
            public int ParentObjectTitleIndex = 0;
            public int ParentObjectInstance = 0;
            public int UniqueID = 0; 
            public int NameOffset = 0;
            public int NameLength = 0; 
        } 

        [StructLayout(LayoutKind.Sequential)] 
        internal class PERF_OBJECT_TYPE {
            public int TotalByteLength = 0;
            public int DefinitionLength = 0;
            public int HeaderLength = 0; 
            public int ObjectNameTitleIndex = 0;
            public int ObjectNameTitlePtr = 0; 
            public int ObjectHelpTitleIndex = 0; 
            public int ObjectHelpTitlePtr = 0;
            public int DetailLevel = 0; 
            public int NumCounters = 0;
            public int DefaultCounter = 0;
            public int NumInstances = 0;
            public int CodePage = 0; 
            public long PerfTime = 0;
            public long PerfFreq = 0; 
        } 

        [DllImport(ExternDll.Kernel32, CharSet=CharSet.Auto, SetLastError=true, BestFitMapping=false)] 
        [ResourceExposure(ResourceScope.Machine)]
        internal static extern SafeFileMappingHandle CreateFileMapping(IntPtr hFile, NativeMethods.SECURITY_ATTRIBUTES lpFileMappingAttributes, int flProtect, int dwMaximumSizeHigh, int dwMaximumSizeLow, string lpName);

        [DllImport(ExternDll.Kernel32, CharSet=CharSet.Auto, SetLastError=true, BestFitMapping=false)] 
        [ResourceExposure(ResourceScope.Machine)]
        internal static extern SafeFileMappingHandle OpenFileMapping(int dwDesiredAccess, bool bInheritHandle, string lpName); 
 
        // copied from winbase.h
        public const int FORMAT_MESSAGE_ALLOCATE_BUFFER = 0x00000100; 
        public const int FORMAT_MESSAGE_IGNORE_INSERTS  = 0x00000200;
        public const int FORMAT_MESSAGE_FROM_STRING     = 0x00000400;
        public const int FORMAT_MESSAGE_FROM_HMODULE    = 0x00000800;
        public const int FORMAT_MESSAGE_FROM_SYSTEM     = 0x00001000; 
        public const int FORMAT_MESSAGE_ARGUMENT_ARRAY  = 0x00002000;
        public const int FORMAT_MESSAGE_MAX_WIDTH_MASK  = 0x000000FF; 
        public const int LOAD_WITH_ALTERED_SEARCH_PATH  = 0x00000008; 
        public const int LOAD_LIBRARY_AS_DATAFILE       = 0x00000002;
 
        public const int SEEK_READ = 0x2;
        public const int FORWARDS_READ = 0x4;
        public const int BACKWARDS_READ = 0x8;
        public const int ERROR_EVENTLOG_FILE_CHANGED = 1503; 

        [DllImport(ExternDll.User32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)] 
        [ResourceExposure(ResourceScope.None)] 
        public static extern int WaitForInputIdle(SafeProcessHandle handle, int milliseconds);
 
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.None)]
        public static extern SafeProcessHandle OpenProcess(int access, bool inherit, int processId);
 
        [DllImport(ExternDll.Psapi, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.None)] 
        public static extern bool EnumProcessModules(SafeProcessHandle handle, IntPtr modules, int size, ref int needed); 

        [DllImport(ExternDll.Psapi, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)] 
        [ResourceExposure(ResourceScope.Machine)]
        public static extern bool EnumProcesses(int[] processIds, int size, out int needed);

        [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 
        [DllImport(ExternDll.Psapi, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true, BestFitMapping=false)]
        [ResourceExposure(ResourceScope.Machine)] 
        public static extern int GetModuleFileNameEx(HandleRef processHandle, HandleRef moduleHandle, StringBuilder baseName, int size); 

        [DllImport(ExternDll.Psapi, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)] 
        [ResourceExposure(ResourceScope.Process)]
        public static extern bool GetModuleInformation(SafeProcessHandle processHandle, HandleRef moduleHandle, NtModuleInfo ntModuleInfo, int size);
        [DllImport(ExternDll.Psapi, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true, BestFitMapping=false)]
        [ResourceExposure(ResourceScope.Machine)] 
        public static extern int GetModuleBaseName(SafeProcessHandle processHandle, HandleRef moduleHandle, StringBuilder baseName, int size);
        [DllImport(ExternDll.Psapi, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true, BestFitMapping=false)] 
        [ResourceExposure(ResourceScope.Machine)] 
        public static extern int GetModuleFileNameEx(SafeProcessHandle processHandle, HandleRef moduleHandle, StringBuilder baseName, int size);
 
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.Machine)]
        public static extern bool SetProcessWorkingSetSize(SafeProcessHandle handle, IntPtr min, IntPtr max);
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)] 
        [ResourceExposure(ResourceScope.None)]
        public static extern bool GetProcessWorkingSetSize(SafeProcessHandle handle, out IntPtr min, out IntPtr max); 
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)] 
        [ResourceExposure(ResourceScope.Machine)]
        public static extern bool SetProcessAffinityMask(SafeProcessHandle handle, IntPtr mask); 
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.None)]
        public static extern bool GetProcessAffinityMask(SafeProcessHandle handle, out IntPtr processMask, out IntPtr systemMask);
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)] 
        [ResourceExposure(ResourceScope.None)]
        public static extern bool GetThreadPriorityBoost(SafeThreadHandle handle, out bool disabled); 
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)] 
        [ResourceExposure(ResourceScope.None)]
        public static extern bool SetThreadPriorityBoost(SafeThreadHandle handle, bool disabled); 
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.None)]
        public static extern bool GetProcessPriorityBoost(SafeProcessHandle handle, out bool disabled);
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)] 
        [ResourceExposure(ResourceScope.None)]
        public static extern bool SetProcessPriorityBoost(SafeProcessHandle handle, bool disabled); 
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)] 
        [ResourceExposure(ResourceScope.Process)]
        public static extern SafeThreadHandle OpenThread(int access, bool inherit, int threadId); 
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.Process)]
        public static extern bool SetThreadPriority(SafeThreadHandle handle, int priority);
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)] 
        [ResourceExposure(ResourceScope.None)]
        public static extern int GetThreadPriority(SafeThreadHandle handle); 
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)] 
        [ResourceExposure(ResourceScope.Process)]
        public static extern IntPtr SetThreadAffinityMask(SafeThreadHandle handle, HandleRef mask); 
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.Process)]
        public static extern int SetThreadIdealProcessor(SafeThreadHandle handle, int processor);
 
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.Process)] 
        public static extern IntPtr CreateToolhelp32Snapshot(int flags, int processId); 
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.None)] 
        public static extern bool Process32First(HandleRef handle, IntPtr entry);
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.None)]
        public static extern bool Process32Next(HandleRef handle, IntPtr entry); 
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.None)] 
        public static extern bool Thread32First(HandleRef handle, WinThreadEntry entry); 
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.None)] 
        public static extern bool Thread32Next(HandleRef handle, WinThreadEntry entry);
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.None)]
        public static extern bool Module32First(HandleRef handle, IntPtr entry); 
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.None)] 
        public static extern bool Module32Next(HandleRef handle, IntPtr entry); 
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.None)] 
        public static extern int GetPriorityClass(SafeProcessHandle handle);
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.Machine)]
        public static extern bool SetPriorityClass(SafeProcessHandle handle, int priorityClass); 
        [DllImport(ExternDll.User32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.Process)] 
        public static extern bool EnumWindows(EnumThreadWindowsCallback callback, IntPtr extraData); 
        [DllImport(ExternDll.User32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.Machine)] 
        public static extern int GetWindowThreadProcessId(HandleRef handle, out int processId);
        [DllImport(ExternDll.Shell32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.Machine)]
        public static extern bool ShellExecuteEx(ShellExecuteInfo info); 
        [DllImport(ExternDll.Ntdll, CharSet=System.Runtime.InteropServices.CharSet.Auto)]
        [ResourceExposure(ResourceScope.Machine)] 
        public static extern int NtQueryInformationProcess(SafeProcessHandle processHandle, int query, NtProcessBasicInfo info, int size, int[] returnedSize); 
        [DllImport(ExternDll.Ntdll, CharSet=System.Runtime.InteropServices.CharSet.Auto)]
        [ResourceExposure(ResourceScope.None)] 
        public static extern int NtQuerySystemInformation(int query, IntPtr dataPtr, int size, out int returnedSize);
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, BestFitMapping=false)]
        [ResourceExposure(ResourceScope.Machine)]
        public static extern SafeFileHandle CreateFile(string lpFileName,int dwDesiredAccess,int dwShareMode, SECURITY_ATTRIBUTES lpSecurityAttributes, int dwCreationDisposition,int dwFlagsAndAttributes, SafeFileHandle hTemplateFile); 

 
#endif // !FEATURE_PAL 

        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Ansi, SetLastError=true, BestFitMapping=false)] 
        [ResourceExposure(ResourceScope.Machine)]
        public static extern bool DuplicateHandle(
            HandleRef hSourceProcessHandle,
            SafeHandle hSourceHandle, 
            HandleRef hTargetProcess,
            out SafeFileHandle targetHandle, 
            int dwDesiredAccess, 
            bool bInheritHandle,
            int dwOptions 
        );

        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Ansi, SetLastError=true, BestFitMapping=false)]
        [ResourceExposure(ResourceScope.Machine)] 
        public static extern bool DuplicateHandle(
            HandleRef hSourceProcessHandle, 
            SafeHandle hSourceHandle, 
            HandleRef hTargetProcess,
            out SafeWaitHandle targetHandle, 
            int dwDesiredAccess,
            bool bInheritHandle,
            int dwOptions
        ); 

 
#if !FEATURE_PAL 
        /* Unused
        [DllImport(ExternDll.Advapi32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true, BestFitMapping=false)] 
        [ResourceExposure(ResourceScope.Process)]
        public static extern bool LogonUser(
            [MarshalAs(UnmanagedType.LPTStr)]
            string lpszUsername, 
            [MarshalAs(UnmanagedType.LPTStr)]
            string lpszDomain, 
            [MarshalAs(UnmanagedType.LPTStr)] 
            string lpszPassword,
            int dwLogonType, 
            int dwLogonProvider,
            out IntPtr phToken
        );
        */ 
        [DllImport(ExternDll.Advapi32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.Process)] 
        public static extern bool OpenProcessToken(HandleRef ProcessHandle, int DesiredAccess, out IntPtr TokenHandle); 
        [DllImport(ExternDll.Advapi32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true, BestFitMapping=false)]
        [ResourceExposure(ResourceScope.None)] 
        public static extern bool LookupPrivilegeValue([MarshalAs(UnmanagedType.LPTStr)] string lpSystemName, [MarshalAs(UnmanagedType.LPTStr)] string lpName, out LUID lpLuid);
        [DllImport(ExternDll.Advapi32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.Process)]
        public static extern bool AdjustTokenPrivileges( 
            HandleRef TokenHandle,
            bool DisableAllPrivileges, 
            TokenPrivileges NewState, 
            int BufferLength,
            IntPtr PreviousState, 
            IntPtr ReturnLength
        );
        [DllImport(ExternDll.User32, CharSet=System.Runtime.InteropServices.CharSet.Auto, BestFitMapping=true)]
        [ResourceExposure(ResourceScope.None)] 
        public static extern int GetWindowText(HandleRef hWnd, StringBuilder lpString, int nMaxCount);
        [DllImport(ExternDll.User32, CharSet=System.Runtime.InteropServices.CharSet.Auto)] 
        [ResourceExposure(ResourceScope.None)] 
        public static extern int GetWindowTextLength(HandleRef hWnd);
        [DllImport(ExternDll.User32, CharSet=System.Runtime.InteropServices.CharSet.Auto)] 
        [ResourceExposure(ResourceScope.None)]
        public static extern bool IsWindowVisible(HandleRef hWnd);
        [DllImport(ExternDll.User32, CharSet=System.Runtime.InteropServices.CharSet.Auto)]
        [ResourceExposure(ResourceScope.None)] 
        public static extern IntPtr SendMessageTimeout(HandleRef hWnd, int msg, IntPtr wParam, IntPtr lParam, int flags, int timeout, out IntPtr pdwResult);
        [DllImport(ExternDll.User32, CharSet=System.Runtime.InteropServices.CharSet.Auto)] 
        [ResourceExposure(ResourceScope.None)] 
        public static extern int GetWindowLong(HandleRef hWnd, int nIndex);
        [DllImport(ExternDll.User32, CharSet=System.Runtime.InteropServices.CharSet.Auto)] 
        [ResourceExposure(ResourceScope.None)]
        public static extern int PostMessage(HandleRef hwnd, int msg, IntPtr wparam, IntPtr lparam);
        [DllImport(ExternDll.User32, ExactSpelling=true, CharSet=System.Runtime.InteropServices.CharSet.Auto)]
        [ResourceExposure(ResourceScope.Process)] 
        public static extern IntPtr GetWindow(HandleRef hWnd, int uCmd);
 
        [StructLayout(LayoutKind.Sequential)] 
        internal class NtModuleInfo {
            public IntPtr BaseOfDll = (IntPtr)0; 
            public int SizeOfImage = 0;
            public IntPtr EntryPoint = (IntPtr)0;
        }
 
        [StructLayout(LayoutKind.Sequential)]
        internal class WinProcessEntry { 
            public int dwSize = 0; 
            public int cntUsage = 0;
            public int th32ProcessID = 0; 
            public IntPtr th32DefaultHeapID = (IntPtr)0;
            public int th32ModuleID = 0;
            public int cntThreads = 0;
            public int th32ParentProcessID = 0; 
            public int pcPriClassBase = 0;
            public int dwFlags = 0; 
            //[MarshalAs(UnmanagedType.ByValTStr, SizeConst=260)] 
            //public string fileName;
            //byte fileName[260]; 
            public const int sizeofFileName = 260;
        }

        [StructLayout(LayoutKind.Sequential)] 
        internal class WinThreadEntry {
            public int dwSize = 0; 
            public int cntUsage = 0; 
            public int th32ThreadID = 0;
            public int th32OwnerProcessID = 0; 
            public int tpBasePri = 0;
            public int tpDeltaPri = 0;
            public int dwFlags = 0;
        } 

        [StructLayout(LayoutKind.Sequential)] 
        internal class WinModuleEntry {  // MODULEENTRY32 
            public int dwSize = 0;
            public int th32ModuleID = 0; 
            public int th32ProcessID = 0;
            public int GlblcntUsage = 0;
            public int ProccntUsage = 0;
            public IntPtr modBaseAddr = (IntPtr)0; 
            public int modBaseSize = 0;
            public IntPtr hModule = (IntPtr)0; 
            //byte moduleName[256]; 
            //[MarshalAs(UnmanagedType.ByValTStr, SizeConst=256)]
            //public string moduleName; 
            //[MarshalAs(UnmanagedType.ByValTStr, SizeConst=260)]
            //public string fileName;
            //byte fileName[260];
            public const int sizeofModuleName = 256; 
            public const int sizeofFileName = 260;
        } 
 
        [StructLayout(LayoutKind.Sequential)]
        internal class ShellExecuteInfo { 
            public int cbSize = 0;
            public int fMask = 0;
            public IntPtr hwnd = (IntPtr)0;
            public IntPtr lpVerb = (IntPtr)0; 
            public IntPtr lpFile = (IntPtr)0;
            public IntPtr lpParameters = (IntPtr)0; 
            public IntPtr lpDirectory = (IntPtr)0; 
            public int nShow = 0;
            public IntPtr hInstApp = (IntPtr)0; 
            public IntPtr lpIDList = (IntPtr)0;
            public IntPtr lpClass = (IntPtr)0;
            public IntPtr hkeyClass = (IntPtr)0;
            public int dwHotKey = 0; 
            public IntPtr hIcon = (IntPtr)0;
            public IntPtr hProcess = (IntPtr)0; 
 
            [ResourceExposure(ResourceScope.Machine)]
            public ShellExecuteInfo() { 
                cbSize = Marshal.SizeOf(this);
            }
        }
 
        // NT definition
        // typedef struct _PROCESS_BASIC_INFORMATION { 
        //    NTSTATUS ExitStatus; (LONG) 
        //    PPEB PebBaseAddress;
        //    ULONG_PTR AffinityMask; 
        //    KPRIORITY BasePriority;  (LONG)
        //    ULONG_PTR UniqueProcessId;
        //    ULONG_PTR InheritedFromUniqueProcessId;
        //} PROCESS_BASIC_INFORMATION; 

        [StructLayout(LayoutKind.Sequential)] 
        internal class NtProcessBasicInfo { 
            public int ExitStatus = 0;
            public IntPtr PebBaseAddress = (IntPtr)0; 
            public IntPtr AffinityMask = (IntPtr)0;
            public int BasePriority = 0;
            public IntPtr UniqueProcessId = (IntPtr)0;
            public IntPtr InheritedFromUniqueProcessId = (IntPtr)0; 
        }
 
        [StructLayout(LayoutKind.Sequential)] 
        internal struct LUID {
            public int LowPart; 
            public int HighPart;
        }

        [StructLayout(LayoutKind.Sequential)] 
        internal class TokenPrivileges {
            public int PrivilegeCount = 1; 
            public LUID Luid; 
            public int Attributes = 0;
        } 

        internal delegate bool EnumThreadWindowsCallback(IntPtr hWnd, IntPtr lParam);

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1812:AvoidUninstantiatedInternalClasses")] 
        [StructLayout(LayoutKind.Sequential)]
        internal class SYSTEMTIME { 
            public short wYear; 
            public short wMonth;
            public short wDayOfWeek; 
            public short wDay;
            public short wHour;
            public short wMinute;
            public short wSecond; 
            public short wMilliseconds;
 
            public override string ToString() { 
                return "[SYSTEMTIME: "
                + wDay.ToString(CultureInfo.CurrentCulture) + "/" + wMonth.ToString(CultureInfo.CurrentCulture) + "/" + wYear.ToString(CultureInfo.CurrentCulture) 
                + " " + wHour.ToString(CultureInfo.CurrentCulture) + ":" + wMinute.ToString(CultureInfo.CurrentCulture) + ":" + wSecond.ToString(CultureInfo.CurrentCulture)
                + "]";
            }
        } 

        public const int NtPerfCounterSizeDword = 0x00000000; 
        public const int NtPerfCounterSizeLarge = 0x00000100; 

        public const int SHGFI_USEFILEATTRIBUTES = 0x000000010;  // use passed dwFileAttribute 
        public const int SHGFI_TYPENAME = 0x000000400;

        public const int NtQueryProcessBasicInfo = 0;
        public const int NtQuerySystemProcessInformation = 5; 

        public const int SEE_MASK_CLASSNAME = 0x00000001;    // Note CLASSKEY overrides CLASSNAME 
        public const int SEE_MASK_CLASSKEY = 0x00000003; 
        public const int SEE_MASK_IDLIST = 0x00000004;    // Note INVOKEIDLIST overrides IDLIST
        public const int SEE_MASK_INVOKEIDLIST = 0x0000000c; 
        public const int SEE_MASK_ICON = 0x00000010;
        public const int SEE_MASK_HOTKEY = 0x00000020;
        public const int SEE_MASK_NOCLOSEPROCESS = 0x00000040;
        public const int SEE_MASK_CONNECTNETDRV = 0x00000080; 
        public const int SEE_MASK_FLAG_DDEWAIT = 0x00000100;
        public const int SEE_MASK_DOENVSUBST = 0x00000200; 
        public const int SEE_MASK_FLAG_NO_UI = 0x00000400; 
        public const int SEE_MASK_UNICODE = 0x00004000;
        public const int SEE_MASK_NO_CONSOLE = 0x00008000; 
        public const int SEE_MASK_ASYNCOK = 0x00100000;

        public const int TH32CS_SNAPHEAPLIST = 0x00000001;
        public const int TH32CS_SNAPPROCESS = 0x00000002; 
        public const int TH32CS_SNAPTHREAD = 0x00000004;
        public const int TH32CS_SNAPMODULE = 0x00000008; 
        public const int TH32CS_INHERIT = unchecked((int)0x80000000); 

#endif // !FEATURE_PAL 

        public const int PROCESS_TERMINATE = 0x0001;
        public const int PROCESS_CREATE_THREAD = 0x0002;
        public const int PROCESS_SET_SESSIONID = 0x0004; 
        public const int PROCESS_VM_OPERATION = 0x0008;
        public const int PROCESS_VM_READ = 0x0010; 
        public const int PROCESS_VM_WRITE = 0x0020; 
        public const int PROCESS_DUP_HANDLE = 0x0040;
        public const int PROCESS_CREATE_PROCESS = 0x0080; 
        public const int PROCESS_SET_QUOTA = 0x0100;
        public const int PROCESS_SET_INFORMATION = 0x0200;
        public const int PROCESS_QUERY_INFORMATION = 0x0400;
        public const int STANDARD_RIGHTS_REQUIRED = 0x000F0000; 
        public const int SYNCHRONIZE = 0x00100000;
        public const int PROCESS_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF; 
 
#if !FEATURE_PAL
 
        public const int THREAD_TERMINATE = 0x0001;
        public const int THREAD_SUSPEND_RESUME = 0x0002;
        public const int THREAD_GET_CONTEXT = 0x0008;
        public const int THREAD_SET_CONTEXT = 0x0010; 
        public const int THREAD_SET_INFORMATION = 0x0020;
        public const int THREAD_QUERY_INFORMATION = 0x0040; 
        public const int THREAD_SET_THREAD_TOKEN = 0x0080; 
        public const int THREAD_IMPERSONATE = 0x0100;
        public const int THREAD_DIRECT_IMPERSONATION = 0x0200; 

        public static readonly IntPtr HKEY_LOCAL_MACHINE = unchecked((IntPtr)(int)0x80000002);
        public const int REG_BINARY = 3;
        public const int REG_MULTI_SZ = 7; 

        public const int READ_CONTROL                    = 0x00020000; 
        public const int STANDARD_RIGHTS_READ            = READ_CONTROL; 

        public const int KEY_QUERY_VALUE        = 0x0001; 
        public const int KEY_ENUMERATE_SUB_KEYS = 0x0008;
        public const int KEY_NOTIFY             = 0x0010;

        public const int KEY_READ               =((STANDARD_RIGHTS_READ | 
                                                           KEY_QUERY_VALUE |
                                                           KEY_ENUMERATE_SUB_KEYS | 
                                                           KEY_NOTIFY) 
                                                          &
                                                          (~SYNCHRONIZE)); 

        public const int ERROR_BROKEN_PIPE = 109;
        public const int ERROR_NO_DATA = 232;
        public const int ERROR_HANDLE_EOF = 38; 
        public const int ERROR_IO_INCOMPLETE = 996;
        public const int ERROR_IO_PENDING = 997; 
        public const int ERROR_FILE_EXISTS = 0x50; 
        public const int ERROR_FILENAME_EXCED_RANGE = 0xCE;  // filename too long.
        public const int ERROR_MORE_DATA = 234; 
        public const int ERROR_CANCELLED = 1223;
        public const int ERROR_FILE_NOT_FOUND = 2;
        public const int ERROR_PATH_NOT_FOUND = 3;
        public const int ERROR_ACCESS_DENIED = 5; 
        public const int ERROR_INVALID_HANDLE = 6;
        public const int ERROR_NOT_ENOUGH_MEMORY = 8; 
        public const int ERROR_SHARING_VIOLATION = 32; 
        public const int ERROR_OPERATION_ABORTED = 995;
        public const int ERROR_NO_ASSOCIATION = 1155; 
        public const int ERROR_DLL_NOT_FOUND = 1157;
        public const int ERROR_DDE_FAIL = 1156;
        public const int ERROR_INVALID_PARAMETER = 87;
        public const int ERROR_PARTIAL_COPY = 299; 
        public const int ERROR_SUCCESS = 0;
        public const int ERROR_ALREADY_EXISTS = 183; 
        public const int ERROR_COUNTER_TIMEOUT = 1121; 
        public const int RPC_S_SERVER_UNAVAILABLE = 1722;
        public const int RPC_S_CALL_FAILED = 1726; 

        public const int PDH_NO_DATA = unchecked((int) 0x800007D5);
        public const int PDH_CALC_NEGATIVE_DENOMINATOR = unchecked((int) 0x800007D6);
        public const int PDH_CALC_NEGATIVE_VALUE = unchecked((int) 0x800007D8); 

 
        public const int SE_ERR_FNF = 2; 
        public const int SE_ERR_PNF = 3;
        public const int SE_ERR_ACCESSDENIED = 5; 
        public const int SE_ERR_OOM = 8;
        public const int SE_ERR_DLLNOTFOUND = 32;
        public const int SE_ERR_SHARE = 26;
        public const int SE_ERR_ASSOCINCOMPLETE = 27; 
        public const int SE_ERR_DDETIMEOUT = 28;
        public const int SE_ERR_DDEFAIL = 29; 
        public const int SE_ERR_DDEBUSY = 30; 
        public const int SE_ERR_NOASSOC = 31;
 
        public const int SE_PRIVILEGE_ENABLED = 2;

#endif // !FEATURE_PAL
 
        public const int DUPLICATE_CLOSE_SOURCE = 1;
        public const int DUPLICATE_SAME_ACCESS  = 2; 
 
#if !FEATURE_PAL
 
        public const int LOGON32_LOGON_BATCH = 4;
        public const int LOGON32_PROVIDER_DEFAULT = 0;
        public const int LOGON32_LOGON_INTERACTIVE = 2;
 
        public const int TOKEN_ADJUST_PRIVILEGES = 0x20;
        public const int TOKEN_QUERY = 0x08; 
 
        public const int CREATE_NO_WINDOW = 0x08000000;
        public const int CREATE_SUSPENDED = 0x00000004; 
        public const int CREATE_UNICODE_ENVIRONMENT = 0x00000400;

        public const int SMTO_ABORTIFHUNG = 0x0002;
        public const int GWL_STYLE = (-16); 
        public const int GCL_WNDPROC = (-24);
        public const int GWL_WNDPROC = (-4); 
        public const int WS_DISABLED = 0x08000000; 
        public const int WM_NULL = 0x0000;
        public const int WM_CLOSE = 0x0010; 
        public const int SW_SHOWNORMAL = 1;
        public const int SW_NORMAL = 1;
        public const int SW_SHOWMINIMIZED = 2;
        public const int SW_SHOWMAXIMIZED = 3; 
        public const int SW_MAXIMIZE = 3;
        public const int SW_SHOWNOACTIVATE = 4; 
        public const int SW_SHOW = 5; 
        public const int SW_MINIMIZE = 6;
        public const int SW_SHOWMINNOACTIVE = 7; 
        public const int SW_SHOWNA = 8;
        public const int SW_RESTORE = 9;
        public const int SW_SHOWDEFAULT = 10;
        public const int SW_MAX = 10; 
        public const int GW_OWNER = 4;
        public const int WHITENESS = 0x00FF0062; 
 
        public const int
        VS_FILE_INFO = 16, 
        VS_VERSION_INFO = 1,
        VS_USER_DEFINED = 100,
        VS_FFI_SIGNATURE = unchecked((int)0xFEEF04BD),
        VS_FFI_STRUCVERSION = 0x00010000, 
        VS_FFI_FILEFLAGSMASK = 0x0000003F,
        VS_FF_DEBUG = 0x00000001, 
        VS_FF_PRERELEASE = 0x00000002, 
        VS_FF_PATCHED = 0x00000004,
        VS_FF_PRIVATEBUILD = 0x00000008, 
        VS_FF_INFOINFERRED = 0x00000010,
        VS_FF_SPECIALBUILD = 0x00000020,
        VFT_UNKNOWN = 0x00000000,
        VFT_APP = 0x00000001, 
        VFT_DLL = 0x00000002,
        VFT_DRV = 0x00000003, 
        VFT_FONT = 0x00000004, 
        VFT_VXD = 0x00000005,
        VFT_STATIC_LIB = 0x00000007, 
        VFT2_UNKNOWN = 0x00000000,
        VFT2_DRV_PRINTER = 0x00000001,
        VFT2_DRV_KEYBOARD = 0x00000002,
        VFT2_DRV_LANGUAGE = 0x00000003, 
        VFT2_DRV_DISPLAY = 0x00000004,
        VFT2_DRV_MOUSE = 0x00000005, 
        VFT2_DRV_NETWORK = 0x00000006, 
        VFT2_DRV_SYSTEM = 0x00000007,
        VFT2_DRV_INSTALLABLE = 0x00000008, 
        VFT2_DRV_SOUND = 0x00000009,
        VFT2_DRV_COMM = 0x0000000A,
        VFT2_DRV_INPUTMETHOD = 0x0000000B,
        VFT2_FONT_RASTER = 0x00000001, 
        VFT2_FONT_VECTOR = 0x00000002,
        VFT2_FONT_TRUETYPE = 0x00000003; 
 
        // from Windows Forms nativemethods.cs
        [StructLayout(LayoutKind.Sequential)] 
        internal class VS_FIXEDFILEINFO {
            public int dwSignature = 0;
            public int dwStructVersion = 0;
            public int dwFileVersionMS = 0; 
            public int dwFileVersionLS = 0;
            public int dwProductVersionMS = 0; 
            public int dwProductVersionLS = 0; 
            public int dwFileFlagsMask = 0;
            public int dwFileFlags = 0; 
            public int dwFileOS = 0;
            public int dwFileType = 0;
            public int dwFileSubtype = 0;
            public int dwFileDateMS = 0; 
            public int dwFileDateLS = 0;
        } 
 
        public const int
        GMEM_FIXED = 0x0000, 
        GMEM_MOVEABLE = 0x0002,
        GMEM_NOCOMPACT = 0x0010,
        GMEM_NODISCARD = 0x0020,
        GMEM_ZEROINIT = 0x0040, 
        GMEM_MODIFY = 0x0080,
        GMEM_DISCARDABLE = 0x0100, 
        GMEM_NOT_BANKED = 0x1000, 
        GMEM_SHARE = 0x2000,
        GMEM_DDESHARE = 0x2000, 
        GMEM_NOTIFY = 0x4000,
        GMEM_LOWER = 0x1000,
        GMEM_VALID_FLAGS = 0x7F72,
        GMEM_INVALID_HANDLE = unchecked((int)0x8000), 
        GHND = (0x0002|0x0040),
        GPTR = (0x0000|0x0040), 
        GMEM_DISCARDED = 0x4000, 
        GMEM_LOCKCOUNT = 0x00FF;
 
        public const int UOI_NAME      = 2;
        public const int UOI_TYPE      = 3;
        public const int UOI_USER_SID  = 4;
 
        [StructLayout(LayoutKind.Sequential)]
        internal class USEROBJECTFLAGS { 
            public int fInherit = 0; 
            public int fReserved = 0;
            public int dwFlags = 0; 
        }

        public const int VER_PLATFORM_WIN32_NT = 2;
 
    internal static class Util {
        public static int HIWORD(int n) { 
            return (n >> 16) & 0xffff; 
        }
 
        public static int LOWORD(int n) {
            return n & 0xffff;
        }
    } 

    [StructLayout(LayoutKind.Sequential)] 
    internal struct MEMORY_BASIC_INFORMATION { 
        internal IntPtr BaseAddress;
        internal IntPtr AllocationBase; 
        internal uint AllocationProtect;
        internal UIntPtr RegionSize;
        internal uint State;
        internal uint Protect; 
        internal uint Type;
    } 
 
    [DllImport(ExternDll.Kernel32, SetLastError=true)]
    [ResourceExposure(ResourceScope.None)] 
    unsafe internal static extern IntPtr VirtualQuery(SafeFileMapViewHandle address, ref MEMORY_BASIC_INFORMATION buffer, IntPtr sizeOfBuffer);

#endif // !FEATURE_PAL
#endif // !SILVERLIGHT 

    } 
 
}

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------------------------ 
// 
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// 
//----------------------------------------------------------------------------- 

namespace Microsoft.Win32 { 
    using System; 
    using System.Runtime.InteropServices;
#if !SILVERLIGHT 
    using System.Text;
    using System.Threading;
    using System.Globalization;
    using System.Runtime.Remoting; 
    using System.Runtime.CompilerServices;
    using System.Runtime.ConstrainedExecution; 
    using System.Runtime.Versioning; 
    using System.Diagnostics;
    using System.Diagnostics.CodeAnalysis; 
    using System.ComponentModel;
    using System.Security.Permissions;
    using Microsoft.Win32.SafeHandles;
 
    // not public!
    [HostProtection(MayLeakOnAbort = true)] 
#endif 

    internal static class NativeMethods { 

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        internal class TEXTMETRIC {
            public int tmHeight = 0; 
            public int tmAscent = 0;
            public int tmDescent = 0; 
            public int tmInternalLeading = 0; 
            public int tmExternalLeading = 0;
            public int tmAveCharWidth = 0; 
            public int tmMaxCharWidth = 0;
            public int tmWeight = 0;
            public int tmOverhang = 0;
            public int tmDigitizedAspectX = 0; 
            public int tmDigitizedAspectY = 0;
            public char tmFirstChar = '\0'; 
            public char tmLastChar = '\0'; 
            public char tmDefaultChar = '\0';
            public char tmBreakChar = '\0'; 
            public byte tmItalic = 0;
            public byte tmUnderlined = 0;
            public byte tmStruckOut = 0;
            public byte tmPitchAndFamily = 0; 
            public byte tmCharSet = 0;
        } 
 
        public const int DEFAULT_GUI_FONT = 17;
        public const int SM_CYSCREEN = 1; 

#if !SILVERLIGHT
        public readonly static HandleRef NullHandleRef = new HandleRef(null, IntPtr.Zero);
 
        public static readonly IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1);
 
        public const int GENERIC_READ = unchecked(((int)0x80000000)); 
        public const int GENERIC_WRITE = (0x40000000);
 
        public const int FILE_SHARE_READ = 0x00000001;
        public const int FILE_SHARE_WRITE = 0x00000002;
        public const int FILE_SHARE_DELETE = 0x00000004;
 
        public const int S_OK = 0x0;
        public const int E_ABORT = unchecked ((int)0x80004004); 
        public const int E_NOTIMPL = unchecked((int)0x80004001); 

        public const int CREATE_ALWAYS = 2; 

        public const int FILE_ATTRIBUTE_NORMAL = 0x00000080;

        public const int STARTF_USESTDHANDLES = 0x00000100; 

        public const int STD_INPUT_HANDLE = -10; 
        public const int STD_OUTPUT_HANDLE = -11; 
        public const int STD_ERROR_HANDLE = -12;
 
        public const int STILL_ACTIVE = 0x00000103;
        public const int SW_HIDE = 0;

        public const int WAIT_OBJECT_0    = 0x00000000; 
        public const int WAIT_FAILED      = unchecked((int)0xFFFFFFFF);
        public const int WAIT_TIMEOUT     = 0x00000102; 
        public const int WAIT_ABANDONED   = 0x00000080; 
        public const int WAIT_ABANDONED_0 = WAIT_ABANDONED;
 
        // MoveFile Parameter
        public const int MOVEFILE_REPLACE_EXISTING = 0x00000001;

        // copied from winerror.h 
        public const int ERROR_CLASS_ALREADY_EXISTS = 1410;
        public const int ERROR_NONE_MAPPED = 1332; 
        public const int ERROR_INSUFFICIENT_BUFFER      = 122; 
        public const int ERROR_INVALID_NAME             = 0x7B; //123
        public const int ERROR_PROC_NOT_FOUND           = 127; 
        public const int ERROR_BAD_EXE_FORMAT           = 193;
        public const int ERROR_EXE_MACHINE_TYPE_MISMATCH= 216;
        public const int MAX_PATH                       = 260;
 

        [StructLayout(LayoutKind.Sequential)] 
        internal class STARTUPINFO { 
            public int cb;
            public IntPtr lpReserved = IntPtr.Zero; 
            public IntPtr lpDesktop = IntPtr.Zero;
            public IntPtr lpTitle = IntPtr.Zero;
            public int dwX = 0;
            public int dwY = 0; 
            public int dwXSize = 0;
            public int dwYSize = 0; 
            public int dwXCountChars = 0; 
            public int dwYCountChars = 0;
            public int dwFillAttribute = 0; 
            public int dwFlags = 0;
            public short wShowWindow = 0;
            public short cbReserved2 = 0;
            public IntPtr lpReserved2 = IntPtr.Zero; 
            public SafeFileHandle hStdInput = new SafeFileHandle(IntPtr.Zero, false);
            public SafeFileHandle hStdOutput = new SafeFileHandle(IntPtr.Zero, false); 
            public SafeFileHandle hStdError = new SafeFileHandle(IntPtr.Zero, false); 

            public STARTUPINFO() { 
                cb = Marshal.SizeOf(this);
            }

            public void Dispose() { 
                // close the handles created for child process
                if(hStdInput != null && !hStdInput.IsInvalid) { 
                    hStdInput.Close(); 
                    hStdInput = null;
                } 

                if(hStdOutput != null && !hStdOutput.IsInvalid) {
                    hStdOutput.Close();
                    hStdOutput = null; 
                }
 
                if(hStdError != null && !hStdError.IsInvalid) { 
                    hStdError.Close();
                    hStdError = null; 
                }
            }
        }
 
        //
        // DACL related stuff 
        // 
        [StructLayout(LayoutKind.Sequential)]
        internal class SECURITY_ATTRIBUTES { 
                public int nLength = 12;
                public SafeLocalMemHandle lpSecurityDescriptor = new SafeLocalMemHandle(IntPtr.Zero, false);
                public bool bInheritHandle = false;
        } 

        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)] 
        [ResourceExposure(ResourceScope.None)] 
        public static extern bool GetExitCodeProcess(SafeProcessHandle processHandle, out int exitCode);
 
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.None)]
        public static extern bool GetProcessTimes(SafeProcessHandle handle, out long creation, out long exit, out long kernel, out long user);
 
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.None)] 
        public static extern bool GetThreadTimes(SafeThreadHandle handle, out long creation, out long exit, out long kernel, out long user); 

        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Ansi, SetLastError=true)] 
        [ResourceExposure(ResourceScope.Process)]
        public static extern IntPtr GetStdHandle(int whichHandle);

        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)] 
        [ResourceExposure(ResourceScope.Process)]
        public static extern bool CreatePipe(out SafeFileHandle hReadPipe, out SafeFileHandle hWritePipe, SECURITY_ATTRIBUTES lpPipeAttributes, int nSize); 
 
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true, BestFitMapping=false)]
        [ResourceExposure(ResourceScope.Process)] 
        public static extern bool CreateProcess(
            [MarshalAs(UnmanagedType.LPTStr)]
            string lpApplicationName,                   // LPCTSTR
            StringBuilder lpCommandLine,                // LPTSTR - note: CreateProcess might insert a null somewhere in this string 
            SECURITY_ATTRIBUTES lpProcessAttributes,    // LPSECURITY_ATTRIBUTES
            SECURITY_ATTRIBUTES lpThreadAttributes,     // LPSECURITY_ATTRIBUTES 
            bool bInheritHandles,                        // BOOL 
            int dwCreationFlags,                        // DWORD
            IntPtr lpEnvironment,                       // LPVOID 
            [MarshalAs(UnmanagedType.LPTStr)]
            string lpCurrentDirectory,                  // LPCTSTR
            STARTUPINFO lpStartupInfo,                  // LPSTARTUPINFO
            SafeNativeMethods.PROCESS_INFORMATION lpProcessInformation    // LPPROCESS_INFORMATION 
        );
 
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)] 
        [ResourceExposure(ResourceScope.Machine)]
        public static extern bool TerminateProcess(SafeProcessHandle processHandle, int exitCode); 


        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto)]
        [ResourceExposure(ResourceScope.Process)] 
        public static extern int GetCurrentProcessId();
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Ansi, SetLastError=true)] 
        [ResourceExposure(ResourceScope.Process)] 
        public static extern IntPtr GetCurrentProcess();
 
#if !FEATURE_PAL
        [ResourceExposure(ResourceScope.Machine)]
        [ResourceConsumption(ResourceScope.Machine)]
        internal static string GetLocalPath(string fileName) { 
            System.Diagnostics.Debug.Assert(fileName != null && fileName.Length > 0, "Cannot get local path, fileName is not valid");
 
            Uri uri = new Uri(fileName); 
            return uri.LocalPath + uri.Fragment;
        } 

        [DllImport(ExternDll.Advapi32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true, BestFitMapping=false)]
        [System.Security.SuppressUnmanagedCodeSecurityAttribute()]
        [ResourceExposure(ResourceScope.Machine)] 
        public extern static bool CreateProcessAsUser(SafeHandle hToken,
            string lpApplicationName, 
            string lpCommandLine, 
            SECURITY_ATTRIBUTES lpProcessAttributes,
            SECURITY_ATTRIBUTES lpThreadAttributes, 
            bool bInheritHandles,
            int dwCreationFlags,
            HandleRef lpEnvironment,
            string lpCurrentDirectory, 
            STARTUPINFO lpStartupInfo,
            SafeNativeMethods.PROCESS_INFORMATION lpProcessInformation 
        ); 

        [DllImport(ExternDll.Advapi32, CharSet=CharSet.Unicode, ExactSpelling=true, SetLastError=true, BestFitMapping=false)] 
        [ResourceExposure(ResourceScope.Machine)]
        internal static extern bool CreateProcessWithLogonW(
            string userName,
            string domain, 
            IntPtr password,
            LogonFlags logonFlags, 
            [MarshalAs(UnmanagedType.LPTStr)] 
            string appName,
            StringBuilder cmdLine, 
            int creationFlags,
            IntPtr environmentBlock,
            [MarshalAs(UnmanagedType.LPTStr)]
            string lpCurrentDirectory,                  // LPCTSTR 
            STARTUPINFO lpStartupInfo,
            SafeNativeMethods.PROCESS_INFORMATION lpProcessInformation); 
 
        [Flags]
        internal enum LogonFlags { 
            LOGON_WITH_PROFILE         = 0x00000001,
            LOGON_NETCREDENTIALS_ONLY  = 0x00000002
        }
 
        public const int UIS_SET = 1,
        WSF_VISIBLE = 0x0001, 
        UIS_CLEAR = 2, 
        UISF_HIDEFOCUS = 0x1,
        UISF_HIDEACCEL = 0x2, 
        USERCLASSTYPE_FULL = 1,
        UOI_FLAGS = 1;

        public const int COLOR_WINDOW = 5; 
        public const int WS_POPUP = unchecked((int)0x80000000);
        public const int WS_VISIBLE = 0x10000000; 
        public const int WM_SETTINGCHANGE = 0x001A; 
        public const int WM_SYSCOLORCHANGE = 0x0015;
        public const int WM_QUERYENDSESSION = 0x0011; 
        public const int WM_QUIT = 0x0012;
        public const int WM_ENDSESSION = 0x0016;
        public const int WM_POWERBROADCAST = 0x0218;
        public const int WM_COMPACTING = 0x0041; 
        public const int WM_DISPLAYCHANGE = 0x007E;
        public const int WM_FONTCHANGE = 0x001D; 
        public const int WM_PALETTECHANGED = 0x0311; 
        public const int WM_TIMECHANGE = 0x001E;
        public const int WM_THEMECHANGED = 0x031A; 
        public const int WM_WTSSESSION_CHANGE = 0x02B1;

        public const int ENDSESSION_LOGOFF = unchecked((int)0x80000000);
        public const int WM_TIMER = 0x0113; 
        public const int WM_USER = 0x0400;
        public const int WM_CREATETIMER = WM_USER + 1; 
        public const int WM_KILLTIMER = WM_USER + 2; 
        public const int WM_REFLECT = WM_USER + 0x1C00;
 
        public const int WTS_CONSOLE_CONNECT              =  0x1;
        public const int WTS_CONSOLE_DISCONNECT           =  0x2;
        public const int WTS_REMOTE_CONNECT               =  0x3;
        public const int WTS_REMOTE_DISCONNECT            =  0x4; 
        public const int WTS_SESSION_LOGON                =  0x5;
        public const int WTS_SESSION_LOGOFF               =  0x6; 
        public const int WTS_SESSION_LOCK                 =  0x7; 
        public const int WTS_SESSION_UNLOCK               =  0x8;
        public const int WTS_SESSION_REMOTE_CONTROL       =  0x9; 

        public const int NOTIFY_FOR_THIS_SESSION          =  0x0;

        public const int CTRL_C_EVENT        = 0; 
        public const int CTRL_BREAK_EVENT    = 1;
        public const int CTRL_CLOSE_EVENT    = 2; 
        public const int CTRL_LOGOFF_EVENT   = 5; 
        public const int CTRL_SHUTDOWN_EVENT = 6;
 
        public const int SPI_GETBEEP                          =   1;
        public const int SPI_SETBEEP                          =   2;
        public const int SPI_GETMOUSE                         =   3;
        public const int SPI_SETMOUSE                         =   4; 
        public const int SPI_GETBORDER                        =   5;
        public const int SPI_SETBORDER                        =   6; 
        public const int SPI_GETKEYBOARDSPEED                 =  10; 
        public const int SPI_SETKEYBOARDSPEED                 =  11;
        public const int SPI_LANGDRIVER                       =  12; 
        public const int SPI_ICONHORIZONTALSPACING            =  13;
        public const int SPI_GETSCREENSAVETIMEOUT             =  14;
        public const int SPI_SETSCREENSAVETIMEOUT             =  15;
        public const int SPI_GETSCREENSAVEACTIVE              =  16; 
        public const int SPI_SETSCREENSAVEACTIVE              =  17;
        public const int SPI_GETGRIDGRANULARITY               =  18; 
        public const int SPI_SETGRIDGRANULARITY               =  19; 
        public const int SPI_SETDESKWALLPAPER                 =  20;
        public const int SPI_SETDESKPATTERN                   =  21; 
        public const int SPI_GETKEYBOARDDELAY                 =  22;
        public const int SPI_SETKEYBOARDDELAY                 =  23;
        public const int SPI_ICONVERTICALSPACING              =  24;
        public const int SPI_GETICONTITLEWRAP                 =  25; 
        public const int SPI_SETICONTITLEWRAP                 =  26;
        public const int SPI_GETMENUDROPALIGNMENT             =  27; 
        public const int SPI_SETMENUDROPALIGNMENT             =  28; 
        public const int SPI_SETDOUBLECLKWIDTH                =  29;
        public const int SPI_SETDOUBLECLKHEIGHT               =  30; 
        public const int SPI_GETICONTITLELOGFONT              =  31;
        public const int SPI_SETDOUBLECLICKTIME               =  32;
        public const int SPI_SETMOUSEBUTTONSWAP               =  33;
        public const int SPI_SETICONTITLELOGFONT              =  34; 
        public const int SPI_GETFASTTASKSWITCH                =  35;
        public const int SPI_SETFASTTASKSWITCH                =  36; 
        public const int SPI_SETDRAGFULLWINDOWS               =  37; 
        public const int SPI_GETDRAGFULLWINDOWS               =  38;
        public const int SPI_GETNONCLIENTMETRICS              =  41; 
        public const int SPI_SETNONCLIENTMETRICS              =  42;
        public const int SPI_GETMINIMIZEDMETRICS              =  43;
        public const int SPI_SETMINIMIZEDMETRICS              =  44;
        public const int SPI_GETICONMETRICS                   =  45; 
        public const int SPI_SETICONMETRICS                   =  46;
        public const int SPI_SETWORKAREA                      =  47; 
        public const int SPI_GETWORKAREA                      =  48; 
        public const int SPI_SETPENWINDOWS                    =  49;
        public const int SPI_GETHIGHCONTRAST                  =  66; 
        public const int SPI_SETHIGHCONTRAST                  =  67;
        public const int SPI_GETKEYBOARDPREF                  =  68;
        public const int SPI_SETKEYBOARDPREF                  =  69;
        public const int SPI_GETSCREENREADER                  =  70; 
        public const int SPI_SETSCREENREADER                  =  71;
        public const int SPI_GETANIMATION                     =  72; 
        public const int SPI_SETANIMATION                     =  73; 
        public const int SPI_GETFONTSMOOTHING                 =  74;
        public const int SPI_SETFONTSMOOTHING                 =  75; 
        public const int SPI_SETDRAGWIDTH                     =  76;
        public const int SPI_SETDRAGHEIGHT                    =  77;
        public const int SPI_SETHANDHELD                      =  78;
        public const int SPI_GETLOWPOWERTIMEOUT               =  79; 
        public const int SPI_GETPOWEROFFTIMEOUT               =  80;
        public const int SPI_SETLOWPOWERTIMEOUT               =  81; 
        public const int SPI_SETPOWEROFFTIMEOUT               =  82; 
        public const int SPI_GETLOWPOWERACTIVE                =  83;
        public const int SPI_GETPOWEROFFACTIVE                =  84; 
        public const int SPI_SETLOWPOWERACTIVE                =  85;
        public const int SPI_SETPOWEROFFACTIVE                =  86;
        public const int SPI_SETCURSORS                       =  87;
        public const int SPI_SETICONS                         =  88; 
        public const int SPI_GETDEFAULTINPUTLANG              =  89;
        public const int SPI_SETDEFAULTINPUTLANG              =  90; 
        public const int SPI_SETLANGTOGGLE                    =  91; 
        public const int SPI_GETWINDOW----TENSION              =  92;
        public const int SPI_SETMOUSETRAILS                   =  93; 
        public const int SPI_GETMOUSETRAILS                   =  94;
        public const int SPI_SETSCREENSAVERRUNNING            =  97;
        public const int SPI_SCREENSAVERRUNNING               =  SPI_SETSCREENSAVERRUNNING;
        public const int SPI_GETFILTERKEYS                    =  50; 
        public const int SPI_SETFILTERKEYS                    =  51;
        public const int SPI_GETTOGGLEKEYS                    =  52; 
        public const int SPI_SETTOGGLEKEYS                    =  53; 
        public const int SPI_GETMOUSEKEYS                     =  54;
        public const int SPI_SETMOUSEKEYS                     =  55; 
        public const int SPI_GETSHOWSOUNDS                    =  56;
        public const int SPI_SETSHOWSOUNDS                    =  57;
        public const int SPI_GETSTICKYKEYS                    =  58;
        public const int SPI_SETSTICKYKEYS                    =  59; 
        public const int SPI_GETACCESSTIMEOUT                 =  60;
        public const int SPI_SETACCESSTIMEOUT                 =  61; 
        public const int SPI_GETSERIALKEYS                    =  62; 
        public const int SPI_SETSERIALKEYS                    =  63;
        public const int SPI_GETSOUNDSENTRY                   =  64; 
        public const int SPI_SETSOUNDSENTRY                   =  65;
        public const int SPI_GETSNAPTODEFBUTTON               =  95;
        public const int SPI_SETSNAPTODEFBUTTON               =  96;
        public const int SPI_GETMOUSEHOVERWIDTH               =  98; 
        public const int SPI_SETMOUSEHOVERWIDTH               =  99;
        public const int SPI_GETMOUSEHOVERHEIGHT              = 100; 
        public const int SPI_SETMOUSEHOVERHEIGHT              = 101; 
        public const int SPI_GETMOUSEHOVERTIME                = 102;
        public const int SPI_SETMOUSEHOVERTIME                = 103; 
        public const int SPI_GETWHEELSCROLLLINES              = 104;
        public const int SPI_SETWHEELSCROLLLINES              = 105;
        public const int SPI_GETMENUSHOWDELAY                 = 106;
        public const int SPI_SETMENUSHOWDELAY                 = 107; 
        public const int SPI_GETSHOWIMEUI                     = 110;
        public const int SPI_SETSHOWIMEUI                     = 111; 
        public const int SPI_GETMOUSESPEED                    = 112; 
        public const int SPI_SETMOUSESPEED                    = 113;
        public const int SPI_GETSCREENSAVERRUNNING            = 114; 
        public const int SPI_GETDESKWALLPAPER                 = 115;
        public const int SPI_GETACTIVEWINDOWTRACKING          = 0x1000;
        public const int SPI_SETACTIVEWINDOWTRACKING          = 0x1001;
        public const int SPI_GETMENUANIMATION                 = 0x1002; 
        public const int SPI_SETMENUANIMATION                 = 0x1003;
        public const int SPI_GETCOMBOBOXANIMATION             = 0x1004; 
        public const int SPI_SETCOMBOBOXANIMATION             = 0x1005; 
        public const int SPI_GETLISTBOXSMOOTHSCROLLING        = 0x1006;
        public const int SPI_SETLISTBOXSMOOTHSCROLLING        = 0x1007; 
        public const int SPI_GETGRADIENTCAPTIONS              = 0x1008;
        public const int SPI_SETGRADIENTCAPTIONS              = 0x1009;
        public const int SPI_GETKEYBOARDCUES                  = 0x100A;
        public const int SPI_SETKEYBOARDCUES                  = 0x100B; 
        public const int SPI_GETMENUUNDERLINES                = SPI_GETKEYBOARDCUES;
        public const int SPI_SETMENUUNDERLINES                = SPI_SETKEYBOARDCUES; 
        public const int SPI_GETACTIVEWNDTRKZORDER            = 0x100C; 
        public const int SPI_SETACTIVEWNDTRKZORDER            = 0x100D;
        public const int SPI_GETHOTTRACKING                   = 0x100E; 
        public const int SPI_SETHOTTRACKING                   = 0x100F;
        public const int SPI_GETMENUFADE                      = 0x1012;
        public const int SPI_SETMENUFADE                      = 0x1013;
        public const int SPI_GETSELECTIONFADE                 = 0x1014; 
        public const int SPI_SETSELECTIONFADE                 = 0x1015;
        public const int SPI_GETTOOLTIPANIMATION              = 0x1016; 
        public const int SPI_SETTOOLTIPANIMATION              = 0x1017; 
        public const int SPI_GETTOOLTIPFADE                   = 0x1018;
        public const int SPI_SETTOOLTIPFADE                   = 0x1019; 
        public const int SPI_GETCURSORSHADOW                  = 0x101A;
        public const int SPI_SETCURSORSHADOW                  = 0x101B;
        public const int SPI_GETUIEFFECTS                     = 0x103E;
        public const int SPI_SETUIEFFECTS                     = 0x103F; 
        public const int SPI_GETFOREGROUNDLOCKTIMEOUT         = 0x2000;
        public const int SPI_SETFOREGROUNDLOCKTIMEOUT         = 0x2001; 
        public const int SPI_GETACTIVEWNDTRKTIMEOUT           = 0x2002; 
        public const int SPI_SETACTIVEWNDTRKTIMEOUT           = 0x2003;
        public const int SPI_GETFOREGROUNDFLASHCOUNT          = 0x2004; 
        public const int SPI_SETFOREGROUNDFLASHCOUNT          = 0x2005;
        public const int SPI_GETCARETWIDTH                    = 0x2006;
        public const int SPI_SETCARETWIDTH                    = 0x2007;
 
        public const uint STATUS_INFO_LENGTH_MISMATCH   =  0xC0000004;
 
        public const int PBT_APMQUERYSUSPEND           = 0x0000; 
        public const int PBT_APMQUERYSTANDBY           = 0x0001;
        public const int PBT_APMQUERYSUSPENDFAILED     = 0x0002; 
        public const int PBT_APMQUERYSTANDBYFAILED     = 0x0003;
        public const int PBT_APMSUSPEND                = 0x0004;
        public const int PBT_APMSTANDBY                = 0x0005;
        public const int PBT_APMRESUMECRITICAL         = 0x0006; 
        public const int PBT_APMRESUMESUSPEND          = 0x0007;
        public const int PBT_APMRESUMESTANDBY          = 0x0008; 
        public const int PBT_APMBATTERYLOW             = 0x0009; 
        public const int PBT_APMPOWERSTATUSCHANGE      = 0x000A;
        public const int PBT_APMOEMEVENT               = 0x000B; 

        public const int STARTF_USESHOWWINDOW = 0x00000001;
        public const int FILE_MAP_WRITE = 0x00000002;
        public const int FILE_MAP_READ = 0x00000004; 
        public const int PAGE_READWRITE = 0x00000004;
        public const int GENERIC_EXECUTE = (0x20000000); 
        public const int GENERIC_ALL = (0x10000000); 
        public const int ERROR_NOT_READY  = 21;
        public const int ERROR_LOCK_FAILED = 167; 
        public const int ERROR_BUSY        = 170;

        public const int IMPERSONATION_LEVEL_SecurityAnonymous = 0;
        public const int IMPERSONATION_LEVEL_SecurityIdentification = 1; 
        public const int IMPERSONATION_LEVEL_SecurityImpersonation = 2;
        public const int IMPERSONATION_LEVEL_SecurityDelegation = 3; 
 
        public const int TOKEN_TYPE_TokenPrimary = 1;
        public const int TOKEN_TYPE_TokenImpersonation = 2; 

        public const int TOKEN_ALL_ACCESS   = 0x000f01ff;
        public const int TOKEN_EXECUTE      = 0x00020000;
        public const int TOKEN_READ         = 0x00020008; 
        public const int TOKEN_IMPERSONATE  = 0x00000004;
 
        public const int PIPE_ACCESS_INBOUND = 0x00000001; 
        public const int PIPE_ACCESS_OUTBOUND = 0x00000002;
        public const int PIPE_ACCESS_DUPLEX = 0x00000003; 

        public const int PIPE_WAIT = 0x00000000;
        public const int PIPE_NOWAIT = 0x00000001;
        public const int PIPE_READMODE_BYTE = 0x00000000; 
        public const int PIPE_READMODE_MESSAGE = 0x00000002;
        public const int PIPE_TYPE_BYTE = 0x00000000; 
        public const int PIPE_TYPE_MESSAGE = 0x00000004; 

        public const int PIPE_SINGLE_INSTANCES = 1; 
        public const int PIPE_UNLIMITED_INSTANCES = 255;

        public const int FILE_FLAG_OVERLAPPED = 0x40000000;
 
        public const int PM_REMOVE = 0x0001;
 
        public const int QS_KEY = 0x0001, 
        QS_MOUSEMOVE = 0x0002,
        QS_MOUSEBUTTON = 0x0004, 
        QS_POSTMESSAGE = 0x0008,
        QS_TIMER = 0x0010,
        QS_PAINT = 0x0020,
        QS_SENDMESSAGE = 0x0040, 
        QS_HOTKEY = 0x0080,
        QS_ALLPOSTMESSAGE = 0x0100, 
        QS_MOUSE = QS_MOUSEMOVE | QS_MOUSEBUTTON, 
        QS_INPUT = QS_MOUSE | QS_KEY,
        QS_ALLEVENTS = QS_INPUT | QS_POSTMESSAGE | QS_TIMER | QS_PAINT | QS_HOTKEY, 
        QS_ALLINPUT = QS_INPUT | QS_POSTMESSAGE | QS_TIMER | QS_PAINT | QS_HOTKEY | QS_SENDMESSAGE;

        public const int MWMO_INPUTAVAILABLE = 0x0004;  // don't use MWMO_WAITALL, see ddb#176342
 
        // The following are unique to the SerialPort/SerialStream classes
        internal const byte ONESTOPBIT = 0; 
        internal const byte ONE5STOPBITS = 1; 
        internal const byte TWOSTOPBITS = 2;
 
        internal const int DTR_CONTROL_DISABLE = 0x00;
        internal const int DTR_CONTROL_ENABLE = 0x01;
        internal const int DTR_CONTROL_HANDSHAKE = 0x02;
 
        internal const int RTS_CONTROL_DISABLE = 0x00;
        internal const int RTS_CONTROL_ENABLE = 0x01; 
        internal const int RTS_CONTROL_HANDSHAKE = 0x02; 
        internal const int RTS_CONTROL_TOGGLE = 0x03;
 
        internal const int  MS_CTS_ON = 0x10;
        internal const int  MS_DSR_ON = 0x20;
        internal const int  MS_RING_ON = 0x40;
        internal const int  MS_RLSD_ON  = 0x80; 

        internal const byte EOFCHAR = (byte) 26; 
 
        // Since C# does not provide access to bitfields and the native DCB structure contains
        // a very necessary one, these are the positional offsets (from the right) of areas 
        // of the 32-bit integer used in SerialStream's SetDcbFlag() and GetDcbFlag() methods.
        internal const int FBINARY = 0;
        internal const int FPARITY = 1;
        internal const int FOUTXCTSFLOW = 2; 
        internal const int FOUTXDSRFLOW = 3;
        internal const int FDTRCONTROL = 4; 
        internal const int FDSRSENSITIVITY = 6; 
        internal const int FTXCONTINUEONXOFF = 7;
        internal const int FOUTX = 8; 
        internal const int FINX = 9;
        internal const int FERRORCHAR = 10;
        internal const int FNULL = 11;
        internal const int FRTSCONTROL = 12; 
        internal const int FABORTONOERROR = 14;
        internal const int FDUMMY2 = 15; 
 
        internal const int PURGE_TXABORT     =  0x0001;  // Kill the pending/current writes to the comm port.
        internal const int PURGE_RXABORT     =  0x0002;  // Kill the pending/current reads to the comm port. 
        internal const int PURGE_TXCLEAR     =  0x0004;  // Kill the transmit queue if there.
        internal const int PURGE_RXCLEAR     =  0x0008;  // Kill the typeahead buffer if there.

        internal const byte DEFAULTXONCHAR = (byte) 17; 
        internal const byte DEFAULTXOFFCHAR = (byte) 19;
 
        internal const int SETRTS = 3;       // Set RTS high 
        internal const int CLRRTS = 4;       // Set RTS low
        internal const int SETDTR = 5;       // Set DTR high 
        internal const int CLRDTR = 6;

        internal const int EV_RXCHAR = 0x01;
        internal const int EV_RXFLAG = 0x02; 
        internal const int EV_CTS = 0x08;
        internal const int EV_DSR = 0x10; 
        internal const int EV_RLSD = 0x20; 
        internal const int EV_BREAK = 0x40;
        internal const int EV_ERR = 0x80; 
        internal const int EV_RING = 0x100;
        internal const int ALL_EVENTS = 0x1fb;  // don't use EV_TXEMPTY

        internal const int CE_RXOVER = 0x01; 
        internal const int CE_OVERRUN = 0x02;
        internal const int CE_PARITY = 0x04; 
        internal const int CE_FRAME = 0x08; 
        internal const int CE_BREAK = 0x10;
        internal const int CE_TXFULL = 0x100; 

        internal const int MAXDWORD = -1;   // note this is 0xfffffff, or UInt32.MaxValue, here used as an int

        internal const int NOPARITY          = 0; 
        internal const int ODDPARITY         = 1;
        internal const int EVENPARITY        = 2; 
        internal const int MARKPARITY        = 3; 
        internal const int SPACEPARITY       = 4;
 
        [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)]
        internal class WNDCLASS_I {
            public int      style;
            public IntPtr   lpfnWndProc; 
            public int      cbClsExtra = 0;
            public int      cbWndExtra = 0; 
            public IntPtr   hInstance = IntPtr.Zero; 
            public IntPtr   hIcon = IntPtr.Zero;
            public IntPtr   hCursor = IntPtr.Zero; 
            public IntPtr   hbrBackground = IntPtr.Zero;
            public IntPtr   lpszMenuName = IntPtr.Zero;
            public IntPtr   lpszClassName = IntPtr.Zero;
        } 

        [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)] 
        internal class WNDCLASS { 
            public int      style;
            public WndProc  lpfnWndProc; 
            public int      cbClsExtra = 0;
            public int      cbWndExtra = 0;
            public IntPtr   hInstance = IntPtr.Zero;
            public IntPtr   hIcon = IntPtr.Zero; 
            public IntPtr   hCursor = IntPtr.Zero;
            public IntPtr   hbrBackground = IntPtr.Zero; 
            public string   lpszMenuName = null; 
            public string   lpszClassName = null;
        } 

        [StructLayout(LayoutKind.Sequential)]
        public struct MSG {
            public IntPtr   hwnd; 
            public int      message;
            public IntPtr   wParam; 
            public IntPtr   lParam; 
            public int      time;
            public int      pt_x; 
            public int      pt_y;
        }

        public enum StructFormatEnum { 
            Ansi = 1,
            Unicode = 2, 
            Auto = 3, 
        }
 
        internal const int SDDL_REVISION_1 = 1;

        public enum StructFormat {
            Ansi = 1, 
            Unicode = 2,
            Auto = 3, 
        } 

        public delegate IntPtr WndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); 

        public delegate int ConHndlr(int signalType);

        // file src\services\monitoring\system\diagnosticts\nativemethods.cs 
        public const int SECURITY_DESCRIPTOR_REVISION = 1;
        public const int HKEY_PERFORMANCE_DATA = unchecked((int)0x80000004); 
        public const int DWORD_SIZE = 4; 
        public const int LARGE_INTEGER_SIZE = 8;
 
        public const int PERF_NO_INSTANCES     =      -1;  // no instances (see NumInstances above)

        public const int PERF_SIZE_DWORD        = 0x00000000;
        public const int PERF_SIZE_LARGE        = 0x00000100; 
        public const int PERF_SIZE_ZERO         = 0x00000200;  // for Zero Length fields
        public const int PERF_SIZE_VARIABLE_LEN = 0x00000300;  // length is In CounterLength field 
 
        public const int PERF_NO_UNIQUE_ID = -1;
 
        //
        //  select one of the following values to indicate the counter field usage
        //
        public const int PERF_TYPE_NUMBER       = 0x00000000;  // a number (not a counter) 
        public const int PERF_TYPE_COUNTER      = 0x00000400;  // an increasing numeric value
        public const int PERF_TYPE_TEXT         = 0x00000800;  // a text field 
        public const int PERF_TYPE_ZERO         = 0x00000C00;  // displays a zero 

        // 
        //  If the PERF_TYPE_NUMBER field was selected, then select one of the
        //  following to describe the Number
        //
        public const int PERF_NUMBER_HEX        = 0x00000000;  // display as HEX value 
        public const int PERF_NUMBER_DECIMAL    = 0x00010000;  // display as a decimal integer
        public const int PERF_NUMBER_DEC_1000   = 0x00020000;  // display as a decimal/1000 
 
        //
        //  If the PERF_TYPE_COUNTER value was selected then select one of the 
        //  following to indicate the type of counter
        //
        public const int PERF_COUNTER_VALUE     = 0x00000000;  // display counter value
        public const int PERF_COUNTER_RATE      = 0x00010000;  // divide ctr / delta time 
        public const int PERF_COUNTER_FRACTION  = 0x00020000;  // divide ctr / base
        public const int PERF_COUNTER_BASE      = 0x00030000;  // base value used In fractions 
        public const int PERF_COUNTER_ELAPSED   = 0x00040000;  // subtract counter from current time 
        public const int PERF_COUNTER_QUEUELEN  = 0x00050000;  // Use Queuelen processing func.
        public const int PERF_COUNTER_HISTOGRAM = 0x00060000;  // Counter begins or ends a histogram 
        public const int PERF_COUNTER_PRECISION = 0x00070000;  // divide ctr / private clock

        //
        //  If the PERF_TYPE_TEXT value was selected, then select one of the 
        //  following to indicate the type of TEXT data.
        // 
        public const int PERF_TEXT_UNICODE      = 0x00000000;  // type of text In text field 
        public const int PERF_TEXT_ASCII        = 0x00010000;  // ASCII using the CodePage field
 
        //
        //  Timer SubTypes
        //
        public const int PERF_TIMER_TICK        = 0x00000000;  // use system perf. freq for base 
        public const int PERF_TIMER_100NS       = 0x00100000;  // use 100 NS timer time base units
        public const int PERF_OBJECT_TIMER      = 0x00200000;  // use the object timer freq 
 
        //
        //  Any types that have calculations performed can use one or more of 
        //  the following calculation modification flags listed here
        //
        public const int PERF_DELTA_COUNTER     = 0x00400000;  // compute difference first
        public const int PERF_DELTA_BASE        = 0x00800000;  // compute base diff as well 
        public const int PERF_INVERSE_COUNTER   = 0x01000000;  // show as 1.00-value (assumes:
        public const int PERF_MULTI_COUNTER     = 0x02000000;  // sum of multiple instances 
 
        //
        //  Select one of the following values to indicate the display suffix (if any) 
        //
        public const int PERF_DISPLAY_NO_SUFFIX = 0x00000000;  // no suffix
        public const int PERF_DISPLAY_PER_SEC   = 0x10000000;  // "/sec"
        public const int PERF_DISPLAY_PERCENT   = 0x20000000;  // "%" 
        public const int PERF_DISPLAY_SECONDS   = 0x30000000;  // "secs"
        public const int PERF_DISPLAY_NOSHOW    = 0x40000000;  // value is not displayed 
 
        //
        //  Predefined counter types 
        //

        // 32-bit Counter.  Divide delta by delta time.  Display suffix: "/sec"
        public const int PERF_COUNTER_COUNTER  = 
                (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_RATE |
                 PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_DISPLAY_PER_SEC); 
 

        // 64-bit Timer.  Divide delta by delta time.  Display suffix: "%" 
        public const int PERF_COUNTER_TIMER =
                (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE |
                PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_DISPLAY_PERCENT);
 
        // Queue Length Space-Time Product. Divide delta by delta time. No Display Suffix.
        public const int PERF_COUNTER_QUEUELEN_TYPE = 
                (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_QUEUELEN | 
                PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_DISPLAY_NO_SUFFIX);
 
        // Queue Length Space-Time Product. Divide delta by delta time. No Display Suffix.
        public const int PERF_COUNTER_LARGE_QUEUELEN_TYPE =
                (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_QUEUELEN |
                PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_DISPLAY_NO_SUFFIX); 

        // Queue Length Space-Time Product using 100 Ns timebase. 
        // Divide delta by delta time. No Display Suffix. 
        public const int PERF_COUNTER_100NS_QUEUELEN_TYPE =
                    (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_QUEUELEN | 
                    PERF_TIMER_100NS | PERF_DELTA_COUNTER | PERF_DISPLAY_NO_SUFFIX);

        // Queue Length Space-Time Product using Object specific timebase.
        // Divide delta by delta time. No Display Suffix. 
        public const int PERF_COUNTER_OBJ_TIME_QUEUELEN_TYPE =
                    (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_QUEUELEN | 
                    PERF_OBJECT_TIMER | PERF_DELTA_COUNTER | PERF_DISPLAY_NO_SUFFIX); 

        // 64-bit Counter.  Divide delta by delta time. Display Suffix: "/sec" 
        public const int PERF_COUNTER_BULK_COUNT =
                (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE |
                PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_DISPLAY_PER_SEC);
 
        // Indicates the counter is not a  counter but rather Unicode text Display as text.
        public const int PERF_COUNTER_TEXT = 
                (PERF_SIZE_VARIABLE_LEN | PERF_TYPE_TEXT | PERF_TEXT_UNICODE | 
                PERF_DISPLAY_NO_SUFFIX);
 
        // Indicates the data is a counter  which should not be
        // time averaged on display (such as an error counter on a serial line)
        // Display as is.  No Display Suffix.
        public const int PERF_COUNTER_RAWCOUNT = 
                (PERF_SIZE_DWORD | PERF_TYPE_NUMBER | PERF_NUMBER_DECIMAL |
                PERF_DISPLAY_NO_SUFFIX); 
 
        // Same as PERF_COUNTER_RAWCOUNT except its size is a large integer
        public const int PERF_COUNTER_LARGE_RAWCOUNT = 
                (PERF_SIZE_LARGE | PERF_TYPE_NUMBER | PERF_NUMBER_DECIMAL |
                PERF_DISPLAY_NO_SUFFIX);

        // Special case for RAWCOUNT that want to be displayed In hex 
        // Indicates the data is a counter  which should not be
        // time averaged on display (such as an error counter on a serial line) 
        // Display as is.  No Display Suffix. 
        public const int PERF_COUNTER_RAWCOUNT_HEX =
                (PERF_SIZE_DWORD | PERF_TYPE_NUMBER | PERF_NUMBER_HEX | 
                PERF_DISPLAY_NO_SUFFIX);

        // Same as PERF_COUNTER_RAWCOUNT_HEX except its size is a large integer
        public const int PERF_COUNTER_LARGE_RAWCOUNT_HEX = 
                (PERF_SIZE_LARGE | PERF_TYPE_NUMBER | PERF_NUMBER_HEX |
                PERF_DISPLAY_NO_SUFFIX); 
 
        // A count which is either 1 or 0 on each sampling interrupt (% busy)
        // Divide delta by delta base. Display Suffix: "%" 
        public const int PERF_SAMPLE_FRACTION =
                (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_FRACTION |
                PERF_DELTA_COUNTER | PERF_DELTA_BASE | PERF_DISPLAY_PERCENT);
 
        // A count which is sampled on each sampling interrupt (queue length)
        // Divide delta by delta time. No Display Suffix. 
        public const int PERF_SAMPLE_COUNTER = 
                (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_RATE |
                PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_DISPLAY_NO_SUFFIX); 

        // A label: no data is associated with this counter (it has 0 length)
        // Do not display.
        public const int PERF_COUNTER_NODATA = 
                (PERF_SIZE_ZERO | PERF_DISPLAY_NOSHOW);
 
        // 64-bit Timer inverse (e.g., idle is measured, but display busy %) 
        // Display 100 - delta divided by delta time.  Display suffix: "%"
        public const int PERF_COUNTER_TIMER_INV = 
                (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE |
                PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_INVERSE_COUNTER |
                PERF_DISPLAY_PERCENT);
 
        // The divisor for a sample, used with the previous counter to form a
        // sampled %.  You must check for >0 before dividing by this!  This 
        // counter will directly follow the  numerator counter.  It should not 
        // be displayed to the user.
        public const int PERF_SAMPLE_BASE = 
                (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_BASE |
                PERF_DISPLAY_NOSHOW |
                0x00000001);  // for compatibility with pre-beta versions
 
        // A timer which, when divided by an average base, produces a time
        // In seconds which is the average time of some operation.  This 
        // timer times total operations, and  the base is the number of opera- 
        // tions.  Display Suffix: "sec"
        public const int PERF_AVERAGE_TIMER = 
                (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_FRACTION |
                PERF_DISPLAY_SECONDS);

        // Used as the denominator In the computation of time or count 
        // averages.  Must directly follow the numerator counter.  Not dis-
        // played to the user. 
        public const int PERF_AVERAGE_BASE = 
                (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_BASE |
                PERF_DISPLAY_NOSHOW | 
                0x00000002);  // for compatibility with pre-beta versions


        // 64-bit Timer in object specific units. Display delta divided by 
        // delta time as returned in the object type header structure.  Display suffix: "%"
        public const int PERF_OBJ_TIME_TIMER = 
                    (PERF_SIZE_LARGE   | PERF_TYPE_COUNTER  | PERF_COUNTER_RATE | 
                     PERF_OBJECT_TIMER | PERF_DELTA_COUNTER | PERF_DISPLAY_PERCENT);
 
        // A bulk count which, when divided (typically) by the number of
        // operations, gives (typically) the number of bytes per operation.
        // No Display Suffix.
        public const int PERF_AVERAGE_BULK = 
                (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_FRACTION  |
                PERF_DISPLAY_NOSHOW); 
 
        // 64-bit Timer in object specific units. Display delta divided by
        // delta time as returned in the object type header structure.  Display suffix: "%" 
        public const int PERF_OBJ_TIME_TIME =
                    (PERF_SIZE_LARGE   | PERF_TYPE_COUNTER  | PERF_COUNTER_RATE |
                     PERF_OBJECT_TIMER | PERF_DELTA_COUNTER | PERF_DISPLAY_PERCENT);
 
        // 64-bit Timer In 100 nsec units. Display delta divided by
        // delta time.  Display suffix: "%" 
        public const int PERF_100NSEC_TIMER = 
                (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE |
                PERF_TIMER_100NS | PERF_DELTA_COUNTER | PERF_DISPLAY_PERCENT); 

        // 64-bit Timer inverse (e.g., idle is measured, but display busy %)
        // Display 100 - delta divided by delta time.  Display suffix: "%"
        public const int PERF_100NSEC_TIMER_INV = 
                (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE |
                PERF_TIMER_100NS | PERF_DELTA_COUNTER | PERF_INVERSE_COUNTER  | 
                PERF_DISPLAY_PERCENT); 

        // 64-bit Timer.  Divide delta by delta time.  Display suffix: "%" 
        // Timer for multiple instances, so result can exceed 100%.
        public const int PERF_COUNTER_MULTI_TIMER =
                (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE |
                PERF_DELTA_COUNTER | PERF_TIMER_TICK | PERF_MULTI_COUNTER | 
                PERF_DISPLAY_PERCENT);
 
        // 64-bit Timer inverse (e.g., idle is measured, but display busy %) 
        // Display 100 * _MULTI_BASE - delta divided by delta time.
        // Display suffix: "%" Timer for multiple instances, so result 
        // can exceed 100%.  Followed by a counter of type _MULTI_BASE.
        public const int PERF_COUNTER_MULTI_TIMER_INV =
                (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE |
                PERF_DELTA_COUNTER | PERF_MULTI_COUNTER | PERF_TIMER_TICK | 
                PERF_INVERSE_COUNTER | PERF_DISPLAY_PERCENT);
 
        // Number of instances to which the preceding _MULTI_..._INV counter 
        // applies.  Used as a factor to get the percentage.
        public const int PERF_COUNTER_MULTI_BASE = 
                (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_BASE |
                PERF_MULTI_COUNTER | PERF_DISPLAY_NOSHOW);

        // 64-bit Timer In 100 nsec units. Display delta divided by delta time. 
        // Display suffix: "%" Timer for multiple instances, so result can exceed 100%.
        public const int PERF_100NSEC_MULTI_TIMER = 
                (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_DELTA_COUNTER  | 
                PERF_COUNTER_RATE | PERF_TIMER_100NS | PERF_MULTI_COUNTER |
                PERF_DISPLAY_PERCENT); 

        // 64-bit Timer inverse (e.g., idle is measured, but display busy %)
        // Display 100 * _MULTI_BASE - delta divided by delta time.
        // Display suffix: "%" Timer for multiple instances, so result 
        // can exceed 100%.  Followed by a counter of type _MULTI_BASE.
        public const int PERF_100NSEC_MULTI_TIMER_INV = 
                (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_DELTA_COUNTER  | 
                PERF_COUNTER_RATE | PERF_TIMER_100NS | PERF_MULTI_COUNTER |
                PERF_INVERSE_COUNTER | PERF_DISPLAY_PERCENT); 

        // Indicates the data is a fraction of the following counter  which
        // should not be time averaged on display (such as free space over
        // total space.) Display as is.  Display the quotient as "%". 
        public const int PERF_RAW_FRACTION =
                (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_FRACTION | 
                PERF_DISPLAY_PERCENT); 

        public const int PERF_LARGE_RAW_FRACTION = 
                    (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_FRACTION |
                    PERF_DISPLAY_PERCENT);

        // Indicates the data is a base for the preceding counter which should 
        // not be time averaged on display (such as free space over total space.)
        public const int PERF_RAW_BASE = 
                (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_BASE | 
                PERF_DISPLAY_NOSHOW |
                0x00000003);  // for compatibility with pre-beta versions 

        public const int PERF_LARGE_RAW_BASE =
                    (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_BASE |
                    PERF_DISPLAY_NOSHOW ); 

        // The data collected In this counter is actually the start time of the 
        // item being measured. For display, this data is subtracted from the 
        // sample time to yield the elapsed time as the difference between the two.
        // In the definition below, the PerfTime field of the Object contains 
        // the sample time as indicated by the PERF_OBJECT_TIMER bit and the
        // difference is scaled by the PerfFreq of the Object to convert the time
        // units into seconds.
        public const int PERF_ELAPSED_TIME = 
                (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_ELAPSED |
                PERF_OBJECT_TIMER | PERF_DISPLAY_SECONDS); 
 
        //
        //  The following counter type can be used with the preceding types to 
        //  define a range of values to be displayed In a histogram.
        //

        // 
        //  This counter is used to display the difference from one sample
        //  to the next. The counter value is a constantly increasing number 
        //  and the value displayed is the difference between the current 
        //  value and the previous value. Negative numbers are not allowed
        //  which shouldn't be a problem as long as the counter value is 
        //  increasing or unchanged.
        //
        public const int PERF_COUNTER_DELTA =
                (PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_VALUE | 
                PERF_DELTA_COUNTER | PERF_DISPLAY_NO_SUFFIX);
 
        public const int PERF_COUNTER_LARGE_DELTA = 
                (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_VALUE |
                PERF_DELTA_COUNTER | PERF_DISPLAY_NO_SUFFIX); 

        // The timer used has the same frequency as the System Performance Timer
        public const int PERF_PRECISION_SYSTEM_TIMER =
                (PERF_SIZE_LARGE    | PERF_TYPE_COUNTER     | PERF_COUNTER_PRECISION    | 
                 PERF_TIMER_TICK    | PERF_DELTA_COUNTER    | PERF_DISPLAY_PERCENT   );
 
        // 
        // The timer used has the same frequency as the 100 NanoSecond Timer
        public const int PERF_PRECISION_100NS_TIMER  = 
                (PERF_SIZE_LARGE    | PERF_TYPE_COUNTER     | PERF_COUNTER_PRECISION    |
                 PERF_TIMER_100NS   | PERF_DELTA_COUNTER    | PERF_DISPLAY_PERCENT   );
        //
        // The timer used is of the frequency specified in the Object header's 
        //  PerfFreq field (PerfTime is ignored)
        public const int PERF_PRECISION_OBJECT_TIMER = 
                (PERF_SIZE_LARGE    | PERF_TYPE_COUNTER     | PERF_COUNTER_PRECISION    | 
                 PERF_OBJECT_TIMER  | PERF_DELTA_COUNTER    | PERF_DISPLAY_PERCENT   );
 
        public const uint PDH_FMT_DOUBLE =  0x00000200;
        public const uint PDH_FMT_NOSCALE   =   0x00001000;
        public const uint PDH_FMT_NOCAP100  =   0x00008000;
 

 
        [StructLayout(LayoutKind.Sequential)] 
        public class PDH_RAW_COUNTER {
            public int CStatus = 0; 
            public long TimeStamp = 0;
            public long FirstValue = 0;
            public long SecondValue = 0;
            public int MultiCount = 0; 
        }
 
        [StructLayout(LayoutKind.Sequential)] 
        public class PDH_FMT_COUNTERVALUE {
            public int CStatus = 0; 
            public double data = 0;
        }

        // 
        //  The following are used to determine the level of detail associated
        //  with the counter.  The user will be setting the level of detail 
        //  that should be displayed at any given time. 
        //
        public const int PERF_DETAIL_NOVICE      =    100; // The uninformed can understand it 
        public const int PERF_DETAIL_ADVANCED    =    200; // For the advanced user
        public const int PERF_DETAIL_EXPERT      =    300; // For the expert user
        public const int PERF_DETAIL_WIZARD      =    400; // For the system designer
 
        [StructLayout(LayoutKind.Sequential)]
        internal class PERF_COUNTER_BLOCK { 
            public int ByteLength = 0; 
        }
 
        [StructLayout(LayoutKind.Sequential)]
        internal class PERF_COUNTER_DEFINITION {
            public int ByteLength = 0;
            public int CounterNameTitleIndex = 0; 

            // this one is kind of weird. It is defined as in SDK: 
            // #ifdef _WIN64 
            //  DWORD           CounterNameTitle;
            // #else 
            //  LPWSTR          CounterNameTitle;
            // #endif
            // so we can't use IntPtr here.
 
            public int CounterNameTitlePtr = 0;
            public int CounterHelpTitleIndex = 0; 
            public int CounterHelpTitlePtr = 0; 
            public int DefaultScale = 0;
            public int DetailLevel = 0; 
            public int CounterType = 0;
            public int CounterSize = 0;
            public int CounterOffset = 0;
        } 

        [StructLayout(LayoutKind.Sequential)] 
        internal class PERF_DATA_BLOCK { 
            public int Signature1 = 0;
            public int Signature2 = 0; 
            public int LittleEndian = 0;
            public int Version = 0;
            public int Revision = 0;
            public int TotalByteLength = 0; 
            public int HeaderLength = 0;
            public int NumObjectTypes = 0; 
            public int DefaultObject = 0; 
            public SYSTEMTIME SystemTime = null;
            public int pad1 = 0;  // Need to pad the struct to get quadword alignment for the 'long' after SystemTime 
            public long PerfTime = 0;
            public long PerfFreq = 0;
            public long PerfTime100nSec = 0;
            public int SystemNameLength = 0; 
            public int SystemNameOffset = 0;
        } 
 
        [StructLayout(LayoutKind.Sequential)]
        internal class PERF_INSTANCE_DEFINITION { 
            public int ByteLength = 0;
            public int ParentObjectTitleIndex = 0;
            public int ParentObjectInstance = 0;
            public int UniqueID = 0; 
            public int NameOffset = 0;
            public int NameLength = 0; 
        } 

        [StructLayout(LayoutKind.Sequential)] 
        internal class PERF_OBJECT_TYPE {
            public int TotalByteLength = 0;
            public int DefinitionLength = 0;
            public int HeaderLength = 0; 
            public int ObjectNameTitleIndex = 0;
            public int ObjectNameTitlePtr = 0; 
            public int ObjectHelpTitleIndex = 0; 
            public int ObjectHelpTitlePtr = 0;
            public int DetailLevel = 0; 
            public int NumCounters = 0;
            public int DefaultCounter = 0;
            public int NumInstances = 0;
            public int CodePage = 0; 
            public long PerfTime = 0;
            public long PerfFreq = 0; 
        } 

        [DllImport(ExternDll.Kernel32, CharSet=CharSet.Auto, SetLastError=true, BestFitMapping=false)] 
        [ResourceExposure(ResourceScope.Machine)]
        internal static extern SafeFileMappingHandle CreateFileMapping(IntPtr hFile, NativeMethods.SECURITY_ATTRIBUTES lpFileMappingAttributes, int flProtect, int dwMaximumSizeHigh, int dwMaximumSizeLow, string lpName);

        [DllImport(ExternDll.Kernel32, CharSet=CharSet.Auto, SetLastError=true, BestFitMapping=false)] 
        [ResourceExposure(ResourceScope.Machine)]
        internal static extern SafeFileMappingHandle OpenFileMapping(int dwDesiredAccess, bool bInheritHandle, string lpName); 
 
        // copied from winbase.h
        public const int FORMAT_MESSAGE_ALLOCATE_BUFFER = 0x00000100; 
        public const int FORMAT_MESSAGE_IGNORE_INSERTS  = 0x00000200;
        public const int FORMAT_MESSAGE_FROM_STRING     = 0x00000400;
        public const int FORMAT_MESSAGE_FROM_HMODULE    = 0x00000800;
        public const int FORMAT_MESSAGE_FROM_SYSTEM     = 0x00001000; 
        public const int FORMAT_MESSAGE_ARGUMENT_ARRAY  = 0x00002000;
        public const int FORMAT_MESSAGE_MAX_WIDTH_MASK  = 0x000000FF; 
        public const int LOAD_WITH_ALTERED_SEARCH_PATH  = 0x00000008; 
        public const int LOAD_LIBRARY_AS_DATAFILE       = 0x00000002;
 
        public const int SEEK_READ = 0x2;
        public const int FORWARDS_READ = 0x4;
        public const int BACKWARDS_READ = 0x8;
        public const int ERROR_EVENTLOG_FILE_CHANGED = 1503; 

        [DllImport(ExternDll.User32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)] 
        [ResourceExposure(ResourceScope.None)] 
        public static extern int WaitForInputIdle(SafeProcessHandle handle, int milliseconds);
 
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.None)]
        public static extern SafeProcessHandle OpenProcess(int access, bool inherit, int processId);
 
        [DllImport(ExternDll.Psapi, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.None)] 
        public static extern bool EnumProcessModules(SafeProcessHandle handle, IntPtr modules, int size, ref int needed); 

        [DllImport(ExternDll.Psapi, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)] 
        [ResourceExposure(ResourceScope.Machine)]
        public static extern bool EnumProcesses(int[] processIds, int size, out int needed);

        [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 
        [DllImport(ExternDll.Psapi, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true, BestFitMapping=false)]
        [ResourceExposure(ResourceScope.Machine)] 
        public static extern int GetModuleFileNameEx(HandleRef processHandle, HandleRef moduleHandle, StringBuilder baseName, int size); 

        [DllImport(ExternDll.Psapi, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)] 
        [ResourceExposure(ResourceScope.Process)]
        public static extern bool GetModuleInformation(SafeProcessHandle processHandle, HandleRef moduleHandle, NtModuleInfo ntModuleInfo, int size);
        [DllImport(ExternDll.Psapi, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true, BestFitMapping=false)]
        [ResourceExposure(ResourceScope.Machine)] 
        public static extern int GetModuleBaseName(SafeProcessHandle processHandle, HandleRef moduleHandle, StringBuilder baseName, int size);
        [DllImport(ExternDll.Psapi, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true, BestFitMapping=false)] 
        [ResourceExposure(ResourceScope.Machine)] 
        public static extern int GetModuleFileNameEx(SafeProcessHandle processHandle, HandleRef moduleHandle, StringBuilder baseName, int size);
 
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.Machine)]
        public static extern bool SetProcessWorkingSetSize(SafeProcessHandle handle, IntPtr min, IntPtr max);
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)] 
        [ResourceExposure(ResourceScope.None)]
        public static extern bool GetProcessWorkingSetSize(SafeProcessHandle handle, out IntPtr min, out IntPtr max); 
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)] 
        [ResourceExposure(ResourceScope.Machine)]
        public static extern bool SetProcessAffinityMask(SafeProcessHandle handle, IntPtr mask); 
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.None)]
        public static extern bool GetProcessAffinityMask(SafeProcessHandle handle, out IntPtr processMask, out IntPtr systemMask);
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)] 
        [ResourceExposure(ResourceScope.None)]
        public static extern bool GetThreadPriorityBoost(SafeThreadHandle handle, out bool disabled); 
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)] 
        [ResourceExposure(ResourceScope.None)]
        public static extern bool SetThreadPriorityBoost(SafeThreadHandle handle, bool disabled); 
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.None)]
        public static extern bool GetProcessPriorityBoost(SafeProcessHandle handle, out bool disabled);
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)] 
        [ResourceExposure(ResourceScope.None)]
        public static extern bool SetProcessPriorityBoost(SafeProcessHandle handle, bool disabled); 
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)] 
        [ResourceExposure(ResourceScope.Process)]
        public static extern SafeThreadHandle OpenThread(int access, bool inherit, int threadId); 
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.Process)]
        public static extern bool SetThreadPriority(SafeThreadHandle handle, int priority);
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)] 
        [ResourceExposure(ResourceScope.None)]
        public static extern int GetThreadPriority(SafeThreadHandle handle); 
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)] 
        [ResourceExposure(ResourceScope.Process)]
        public static extern IntPtr SetThreadAffinityMask(SafeThreadHandle handle, HandleRef mask); 
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.Process)]
        public static extern int SetThreadIdealProcessor(SafeThreadHandle handle, int processor);
 
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.Process)] 
        public static extern IntPtr CreateToolhelp32Snapshot(int flags, int processId); 
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.None)] 
        public static extern bool Process32First(HandleRef handle, IntPtr entry);
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.None)]
        public static extern bool Process32Next(HandleRef handle, IntPtr entry); 
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.None)] 
        public static extern bool Thread32First(HandleRef handle, WinThreadEntry entry); 
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.None)] 
        public static extern bool Thread32Next(HandleRef handle, WinThreadEntry entry);
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.None)]
        public static extern bool Module32First(HandleRef handle, IntPtr entry); 
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.None)] 
        public static extern bool Module32Next(HandleRef handle, IntPtr entry); 
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.None)] 
        public static extern int GetPriorityClass(SafeProcessHandle handle);
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.Machine)]
        public static extern bool SetPriorityClass(SafeProcessHandle handle, int priorityClass); 
        [DllImport(ExternDll.User32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.Process)] 
        public static extern bool EnumWindows(EnumThreadWindowsCallback callback, IntPtr extraData); 
        [DllImport(ExternDll.User32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.Machine)] 
        public static extern int GetWindowThreadProcessId(HandleRef handle, out int processId);
        [DllImport(ExternDll.Shell32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.Machine)]
        public static extern bool ShellExecuteEx(ShellExecuteInfo info); 
        [DllImport(ExternDll.Ntdll, CharSet=System.Runtime.InteropServices.CharSet.Auto)]
        [ResourceExposure(ResourceScope.Machine)] 
        public static extern int NtQueryInformationProcess(SafeProcessHandle processHandle, int query, NtProcessBasicInfo info, int size, int[] returnedSize); 
        [DllImport(ExternDll.Ntdll, CharSet=System.Runtime.InteropServices.CharSet.Auto)]
        [ResourceExposure(ResourceScope.None)] 
        public static extern int NtQuerySystemInformation(int query, IntPtr dataPtr, int size, out int returnedSize);
        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, BestFitMapping=false)]
        [ResourceExposure(ResourceScope.Machine)]
        public static extern SafeFileHandle CreateFile(string lpFileName,int dwDesiredAccess,int dwShareMode, SECURITY_ATTRIBUTES lpSecurityAttributes, int dwCreationDisposition,int dwFlagsAndAttributes, SafeFileHandle hTemplateFile); 

 
#endif // !FEATURE_PAL 

        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Ansi, SetLastError=true, BestFitMapping=false)] 
        [ResourceExposure(ResourceScope.Machine)]
        public static extern bool DuplicateHandle(
            HandleRef hSourceProcessHandle,
            SafeHandle hSourceHandle, 
            HandleRef hTargetProcess,
            out SafeFileHandle targetHandle, 
            int dwDesiredAccess, 
            bool bInheritHandle,
            int dwOptions 
        );

        [DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Ansi, SetLastError=true, BestFitMapping=false)]
        [ResourceExposure(ResourceScope.Machine)] 
        public static extern bool DuplicateHandle(
            HandleRef hSourceProcessHandle, 
            SafeHandle hSourceHandle, 
            HandleRef hTargetProcess,
            out SafeWaitHandle targetHandle, 
            int dwDesiredAccess,
            bool bInheritHandle,
            int dwOptions
        ); 

 
#if !FEATURE_PAL 
        /* Unused
        [DllImport(ExternDll.Advapi32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true, BestFitMapping=false)] 
        [ResourceExposure(ResourceScope.Process)]
        public static extern bool LogonUser(
            [MarshalAs(UnmanagedType.LPTStr)]
            string lpszUsername, 
            [MarshalAs(UnmanagedType.LPTStr)]
            string lpszDomain, 
            [MarshalAs(UnmanagedType.LPTStr)] 
            string lpszPassword,
            int dwLogonType, 
            int dwLogonProvider,
            out IntPtr phToken
        );
        */ 
        [DllImport(ExternDll.Advapi32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.Process)] 
        public static extern bool OpenProcessToken(HandleRef ProcessHandle, int DesiredAccess, out IntPtr TokenHandle); 
        [DllImport(ExternDll.Advapi32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true, BestFitMapping=false)]
        [ResourceExposure(ResourceScope.None)] 
        public static extern bool LookupPrivilegeValue([MarshalAs(UnmanagedType.LPTStr)] string lpSystemName, [MarshalAs(UnmanagedType.LPTStr)] string lpName, out LUID lpLuid);
        [DllImport(ExternDll.Advapi32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
        [ResourceExposure(ResourceScope.Process)]
        public static extern bool AdjustTokenPrivileges( 
            HandleRef TokenHandle,
            bool DisableAllPrivileges, 
            TokenPrivileges NewState, 
            int BufferLength,
            IntPtr PreviousState, 
            IntPtr ReturnLength
        );
        [DllImport(ExternDll.User32, CharSet=System.Runtime.InteropServices.CharSet.Auto, BestFitMapping=true)]
        [ResourceExposure(ResourceScope.None)] 
        public static extern int GetWindowText(HandleRef hWnd, StringBuilder lpString, int nMaxCount);
        [DllImport(ExternDll.User32, CharSet=System.Runtime.InteropServices.CharSet.Auto)] 
        [ResourceExposure(ResourceScope.None)] 
        public static extern int GetWindowTextLength(HandleRef hWnd);
        [DllImport(ExternDll.User32, CharSet=System.Runtime.InteropServices.CharSet.Auto)] 
        [ResourceExposure(ResourceScope.None)]
        public static extern bool IsWindowVisible(HandleRef hWnd);
        [DllImport(ExternDll.User32, CharSet=System.Runtime.InteropServices.CharSet.Auto)]
        [ResourceExposure(ResourceScope.None)] 
        public static extern IntPtr SendMessageTimeout(HandleRef hWnd, int msg, IntPtr wParam, IntPtr lParam, int flags, int timeout, out IntPtr pdwResult);
        [DllImport(ExternDll.User32, CharSet=System.Runtime.InteropServices.CharSet.Auto)] 
        [ResourceExposure(ResourceScope.None)] 
        public static extern int GetWindowLong(HandleRef hWnd, int nIndex);
        [DllImport(ExternDll.User32, CharSet=System.Runtime.InteropServices.CharSet.Auto)] 
        [ResourceExposure(ResourceScope.None)]
        public static extern int PostMessage(HandleRef hwnd, int msg, IntPtr wparam, IntPtr lparam);
        [DllImport(ExternDll.User32, ExactSpelling=true, CharSet=System.Runtime.InteropServices.CharSet.Auto)]
        [ResourceExposure(ResourceScope.Process)] 
        public static extern IntPtr GetWindow(HandleRef hWnd, int uCmd);
 
        [StructLayout(LayoutKind.Sequential)] 
        internal class NtModuleInfo {
            public IntPtr BaseOfDll = (IntPtr)0; 
            public int SizeOfImage = 0;
            public IntPtr EntryPoint = (IntPtr)0;
        }
 
        [StructLayout(LayoutKind.Sequential)]
        internal class WinProcessEntry { 
            public int dwSize = 0; 
            public int cntUsage = 0;
            public int th32ProcessID = 0; 
            public IntPtr th32DefaultHeapID = (IntPtr)0;
            public int th32ModuleID = 0;
            public int cntThreads = 0;
            public int th32ParentProcessID = 0; 
            public int pcPriClassBase = 0;
            public int dwFlags = 0; 
            //[MarshalAs(UnmanagedType.ByValTStr, SizeConst=260)] 
            //public string fileName;
            //byte fileName[260]; 
            public const int sizeofFileName = 260;
        }

        [StructLayout(LayoutKind.Sequential)] 
        internal class WinThreadEntry {
            public int dwSize = 0; 
            public int cntUsage = 0; 
            public int th32ThreadID = 0;
            public int th32OwnerProcessID = 0; 
            public int tpBasePri = 0;
            public int tpDeltaPri = 0;
            public int dwFlags = 0;
        } 

        [StructLayout(LayoutKind.Sequential)] 
        internal class WinModuleEntry {  // MODULEENTRY32 
            public int dwSize = 0;
            public int th32ModuleID = 0; 
            public int th32ProcessID = 0;
            public int GlblcntUsage = 0;
            public int ProccntUsage = 0;
            public IntPtr modBaseAddr = (IntPtr)0; 
            public int modBaseSize = 0;
            public IntPtr hModule = (IntPtr)0; 
            //byte moduleName[256]; 
            //[MarshalAs(UnmanagedType.ByValTStr, SizeConst=256)]
            //public string moduleName; 
            //[MarshalAs(UnmanagedType.ByValTStr, SizeConst=260)]
            //public string fileName;
            //byte fileName[260];
            public const int sizeofModuleName = 256; 
            public const int sizeofFileName = 260;
        } 
 
        [StructLayout(LayoutKind.Sequential)]
        internal class ShellExecuteInfo { 
            public int cbSize = 0;
            public int fMask = 0;
            public IntPtr hwnd = (IntPtr)0;
            public IntPtr lpVerb = (IntPtr)0; 
            public IntPtr lpFile = (IntPtr)0;
            public IntPtr lpParameters = (IntPtr)0; 
            public IntPtr lpDirectory = (IntPtr)0; 
            public int nShow = 0;
            public IntPtr hInstApp = (IntPtr)0; 
            public IntPtr lpIDList = (IntPtr)0;
            public IntPtr lpClass = (IntPtr)0;
            public IntPtr hkeyClass = (IntPtr)0;
            public int dwHotKey = 0; 
            public IntPtr hIcon = (IntPtr)0;
            public IntPtr hProcess = (IntPtr)0; 
 
            [ResourceExposure(ResourceScope.Machine)]
            public ShellExecuteInfo() { 
                cbSize = Marshal.SizeOf(this);
            }
        }
 
        // NT definition
        // typedef struct _PROCESS_BASIC_INFORMATION { 
        //    NTSTATUS ExitStatus; (LONG) 
        //    PPEB PebBaseAddress;
        //    ULONG_PTR AffinityMask; 
        //    KPRIORITY BasePriority;  (LONG)
        //    ULONG_PTR UniqueProcessId;
        //    ULONG_PTR InheritedFromUniqueProcessId;
        //} PROCESS_BASIC_INFORMATION; 

        [StructLayout(LayoutKind.Sequential)] 
        internal class NtProcessBasicInfo { 
            public int ExitStatus = 0;
            public IntPtr PebBaseAddress = (IntPtr)0; 
            public IntPtr AffinityMask = (IntPtr)0;
            public int BasePriority = 0;
            public IntPtr UniqueProcessId = (IntPtr)0;
            public IntPtr InheritedFromUniqueProcessId = (IntPtr)0; 
        }
 
        [StructLayout(LayoutKind.Sequential)] 
        internal struct LUID {
            public int LowPart; 
            public int HighPart;
        }

        [StructLayout(LayoutKind.Sequential)] 
        internal class TokenPrivileges {
            public int PrivilegeCount = 1; 
            public LUID Luid; 
            public int Attributes = 0;
        } 

        internal delegate bool EnumThreadWindowsCallback(IntPtr hWnd, IntPtr lParam);

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1812:AvoidUninstantiatedInternalClasses")] 
        [StructLayout(LayoutKind.Sequential)]
        internal class SYSTEMTIME { 
            public short wYear; 
            public short wMonth;
            public short wDayOfWeek; 
            public short wDay;
            public short wHour;
            public short wMinute;
            public short wSecond; 
            public short wMilliseconds;
 
            public override string ToString() { 
                return "[SYSTEMTIME: "
                + wDay.ToString(CultureInfo.CurrentCulture) + "/" + wMonth.ToString(CultureInfo.CurrentCulture) + "/" + wYear.ToString(CultureInfo.CurrentCulture) 
                + " " + wHour.ToString(CultureInfo.CurrentCulture) + ":" + wMinute.ToString(CultureInfo.CurrentCulture) + ":" + wSecond.ToString(CultureInfo.CurrentCulture)
                + "]";
            }
        } 

        public const int NtPerfCounterSizeDword = 0x00000000; 
        public const int NtPerfCounterSizeLarge = 0x00000100; 

        public const int SHGFI_USEFILEATTRIBUTES = 0x000000010;  // use passed dwFileAttribute 
        public const int SHGFI_TYPENAME = 0x000000400;

        public const int NtQueryProcessBasicInfo = 0;
        public const int NtQuerySystemProcessInformation = 5; 

        public const int SEE_MASK_CLASSNAME = 0x00000001;    // Note CLASSKEY overrides CLASSNAME 
        public const int SEE_MASK_CLASSKEY = 0x00000003; 
        public const int SEE_MASK_IDLIST = 0x00000004;    // Note INVOKEIDLIST overrides IDLIST
        public const int SEE_MASK_INVOKEIDLIST = 0x0000000c; 
        public const int SEE_MASK_ICON = 0x00000010;
        public const int SEE_MASK_HOTKEY = 0x00000020;
        public const int SEE_MASK_NOCLOSEPROCESS = 0x00000040;
        public const int SEE_MASK_CONNECTNETDRV = 0x00000080; 
        public const int SEE_MASK_FLAG_DDEWAIT = 0x00000100;
        public const int SEE_MASK_DOENVSUBST = 0x00000200; 
        public const int SEE_MASK_FLAG_NO_UI = 0x00000400; 
        public const int SEE_MASK_UNICODE = 0x00004000;
        public const int SEE_MASK_NO_CONSOLE = 0x00008000; 
        public const int SEE_MASK_ASYNCOK = 0x00100000;

        public const int TH32CS_SNAPHEAPLIST = 0x00000001;
        public const int TH32CS_SNAPPROCESS = 0x00000002; 
        public const int TH32CS_SNAPTHREAD = 0x00000004;
        public const int TH32CS_SNAPMODULE = 0x00000008; 
        public const int TH32CS_INHERIT = unchecked((int)0x80000000); 

#endif // !FEATURE_PAL 

        public const int PROCESS_TERMINATE = 0x0001;
        public const int PROCESS_CREATE_THREAD = 0x0002;
        public const int PROCESS_SET_SESSIONID = 0x0004; 
        public const int PROCESS_VM_OPERATION = 0x0008;
        public const int PROCESS_VM_READ = 0x0010; 
        public const int PROCESS_VM_WRITE = 0x0020; 
        public const int PROCESS_DUP_HANDLE = 0x0040;
        public const int PROCESS_CREATE_PROCESS = 0x0080; 
        public const int PROCESS_SET_QUOTA = 0x0100;
        public const int PROCESS_SET_INFORMATION = 0x0200;
        public const int PROCESS_QUERY_INFORMATION = 0x0400;
        public const int STANDARD_RIGHTS_REQUIRED = 0x000F0000; 
        public const int SYNCHRONIZE = 0x00100000;
        public const int PROCESS_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF; 
 
#if !FEATURE_PAL
 
        public const int THREAD_TERMINATE = 0x0001;
        public const int THREAD_SUSPEND_RESUME = 0x0002;
        public const int THREAD_GET_CONTEXT = 0x0008;
        public const int THREAD_SET_CONTEXT = 0x0010; 
        public const int THREAD_SET_INFORMATION = 0x0020;
        public const int THREAD_QUERY_INFORMATION = 0x0040; 
        public const int THREAD_SET_THREAD_TOKEN = 0x0080; 
        public const int THREAD_IMPERSONATE = 0x0100;
        public const int THREAD_DIRECT_IMPERSONATION = 0x0200; 

        public static readonly IntPtr HKEY_LOCAL_MACHINE = unchecked((IntPtr)(int)0x80000002);
        public const int REG_BINARY = 3;
        public const int REG_MULTI_SZ = 7; 

        public const int READ_CONTROL                    = 0x00020000; 
        public const int STANDARD_RIGHTS_READ            = READ_CONTROL; 

        public const int KEY_QUERY_VALUE        = 0x0001; 
        public const int KEY_ENUMERATE_SUB_KEYS = 0x0008;
        public const int KEY_NOTIFY             = 0x0010;

        public const int KEY_READ               =((STANDARD_RIGHTS_READ | 
                                                           KEY_QUERY_VALUE |
                                                           KEY_ENUMERATE_SUB_KEYS | 
                                                           KEY_NOTIFY) 
                                                          &
                                                          (~SYNCHRONIZE)); 

        public const int ERROR_BROKEN_PIPE = 109;
        public const int ERROR_NO_DATA = 232;
        public const int ERROR_HANDLE_EOF = 38; 
        public const int ERROR_IO_INCOMPLETE = 996;
        public const int ERROR_IO_PENDING = 997; 
        public const int ERROR_FILE_EXISTS = 0x50; 
        public const int ERROR_FILENAME_EXCED_RANGE = 0xCE;  // filename too long.
        public const int ERROR_MORE_DATA = 234; 
        public const int ERROR_CANCELLED = 1223;
        public const int ERROR_FILE_NOT_FOUND = 2;
        public const int ERROR_PATH_NOT_FOUND = 3;
        public const int ERROR_ACCESS_DENIED = 5; 
        public const int ERROR_INVALID_HANDLE = 6;
        public const int ERROR_NOT_ENOUGH_MEMORY = 8; 
        public const int ERROR_SHARING_VIOLATION = 32; 
        public const int ERROR_OPERATION_ABORTED = 995;
        public const int ERROR_NO_ASSOCIATION = 1155; 
        public const int ERROR_DLL_NOT_FOUND = 1157;
        public const int ERROR_DDE_FAIL = 1156;
        public const int ERROR_INVALID_PARAMETER = 87;
        public const int ERROR_PARTIAL_COPY = 299; 
        public const int ERROR_SUCCESS = 0;
        public const int ERROR_ALREADY_EXISTS = 183; 
        public const int ERROR_COUNTER_TIMEOUT = 1121; 
        public const int RPC_S_SERVER_UNAVAILABLE = 1722;
        public const int RPC_S_CALL_FAILED = 1726; 

        public const int PDH_NO_DATA = unchecked((int) 0x800007D5);
        public const int PDH_CALC_NEGATIVE_DENOMINATOR = unchecked((int) 0x800007D6);
        public const int PDH_CALC_NEGATIVE_VALUE = unchecked((int) 0x800007D8); 

 
        public const int SE_ERR_FNF = 2; 
        public const int SE_ERR_PNF = 3;
        public const int SE_ERR_ACCESSDENIED = 5; 
        public const int SE_ERR_OOM = 8;
        public const int SE_ERR_DLLNOTFOUND = 32;
        public const int SE_ERR_SHARE = 26;
        public const int SE_ERR_ASSOCINCOMPLETE = 27; 
        public const int SE_ERR_DDETIMEOUT = 28;
        public const int SE_ERR_DDEFAIL = 29; 
        public const int SE_ERR_DDEBUSY = 30; 
        public const int SE_ERR_NOASSOC = 31;
 
        public const int SE_PRIVILEGE_ENABLED = 2;

#endif // !FEATURE_PAL
 
        public const int DUPLICATE_CLOSE_SOURCE = 1;
        public const int DUPLICATE_SAME_ACCESS  = 2; 
 
#if !FEATURE_PAL
 
        public const int LOGON32_LOGON_BATCH = 4;
        public const int LOGON32_PROVIDER_DEFAULT = 0;
        public const int LOGON32_LOGON_INTERACTIVE = 2;
 
        public const int TOKEN_ADJUST_PRIVILEGES = 0x20;
        public const int TOKEN_QUERY = 0x08; 
 
        public const int CREATE_NO_WINDOW = 0x08000000;
        public const int CREATE_SUSPENDED = 0x00000004; 
        public const int CREATE_UNICODE_ENVIRONMENT = 0x00000400;

        public const int SMTO_ABORTIFHUNG = 0x0002;
        public const int GWL_STYLE = (-16); 
        public const int GCL_WNDPROC = (-24);
        public const int GWL_WNDPROC = (-4); 
        public const int WS_DISABLED = 0x08000000; 
        public const int WM_NULL = 0x0000;
        public const int WM_CLOSE = 0x0010; 
        public const int SW_SHOWNORMAL = 1;
        public const int SW_NORMAL = 1;
        public const int SW_SHOWMINIMIZED = 2;
        public const int SW_SHOWMAXIMIZED = 3; 
        public const int SW_MAXIMIZE = 3;
        public const int SW_SHOWNOACTIVATE = 4; 
        public const int SW_SHOW = 5; 
        public const int SW_MINIMIZE = 6;
        public const int SW_SHOWMINNOACTIVE = 7; 
        public const int SW_SHOWNA = 8;
        public const int SW_RESTORE = 9;
        public const int SW_SHOWDEFAULT = 10;
        public const int SW_MAX = 10; 
        public const int GW_OWNER = 4;
        public const int WHITENESS = 0x00FF0062; 
 
        public const int
        VS_FILE_INFO = 16, 
        VS_VERSION_INFO = 1,
        VS_USER_DEFINED = 100,
        VS_FFI_SIGNATURE = unchecked((int)0xFEEF04BD),
        VS_FFI_STRUCVERSION = 0x00010000, 
        VS_FFI_FILEFLAGSMASK = 0x0000003F,
        VS_FF_DEBUG = 0x00000001, 
        VS_FF_PRERELEASE = 0x00000002, 
        VS_FF_PATCHED = 0x00000004,
        VS_FF_PRIVATEBUILD = 0x00000008, 
        VS_FF_INFOINFERRED = 0x00000010,
        VS_FF_SPECIALBUILD = 0x00000020,
        VFT_UNKNOWN = 0x00000000,
        VFT_APP = 0x00000001, 
        VFT_DLL = 0x00000002,
        VFT_DRV = 0x00000003, 
        VFT_FONT = 0x00000004, 
        VFT_VXD = 0x00000005,
        VFT_STATIC_LIB = 0x00000007, 
        VFT2_UNKNOWN = 0x00000000,
        VFT2_DRV_PRINTER = 0x00000001,
        VFT2_DRV_KEYBOARD = 0x00000002,
        VFT2_DRV_LANGUAGE = 0x00000003, 
        VFT2_DRV_DISPLAY = 0x00000004,
        VFT2_DRV_MOUSE = 0x00000005, 
        VFT2_DRV_NETWORK = 0x00000006, 
        VFT2_DRV_SYSTEM = 0x00000007,
        VFT2_DRV_INSTALLABLE = 0x00000008, 
        VFT2_DRV_SOUND = 0x00000009,
        VFT2_DRV_COMM = 0x0000000A,
        VFT2_DRV_INPUTMETHOD = 0x0000000B,
        VFT2_FONT_RASTER = 0x00000001, 
        VFT2_FONT_VECTOR = 0x00000002,
        VFT2_FONT_TRUETYPE = 0x00000003; 
 
        // from Windows Forms nativemethods.cs
        [StructLayout(LayoutKind.Sequential)] 
        internal class VS_FIXEDFILEINFO {
            public int dwSignature = 0;
            public int dwStructVersion = 0;
            public int dwFileVersionMS = 0; 
            public int dwFileVersionLS = 0;
            public int dwProductVersionMS = 0; 
            public int dwProductVersionLS = 0; 
            public int dwFileFlagsMask = 0;
            public int dwFileFlags = 0; 
            public int dwFileOS = 0;
            public int dwFileType = 0;
            public int dwFileSubtype = 0;
            public int dwFileDateMS = 0; 
            public int dwFileDateLS = 0;
        } 
 
        public const int
        GMEM_FIXED = 0x0000, 
        GMEM_MOVEABLE = 0x0002,
        GMEM_NOCOMPACT = 0x0010,
        GMEM_NODISCARD = 0x0020,
        GMEM_ZEROINIT = 0x0040, 
        GMEM_MODIFY = 0x0080,
        GMEM_DISCARDABLE = 0x0100, 
        GMEM_NOT_BANKED = 0x1000, 
        GMEM_SHARE = 0x2000,
        GMEM_DDESHARE = 0x2000, 
        GMEM_NOTIFY = 0x4000,
        GMEM_LOWER = 0x1000,
        GMEM_VALID_FLAGS = 0x7F72,
        GMEM_INVALID_HANDLE = unchecked((int)0x8000), 
        GHND = (0x0002|0x0040),
        GPTR = (0x0000|0x0040), 
        GMEM_DISCARDED = 0x4000, 
        GMEM_LOCKCOUNT = 0x00FF;
 
        public const int UOI_NAME      = 2;
        public const int UOI_TYPE      = 3;
        public const int UOI_USER_SID  = 4;
 
        [StructLayout(LayoutKind.Sequential)]
        internal class USEROBJECTFLAGS { 
            public int fInherit = 0; 
            public int fReserved = 0;
            public int dwFlags = 0; 
        }

        public const int VER_PLATFORM_WIN32_NT = 2;
 
    internal static class Util {
        public static int HIWORD(int n) { 
            return (n >> 16) & 0xffff; 
        }
 
        public static int LOWORD(int n) {
            return n & 0xffff;
        }
    } 

    [StructLayout(LayoutKind.Sequential)] 
    internal struct MEMORY_BASIC_INFORMATION { 
        internal IntPtr BaseAddress;
        internal IntPtr AllocationBase; 
        internal uint AllocationProtect;
        internal UIntPtr RegionSize;
        internal uint State;
        internal uint Protect; 
        internal uint Type;
    } 
 
    [DllImport(ExternDll.Kernel32, SetLastError=true)]
    [ResourceExposure(ResourceScope.None)] 
    unsafe internal static extern IntPtr VirtualQuery(SafeFileMapViewHandle address, ref MEMORY_BASIC_INFORMATION buffer, IntPtr sizeOfBuffer);

#endif // !FEATURE_PAL
#endif // !SILVERLIGHT 

    } 
 
}

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.

                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK