// see https://msdn.microsoft.com/en-us/library/windows/desktop/ms684139%28v=vs.85%29.aspx
        public static bool?IsProcess64Bit(int processId)
        {
            if (!Environment.Is64BitOperatingSystem)
            {
                return(false);
            }

            // if this method is not available in your version of .NET, use GetNativeSystemInfo via P/Invoke instead
            using (var processHandle = ProcessNativeMethods.OpenProcess(processId, ProcessAccessFlags.QueryLimitedInformation))
            {
                if (processHandle.IsInvalid)
                {
                    var errorCode = NativeMethods.GetLastError();
                    if (errorCode == 5)
                    {
                        return(null);//no access
                    }
                    throw new Win32Exception(errorCode);
                }

                if (!ProcessNativeMethods.IsWow64Process(processHandle.DangerousGetHandle(), out var isWow64))
                {
                    var errorCode = NativeMethods.GetLastError();

                    throw new Win32Exception(errorCode);
                }

                return(!isWow64);
            }
        }
        private static bool IsProcessElevated(Process process)
        {
            using (var processHandle = ProcessNativeMethods.OpenProcess(process, ProcessAccessFlags.QueryInformation))
            {
                if (processHandle.IsInvalid)
                {
                    var error = Marshal.GetLastWin32Error();

                    return(error == NativeMethods.ERROR_ACCESS_DENIED);
                }

                return(false);
            }
        }