summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichal Strehovský <MichalStrehovsky@users.noreply.github.com>2017-05-18 21:47:46 -0700
committerJan Kotas <jkotas@microsoft.com>2017-05-19 15:53:20 -0700
commit52bd52bb06bd268915aff0180eb7f1c53ee57a60 (patch)
tree79960225be4edfa8a457e1a67a998a81a2106235
parentc7758583122ceff2deb6e60dd3381486d7d71504 (diff)
downloadcoreclr-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>
-rw-r--r--src/mscorlib/shared/Interop/Windows/Kernel32/Interop.FileAttributes.cs17
-rw-r--r--src/mscorlib/shared/Interop/Windows/Kernel32/Interop.FindClose.cs16
-rw-r--r--src/mscorlib/shared/Interop/Windows/Kernel32/Interop.FindFirstFileEx.cs43
-rw-r--r--src/mscorlib/shared/Interop/Windows/Kernel32/Interop.GetFileAttributesEx.cs94
-rw-r--r--src/mscorlib/shared/System.Private.CoreLib.Shared.projitems6
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"/>