e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
45 lines
1.8 KiB
C#
45 lines
1.8 KiB
C#
//-----------------------------------------------------------------------------
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
namespace System.ServiceModel.Activation.Interop
|
|
{
|
|
using System;
|
|
using System.Security;
|
|
using System.Runtime.InteropServices;
|
|
using System.Security.Principal;
|
|
using System.Runtime.Versioning;
|
|
using System.Runtime;
|
|
|
|
[SuppressUnmanagedCodeSecurity]
|
|
static class SafeNativeMethods
|
|
{
|
|
public const int ERROR_NO_TOKEN = 1008;
|
|
|
|
const string ADVAPI32 = "advapi32.dll";
|
|
const string KERNEL32 = "kernel32.dll";
|
|
|
|
[DllImport(ADVAPI32, SetLastError = true, EntryPoint = "OpenThreadToken")]
|
|
[ResourceExposure(ResourceScope.None)]
|
|
static extern bool OpenThreadTokenCritical(
|
|
[In] IntPtr ThreadHandle,
|
|
[In] TokenAccessLevels DesiredAccess,
|
|
[In] bool OpenAsSelf,
|
|
[Out] out SafeCloseHandleCritical TokenHandle);
|
|
|
|
[DllImport(KERNEL32, SetLastError = true)]
|
|
[ResourceExposure(ResourceScope.None)]
|
|
static extern IntPtr GetCurrentThread();
|
|
|
|
[Fx.Tag.SecurityNote(Critical = "Calls two safe native methods: GetCurrentThread and OpenThreadToken." +
|
|
"Marshal.GetLastWin32Error captures current thread token in a SecurityCritical field.")]
|
|
[SecurityCritical]
|
|
internal static bool OpenCurrentThreadTokenCritical(TokenAccessLevels desiredAccess, bool openAsSelf, out SafeCloseHandleCritical tokenHandle, out int error)
|
|
{
|
|
bool result = OpenThreadTokenCritical(GetCurrentThread(), desiredAccess, openAsSelf, out tokenHandle);
|
|
error = Marshal.GetLastWin32Error();
|
|
return result;
|
|
}
|
|
}
|
|
}
|