diff options
author | Michal Strehovský <MichalStrehovsky@users.noreply.github.com> | 2017-05-18 21:47:46 -0700 |
---|---|---|
committer | Jan Kotas <jkotas@microsoft.com> | 2017-05-19 15:53:20 -0700 |
commit | 52bd52bb06bd268915aff0180eb7f1c53ee57a60 (patch) | |
tree | 79960225be4edfa8a457e1a67a998a81a2106235 | |
parent | c7758583122ceff2deb6e60dd3381486d7d71504 (diff) | |
download | coreclr-52bd52bb06bd268915aff0180eb7f1c53ee57a60.tar.gz coreclr-52bd52bb06bd268915aff0180eb7f1c53ee57a60.tar.bz2 coreclr-52bd52bb06bd268915aff0180eb7f1c53ee57a60.zip |
Merge pull request dotnet/corert#3654 from dotnet/nmirror
Merge nmirror to master
Signed-off-by: dotnet-bot <dotnet-bot@microsoft.com>
5 files changed, 175 insertions, 1 deletions
diff --git a/src/mscorlib/shared/Interop/Windows/Kernel32/Interop.FileAttributes.cs b/src/mscorlib/shared/Interop/Windows/Kernel32/Interop.FileAttributes.cs new file mode 100644 index 0000000000..725a25a719 --- /dev/null +++ b/src/mscorlib/shared/Interop/Windows/Kernel32/Interop.FileAttributes.cs @@ -0,0 +1,17 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +internal partial class Interop +{ + internal partial class Kernel32 + { + internal partial class FileAttributes + { + internal const int FILE_ATTRIBUTE_NORMAL = 0x00000080; + internal const int FILE_ATTRIBUTE_READONLY = 0x00000001; + internal const int FILE_ATTRIBUTE_DIRECTORY = 0x00000010; + internal const int FILE_ATTRIBUTE_REPARSE_POINT = 0x00000400; + } + } +} diff --git a/src/mscorlib/shared/Interop/Windows/Kernel32/Interop.FindClose.cs b/src/mscorlib/shared/Interop/Windows/Kernel32/Interop.FindClose.cs new file mode 100644 index 0000000000..03d8c8b323 --- /dev/null +++ b/src/mscorlib/shared/Interop/Windows/Kernel32/Interop.FindClose.cs @@ -0,0 +1,16 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.Win32.SafeHandles; +using System; +using System.Runtime.InteropServices; + +internal partial class Interop +{ + internal partial class Kernel32 + { + [DllImport(Libraries.Kernel32, SetLastError = true)] + internal extern static bool FindClose(IntPtr hFindFile); + } +} diff --git a/src/mscorlib/shared/Interop/Windows/Kernel32/Interop.FindFirstFileEx.cs b/src/mscorlib/shared/Interop/Windows/Kernel32/Interop.FindFirstFileEx.cs new file mode 100644 index 0000000000..80b1ddd28d --- /dev/null +++ b/src/mscorlib/shared/Interop/Windows/Kernel32/Interop.FindFirstFileEx.cs @@ -0,0 +1,43 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.Win32.SafeHandles; +using System; +using System.IO; +using System.Runtime.InteropServices; + +internal partial class Interop +{ + internal partial class Kernel32 + { + /// <summary> + /// WARNING: This method does not implicitly handle long paths. Use FindFirstFile. + /// </summary> + [DllImport(Libraries.Kernel32, EntryPoint = "FindFirstFileExW", SetLastError = true, CharSet = CharSet.Unicode)] + private static extern SafeFindHandle FindFirstFileExPrivate(string lpFileName, FINDEX_INFO_LEVELS fInfoLevelId, ref WIN32_FIND_DATA lpFindFileData, FINDEX_SEARCH_OPS fSearchOp, IntPtr lpSearchFilter, int dwAdditionalFlags); + + internal static SafeFindHandle FindFirstFile(string fileName, ref WIN32_FIND_DATA data) + { + fileName = PathInternal.EnsureExtendedPrefixOverMaxPath(fileName); + + // use FindExInfoBasic since we don't care about short name and it has better perf + return FindFirstFileExPrivate(fileName, FINDEX_INFO_LEVELS.FindExInfoBasic, ref data, FINDEX_SEARCH_OPS.FindExSearchNameMatch, IntPtr.Zero, 0); + } + + internal enum FINDEX_INFO_LEVELS : uint + { + FindExInfoStandard = 0x0u, + FindExInfoBasic = 0x1u, + FindExInfoMaxInfoLevel = 0x2u, + } + + internal enum FINDEX_SEARCH_OPS : uint + { + FindExSearchNameMatch = 0x0u, + FindExSearchLimitToDirectories = 0x1u, + FindExSearchLimitToDevices = 0x2u, + FindExSearchMaxSearchOp = 0x3u, + } + } +} diff --git a/src/mscorlib/shared/Interop/Windows/Kernel32/Interop.GetFileAttributesEx.cs b/src/mscorlib/shared/Interop/Windows/Kernel32/Interop.GetFileAttributesEx.cs new file mode 100644 index 0000000000..4cce56bd05 --- /dev/null +++ b/src/mscorlib/shared/Interop/Windows/Kernel32/Interop.GetFileAttributesEx.cs @@ -0,0 +1,94 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.Win32.SafeHandles; +using System; +using System.IO; +using System.Runtime.InteropServices; + +internal partial class Interop +{ + internal partial class Kernel32 + { + /// <summary> + /// WARNING: This method does not implicitly handle long paths. Use GetFileAttributesEx. + /// </summary> + [DllImport(Libraries.Kernel32, EntryPoint = "GetFileAttributesExW", SetLastError = true, CharSet = CharSet.Unicode)] + private static extern bool GetFileAttributesExPrivate(string name, GET_FILEEX_INFO_LEVELS fileInfoLevel, ref WIN32_FILE_ATTRIBUTE_DATA lpFileInformation); + + internal static bool GetFileAttributesEx(string name, GET_FILEEX_INFO_LEVELS fileInfoLevel, ref WIN32_FILE_ATTRIBUTE_DATA lpFileInformation) + { + name = PathInternal.EnsureExtendedPrefixOverMaxPath(name); + return GetFileAttributesExPrivate(name, fileInfoLevel, ref lpFileInformation); + } + + internal enum GET_FILEEX_INFO_LEVELS : uint + { + GetFileExInfoStandard = 0x0u, + GetFileExMaxInfoLevel = 0x1u, + } + + 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 uint fileSizeHigh; + internal uint fileSizeLow; + + internal void PopulateFrom(ref WIN32_FIND_DATA findData) + { + // Copy the information to data + fileAttributes = (int)findData.dwFileAttributes; + ftCreationTimeLow = findData.ftCreationTime.dwLowDateTime; + ftCreationTimeHigh = findData.ftCreationTime.dwHighDateTime; + ftLastAccessTimeLow = findData.ftLastAccessTime.dwLowDateTime; + ftLastAccessTimeHigh = findData.ftLastAccessTime.dwHighDateTime; + ftLastWriteTimeLow = findData.ftLastWriteTime.dwLowDateTime; + ftLastWriteTimeHigh = findData.ftLastWriteTime.dwHighDateTime; + fileSizeHigh = findData.nFileSizeHigh; + fileSizeLow = findData.nFileSizeLow; + } + } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + [BestFitMapping(false)] + internal unsafe struct WIN32_FIND_DATA + { + internal uint dwFileAttributes; + internal FILE_TIME ftCreationTime; + internal FILE_TIME ftLastAccessTime; + internal FILE_TIME ftLastWriteTime; + internal uint nFileSizeHigh; + internal uint nFileSizeLow; + internal uint dwReserved0; + internal uint dwReserved1; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] + internal string cFileName; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)] + internal string cAlternateFileName; + } + + internal struct FILE_TIME + { + internal uint dwLowDateTime; + internal uint dwHighDateTime; + + internal FILE_TIME(long fileTime) + { + dwLowDateTime = (uint)fileTime; + dwHighDateTime = (uint)(fileTime >> 32); + } + + internal long ToTicks() + { + return ((long)dwHighDateTime << 32) + dwLowDateTime; + } + } + } +} diff --git a/src/mscorlib/shared/System.Private.CoreLib.Shared.projitems b/src/mscorlib/shared/System.Private.CoreLib.Shared.projitems index 981d35811e..ae98a97c7a 100644 --- a/src/mscorlib/shared/System.Private.CoreLib.Shared.projitems +++ b/src/mscorlib/shared/System.Private.CoreLib.Shared.projitems @@ -472,11 +472,15 @@ <Compile Include="$(MSBuildThisFileDirectory)Interop\Windows\Kernel32\Interop.CloseHandle.cs"/> <Compile Include="$(MSBuildThisFileDirectory)Interop\Windows\Kernel32\Interop.CreateFile.cs" Condition="'$(IsProjectNLibrary)' != 'true'" /> <Compile Include="$(MSBuildThisFileDirectory)Interop\Windows\Kernel32\Interop.CreateFile2.cs" Condition="'$(IsProjectNLibrary)' == 'true'" /> + <Compile Include="$(MSBuildThisFileDirectory)Interop\Windows\Kernel32\Interop.FileAttributes.cs"/> <Compile Include="$(MSBuildThisFileDirectory)Interop\Windows\Kernel32\Interop.FILE_INFO_BY_HANDLE_CLASS.cs"/> <Compile Include="$(MSBuildThisFileDirectory)Interop\Windows\Kernel32\Interop.FileTypes.cs"/> + <Compile Include="$(MSBuildThisFileDirectory)Interop\Windows\Kernel32\Interop.FindClose.cs"/> + <Compile Include="$(MSBuildThisFileDirectory)Interop\Windows\Kernel32\Interop.FindFirstFileEx.cs"/> <Compile Include="$(MSBuildThisFileDirectory)Interop\Windows\Kernel32\Interop.FlushFileBuffers.cs"/> <Compile Include="$(MSBuildThisFileDirectory)Interop\Windows\Kernel32\Interop.FormatMessage.cs"/> - <Compile Include="$(MSBuildThisFileDirectory)Interop\Windows\Kernel32\Interop.GetCPInfo.cs" /> + <Compile Include="$(MSBuildThisFileDirectory)Interop\Windows\Kernel32\Interop.GetCPInfo.cs" /> + <Compile Include="$(MSBuildThisFileDirectory)Interop\Windows\Kernel32\Interop.GetFileAttributesEx.cs" /> <Compile Include="$(MSBuildThisFileDirectory)Interop\Windows\Kernel32\Interop.GetFileInformationByHandleEx.cs" /> <Compile Include="$(MSBuildThisFileDirectory)Interop\Windows\Kernel32\Interop.GetFileType_SafeHandle.cs"/> <Compile Include="$(MSBuildThisFileDirectory)Interop\Windows\Kernel32\Interop.GetFullPathNameW.cs"/> |