From a13489c3c48c3c676033da4ff43db1fe8110ef3d Mon Sep 17 00:00:00 2001 From: Ilya Date: Fri, 22 Mar 2019 17:02:48 +0500 Subject: [PATCH 1/3] Remove unused code --- .../namespaces/Win32Native.cs | 719 ------------------ 1 file changed, 719 deletions(-) diff --git a/src/System.Management.Automation/namespaces/Win32Native.cs b/src/System.Management.Automation/namespaces/Win32Native.cs index a103304819b..de6821fe875 100644 --- a/src/System.Management.Automation/namespaces/Win32Native.cs +++ b/src/System.Management.Automation/namespaces/Win32Native.cs @@ -18,10 +18,8 @@ namespace Microsoft.PowerShell.Commands.Internal using System.Security; using System.Text; using System.Runtime.InteropServices; - using Microsoft.Win32; using System.Runtime.Versioning; using System.Management.Automation; - using System.Globalization; using System.Diagnostics.CodeAnalysis; using System.Runtime.ConstrainedExecution; @@ -166,722 +164,5 @@ internal static extern bool GetTokenInformation(IntPtr tokenHandle, out int returnLength); #endregion PInvoke Methods - - internal enum SECURITY_IMPERSONATION_LEVEL : short - { - Anonymous = 0, - Identification = 0x1, - Impersonation = 0x2, - Delegation = 0x4 - } - - // Security Quality of Service flags - internal const int SECURITY_ANONYMOUS = ((int)SECURITY_IMPERSONATION_LEVEL.Anonymous << 16); - internal const int SECURITY_SQOS_PRESENT = 0x00100000; - -#if !CORECLR // Only enable/port what is needed by CORE CLR. - - private const string resBaseName = "RegistryProviderStrings"; - internal const int KEY_QUERY_VALUE = 0x0001; - internal const int KEY_SET_VALUE = 0x0002; - internal const int KEY_CREATE_SUB_KEY = 0x0004; - internal const int KEY_ENUMERATE_SUB_KEYS = 0x0008; - internal const int KEY_NOTIFY = 0x0010; - internal const int KEY_CREATE_LINK = 0x0020; - internal const int KEY_READ = ((STANDARD_RIGHTS_READ | - KEY_QUERY_VALUE | - KEY_ENUMERATE_SUB_KEYS | - KEY_NOTIFY) - & - (~SYNCHRONIZE)); - - internal const int KEY_WRITE = ((STANDARD_RIGHTS_WRITE | - KEY_SET_VALUE | - KEY_CREATE_SUB_KEY) - & - (~SYNCHRONIZE)); - internal const int KEY_WOW64_64KEY = 0x100; - internal const int KEY_WOW64_32KEY = 0x200; - - internal const int REG_NONE = 0; // No value type - internal const int REG_SZ = 1; // Unicode nul terminated string - internal const int REG_EXPAND_SZ = 2; // Unicode nul terminated string - // (with environment variable references) - internal const int REG_BINARY = 3; // Free form binary - internal const int REG_DWORD = 4; // 32-bit number - internal const int REG_DWORD_LITTLE_ENDIAN = 4; // 32-bit number (same as REG_DWORD) - internal const int REG_DWORD_BIG_ENDIAN = 5; // 32-bit number - internal const int REG_LINK = 6; // Symbolic Link (unicode) - internal const int REG_MULTI_SZ = 7; // Multiple Unicode strings - internal const int REG_RESOURCE_LIST = 8; // Resource list in the resource map - internal const int REG_FULL_RESOURCE_DESCRIPTOR = 9; // Resource list in the hardware description - internal const int REG_RESOURCE_REQUIREMENTS_LIST = 10; - internal const int REG_QWORD = 11; // 64-bit number - - internal const int HWND_BROADCAST = 0xffff; - internal const int WM_SETTINGCHANGE = 0x001A; - - // CryptProtectMemory and CryptUnprotectMemory. - internal const uint CRYPTPROTECTMEMORY_BLOCK_SIZE = 16; - internal const uint CRYPTPROTECTMEMORY_SAME_PROCESS = 0x00; - internal const uint CRYPTPROTECTMEMORY_CROSS_PROCESS = 0x01; - internal const uint CRYPTPROTECTMEMORY_SAME_LOGON = 0x02; - - // Access Control library. - internal const string MICROSOFT_KERBEROS_NAME = "Kerberos"; - internal const uint ANONYMOUS_LOGON_LUID = 0x3e6; - - internal const int SECURITY_ANONYMOUS_LOGON_RID = 0x00000007; - internal const int SECURITY_AUTHENTICATED_USER_RID = 0x0000000B; - internal const int SECURITY_LOCAL_SYSTEM_RID = 0x00000012; - internal const int SECURITY_BUILTIN_DOMAIN_RID = 0x00000020; - internal const int DOMAIN_USER_RID_GUEST = 0x000001F5; - - internal const uint SE_GROUP_MANDATORY = 0x00000001; - internal const uint SE_GROUP_ENABLED_BY_DEFAULT = 0x00000002; - internal const uint SE_GROUP_ENABLED = 0x00000004; - internal const uint SE_GROUP_OWNER = 0x00000008; - internal const uint SE_GROUP_USE_FOR_DENY_ONLY = 0x00000010; - internal const uint SE_GROUP_LOGON_ID = 0xC0000000; - internal const uint SE_GROUP_RESOURCE = 0x20000000; - - internal const uint DUPLICATE_CLOSE_SOURCE = 0x00000001; - internal const uint DUPLICATE_SAME_ACCESS = 0x00000002; - internal const uint DUPLICATE_SAME_ATTRIBUTES = 0x00000004; - - // Win32 ACL-related constants: - internal const int READ_CONTROL = 0x00020000; - internal const int SYNCHRONIZE = 0x00100000; - - internal const int STANDARD_RIGHTS_READ = READ_CONTROL; - internal const int STANDARD_RIGHTS_WRITE = READ_CONTROL; - - // STANDARD_RIGHTS_REQUIRED (0x000F0000L) - // SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3) - - // SEMAPHORE and Event both use 0x0002 - // MUTEX uses 0x001 (MUTANT_QUERY_STATE) - - // Note that you may need to specify the SYNCHRONIZE bit as well - // to be able to open a synchronization primitive. - internal const int SEMAPHORE_MODIFY_STATE = 0x00000002; - internal const int EVENT_MODIFY_STATE = 0x00000002; - internal const int MUTEX_MODIFY_STATE = 0x00000001; - internal const int MUTEX_ALL_ACCESS = 0x001F0001; - - internal const int LMEM_FIXED = 0x0000; - internal const int LMEM_ZEROINIT = 0x0040; - internal const int LPTR = (LMEM_FIXED | LMEM_ZEROINIT); - - [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] - internal class OSVERSIONINFO - { - internal OSVERSIONINFO() - { - OSVersionInfoSize = (int)Marshal.SizeOf(this); - } - - // The OSVersionInfoSize field must be set to Marshal.SizeOf(this) - internal int OSVersionInfoSize = 0; - internal int MajorVersion = 0; - internal int MinorVersion = 0; - internal int BuildNumber = 0; - internal int PlatformId = 0; - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] - internal string CSDVersion = null; - } - - [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] - internal class OSVERSIONINFOEX - { - public OSVERSIONINFOEX() - { - OSVersionInfoSize = (int)Marshal.SizeOf(this); - } - - // The OSVersionInfoSize field must be set to Marshal.SizeOf(this) - internal int OSVersionInfoSize = 0; - internal int MajorVersion = 0; - internal int MinorVersion = 0; - internal int BuildNumber = 0; - internal int PlatformId = 0; - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] - internal string CSDVersion = null; - internal ushort ServicePackMajor = 0; - internal ushort ServicePackMinor = 0; - internal short SuiteMask = 0; - internal byte ProductType = 0; - internal byte Reserved = 0; - } - - [StructLayout(LayoutKind.Sequential)] - internal struct SYSTEM_INFO - { - internal int dwOemId; // This is a union of a DWORD and a struct containing 2 WORDs. - internal int dwPageSize; - internal IntPtr lpMinimumApplicationAddress; - internal IntPtr lpMaximumApplicationAddress; - internal IntPtr dwActiveProcessorMask; - internal int dwNumberOfProcessors; - internal int dwProcessorType; - internal int dwAllocationGranularity; - internal short wProcessorLevel; - internal short wProcessorRevision; - } - - [StructLayout(LayoutKind.Sequential)] - internal class SECURITY_ATTRIBUTES - { - internal int nLength = 0; - internal unsafe byte* pSecurityDescriptor = null; - internal int bInheritHandle = 0; - } - - [StructLayout(LayoutKind.Sequential), Serializable] - internal 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 int fileSizeHigh; - internal int fileSizeLow; - } - - [StructLayout(LayoutKind.Sequential)] - internal struct FILE_TIME - { - public FILE_TIME(long fileTime) - { - ftTimeLow = (uint)fileTime; - ftTimeHigh = (uint)(fileTime >> 32); - } - - public long ToTicks() - { - return ((long)ftTimeHigh << 32) + ftTimeLow; - } - - internal uint ftTimeLow; - internal uint ftTimeHigh; - } - - [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] - internal struct KERB_S4U_LOGON - { - internal uint MessageType; - internal uint Flags; - internal UNICODE_INTPTR_STRING ClientUpn; // REQUIRED: UPN for client - internal UNICODE_INTPTR_STRING ClientRealm; // Optional: Client Realm, if known - } - - [StructLayoutAttribute(LayoutKind.Sequential)] - internal struct LSA_OBJECT_ATTRIBUTES - { - internal int Length; - internal IntPtr RootDirectory; - internal IntPtr ObjectName; - internal int Attributes; - internal IntPtr SecurityDescriptor; - internal IntPtr SecurityQualityOfService; - } - - [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] - internal struct UNICODE_STRING - { - internal ushort Length; - internal ushort MaximumLength; - [MarshalAs(UnmanagedType.LPWStr)] - internal string Buffer; - } - - [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] - internal struct UNICODE_INTPTR_STRING - { - internal UNICODE_INTPTR_STRING(int length, int maximumLength, IntPtr buffer) - { - this.Length = (ushort)length; - this.MaxLength = (ushort)maximumLength; - this.Buffer = buffer; - } - - internal ushort Length; - internal ushort MaxLength; - internal IntPtr Buffer; - } - - [StructLayout(LayoutKind.Sequential)] - internal struct LSA_TRANSLATED_NAME - { - internal int Use; - internal UNICODE_INTPTR_STRING Name; - internal int DomainIndex; - } - - [StructLayoutAttribute(LayoutKind.Sequential)] - internal struct LSA_TRANSLATED_SID - { - internal int Use; - internal uint Rid; - internal int DomainIndex; - } - - [StructLayoutAttribute(LayoutKind.Sequential)] - internal struct LSA_TRANSLATED_SID2 - { - internal int Use; - internal IntPtr Sid; - internal int DomainIndex; - private uint Flags; - } - - [StructLayout(LayoutKind.Sequential)] - internal struct LSA_TRUST_INFORMATION - { - internal UNICODE_INTPTR_STRING Name; - internal IntPtr Sid; - } - - [StructLayout(LayoutKind.Sequential)] - internal struct LSA_REFERENCED_DOMAIN_LIST - { - internal int Entries; - internal IntPtr Domains; - } - - [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] - internal struct QUOTA_LIMITS - { - internal IntPtr PagedPoolLimit; - internal IntPtr NonPagedPoolLimit; - internal IntPtr MinimumWorkingSetSize; - internal IntPtr MaximumWorkingSetSize; - internal IntPtr PagefileLimit; - internal IntPtr TimeLimit; - } - - [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] - internal struct TOKEN_GROUPS - { - internal uint GroupCount; - internal SID_AND_ATTRIBUTES Groups; // SID_AND_ATTRIBUTES Groups[ANYSIZE_ARRAY]; - } - - [StructLayout(LayoutKind.Sequential)] - internal class MEMORYSTATUSEX - { - internal MEMORYSTATUSEX() - { - length = (int)Marshal.SizeOf(this); - } - - // The length field must be set to the size of this data structure. - internal int length; - internal int memoryLoad; - internal ulong totalPhys; - internal ulong availPhys; - internal ulong totalPageFile; - internal ulong availPageFile; - internal ulong totalVirtual; - internal ulong availVirtual; - internal ulong availExtendedVirtual; - } - - // Use only on Win9x - [StructLayout(LayoutKind.Sequential)] - internal class MEMORYSTATUS - { - internal MEMORYSTATUS() - { - length = (int)Marshal.SizeOf(this); - } - - // The length field must be set to the size of this data structure. - internal int length; - internal int memoryLoad; - internal uint totalPhys; - internal uint availPhys; - internal uint totalPageFile; - internal uint availPageFile; - internal uint totalVirtual; - internal uint availVirtual; - } - - [StructLayout(LayoutKind.Sequential)] - internal unsafe struct MEMORY_BASIC_INFORMATION - { - internal UIntPtr BaseAddress; - internal UIntPtr AllocationBase; - internal uint AllocationProtect; - internal UIntPtr RegionSize; - internal uint State; - internal uint Protect; - internal uint Type; - } - - internal const string KERNEL32 = "kernel32.dll"; - internal const string USER32 = "user32.dll"; - internal const string ADVAPI32 = "advapi32.dll"; - internal const string OLE32 = "ole32.dll"; - internal const string OLEAUT32 = "oleaut32.dll"; - internal const string SHFOLDER = "shfolder.dll"; - internal const string SHIM = "mscoree.dll"; - internal const string CRYPT32 = "crypt32.dll"; - internal const string SECUR32 = "secur32.dll"; - internal const string MSCORWKS = "mscorwks.dll"; - - internal const string LSTRCPY = "lstrcpy"; - internal const string LSTRCPYN = "lstrcpyn"; - internal const string LSTRLEN = "lstrlen"; - internal const string LSTRLENA = "lstrlenA"; - internal const string LSTRLENW = "lstrlenW"; - internal const string MOVEMEMORY = "RtlMoveMemory"; - - // From WinBase.h - internal const int SEM_FAILCRITICALERRORS = 1; - - [DllImport( - ADVAPI32, - EntryPoint = "GetSecurityDescriptorLength", - CallingConvention = CallingConvention.Winapi, - SetLastError = true, - CharSet = CharSet.Unicode)] - [ResourceExposure(ResourceScope.None)] - internal static extern DWORD GetSecurityDescriptorLength( - IntPtr byteArray); - - [DllImport( - ADVAPI32, - EntryPoint = "GetSecurityInfo", - CallingConvention = CallingConvention.Winapi, - SetLastError = true, - CharSet = CharSet.Unicode)] - [ResourceExposure(ResourceScope.None)] - internal static extern DWORD GetSecurityInfoByHandle( - SafeHandle handle, - DWORD objectType, - DWORD securityInformation, - out IntPtr sidOwner, - out IntPtr sidGroup, - out IntPtr dacl, - out IntPtr sacl, - out IntPtr securityDescriptor); - - [DllImport( - ADVAPI32, - EntryPoint = "SetSecurityInfo", - CallingConvention = CallingConvention.Winapi, - SetLastError = true, - CharSet = CharSet.Unicode)] - [ResourceExposure(ResourceScope.None)] - internal static extern DWORD SetSecurityInfoByHandle( - SafeHandle handle, - DWORD objectType, - DWORD securityInformation, - byte[] owner, - byte[] group, - byte[] dacl, - byte[] sacl); - - [DllImport(KERNEL32, SetLastError = true)] - [ResourceExposure(ResourceScope.None)] - [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] - internal static extern IntPtr LocalFree(IntPtr handle); - - internal static readonly IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1); // WinBase.h - internal static readonly IntPtr NULL = IntPtr.Zero; - - // Error codes from WinError.h - internal const int ERROR_SUCCESS = 0x0; - internal const int ERROR_INVALID_FUNCTION = 0x1; - internal const int ERROR_FILE_NOT_FOUND = 0x2; - internal const int ERROR_PATH_NOT_FOUND = 0x3; - internal const int ERROR_ACCESS_DENIED = 0x5; - internal const int ERROR_INVALID_HANDLE = 0x6; - internal const int ERROR_NOT_ENOUGH_MEMORY = 0x8; - internal const int ERROR_INVALID_DATA = 0xd; - internal const int ERROR_INVALID_DRIVE = 0xf; - internal const int ERROR_NO_MORE_FILES = 0x12; - internal const int ERROR_NOT_READY = 0x15; - internal const int ERROR_BAD_LENGTH = 0x18; - internal const int ERROR_SHARING_VIOLATION = 0x20; - internal const int ERROR_NOT_SUPPORTED = 0x32; - internal const int ERROR_FILE_EXISTS = 0x50; - internal const int ERROR_INVALID_PARAMETER = 0x57; - internal const int ERROR_CALL_NOT_IMPLEMENTED = 0x78; - internal const int ERROR_INVALID_NAME = 0x7B; - internal const int ERROR_BAD_PATHNAME = 0xA1; - internal const int ERROR_ALREADY_EXISTS = 0xB7; - internal const int ERROR_ENVVAR_NOT_FOUND = 0xCB; - internal const int ERROR_FILENAME_EXCED_RANGE = 0xCE; // filename too long. - internal const int ERROR_NO_DATA = 0xE8; - internal const int ERROR_PIPE_NOT_CONNECTED = 0xE9; - internal const int ERROR_MORE_DATA = 0xEA; - internal const int ERROR_OPERATION_ABORTED = 0x3E3; // 995; For IO Cancellation - internal const int ERROR_NO_TOKEN = 0x3f0; - internal const int ERROR_DLL_INIT_FAILED = 0x45A; - internal const int ERROR_NON_ACCOUNT_SID = 0x4E9; - internal const int ERROR_NOT_ALL_ASSIGNED = 0x514; - internal const int ERROR_UNKNOWN_REVISION = 0x519; - internal const int ERROR_INVALID_OWNER = 0x51B; - internal const int ERROR_INVALID_PRIMARY_GROUP = 0x51C; - internal const int ERROR_NO_SUCH_PRIVILEGE = 0x521; - internal const int ERROR_PRIVILEGE_NOT_HELD = 0x522; - internal const int ERROR_NONE_MAPPED = 0x534; - internal const int ERROR_INVALID_ACL = 0x538; - internal const int ERROR_INVALID_SID = 0x539; - internal const int ERROR_INVALID_SECURITY_DESCR = 0x53A; - internal const int ERROR_BAD_IMPERSONATION_LEVEL = 0x542; - internal const int ERROR_CANT_OPEN_ANONYMOUS = 0x543; - internal const int ERROR_NO_SECURITY_ON_OBJECT = 0x546; - internal const int ERROR_TRUSTED_RELATIONSHIP_FAILURE = 0x6FD; - - // These two values come from comments in WinError.h - internal const int ERROR_MIN_KTM_CODE = 6700; // 0x1A2C - internal const int ERROR_INVALID_TRANSACTION = 6700; // 0x1A2C - internal const int ERROR_MAX_KTM_CODE = 6799; // 0x1A8F; - - // Error codes from ntstatus.h - internal const uint STATUS_SUCCESS = 0x00000000; - internal const uint STATUS_SOME_NOT_MAPPED = 0x00000107; - internal const uint STATUS_NO_MEMORY = 0xC0000017; - internal const uint STATUS_OBJECT_NAME_NOT_FOUND = 0xC0000034; - internal const uint STATUS_NONE_MAPPED = 0xC0000073; - internal const uint STATUS_INSUFFICIENT_RESOURCES = 0xC000009A; - internal const uint STATUS_ACCESS_DENIED = 0xC0000022; - - internal const int INVALID_FILE_SIZE = -1; - - [DllImport(ADVAPI32, CharSet = CharSet.Auto, BestFitMapping = false)] - [ResourceExposure(ResourceScope.Machine)] - internal static extern int RegConnectRegistry(string machineName, - SafeRegistryHandle key, out SafeRegistryHandle result); - - // Note: RegCreateKeyEx won't set the last error on failure - it returns - // an error code if it fails. - [DllImport(ADVAPI32, CharSet = CharSet.Auto, BestFitMapping = false)] - [ResourceExposure(ResourceScope.Machine)] - internal static extern int RegCreateKeyEx(SafeRegistryHandle hKey, string lpSubKey, - int Reserved, string lpClass, int dwOptions, - int samDesigner, SECURITY_ATTRIBUTES lpSecurityAttributes, - out SafeRegistryHandle hkResult, out int lpdwDisposition); - - [DllImport(ADVAPI32, CharSet = CharSet.Auto, BestFitMapping = false)] - [ResourceExposure(ResourceScope.Machine)] - // Suppressed because there is no way for arbitrary data to be passed. - [SuppressMessage("Microsoft.Security", "CA2118:ReviewSuppressUnmanagedCodeSecurityUsage")] - internal static extern int RegDeleteKey(SafeRegistryHandle hKey, string lpSubKey); - - [DllImport(ADVAPI32, CharSet = CharSet.Auto, BestFitMapping = false)] - [ResourceExposure(ResourceScope.Machine)] - // Suppressed because there is no way for arbitrary data to be passed. - [SuppressMessage("Microsoft.Security", "CA2118:ReviewSuppressUnmanagedCodeSecurityUsage")] - internal static extern int RegDeleteKeyTransacted(SafeRegistryHandle hKey, string lpSubKey, int samDesired, - DWORD reserved, SafeTransactionHandle hTransaction, IntPtr pExtendedParameter); - - [DllImport(ADVAPI32, CharSet = CharSet.Auto, BestFitMapping = false)] - [ResourceExposure(ResourceScope.Machine)] - // Suppressed because there is no way for arbitrary data to be passed. - [SuppressMessage("Microsoft.Security", "CA2118:ReviewSuppressUnmanagedCodeSecurityUsage")] - internal static extern int RegDeleteValue(SafeRegistryHandle hKey, string lpValueName); - - [DllImport(ADVAPI32, CharSet = CharSet.Auto, BestFitMapping = false)] - [ResourceExposure(ResourceScope.None)] - // Suppressed because there is no way for arbitrary data to be passed. - [SuppressMessage("Microsoft.Security", "CA2118:ReviewSuppressUnmanagedCodeSecurityUsage")] - internal static extern int RegEnumKeyEx(SafeRegistryHandle hKey, int dwIndex, - StringBuilder lpName, out int lpcbName, int[] lpReserved, - StringBuilder lpClass, int[] lpcbClass, - long[] lpftLastWriteTime); - - [DllImport(PinvokeDllNames.RegEnumValueDllName, CharSet = CharSet.Auto, BestFitMapping = false)] - [ResourceExposure(ResourceScope.None)] - // Suppressed because there is no way for arbitrary data to be passed. - [SuppressMessage("Microsoft.Security", "CA2118:ReviewSuppressUnmanagedCodeSecurityUsage")] - internal static extern int RegEnumValue(SafeRegistryHandle hKey, int dwIndex, - StringBuilder lpValueName, ref int lpcbValueName, - IntPtr lpReserved_MustBeZero, int[] lpType, byte[] lpData, - int[] lpcbData); - - [DllImport(ADVAPI32)] - [ResourceExposure(ResourceScope.None)] - // Suppressed because there is no way for arbitrary data to be passed. - [SuppressMessage("Microsoft.Security", "CA2118:ReviewSuppressUnmanagedCodeSecurityUsage")] - internal static extern int RegFlushKey(SafeRegistryHandle hKey); - - [DllImport(PinvokeDllNames.RegOpenKeyExDllName, CharSet = CharSet.Auto, BestFitMapping = false)] - [ResourceExposure(ResourceScope.Machine)] - // Suppressed because there is no way for arbitrary data to be passed. - [SuppressMessage("Microsoft.Security", "CA2118:ReviewSuppressUnmanagedCodeSecurityUsage")] - internal static extern int RegOpenKeyEx(SafeRegistryHandle hKey, string lpSubKey, - int ulOptions, int samDesired, out SafeRegistryHandle hkResult); - - [DllImport(PinvokeDllNames.RegOpenKeyTransactedDllName, CharSet = CharSet.Auto, BestFitMapping = false)] - [ResourceExposure(ResourceScope.Machine)] - // Suppressed because there is no way for arbitrary data to be passed. - [SuppressMessage("Microsoft.Security", "CA2118:ReviewSuppressUnmanagedCodeSecurityUsage")] - internal static extern int RegOpenKeyTransacted(SafeRegistryHandle hKey, string lpSubKey, - int ulOptions, int samDesired, out SafeRegistryHandle hkResult, - SafeTransactionHandle hTransaction, IntPtr pExtendedParameter); - - [DllImport(PinvokeDllNames.RegQueryInfoKeyDllName, CharSet = CharSet.Auto, BestFitMapping = false)] - [ResourceExposure(ResourceScope.None)] - // Suppressed because there is no way for arbitrary data to be passed. - [SuppressMessage("Microsoft.Security", "CA2118:ReviewSuppressUnmanagedCodeSecurityUsage")] - internal static extern int RegQueryInfoKey(SafeRegistryHandle hKey, StringBuilder lpClass, - int[] lpcbClass, IntPtr lpReserved_MustBeZero, ref int lpcSubKeys, - int[] lpcbMaxSubKeyLen, int[] lpcbMaxClassLen, - ref int lpcValues, int[] lpcbMaxValueNameLen, - int[] lpcbMaxValueLen, int[] lpcbSecurityDescriptor, - int[] lpftLastWriteTime); - - [DllImport(PinvokeDllNames.RegQueryValueExDllName, CharSet = CharSet.Auto, BestFitMapping = false)] - [ResourceExposure(ResourceScope.None)] - // Suppressed because there is no way for arbitrary data to be passed. - [SuppressMessage("Microsoft.Security", "CA2118:ReviewSuppressUnmanagedCodeSecurityUsage")] - internal static extern int RegQueryValueEx(SafeRegistryHandle hKey, string lpValueName, - int[] lpReserved, ref int lpType, [Out] byte[] lpData, - ref int lpcbData); - - [DllImport(PinvokeDllNames.RegQueryValueExDllName, CharSet = CharSet.Auto, BestFitMapping = false)] - [ResourceExposure(ResourceScope.None)] - // Suppressed because there is no way for arbitrary data to be passed. - [SuppressMessage("Microsoft.Security", "CA2118:ReviewSuppressUnmanagedCodeSecurityUsage")] - internal static extern int RegQueryValueEx(SafeRegistryHandle hKey, string lpValueName, - int[] lpReserved, ref int lpType, ref int lpData, - ref int lpcbData); - - [DllImport(PinvokeDllNames.RegQueryValueExDllName, CharSet = CharSet.Auto, BestFitMapping = false)] - [ResourceExposure(ResourceScope.None)] - // Suppressed because there is no way for arbitrary data to be passed. - [SuppressMessage("Microsoft.Security", "CA2118:ReviewSuppressUnmanagedCodeSecurityUsage")] - internal static extern int RegQueryValueEx(SafeRegistryHandle hKey, string lpValueName, - int[] lpReserved, ref int lpType, ref long lpData, - ref int lpcbData); - - [DllImport(PinvokeDllNames.RegQueryValueExDllName, CharSet = CharSet.Auto, BestFitMapping = false)] - [ResourceExposure(ResourceScope.None)] - // Suppressed because there is no way for arbitrary data to be passed. - [SuppressMessage("Microsoft.Security", "CA2118:ReviewSuppressUnmanagedCodeSecurityUsage")] - internal static extern int RegQueryValueEx(SafeRegistryHandle hKey, string lpValueName, - int[] lpReserved, ref int lpType, [Out] char[] lpData, - ref int lpcbData); - - [DllImport(PinvokeDllNames.RegQueryValueExDllName, CharSet = CharSet.Auto, BestFitMapping = false)] - [ResourceExposure(ResourceScope.None)] - // Suppressed because there is no way for arbitrary data to be passed. - [SuppressMessage("Microsoft.Security", "CA2118:ReviewSuppressUnmanagedCodeSecurityUsage")] - internal static extern int RegQueryValueEx(SafeRegistryHandle hKey, string lpValueName, - int[] lpReserved, ref int lpType, StringBuilder lpData, - ref int lpcbData); - - [DllImport(PinvokeDllNames.RegSetValueExDllName, CharSet = CharSet.Auto, BestFitMapping = false)] - [ResourceExposure(ResourceScope.None)] - // Suppressed because there is no way for arbitrary data to be passed. - [SuppressMessage("Microsoft.Security", "CA2118:ReviewSuppressUnmanagedCodeSecurityUsage")] - internal static extern int RegSetValueEx(SafeRegistryHandle hKey, string lpValueName, - int Reserved, RegistryValueKind dwType, byte[] lpData, int cbData); - - [DllImport(PinvokeDllNames.RegSetValueExDllName, CharSet = CharSet.Auto, BestFitMapping = false)] - [ResourceExposure(ResourceScope.None)] - // Suppressed because there is no way for arbitrary data to be passed. - [SuppressMessage("Microsoft.Security", "CA2118:ReviewSuppressUnmanagedCodeSecurityUsage")] - internal static extern int RegSetValueEx(SafeRegistryHandle hKey, string lpValueName, - int Reserved, RegistryValueKind dwType, ref int lpData, int cbData); - - [DllImport(PinvokeDllNames.RegSetValueExDllName, CharSet = CharSet.Auto, BestFitMapping = false)] - [ResourceExposure(ResourceScope.None)] - // Suppressed because there is no way for arbitrary data to be passed. - [SuppressMessage("Microsoft.Security", "CA2118:ReviewSuppressUnmanagedCodeSecurityUsage")] - internal static extern int RegSetValueEx(SafeRegistryHandle hKey, string lpValueName, - int Reserved, RegistryValueKind dwType, ref long lpData, int cbData); - - [DllImport(PinvokeDllNames.RegSetValueExDllName, CharSet = CharSet.Auto, BestFitMapping = false)] - [ResourceExposure(ResourceScope.None)] - // Suppressed because there is no way for arbitrary data to be passed. - [SuppressMessage("Microsoft.Security", "CA2118:ReviewSuppressUnmanagedCodeSecurityUsage")] - internal static extern int RegSetValueEx(SafeRegistryHandle hKey, string lpValueName, - int Reserved, RegistryValueKind dwType, string lpData, int cbData); - - [DllImport(PinvokeDllNames.RegCreateKeyTransactedDllName, CharSet = CharSet.Auto, BestFitMapping = false)] - [ResourceExposure(ResourceScope.Machine)] - // Suppressed because there is no way for arbitrary data to be passed. - [SuppressMessage("Microsoft.Security", "CA2118:ReviewSuppressUnmanagedCodeSecurityUsage")] - internal static extern int RegCreateKeyTransacted(SafeRegistryHandle hKey, string lpSubKey, - int Reserved, string lpClass, int dwOptions, - int samDesigner, SECURITY_ATTRIBUTES lpSecurityAttributes, - out SafeRegistryHandle hkResult, out int lpdwDisposition, - SafeTransactionHandle hTransaction, IntPtr pExtendedParameter); - - private const int FORMAT_MESSAGE_IGNORE_INSERTS = 0x00000200; - private const int FORMAT_MESSAGE_FROM_SYSTEM = 0x00001000; - private const int FORMAT_MESSAGE_ARGUMENT_ARRAY = 0x00002000; - - [DllImport(KERNEL32, CharSet = CharSet.Unicode, BestFitMapping = true)] - [ResourceExposure(ResourceScope.None)] - // Suppressed because there is no way for arbitrary data to be passed. - [SuppressMessage("Microsoft.Security", "CA2118:ReviewSuppressUnmanagedCodeSecurityUsage")] - internal static extern int FormatMessage(int dwFlags, IntPtr lpSource, - int dwMessageId, int dwLanguageId, StringBuilder lpBuffer, - int nSize, IntPtr va_list_arguments); - - // Gets an error message for a Win32 error code. - internal static string GetMessage(int errorCode) - { - StringBuilder sb = new StringBuilder(512); - int result = Win32Native.FormatMessage(FORMAT_MESSAGE_IGNORE_INSERTS | - FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ARGUMENT_ARRAY, - Win32Native.NULL, errorCode, 0, sb, sb.Capacity, Win32Native.NULL); - if (result != 0) - { - // result is the # of characters copied to the StringBuilder on NT, - // but on Win9x, it appears to be the number of MBCS bytes. - // Just give up and return the String as-is... - string s = sb.ToString(); - return s; - } - else - { - string resourceTemplate = RegistryProviderStrings.UnknownError_Num; - return string.Format(CultureInfo.CurrentCulture, resourceTemplate, errorCode.ToString(System.Globalization.CultureInfo.InvariantCulture)); - } - } - - [DllImport(KERNEL32, CharSet = CharSet.Auto, EntryPoint = LSTRLEN)] - [ResourceExposure(ResourceScope.None)] - internal static extern int lstrlen(sbyte[] ptr); - - [DllImport(KERNEL32, CharSet = CharSet.Auto, EntryPoint = LSTRLEN)] - [ResourceExposure(ResourceScope.None)] - internal static extern int lstrlen(IntPtr ptr); - - [DllImport(KERNEL32, CharSet = CharSet.Ansi, EntryPoint = LSTRLENA)] - [ResourceExposure(ResourceScope.None)] - internal static extern int lstrlenA(IntPtr ptr); - - [DllImport(KERNEL32, CharSet = CharSet.Unicode, EntryPoint = LSTRLENW)] - [ResourceExposure(ResourceScope.None)] - internal static extern int lstrlenW(IntPtr ptr); - - [DllImport(KERNEL32)] - [SuppressMessage("Microsoft.Security", "CA2118:ReviewSuppressUnmanagedCodeSecurityUsage")] - internal static extern UIntPtr VirtualQuery(UIntPtr lpAddress, ref MEMORY_BASIC_INFORMATION lpBuffer, UIntPtr dwLength); - - [DllImport(KERNEL32)] - internal static extern void GetSystemInfo(out SYSTEM_INFO lpSystemInfo); - - internal static readonly uint PAGE_SIZE; - - static Win32Native() - { - SYSTEM_INFO systemInfo; - GetSystemInfo(out systemInfo); - PAGE_SIZE = (uint)systemInfo.dwPageSize; - } - -#endif } } From 2a8656dee85ccf788751b720f19fb239d4d38b33 Mon Sep 17 00:00:00 2001 From: Ilya Date: Fri, 22 Mar 2019 18:24:19 +0500 Subject: [PATCH 2/3] Remove StringBuilder from LookupAccountSid in Process.cs --- .../commands/management/Process.cs | 28 ++++++++----------- .../namespaces/Win32Native.cs | 27 ++++++++++++++++-- 2 files changed, 35 insertions(+), 20 deletions(-) diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/Process.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/Process.cs index e8b75e0a9cc..74e8b8e5515 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/Process.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/Process.cs @@ -779,29 +779,23 @@ private static string RetrieveProcessUserName(Process process) var tokenUser = Marshal.PtrToStructure(tokenUserInfo); - // Set the default length to be 256, so it will be sufficient for most cases. - int userNameLength = 256, domainNameLength = 256; - var userNameStr = new StringBuilder(userNameLength); - var domainNameStr = new StringBuilder(domainNameLength); + // Max username is defined as UNLEN = 256 in lmcons.h + // Max domainname is defined as DNLEN = CNLEN = 15 in lmcons.h + // The buffer length must be +1, last position is for a null string terminator. + int userNameLength = 257; + int domainNameLength = 16; + Span userNameStr = stackalloc char[userNameLength]; + Span domainNameStr = stackalloc char[domainNameLength]; Win32Native.SID_NAME_USE accountType; if (!Win32Native.LookupAccountSid(null, tokenUser.User.Sid, userNameStr, ref userNameLength, domainNameStr, ref domainNameLength, out accountType)) { - error = Marshal.GetLastWin32Error(); - if (error == Win32Native.ERROR_INSUFFICIENT_BUFFER) - { - userNameStr.EnsureCapacity(userNameLength); - domainNameStr.EnsureCapacity(domainNameLength); - - if (!Win32Native.LookupAccountSid(null, tokenUser.User.Sid, userNameStr, ref userNameLength, domainNameStr, ref domainNameLength, out accountType)) { break; } - } - else - { - break; - } + break; } - userName = domainNameStr + "\\" + userNameStr; + // TODO: Use Concat() from .Net Core 3.0 + // public static string Concat(ReadOnlySpan str0, ReadOnlySpan str1, ReadOnlySpan str2) + userName = string.Concat(domainNameStr.Slice(0, domainNameLength).ToString(), "\\", userNameStr.Slice(0, userNameLength).ToString()); } while (false); } catch (NotSupportedException) diff --git a/src/System.Management.Automation/namespaces/Win32Native.cs b/src/System.Management.Automation/namespaces/Win32Native.cs index de6821fe875..5ce1810440a 100644 --- a/src/System.Management.Automation/namespaces/Win32Native.cs +++ b/src/System.Management.Automation/namespaces/Win32Native.cs @@ -115,14 +115,35 @@ internal struct TOKEN_USER [ResourceExposure(ResourceScope.Machine)] [SuppressMessage("Microsoft.Security", "CA2118:ReviewSuppressUnmanagedCodeSecurityUsage")] [return: MarshalAs(UnmanagedType.Bool)] - internal static extern bool LookupAccountSid(string lpSystemName, + private static extern unsafe bool LookupAccountSid(string lpSystemName, IntPtr sid, - StringBuilder lpName, + char* lpName, ref int cchName, - StringBuilder referencedDomainName, + char* referencedDomainName, ref int cchReferencedDomainName, out SID_NAME_USE peUse); + internal static unsafe bool LookupAccountSid(string lpSystemName, + IntPtr sid, + Span userName, + ref int cchName, + Span domainName, + ref int cchDomainName, + out SID_NAME_USE peUse) + { + fixed (char* userNamePtr = &MemoryMarshal.GetReference(userName)) + fixed (char* domainNamePtr = &MemoryMarshal.GetReference(domainName)) + { + return LookupAccountSid(lpSystemName, + sid, + userNamePtr, + ref cchName, + domainNamePtr, + ref cchDomainName, + out peUse); + } + } + [DllImport(PinvokeDllNames.CloseHandleDllName, SetLastError = true)] [ResourceExposure(ResourceScope.Machine)] [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] From 6727950ff16e1ce3dea2102250d64e2bdc85da68 Mon Sep 17 00:00:00 2001 From: Ilya Date: Tue, 26 Mar 2019 22:11:01 +0500 Subject: [PATCH 3/3] Add comment --- .../commands/management/Process.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/Process.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/Process.cs index 74e8b8e5515..d7a3207fdbc 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/Process.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/Process.cs @@ -788,6 +788,7 @@ private static string RetrieveProcessUserName(Process process) Span domainNameStr = stackalloc char[domainNameLength]; Win32Native.SID_NAME_USE accountType; + // userNameLength and domainNameLength will be set to actual lengths. if (!Win32Native.LookupAccountSid(null, tokenUser.User.Sid, userNameStr, ref userNameLength, domainNameStr, ref domainNameLength, out accountType)) { break;