156 lines
6.9 KiB
C#
156 lines
6.9 KiB
C#
// Copyright (c) .NET Foundation. All rights reserved.
|
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
|
|
using System;
|
|
using System.Diagnostics.CodeAnalysis;
|
|
using System.Runtime.InteropServices;
|
|
|
|
namespace Microsoft.AspNetCore.HttpSys.Internal
|
|
{
|
|
internal static unsafe class UnsafeNclNativeMethods
|
|
{
|
|
private const string sspicli_LIB = "sspicli.dll";
|
|
private const string api_ms_win_core_processthreads_LIB = "api-ms-win-core-processthreads-l1-1-1.dll";
|
|
private const string api_ms_win_core_io_LIB = "api-ms-win-core-io-l1-1-0.dll";
|
|
private const string api_ms_win_core_handle_LIB = "api-ms-win-core-handle-l1-1-0.dll";
|
|
private const string api_ms_win_core_libraryloader_LIB = "api-ms-win-core-libraryloader-l1-1-0.dll";
|
|
private const string api_ms_win_core_heap_LIB = "api-ms-win-core-heap-L1-2-0.dll";
|
|
private const string api_ms_win_core_heap_obsolete_LIB = "api-ms-win-core-heap-obsolete-L1-1-0.dll";
|
|
private const string api_ms_win_core_kernel32_legacy_LIB = "api-ms-win-core-kernel32-legacy-l1-1-0.dll";
|
|
|
|
private const string TOKENBINDING = "tokenbinding.dll";
|
|
|
|
// CONSIDER: Make this an enum, requires changing a lot of types from uint to ErrorCodes.
|
|
internal static class ErrorCodes
|
|
{
|
|
internal const uint ERROR_SUCCESS = 0;
|
|
internal const uint ERROR_HANDLE_EOF = 38;
|
|
internal const uint ERROR_NOT_SUPPORTED = 50;
|
|
internal const uint ERROR_INVALID_PARAMETER = 87;
|
|
internal const uint ERROR_ALREADY_EXISTS = 183;
|
|
internal const uint ERROR_MORE_DATA = 234;
|
|
internal const uint ERROR_OPERATION_ABORTED = 995;
|
|
internal const uint ERROR_IO_PENDING = 997;
|
|
internal const uint ERROR_NOT_FOUND = 1168;
|
|
internal const uint ERROR_CONNECTION_INVALID = 1229;
|
|
}
|
|
|
|
[DllImport(api_ms_win_core_io_LIB, ExactSpelling = true, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
|
|
internal static unsafe extern uint CancelIoEx(SafeHandle handle, SafeNativeOverlapped overlapped);
|
|
|
|
[DllImport(api_ms_win_core_kernel32_legacy_LIB, ExactSpelling = true, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
|
|
internal static unsafe extern bool SetFileCompletionNotificationModes(SafeHandle handle, FileCompletionNotificationModes modes);
|
|
|
|
[Flags]
|
|
internal enum FileCompletionNotificationModes : byte
|
|
{
|
|
None = 0,
|
|
SkipCompletionPortOnSuccess = 1,
|
|
SkipSetEventOnHandle = 2
|
|
}
|
|
|
|
[DllImport(TOKENBINDING, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
|
|
public static extern int TokenBindingVerifyMessage(
|
|
[In] byte* tokenBindingMessage,
|
|
[In] uint tokenBindingMessageSize,
|
|
[In] char* keyType,
|
|
[In] byte* tlsUnique,
|
|
[In] uint tlsUniqueSize,
|
|
[Out] out HeapAllocHandle resultList);
|
|
|
|
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa366569(v=vs.85).aspx
|
|
[DllImport(api_ms_win_core_heap_LIB, CallingConvention = CallingConvention.Winapi, SetLastError = true)]
|
|
internal static extern IntPtr GetProcessHeap();
|
|
|
|
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa366701(v=vs.85).aspx
|
|
[DllImport(api_ms_win_core_heap_LIB, CallingConvention = CallingConvention.Winapi, SetLastError = true)]
|
|
internal static extern bool HeapFree(
|
|
[In] IntPtr hHeap,
|
|
[In] uint dwFlags,
|
|
[In] IntPtr lpMem);
|
|
|
|
internal static class SafeNetHandles
|
|
{
|
|
[DllImport(sspicli_LIB, ExactSpelling = true, SetLastError = true)]
|
|
internal static extern int FreeContextBuffer(
|
|
[In] IntPtr contextBuffer);
|
|
|
|
[DllImport(api_ms_win_core_handle_LIB, ExactSpelling = true, SetLastError = true)]
|
|
internal static extern bool CloseHandle(IntPtr handle);
|
|
|
|
[DllImport(api_ms_win_core_heap_obsolete_LIB, EntryPoint = "LocalAlloc", SetLastError = true)]
|
|
internal static extern SafeLocalFreeChannelBinding LocalAllocChannelBinding(int uFlags, UIntPtr sizetdwBytes);
|
|
|
|
[DllImport(api_ms_win_core_heap_obsolete_LIB, ExactSpelling = true, SetLastError = true)]
|
|
internal static extern IntPtr LocalFree(IntPtr handle);
|
|
}
|
|
|
|
// from tokenbinding.h
|
|
internal static class TokenBinding
|
|
{
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
internal unsafe struct TOKENBINDING_RESULT_DATA
|
|
{
|
|
public uint identifierSize;
|
|
public TOKENBINDING_IDENTIFIER* identifierData;
|
|
public TOKENBINDING_EXTENSION_FORMAT extensionFormat;
|
|
public uint extensionSize;
|
|
public IntPtr extensionData;
|
|
}
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
internal struct TOKENBINDING_IDENTIFIER
|
|
{
|
|
// Note: If the layout of these fields changes, be sure to make the
|
|
// corresponding change to TokenBindingUtil.ExtractIdentifierBlob.
|
|
|
|
public TOKENBINDING_TYPE bindingType;
|
|
public TOKENBINDING_HASH_ALGORITHM hashAlgorithm;
|
|
public TOKENBINDING_SIGNATURE_ALGORITHM signatureAlgorithm;
|
|
}
|
|
|
|
internal enum TOKENBINDING_TYPE : byte
|
|
{
|
|
TOKENBINDING_TYPE_PROVIDED = 0,
|
|
TOKENBINDING_TYPE_REFERRED = 1,
|
|
}
|
|
|
|
internal enum TOKENBINDING_HASH_ALGORITHM : byte
|
|
{
|
|
TOKENBINDING_HASH_ALGORITHM_SHA256 = 4,
|
|
}
|
|
|
|
internal enum TOKENBINDING_SIGNATURE_ALGORITHM : byte
|
|
{
|
|
TOKENBINDING_SIGNATURE_ALGORITHM_RSA = 1,
|
|
TOKENBINDING_SIGNATURE_ALGORITHM_ECDSAP256 = 3,
|
|
}
|
|
|
|
internal enum TOKENBINDING_EXTENSION_FORMAT
|
|
{
|
|
TOKENBINDING_EXTENSION_FORMAT_UNDEFINED = 0,
|
|
}
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
internal unsafe struct TOKENBINDING_RESULT_LIST
|
|
{
|
|
public uint resultCount;
|
|
public TOKENBINDING_RESULT_DATA* resultData;
|
|
}
|
|
}
|
|
|
|
// DACL related stuff
|
|
|
|
[SuppressMessage("Microsoft.Performance", "CA1812:AvoidUninstantiatedInternalClasses", Justification = "Instantiated natively")]
|
|
[SuppressMessage("Microsoft.Design", "CA1001:TypesThatOwnDisposableFieldsShouldBeDisposable",
|
|
Justification = "Does not own the resource.")]
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
internal class SECURITY_ATTRIBUTES
|
|
{
|
|
public int nLength = 12;
|
|
public SafeLocalMemHandle lpSecurityDescriptor = new SafeLocalMemHandle(IntPtr.Zero, false);
|
|
public bool bInheritHandle = false;
|
|
}
|
|
}
|
|
}
|