|
|
1.1 root 1: using System;
2: using System.ComponentModel;
3: using System.Runtime.InteropServices;
4: using System.Security.Principal;
5:
6: namespace CleanFlashCommon {
7: public class WinAPI {
8:
9: public static void AllowModifications() {
10: ModifyPrivilege(PrivilegeName.SeRestorePrivilege, true);
11: ModifyPrivilege(PrivilegeName.SeTakeOwnershipPrivilege, true);
12: }
13:
14: public static bool ModifyPrivilege(PrivilegeName privilege, bool enable) {
15: LUID luid;
16:
17: if (!LookupPrivilegeValue(null, privilege.ToString(), out luid)) {
18: throw new Win32Exception();
19: }
20:
21: using (var identity = WindowsIdentity.GetCurrent(TokenAccessLevels.AdjustPrivileges | TokenAccessLevels.Query)) {
22: var newPriv = new TOKEN_PRIVILEGES();
23: newPriv.Privileges = new LUID_AND_ATTRIBUTES[1];
24: newPriv.PrivilegeCount = 1;
25: newPriv.Privileges[0].Luid = luid;
26: newPriv.Privileges[0].Attributes = enable ? SE_PRIVILEGE_ENABLED : 0;
27:
28: var prevPriv = new TOKEN_PRIVILEGES();
29: prevPriv.Privileges = new LUID_AND_ATTRIBUTES[1];
30: prevPriv.PrivilegeCount = 1;
31: uint returnedBytes;
32:
33: if (!AdjustTokenPrivileges(identity.Token, false, ref newPriv, (uint)Marshal.SizeOf(prevPriv), ref prevPriv, out returnedBytes)) {
34: throw new Win32Exception();
35: }
36:
37: return prevPriv.PrivilegeCount == 0 ? enable /* didn't make a change */ : ((prevPriv.Privileges[0].Attributes & SE_PRIVILEGE_ENABLED) != 0);
38: }
39: }
40:
41: const uint SE_PRIVILEGE_ENABLED = 2;
42:
43: [DllImport("advapi32.dll", SetLastError = true)]
44: [return: MarshalAs(UnmanagedType.Bool)]
45: static extern bool AdjustTokenPrivileges(IntPtr TokenHandle, [MarshalAs(UnmanagedType.Bool)] bool DisableAllPrivileges, ref TOKEN_PRIVILEGES NewState,
46: UInt32 BufferLengthInBytes, ref TOKEN_PRIVILEGES PreviousState, out UInt32 ReturnLengthInBytes);
47:
48: [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
49: [return: MarshalAs(UnmanagedType.Bool)]
50: static extern bool LookupPrivilegeValue(string lpSystemName, string lpName, out LUID lpLuid);
51:
52: struct TOKEN_PRIVILEGES {
53: public UInt32 PrivilegeCount;
54: [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1 /*ANYSIZE_ARRAY*/)]
55: public LUID_AND_ATTRIBUTES[] Privileges;
56: }
57:
58: [StructLayout(LayoutKind.Sequential)]
59: struct LUID_AND_ATTRIBUTES {
60: public LUID Luid;
61: public UInt32 Attributes;
62: }
63:
64: [StructLayout(LayoutKind.Sequential)]
65: struct LUID {
66: public uint LowPart;
67: public int HighPart;
68: }
69: }
70:
71: public enum PrivilegeName {
72: SeAssignPrimaryTokenPrivilege,
73: SeAuditPrivilege,
74: SeBackupPrivilege,
75: SeChangeNotifyPrivilege,
76: SeCreateGlobalPrivilege,
77: SeCreatePagefilePrivilege,
78: SeCreatePermanentPrivilege,
79: SeCreateSymbolicLinkPrivilege,
80: SeCreateTokenPrivilege,
81: SeDebugPrivilege,
82: SeEnableDelegationPrivilege,
83: SeImpersonatePrivilege,
84: SeIncreaseBasePriorityPrivilege,
85: SeIncreaseQuotaPrivilege,
86: SeIncreaseWorkingSetPrivilege,
87: SeLoadDriverPrivilege,
88: SeLockMemoryPrivilege,
89: SeMachineAccountPrivilege,
90: SeManageVolumePrivilege,
91: SeProfileSingleProcessPrivilege,
92: SeRelabelPrivilege,
93: SeRemoteShutdownPrivilege,
94: SeRestorePrivilege,
95: SeSecurityPrivilege,
96: SeShutdownPrivilege,
97: SeSyncAgentPrivilege,
98: SeSystemEnvironmentPrivilege,
99: SeSystemProfilePrivilege,
100: SeSystemtimePrivilege,
101: SeTakeOwnershipPrivilege,
102: SeTcbPrivilege,
103: SeTimeZonePrivilege,
104: SeTrustedCredManAccessPrivilege,
105: SeUndockPrivilege,
106: SeUnsolicitedInputPrivilege,
107: }
108: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.