2016-08-03 10:59:49 +00:00
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// <copyright file="UnsafeNativeMethods.cs" company="Microsoft">
|
|
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
|
|
// </copyright>
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
namespace Microsoft.Win32 {
|
|
|
|
using System.Runtime.InteropServices;
|
|
|
|
using System.Runtime.Versioning;
|
|
|
|
using System;
|
|
|
|
using System.Diagnostics;
|
|
|
|
using System.Diagnostics.CodeAnalysis;
|
|
|
|
#if !SILVERLIGHT
|
|
|
|
using System.Threading;
|
|
|
|
using System.Security.Permissions;
|
|
|
|
using System.Collections;
|
|
|
|
using System.IO;
|
|
|
|
using System.Text;
|
|
|
|
using Microsoft.Win32;
|
|
|
|
using Microsoft.Win32.SafeHandles;
|
|
|
|
using System.Configuration;
|
|
|
|
|
|
|
|
[HostProtectionAttribute(MayLeakOnAbort = true)]
|
|
|
|
[System.Security.SuppressUnmanagedCodeSecurity]
|
|
|
|
#endif // !SILVERLIGHT
|
|
|
|
internal static class UnsafeNativeMethods {
|
|
|
|
|
|
|
|
[DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto)]
|
|
|
|
[ResourceExposure(ResourceScope.Machine)]
|
|
|
|
public static extern IntPtr GetStdHandle(int type);
|
|
|
|
|
|
|
|
#if !FEATURE_PAL && !FEATURE_CORESYSTEM
|
|
|
|
[DllImport(ExternDll.User32, CharSet = System.Runtime.InteropServices.CharSet.Auto)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
public static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);
|
|
|
|
|
|
|
|
[DllImport(ExternDll.User32, CharSet = System.Runtime.InteropServices.CharSet.Auto)]
|
|
|
|
[ResourceExposure(ResourceScope.Machine)]
|
|
|
|
public static extern IntPtr GetDC(IntPtr hWnd);
|
|
|
|
|
|
|
|
[SuppressMessage("Microsoft.Security", "CA2118:ReviewSuppressUnmanagedCodeSecurityUsage", Justification = "reviewed")]
|
|
|
|
[DllImport(ExternDll.Gdi32, CharSet = System.Runtime.InteropServices.CharSet.Auto)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject);
|
|
|
|
|
|
|
|
[DllImport(ExternDll.User32, CharSet = System.Runtime.InteropServices.CharSet.Auto)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
public static extern int GetSystemMetrics(int nIndex);
|
|
|
|
#endif // !FEATURE_PAL && !FEATURE_CORESYSTEM
|
|
|
|
|
|
|
|
#if !SILVERLIGHT
|
|
|
|
[DllImport(ExternDll.User32, ExactSpelling=true)]
|
|
|
|
[ResourceExposure(ResourceScope.Process)]
|
|
|
|
public static extern IntPtr GetProcessWindowStation();
|
|
|
|
[DllImport(ExternDll.User32, SetLastError=true)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
public static extern bool GetUserObjectInformation(HandleRef hObj, int nIndex, [MarshalAs(UnmanagedType.LPStruct)] NativeMethods.USEROBJECTFLAGS pvBuffer, int nLength, ref int lpnLengthNeeded);
|
|
|
|
[DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto, BestFitMapping=false)]
|
|
|
|
[ResourceExposure(ResourceScope.Machine)]
|
|
|
|
public static extern IntPtr GetModuleHandle(string modName);
|
|
|
|
[DllImport(ExternDll.User32, CharSet=System.Runtime.InteropServices.CharSet.Auto, BestFitMapping=false)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
public static extern bool GetClassInfo(HandleRef hInst, string lpszClass, [In, Out] NativeMethods.WNDCLASS_I wc);
|
|
|
|
|
|
|
|
[DllImport(ExternDll.User32, ExactSpelling = true, CharSet = CharSet.Auto)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
public static extern bool IsWindow(HandleRef hWnd);
|
|
|
|
|
|
|
|
//SetClassLong won't work correctly for 64-bit: we should use SetClassLongPtr instead. On
|
|
|
|
//32-bit, SetClassLongPtr is just #defined as SetClassLong. SetClassLong really should
|
|
|
|
//take/return int instead of IntPtr/HandleRef, but since we're running this only for 32-bit
|
|
|
|
//it'll be OK.
|
|
|
|
public static IntPtr SetClassLong(HandleRef hWnd, int nIndex, IntPtr dwNewLong) {
|
|
|
|
if (IntPtr.Size == 4) {
|
|
|
|
return SetClassLongPtr32(hWnd, nIndex, dwNewLong);
|
|
|
|
}
|
|
|
|
return SetClassLongPtr64(hWnd, nIndex, dwNewLong);
|
|
|
|
}
|
|
|
|
[DllImport(ExternDll.User32, CharSet = System.Runtime.InteropServices.CharSet.Auto, EntryPoint = "SetClassLong")]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
[SuppressMessage("Microsoft.Portability", "CA1901:PInvokeDeclarationsShouldBePortable")]
|
|
|
|
public static extern IntPtr SetClassLongPtr32(HandleRef hwnd, int nIndex, IntPtr dwNewLong);
|
|
|
|
[SuppressMessage("Microsoft.Interoperability", "CA1400:PInvokeEntryPointsShouldExist")]
|
|
|
|
[DllImport(ExternDll.User32, CharSet = System.Runtime.InteropServices.CharSet.Auto, EntryPoint = "SetClassLongPtr")]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
public static extern IntPtr SetClassLongPtr64(HandleRef hwnd, int nIndex, IntPtr dwNewLong);
|
|
|
|
|
|
|
|
//SetWindowLong won't work correctly for 64-bit: we should use SetWindowLongPtr instead. On
|
|
|
|
//32-bit, SetWindowLongPtr is just #defined as SetWindowLong. SetWindowLong really should
|
|
|
|
//take/return int instead of IntPtr/HandleRef, but since we're running this only for 32-bit
|
|
|
|
//it'll be OK.
|
|
|
|
public static IntPtr SetWindowLong(HandleRef hWnd, int nIndex, HandleRef dwNewLong)
|
|
|
|
{
|
|
|
|
if (IntPtr.Size == 4)
|
|
|
|
{
|
|
|
|
return SetWindowLongPtr32(hWnd, nIndex, dwNewLong);
|
|
|
|
}
|
|
|
|
return SetWindowLongPtr64(hWnd, nIndex, dwNewLong);
|
|
|
|
}
|
|
|
|
[SuppressMessage("Microsoft.Portability", "CA1901:PInvokeDeclarationsShouldBePortable")]
|
|
|
|
[DllImport(ExternDll.User32, CharSet = CharSet.Auto, EntryPoint = "SetWindowLong")]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
public static extern IntPtr SetWindowLongPtr32(HandleRef hWnd, int nIndex, HandleRef dwNewLong);
|
|
|
|
[SuppressMessage("Microsoft.Interoperability", "CA1400:PInvokeEntryPointsShouldExist")]
|
|
|
|
[DllImport(ExternDll.User32, CharSet = CharSet.Auto, EntryPoint = "SetWindowLongPtr")]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
public static extern IntPtr SetWindowLongPtr64(HandleRef hWnd, int nIndex, HandleRef dwNewLong);
|
|
|
|
|
|
|
|
|
|
|
|
[DllImport(ExternDll.User32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true, BestFitMapping=false)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
public static extern short RegisterClass(NativeMethods.WNDCLASS wc);
|
|
|
|
[DllImport(ExternDll.User32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true, BestFitMapping=false)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
public static extern short UnregisterClass(string lpClassName, HandleRef hInstance);
|
|
|
|
[DllImport(ExternDll.User32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true, BestFitMapping=true)]
|
|
|
|
[ResourceExposure(ResourceScope.Process)]
|
|
|
|
public static extern IntPtr CreateWindowEx(int exStyle, string lpszClassName, string lpszWindowName, int style, int x, int y, int width,
|
|
|
|
int height, HandleRef hWndParent, HandleRef hMenu, HandleRef hInst, [MarshalAs(UnmanagedType.AsAny)] object pvParam);
|
|
|
|
[DllImport(ExternDll.User32, CharSet=System.Runtime.InteropServices.CharSet.Auto)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
public static extern IntPtr SendMessage(HandleRef hWnd, int msg, IntPtr wParam, IntPtr lParam);
|
|
|
|
[DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto)]
|
|
|
|
[ResourceExposure(ResourceScope.Process)]
|
|
|
|
public static extern bool SetConsoleCtrlHandler(NativeMethods.ConHndlr handler, int add);
|
|
|
|
[DllImport(ExternDll.User32, CharSet=System.Runtime.InteropServices.CharSet.Auto)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
public static extern IntPtr DefWindowProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
|
|
|
|
|
|
|
|
[DllImport(ExternDll.User32, CharSet=System.Runtime.InteropServices.CharSet.Auto)]
|
|
|
|
[ResourceExposure(ResourceScope.Process)]
|
|
|
|
public static extern bool DestroyWindow(HandleRef hWnd);
|
|
|
|
|
|
|
|
[DllImport(ExternDll.User32, ExactSpelling=true, CharSet=CharSet.Auto)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
public static extern int MsgWaitForMultipleObjectsEx(int nCount, IntPtr pHandles, int dwMilliseconds, int dwWakeMask, int dwFlags);
|
|
|
|
|
|
|
|
[DllImport(ExternDll.User32, CharSet=System.Runtime.InteropServices.CharSet.Auto)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
public static extern int DispatchMessage([In] ref NativeMethods.MSG msg);
|
|
|
|
|
|
|
|
[DllImport(ExternDll.User32, CharSet=System.Runtime.InteropServices.CharSet.Auto)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
public static extern bool PeekMessage([In, Out] ref NativeMethods.MSG msg, HandleRef hwnd, int msgMin, int msgMax, int remove);
|
|
|
|
[DllImport(ExternDll.User32, CharSet=System.Runtime.InteropServices.CharSet.Auto)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
public static extern IntPtr SetTimer(HandleRef hWnd, HandleRef nIDEvent, int uElapse, HandleRef lpTimerProc);
|
|
|
|
|
|
|
|
[DllImport(ExternDll.User32, CharSet=System.Runtime.InteropServices.CharSet.Auto)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
public static extern bool KillTimer(HandleRef hwnd, HandleRef idEvent);
|
|
|
|
|
|
|
|
[DllImport(ExternDll.User32, CharSet=System.Runtime.InteropServices.CharSet.Auto)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
public static extern bool TranslateMessage([In, Out] ref NativeMethods.MSG msg);
|
|
|
|
[DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Ansi, BestFitMapping=false)]
|
|
|
|
[ResourceExposure(ResourceScope.Process)]
|
|
|
|
public static extern IntPtr GetProcAddress(HandleRef hModule, string lpProcName);
|
|
|
|
|
|
|
|
[DllImport(ExternDll.User32, CharSet=System.Runtime.InteropServices.CharSet.Auto)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
public static extern bool PostMessage(HandleRef hwnd, int msg, IntPtr wparam, IntPtr lparam);
|
|
|
|
|
|
|
|
[DllImport(ExternDll.Wtsapi32, CharSet=System.Runtime.InteropServices.CharSet.Auto)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
public static extern bool WTSRegisterSessionNotification(HandleRef hWnd, int dwFlags);
|
|
|
|
|
|
|
|
[DllImport(ExternDll.Wtsapi32, CharSet=System.Runtime.InteropServices.CharSet.Auto)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
public static extern bool WTSUnRegisterSessionNotification(HandleRef hWnd);
|
|
|
|
|
2016-11-10 13:04:39 +00:00
|
|
|
private static IntPtr GetCurrentProcessToken() { return new IntPtr(-4); }
|
|
|
|
|
|
|
|
private const int ERROR_SUCCESS = 0;
|
|
|
|
|
|
|
|
enum AppPolicyClrCompat
|
|
|
|
{
|
|
|
|
AppPolicyClrCompat_Others = 0,
|
|
|
|
AppPolicyClrCompat_ClassicDesktop = 1,
|
|
|
|
AppPolicyClrCompat_Universal = 2,
|
|
|
|
AppPolicyClrCompat_PackagedDesktop = 3
|
|
|
|
};
|
|
|
|
|
|
|
|
[DllImport(ExternDll.Kernel32, CharSet = CharSet.None, EntryPoint = "AppPolicyGetClrCompat")]
|
|
|
|
[System.Security.SecuritySafeCritical]
|
|
|
|
[return: MarshalAs(UnmanagedType.I4)]
|
|
|
|
private static extern Int32 _AppPolicyGetClrCompat(IntPtr processToken, out AppPolicyClrCompat appPolicyClrCompat);
|
|
|
|
|
2016-08-03 10:59:49 +00:00
|
|
|
private const int ERROR_INSUFFICIENT_BUFFER = 0x007A;
|
|
|
|
private const int ERROR_NO_PACKAGE_IDENTITY = 0x3d54;
|
|
|
|
|
|
|
|
// AppModel.h functions (Win8+)
|
|
|
|
[DllImport(ExternDll.Kernel32, CharSet = CharSet.None, EntryPoint = "GetCurrentPackageId")]
|
|
|
|
[System.Security.SecuritySafeCritical]
|
|
|
|
[return: MarshalAs(UnmanagedType.I4)]
|
|
|
|
private static extern Int32 _GetCurrentPackageId(ref Int32 pBufferLength, Byte[] pBuffer);
|
|
|
|
|
|
|
|
// Copied from Win32Native.cs
|
|
|
|
// Note - do NOT use this to call methods. Use P/Invoke, which will
|
|
|
|
// do much better things w.r.t. marshaling, pinning memory, security
|
|
|
|
// stuff, better interactions with thread aborts, etc. This is used
|
|
|
|
// solely by DoesWin32MethodExist for avoiding try/catch EntryPointNotFoundException
|
|
|
|
// in scenarios where an OS Version check is insufficient
|
|
|
|
[DllImport(ExternDll.Kernel32, CharSet=CharSet.Ansi, BestFitMapping=false, SetLastError=true, ExactSpelling=true)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
private static extern IntPtr GetProcAddress(IntPtr hModule, String methodName);
|
|
|
|
|
|
|
|
[System.Security.SecurityCritical] // auto-generated
|
|
|
|
private static bool DoesWin32MethodExist(String moduleName, String methodName)
|
|
|
|
{
|
|
|
|
// GetModuleHandle does not increment the module's ref count, so we don't need to call FreeLibrary.
|
|
|
|
IntPtr hModule = GetModuleHandle(moduleName);
|
|
|
|
if (hModule == IntPtr.Zero) {
|
|
|
|
Debug.Assert(hModule != IntPtr.Zero, "GetModuleHandle failed. Dll isn't loaded?");
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
IntPtr functionPointer = GetProcAddress(hModule, methodName);
|
|
|
|
return (functionPointer != IntPtr.Zero);
|
|
|
|
}
|
|
|
|
|
|
|
|
[System.Security.SecuritySafeCritical]
|
|
|
|
private static bool _IsPackagedProcess()
|
|
|
|
{
|
2016-11-10 13:04:39 +00:00
|
|
|
Version windows8Version = new Version(6, 2, 0, 0);
|
2016-08-03 10:59:49 +00:00
|
|
|
OperatingSystem os = Environment.OSVersion;
|
2016-11-10 13:04:39 +00:00
|
|
|
bool osSupportsPackagedProcesses = os.Platform == PlatformID.Win32NT && os.Version >= windows8Version;
|
|
|
|
|
|
|
|
if (osSupportsPackagedProcesses && DoesWin32MethodExist(ExternDll.Kernel32, "AppPolicyGetClrCompat"))
|
|
|
|
{
|
|
|
|
// Use AppPolicyGetClrCompat if it is available. Return true if and only if this is a UWA which means if
|
|
|
|
// this is packaged desktop app this method will return false. This may cause some confusion however
|
|
|
|
// this is necessary to make the behavior of packaged desktop apps identical to desktop apps.
|
|
|
|
AppPolicyClrCompat appPolicyClrCompat;
|
|
|
|
return _AppPolicyGetClrCompat(GetCurrentProcessToken(), out appPolicyClrCompat) == ERROR_SUCCESS &&
|
|
|
|
appPolicyClrCompat == AppPolicyClrCompat.AppPolicyClrCompat_Universal;
|
|
|
|
}
|
|
|
|
else if(osSupportsPackagedProcesses && DoesWin32MethodExist(ExternDll.Kernel32, "GetCurrentPackageId"))
|
2016-08-03 10:59:49 +00:00
|
|
|
{
|
|
|
|
Int32 bufLen = 0;
|
|
|
|
// Will return ERROR_INSUFFICIENT_BUFFER when running within a packaged application,
|
|
|
|
// and will return ERROR_NO_PACKAGE_IDENTITY otherwise.
|
|
|
|
return _GetCurrentPackageId(ref bufLen, null) == ERROR_INSUFFICIENT_BUFFER;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{ // We must be running on a downlevel OS.
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
[System.Security.SecuritySafeCritical]
|
|
|
|
internal static Lazy<bool> IsPackagedProcess = new Lazy<bool>(() => _IsPackagedProcess());
|
|
|
|
|
|
|
|
|
|
|
|
// File src\services\system\io\unsafenativemethods.cs
|
|
|
|
|
|
|
|
public const int FILE_READ_DATA = (0x0001),
|
|
|
|
FILE_LIST_DIRECTORY = (0x0001),
|
|
|
|
FILE_WRITE_DATA = (0x0002),
|
|
|
|
FILE_ADD_FILE = (0x0002),
|
|
|
|
FILE_APPEND_DATA = (0x0004),
|
|
|
|
FILE_ADD_SUBDIRECTORY = (0x0004),
|
|
|
|
FILE_CREATE_PIPE_INSTANCE = (0x0004),
|
|
|
|
FILE_READ_EA = (0x0008),
|
|
|
|
FILE_WRITE_EA = (0x0010),
|
|
|
|
FILE_EXECUTE = (0x0020),
|
|
|
|
FILE_TRAVERSE = (0x0020),
|
|
|
|
FILE_DELETE_CHILD = (0x0040),
|
|
|
|
FILE_READ_ATTRIBUTES = (0x0080),
|
|
|
|
FILE_WRITE_ATTRIBUTES = (0x0100),
|
|
|
|
FILE_SHARE_READ = 0x00000001,
|
|
|
|
FILE_SHARE_WRITE = 0x00000002,
|
|
|
|
FILE_SHARE_DELETE = 0x00000004,
|
|
|
|
FILE_ATTRIBUTE_READONLY = 0x00000001,
|
|
|
|
FILE_ATTRIBUTE_HIDDEN = 0x00000002,
|
|
|
|
FILE_ATTRIBUTE_SYSTEM = 0x00000004,
|
|
|
|
FILE_ATTRIBUTE_DIRECTORY = 0x00000010,
|
|
|
|
FILE_ATTRIBUTE_ARCHIVE = 0x00000020,
|
|
|
|
FILE_ATTRIBUTE_NORMAL = 0x00000080,
|
|
|
|
FILE_ATTRIBUTE_TEMPORARY = 0x00000100,
|
|
|
|
FILE_ATTRIBUTE_COMPRESSED = 0x00000800,
|
|
|
|
FILE_ATTRIBUTE_OFFLINE = 0x00001000,
|
|
|
|
FILE_NOTIFY_CHANGE_FILE_NAME = 0x00000001,
|
|
|
|
FILE_NOTIFY_CHANGE_DIR_NAME = 0x00000002,
|
|
|
|
FILE_NOTIFY_CHANGE_ATTRIBUTES = 0x00000004,
|
|
|
|
FILE_NOTIFY_CHANGE_SIZE = 0x00000008,
|
|
|
|
FILE_NOTIFY_CHANGE_LAST_WRITE = 0x00000010,
|
|
|
|
FILE_NOTIFY_CHANGE_LAST_ACCESS = 0x00000020,
|
|
|
|
FILE_NOTIFY_CHANGE_CREATION = 0x00000040,
|
|
|
|
FILE_NOTIFY_CHANGE_SECURITY = 0x00000100,
|
|
|
|
FILE_ACTION_ADDED = 0x00000001,
|
|
|
|
FILE_ACTION_REMOVED = 0x00000002,
|
|
|
|
FILE_ACTION_MODIFIED = 0x00000003,
|
|
|
|
FILE_ACTION_RENAMED_OLD_NAME = 0x00000004,
|
|
|
|
FILE_ACTION_RENAMED_NEW_NAME = 0x00000005,
|
|
|
|
FILE_CASE_SENSITIVE_SEARCH = 0x00000001,
|
|
|
|
FILE_CASE_PRESERVED_NAMES = 0x00000002,
|
|
|
|
FILE_UNICODE_ON_DISK = 0x00000004,
|
|
|
|
FILE_PERSISTENT_ACLS = 0x00000008,
|
|
|
|
FILE_FILE_COMPRESSION = 0x00000010,
|
|
|
|
OPEN_EXISTING = 3,
|
|
|
|
OPEN_ALWAYS = 4,
|
|
|
|
FILE_FLAG_WRITE_THROUGH = unchecked((int)0x80000000),
|
|
|
|
FILE_FLAG_OVERLAPPED = 0x40000000,
|
|
|
|
FILE_FLAG_NO_BUFFERING = 0x20000000,
|
|
|
|
FILE_FLAG_RANDOM_ACCESS = 0x10000000,
|
|
|
|
FILE_FLAG_SEQUENTIAL_SCAN = 0x08000000,
|
|
|
|
FILE_FLAG_DELETE_ON_CLOSE = 0x04000000,
|
|
|
|
FILE_FLAG_BACKUP_SEMANTICS = 0x02000000,
|
|
|
|
FILE_FLAG_POSIX_SEMANTICS = 0x01000000,
|
|
|
|
FILE_TYPE_UNKNOWN = 0x0000,
|
|
|
|
FILE_TYPE_DISK = 0x0001,
|
|
|
|
FILE_TYPE_CHAR = 0x0002,
|
|
|
|
FILE_TYPE_PIPE = 0x0003,
|
|
|
|
FILE_TYPE_REMOTE = unchecked((int)0x8000),
|
|
|
|
FILE_VOLUME_IS_COMPRESSED = 0x00008000;
|
|
|
|
|
|
|
|
[SuppressMessage("Microsoft.Security", "CA2118:ReviewSuppressUnmanagedCodeSecurityUsage", Justification = "reviewed")]
|
|
|
|
[DllImport(ExternDll.Advapi32, CharSet=System.Runtime.InteropServices.CharSet.Unicode, SetLastError=true)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
public extern static int LookupAccountSid(string systemName, byte[] pSid, StringBuilder szUserName, ref int userNameSize, StringBuilder szDomainName, ref int domainNameSize, ref int eUse);
|
|
|
|
|
|
|
|
public const int GetFileExInfoStandard = 0;
|
|
|
|
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
|
|
public struct WIN32_FILE_ATTRIBUTE_DATA {
|
|
|
|
internal int fileAttributes;
|
|
|
|
internal uint ftCreationTimeLow;
|
|
|
|
internal uint ftCreationTimeHigh;
|
|
|
|
internal uint ftLastAccessTimeLow;
|
|
|
|
internal uint ftLastAccessTimeHigh;
|
|
|
|
internal uint ftLastWriteTimeLow;
|
|
|
|
internal uint ftLastWriteTimeHigh;
|
|
|
|
internal uint fileSizeHigh;
|
|
|
|
internal uint fileSizeLow;
|
|
|
|
}
|
|
|
|
|
|
|
|
// file Windows Forms
|
|
|
|
[DllImport(ExternDll.Version, CharSet=CharSet.Auto, SetLastError=true, BestFitMapping=false)]
|
|
|
|
[ResourceExposure(ResourceScope.Machine)]
|
|
|
|
public static extern int GetFileVersionInfoSize(string lptstrFilename, out int handle);
|
|
|
|
[DllImport(ExternDll.Version, CharSet=CharSet.Auto, BestFitMapping=false)]
|
|
|
|
[ResourceExposure(ResourceScope.Machine)]
|
|
|
|
public static extern bool GetFileVersionInfo(string lptstrFilename, int dwHandle, int dwLen, HandleRef lpData);
|
|
|
|
[SuppressMessage("Microsoft.Security", "CA2118:ReviewSuppressUnmanagedCodeSecurityUsage")]
|
|
|
|
[SuppressMessage("Microsoft.Security", "CA2101:SpecifyMarshalingForPInvokeStringArguments")]
|
|
|
|
[DllImport(ExternDll.Kernel32, CharSet=CharSet.Auto)]
|
|
|
|
[ResourceExposure(ResourceScope.Machine)]
|
|
|
|
public static extern int GetModuleFileName(HandleRef hModule, StringBuilder buffer, int length);
|
|
|
|
[DllImport(ExternDll.Version, CharSet=CharSet.Auto, BestFitMapping=false)]
|
|
|
|
[ResourceExposure(ResourceScope.Process)] // Review usages to see if versioning problems exist in distant callers
|
|
|
|
public static extern bool VerQueryValue(HandleRef pBlock, string lpSubBlock, [In, Out] ref IntPtr lplpBuffer, out int len);
|
|
|
|
[DllImport(ExternDll.Version, CharSet=CharSet.Auto, BestFitMapping=true)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
public static extern int VerLanguageName( int langID, StringBuilder lpBuffer, int nSize);
|
|
|
|
|
|
|
|
[DllImport(ExternDll.Advapi32, CharSet=System.Runtime.InteropServices.CharSet.Unicode, SetLastError=true)]
|
|
|
|
[ResourceExposure(ResourceScope.Machine)]
|
|
|
|
public static extern bool ReportEvent(SafeHandle hEventLog, short type, ushort category,
|
|
|
|
uint eventID, byte[] userSID, short numStrings, int dataLen, HandleRef strings,
|
|
|
|
byte[] rawData);
|
|
|
|
[DllImport(ExternDll.Advapi32, CharSet=System.Runtime.InteropServices.CharSet.Unicode, SetLastError=true)]
|
|
|
|
[ResourceExposure(ResourceScope.Machine)]
|
|
|
|
public static extern bool ClearEventLog(SafeHandle hEventLog, HandleRef lpctstrBackupFileName);
|
|
|
|
[DllImport(ExternDll.Advapi32, CharSet=System.Runtime.InteropServices.CharSet.Unicode, SetLastError=true)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
public static extern bool GetNumberOfEventLogRecords(SafeHandle hEventLog, out int count);
|
|
|
|
[DllImport(ExternDll.Advapi32, CharSet=System.Runtime.InteropServices.CharSet.Unicode, SetLastError=true)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
[return: MarshalAs(UnmanagedType.Bool)]
|
|
|
|
[SuppressMessage("Microsoft.Security", "CA2118:ReviewSuppressUnmanagedCodeSecurityUsage", Justification = "[....]: EventLog is protected by EventLogPermission")]
|
|
|
|
public static extern bool GetOldestEventLogRecord(SafeHandle hEventLog, out int number);
|
|
|
|
[DllImport(ExternDll.Advapi32, CharSet=System.Runtime.InteropServices.CharSet.Unicode, SetLastError=true)]
|
|
|
|
[ResourceExposure(ResourceScope.Machine)]
|
|
|
|
[return: MarshalAs(UnmanagedType.Bool)]
|
|
|
|
[SuppressMessage("Microsoft.Security", "CA2118:ReviewSuppressUnmanagedCodeSecurityUsage", Justification = "[....]: EventLog is protected by EventLogPermission")]
|
|
|
|
public static extern bool ReadEventLog(SafeHandle hEventLog, int dwReadFlags,
|
|
|
|
int dwRecordOffset, byte[] buffer, int numberOfBytesToRead, out int bytesRead,
|
|
|
|
out int minNumOfBytesNeeded);
|
|
|
|
[DllImport(ExternDll.Advapi32, CharSet=System.Runtime.InteropServices.CharSet.Unicode, SetLastError=true)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
[return: MarshalAs(UnmanagedType.Bool)]
|
|
|
|
[SuppressMessage("Microsoft.Security", "CA2118:ReviewSuppressUnmanagedCodeSecurityUsage", Justification = "[....]: EventLog is protected by EventLogPermission")]
|
|
|
|
public static extern bool NotifyChangeEventLog(SafeHandle hEventLog, SafeWaitHandle hEvent);
|
|
|
|
|
|
|
|
[DllImport(ExternDll.Kernel32, EntryPoint="ReadDirectoryChangesW", CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
public unsafe static extern bool ReadDirectoryChangesW(SafeFileHandle hDirectory, HandleRef lpBuffer,
|
|
|
|
int nBufferLength, int bWatchSubtree, int dwNotifyFilter, out int lpBytesReturned,
|
|
|
|
NativeOverlapped* overlappedPointer, HandleRef lpCompletionRoutine);
|
|
|
|
|
|
|
|
//////////////////// Serial Port structs ////////////////////
|
|
|
|
// Declaration for C# representation of Win32 Device Control Block (DCB)
|
|
|
|
// structure. Note that all flag properties are encapsulated in the Flags field here,
|
|
|
|
// and accessed/set through SerialStream's GetDcbFlag(...) and SetDcbFlag(...) methods.
|
|
|
|
internal struct DCB
|
|
|
|
{
|
|
|
|
|
|
|
|
public uint DCBlength;
|
|
|
|
public uint BaudRate;
|
|
|
|
public uint Flags;
|
|
|
|
public ushort wReserved;
|
|
|
|
public ushort XonLim;
|
|
|
|
public ushort XoffLim;
|
|
|
|
public byte ByteSize;
|
|
|
|
public byte Parity;
|
|
|
|
public byte StopBits;
|
|
|
|
public byte XonChar;
|
|
|
|
public byte XoffChar;
|
|
|
|
public byte ErrorChar;
|
|
|
|
public byte EofChar;
|
|
|
|
public byte EvtChar;
|
|
|
|
public ushort wReserved1;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Declaration for C# representation of Win32 COMSTAT structure associated with
|
|
|
|
// a file handle to a serial communications resource. SerialStream's
|
|
|
|
// InBufferBytes and OutBufferBytes directly expose cbInQue and cbOutQue to reading, respectively.
|
|
|
|
internal struct COMSTAT
|
|
|
|
{
|
|
|
|
public uint Flags;
|
|
|
|
public uint cbInQue;
|
|
|
|
public uint cbOutQue;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Declaration for C# representation of Win32 COMMTIMEOUTS
|
|
|
|
// structure associated with a file handle to a serial communications resource.
|
|
|
|
///Currently the only set fields are ReadTotalTimeoutConstant
|
|
|
|
// and WriteTotalTimeoutConstant.
|
|
|
|
internal struct COMMTIMEOUTS
|
|
|
|
{
|
|
|
|
public int ReadIntervalTimeout;
|
|
|
|
public int ReadTotalTimeoutMultiplier;
|
|
|
|
public int ReadTotalTimeoutConstant;
|
|
|
|
public int WriteTotalTimeoutMultiplier;
|
|
|
|
public int WriteTotalTimeoutConstant;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Declaration for C# representation of Win32 COMMPROP
|
|
|
|
// structure associated with a file handle to a serial communications resource.
|
|
|
|
// Currently the only fields used are dwMaxTxQueue, dwMaxRxQueue, and dwMaxBaud
|
|
|
|
// to ensure that users provide appropriate settings to the SerialStream constructor.
|
|
|
|
internal struct COMMPROP
|
|
|
|
{
|
|
|
|
public ushort wPacketLength;
|
|
|
|
public ushort wPacketVersion;
|
|
|
|
public int dwServiceMask;
|
|
|
|
public int dwReserved1;
|
|
|
|
public int dwMaxTxQueue;
|
|
|
|
public int dwMaxRxQueue;
|
|
|
|
public int dwMaxBaud;
|
|
|
|
public int dwProvSubType;
|
|
|
|
public int dwProvCapabilities;
|
|
|
|
public int dwSettableParams;
|
|
|
|
public int dwSettableBaud;
|
|
|
|
public ushort wSettableData;
|
|
|
|
public ushort wSettableStopParity;
|
|
|
|
public int dwCurrentTxQueue;
|
|
|
|
public int dwCurrentRxQueue;
|
|
|
|
public int dwProvSpec1;
|
|
|
|
public int dwProvSpec2;
|
|
|
|
public char wcProvChar;
|
|
|
|
}
|
|
|
|
//////////////////// end Serial Port structs ////////////////////
|
|
|
|
|
|
|
|
//////////////////// Serial Port methods ////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[DllImport(ExternDll.Kernel32, SetLastError=true, CharSet=CharSet.Auto, BestFitMapping=false)]
|
|
|
|
[ResourceExposure(ResourceScope.Machine)]
|
|
|
|
internal static extern SafeFileHandle CreateFile(String lpFileName,
|
|
|
|
int dwDesiredAccess, int dwShareMode,
|
|
|
|
IntPtr securityAttrs, int dwCreationDisposition,
|
|
|
|
int dwFlagsAndAttributes, IntPtr hTemplateFile);
|
|
|
|
|
|
|
|
[DllImport(ExternDll.Kernel32, SetLastError=true, CharSet=CharSet.Auto)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
internal static extern bool GetCommState(
|
|
|
|
SafeFileHandle hFile, // handle to communications device
|
|
|
|
ref DCB lpDCB // device-control block
|
|
|
|
);
|
|
|
|
|
|
|
|
[DllImport(ExternDll.Kernel32, SetLastError=true, CharSet=CharSet.Auto)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
internal static extern bool SetCommState(
|
|
|
|
SafeFileHandle hFile, // handle to communications device
|
|
|
|
ref DCB lpDCB // device-control block
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
[DllImport(ExternDll.Kernel32, SetLastError=true, CharSet=CharSet.Auto)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
internal static extern bool GetCommModemStatus(
|
|
|
|
SafeFileHandle hFile, // handle to communications device
|
|
|
|
ref int lpModemStat // control-register values
|
|
|
|
);
|
|
|
|
|
|
|
|
[DllImport(ExternDll.Kernel32, SetLastError=true, CharSet=CharSet.Auto)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
internal static extern bool SetupComm(
|
|
|
|
SafeFileHandle hFile, // handle to communications device
|
|
|
|
int dwInQueue, // size of input buffer
|
|
|
|
int dwOutQueue // size of output buffer
|
|
|
|
);
|
|
|
|
|
|
|
|
[DllImport(ExternDll.Kernel32, SetLastError=true, CharSet=CharSet.Auto)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
internal static extern bool SetCommTimeouts(
|
|
|
|
SafeFileHandle hFile, // handle to comm device
|
|
|
|
ref COMMTIMEOUTS lpCommTimeouts // time-out values
|
|
|
|
);
|
|
|
|
|
|
|
|
[DllImport(ExternDll.Kernel32, SetLastError=true, CharSet=CharSet.Auto)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
internal static extern bool SetCommBreak(
|
|
|
|
SafeFileHandle hFile // handle to comm device
|
|
|
|
);
|
|
|
|
|
|
|
|
[DllImport(ExternDll.Kernel32, SetLastError=true, CharSet=CharSet.Auto)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
internal static extern bool ClearCommBreak(
|
|
|
|
SafeFileHandle hFile // handle to comm device
|
|
|
|
);
|
|
|
|
|
|
|
|
[DllImport(ExternDll.Kernel32, SetLastError=true, CharSet=CharSet.Auto)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
internal static extern bool ClearCommError(
|
|
|
|
SafeFileHandle hFile, // handle to comm device
|
|
|
|
ref int lpErrors,
|
|
|
|
ref COMSTAT lpStat
|
|
|
|
);
|
|
|
|
|
|
|
|
[DllImport(ExternDll.Kernel32, SetLastError=true, CharSet=CharSet.Auto)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
internal static extern bool ClearCommError(
|
|
|
|
SafeFileHandle hFile, // handle to comm device
|
|
|
|
ref int lpErrors,
|
|
|
|
IntPtr lpStat
|
|
|
|
);
|
|
|
|
|
|
|
|
[DllImport(ExternDll.Kernel32, SetLastError=true, CharSet=CharSet.Auto)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
internal static extern bool PurgeComm(
|
|
|
|
SafeFileHandle hFile, // handle to communications resource
|
|
|
|
uint dwFlags // action to perform
|
|
|
|
);
|
|
|
|
|
|
|
|
[DllImport(ExternDll.Kernel32, SetLastError=true, CharSet=CharSet.Auto)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
internal static extern bool FlushFileBuffers(SafeFileHandle hFile);
|
|
|
|
|
|
|
|
[DllImport(ExternDll.Kernel32, SetLastError=true, CharSet=CharSet.Auto)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
internal static extern bool GetCommProperties(
|
|
|
|
SafeFileHandle hFile, // handle to comm device
|
|
|
|
ref COMMPROP lpCommProp // communications properties
|
|
|
|
);
|
|
|
|
|
|
|
|
// All actual file Read/Write methods, which are declared to be unsafe.
|
|
|
|
[DllImport(ExternDll.Kernel32, SetLastError=true)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
unsafe internal static extern int ReadFile(SafeFileHandle handle, byte* bytes, int numBytesToRead, IntPtr numBytesRead, NativeOverlapped* overlapped);
|
|
|
|
|
|
|
|
[DllImport(ExternDll.Kernel32, SetLastError=true)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
unsafe internal static extern int ReadFile(SafeFileHandle handle, byte* bytes, int numBytesToRead, out int numBytesRead, IntPtr overlapped);
|
|
|
|
|
|
|
|
[DllImport(ExternDll.Kernel32 , SetLastError=true)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
unsafe internal static extern int WriteFile(SafeFileHandle handle, byte* bytes, int numBytesToWrite, IntPtr numBytesWritten, NativeOverlapped* lpOverlapped);
|
|
|
|
|
|
|
|
[DllImport(ExternDll.Kernel32 , SetLastError=true)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
unsafe internal static extern int WriteFile(SafeFileHandle handle, byte* bytes, int numBytesToWrite, out int numBytesWritten, IntPtr lpOverlapped);
|
|
|
|
|
|
|
|
[DllImport(ExternDll.Kernel32 , SetLastError=true)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
internal static extern int GetFileType(
|
|
|
|
SafeFileHandle hFile // handle to file
|
|
|
|
);
|
|
|
|
[DllImport(ExternDll.Kernel32 , SetLastError=true)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
internal static extern bool EscapeCommFunction(
|
|
|
|
SafeFileHandle hFile, // handle to communications device
|
|
|
|
int dwFunc // extended function to perform
|
|
|
|
);
|
|
|
|
|
|
|
|
[DllImport(ExternDll.Kernel32 , SetLastError=true)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
unsafe internal static extern bool WaitCommEvent(
|
|
|
|
SafeFileHandle hFile, // handle to comm device
|
|
|
|
int* lpEvtMask, // event type
|
|
|
|
NativeOverlapped* lpOverlapped // overlapped structure
|
|
|
|
);
|
|
|
|
|
|
|
|
[DllImport(ExternDll.Kernel32, SetLastError=true, CharSet=CharSet.Auto)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
unsafe internal static extern bool SetCommMask(
|
|
|
|
SafeFileHandle hFile,
|
|
|
|
int dwEvtMask
|
|
|
|
);
|
|
|
|
|
|
|
|
[DllImport(ExternDll.Kernel32, SetLastError=true, CharSet=CharSet.Auto)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
unsafe internal static extern bool GetOverlappedResult(
|
|
|
|
SafeFileHandle hFile,
|
|
|
|
NativeOverlapped* lpOverlapped,
|
|
|
|
ref int lpNumberOfBytesTransferred,
|
|
|
|
bool bWait
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
//////////////////// end Serial Port methods ////////////////////
|
|
|
|
|
|
|
|
[DllImport(ExternDll.Advapi32, CharSet=CharSet.Auto, SetLastError=true)]
|
|
|
|
internal static extern
|
|
|
|
bool GetTokenInformation (
|
|
|
|
[In] IntPtr TokenHandle,
|
|
|
|
[In] uint TokenInformationClass,
|
|
|
|
[In] IntPtr TokenInformation,
|
|
|
|
[In] uint TokenInformationLength,
|
|
|
|
[Out] out uint ReturnLength);
|
|
|
|
|
|
|
|
internal const int TokenIsAppContainer = 29;
|
|
|
|
|
|
|
|
|
|
|
|
[ComImport, Guid("00000003-0000-0000-C000-000000000046"),
|
|
|
|
InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
|
|
|
|
internal interface IMarshal
|
|
|
|
{
|
|
|
|
[PreserveSig]
|
|
|
|
int GetUnmarshalClass(
|
|
|
|
ref Guid riid,
|
|
|
|
IntPtr pv,
|
|
|
|
int dwDestContext,
|
|
|
|
IntPtr pvDestContext,
|
|
|
|
int mshlflags,
|
|
|
|
out Guid pCid);
|
|
|
|
|
|
|
|
[PreserveSig]
|
|
|
|
int GetMarshalSizeMax(
|
|
|
|
ref Guid riid,
|
|
|
|
IntPtr pv,
|
|
|
|
int dwDestContext,
|
|
|
|
IntPtr pvDestContext,
|
|
|
|
int mshlflags,
|
|
|
|
out int pSize);
|
|
|
|
|
|
|
|
[PreserveSig]
|
|
|
|
int MarshalInterface(
|
|
|
|
IntPtr pStm,
|
|
|
|
ref Guid riid,
|
|
|
|
IntPtr pv,
|
|
|
|
int dwDestContext,
|
|
|
|
IntPtr pvDestContext,
|
|
|
|
int mshlflags);
|
|
|
|
|
|
|
|
[PreserveSig]
|
|
|
|
int UnmarshalInterface(
|
|
|
|
IntPtr pStm,
|
|
|
|
ref Guid riid,
|
|
|
|
out IntPtr ppv);
|
|
|
|
|
|
|
|
[PreserveSig]
|
|
|
|
int ReleaseMarshalData(IntPtr pStm);
|
|
|
|
|
|
|
|
[PreserveSig]
|
|
|
|
int DisconnectObject(int dwReserved);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
[DllImport(ExternDll.Ole32)]
|
|
|
|
[ResourceExposure(ResourceScope.None)]
|
|
|
|
internal static extern int CoGetStandardMarshal(
|
|
|
|
ref Guid riid,
|
|
|
|
IntPtr pv,
|
|
|
|
int dwDestContext,
|
|
|
|
IntPtr pvDestContext,
|
|
|
|
int mshlflags,
|
|
|
|
out IntPtr ppMarshal
|
|
|
|
);
|
|
|
|
|
|
|
|
#endif // !SILVERLIGHT
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|