1 #define WIN32_NO_STATUS
11 #include <wine/debug.h>
21 static const PRIVILEGE_DATA WellKnownPrivileges
[] =
23 {{SE_CREATE_TOKEN_PRIVILEGE
, 0}, L
"SeCreateTokenPrivilege"},
24 {{SE_ASSIGNPRIMARYTOKEN_PRIVILEGE
, 0}, L
"SeAssignPrimaryTokenPrivilege"},
25 {{SE_LOCK_MEMORY_PRIVILEGE
, 0}, L
"SeLockMemoryPrivilege"},
26 {{SE_INCREASE_QUOTA_PRIVILEGE
, 0}, L
"SeIncreaseQuotaPrivilege"},
27 {{SE_MACHINE_ACCOUNT_PRIVILEGE
, 0}, L
"SeMachineAccountPrivilege"},
28 {{SE_TCB_PRIVILEGE
, 0}, L
"SeTcbPrivilege"},
29 {{SE_SECURITY_PRIVILEGE
, 0}, L
"SeSecurityPrivilege"},
30 {{SE_TAKE_OWNERSHIP_PRIVILEGE
, 0}, L
"SeTakeOwnershipPrivilege"},
31 {{SE_LOAD_DRIVER_PRIVILEGE
, 0}, L
"SeLoadDriverPrivilege"},
32 {{SE_SYSTEM_PROFILE_PRIVILEGE
, 0}, L
"SeSystemProfilePrivilege"},
33 {{SE_SYSTEMTIME_PRIVILEGE
, 0}, L
"SeSystemtimePrivilege"},
34 {{SE_PROF_SINGLE_PROCESS_PRIVILEGE
, 0}, L
"SeProfileSingleProcessPrivilege"},
35 {{SE_INC_BASE_PRIORITY_PRIVILEGE
, 0}, L
"SeIncreaseBasePriorityPrivilege"},
36 {{SE_CREATE_PAGEFILE_PRIVILEGE
, 0}, L
"SeCreatePagefilePrivilege"},
37 {{SE_CREATE_PERMANENT_PRIVILEGE
, 0}, L
"SeCreatePermanentPrivilege"},
38 {{SE_BACKUP_PRIVILEGE
, 0}, L
"SeBackupPrivilege"},
39 {{SE_RESTORE_PRIVILEGE
, 0}, L
"SeRestorePrivilege"},
40 {{SE_SHUTDOWN_PRIVILEGE
, 0}, L
"SeShutdownPrivilege"},
41 {{SE_DEBUG_PRIVILEGE
, 0}, L
"SeDebugPrivilege"},
42 {{SE_AUDIT_PRIVILEGE
, 0}, L
"SeAuditPrivilege"},
43 {{SE_SYSTEM_ENVIRONMENT_PRIVILEGE
, 0}, L
"SeSystemEnvironmentPrivilege"},
44 {{SE_CHANGE_NOTIFY_PRIVILEGE
, 0}, L
"SeChangeNotifyPrivilege"},
45 {{SE_REMOTE_SHUTDOWN_PRIVILEGE
, 0}, L
"SeRemoteShutdownPrivilege"},
46 {{SE_UNDOCK_PRIVILEGE
, 0}, L
"SeUndockPrivilege"},
47 {{SE_SYNC_AGENT_PRIVILEGE
, 0}, L
"SeSyncAgentPrivilege"},
48 {{SE_ENABLE_DELEGATION_PRIVILEGE
, 0}, L
"SeEnableDelegationPrivilege"},
49 {{SE_MANAGE_VOLUME_PRIVILEGE
, 0}, L
"SeManageVolumePrivilege"},
50 {{SE_IMPERSONATE_PRIVILEGE
, 0}, L
"SeImpersonatePrivilege"},
51 {{SE_CREATE_GLOBAL_PRIVILEGE
, 0}, L
"SeCreateGlobalPrivilege"}
55 /* FUNCTIONS ***************************************************************/
58 LsarpLookupPrivilegeName(PLUID Value
,
59 PUNICODE_STRING
*Name
)
61 PUNICODE_STRING NameBuffer
;
64 if (Value
->HighPart
!= 0 ||
65 (Value
->LowPart
< SE_MIN_WELL_KNOWN_PRIVILEGE
||
66 Value
->LowPart
> SE_MAX_WELL_KNOWN_PRIVILEGE
))
68 return STATUS_NO_SUCH_PRIVILEGE
;
71 for (Priv
= 0; Priv
< sizeof(WellKnownPrivileges
) / sizeof(WellKnownPrivileges
[0]); Priv
++)
73 if (Value
->LowPart
== WellKnownPrivileges
[Priv
].Luid
.LowPart
&&
74 Value
->HighPart
== WellKnownPrivileges
[Priv
].Luid
.HighPart
)
76 NameBuffer
= MIDL_user_allocate(sizeof(UNICODE_STRING
));
77 if (NameBuffer
== NULL
)
78 return STATUS_NO_MEMORY
;
80 NameBuffer
->Length
= wcslen(WellKnownPrivileges
[Priv
].Name
) * sizeof(WCHAR
);
81 NameBuffer
->MaximumLength
= NameBuffer
->Length
+ sizeof(WCHAR
);
83 NameBuffer
->Buffer
= MIDL_user_allocate(NameBuffer
->MaximumLength
);
84 if (NameBuffer
== NULL
)
86 MIDL_user_free(NameBuffer
);
87 return STATUS_NO_MEMORY
;
90 wcscpy(NameBuffer
->Buffer
, WellKnownPrivileges
[Priv
].Name
);
94 return STATUS_SUCCESS
;
98 return STATUS_NO_SUCH_PRIVILEGE
;
103 LsarpLookupPrivilegeValue(PUNICODE_STRING Name
,
108 if (Name
->Length
== 0 || Name
->Buffer
== NULL
)
109 return STATUS_NO_SUCH_PRIVILEGE
;
111 for (Priv
= 0; Priv
< sizeof(WellKnownPrivileges
) / sizeof(WellKnownPrivileges
[0]); Priv
++)
113 if (_wcsicmp(Name
->Buffer
, WellKnownPrivileges
[Priv
].Name
) == 0)
115 Value
->LowPart
= WellKnownPrivileges
[Priv
].Luid
.LowPart
;
116 Value
->HighPart
= WellKnownPrivileges
[Priv
].Luid
.HighPart
;
117 return STATUS_SUCCESS
;
121 return STATUS_NO_SUCH_PRIVILEGE
;