File: EnvironmentHelpers.cs

package info (click to toggle)
mono 6.8.0.105%2Bdfsg-3.3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,284,512 kB
  • sloc: cs: 11,172,132; xml: 2,850,069; ansic: 671,653; cpp: 122,091; perl: 59,366; javascript: 30,841; asm: 22,168; makefile: 20,093; sh: 15,020; python: 4,827; pascal: 925; sql: 859; sed: 16; php: 1
file content (57 lines) | stat: -rw-r--r-- 2,352 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
using System.ComponentModel;
using System.Security;
using System.Security.Permissions;
using System.Security.Principal;
using Microsoft.Win32;
using Microsoft.Win32.SafeHandles;

namespace System
{
    internal static class EnvironmentHelpers
    {
        private static volatile bool s_IsAppContainerProcess;
        private static volatile bool s_IsAppContainerProcessInitalized;

        public static bool IsAppContainerProcess {
            get {
                if(!s_IsAppContainerProcessInitalized) {
                   if(Environment.OSVersion.Platform != PlatformID.Win32NT) {
                       s_IsAppContainerProcess = false;
                   } else if(Environment.OSVersion.Version.Major < 6 || (Environment.OSVersion.Version.Major == 6 && Environment.OSVersion.Version.Minor <= 1)) {
                       // Windows 7 or older.
                       s_IsAppContainerProcess = false;
                   } else {
                       s_IsAppContainerProcess = HasAppContainerToken();
                   }

                    s_IsAppContainerProcessInitalized = true;
                }

                return s_IsAppContainerProcess;
            }
        }

        [SecuritySafeCritical]
        [SecurityPermission(SecurityAction.Assert, Flags = SecurityPermissionFlag.UnmanagedCode | SecurityPermissionFlag.ControlPrincipal)]
        private static unsafe bool HasAppContainerToken() {
            int* dwIsAppContainerPtr = stackalloc int[1];
            uint dwLength = 0;

            using (WindowsIdentity wi = WindowsIdentity.GetCurrent(TokenAccessLevels.Query)) {
                if (!UnsafeNativeMethods.GetTokenInformation(wi.Token, UnsafeNativeMethods.TokenIsAppContainer, new IntPtr(dwIsAppContainerPtr), sizeof(int), out dwLength)) {
                    throw new Win32Exception();
                }
            }

            return (*dwIsAppContainerPtr != 0);
        }

        internal static bool IsWindowsVistaOrAbove()
        {
            // Method should match the logic of the internal Environment.IsWindowsVista property in mscorlib
            // If this method turns out to be heavily used we might want to cache at least part of this value.
            OperatingSystem os = Environment.OSVersion;
            return os.Platform == PlatformID.Win32NT && os.Version.Major >= 6;
        }
    }
}