Sync with trunk (r48123)
[reactos.git] / dll / win32 / lsasrv / privileges.c
1 #define WIN32_NO_STATUS
2 #include <windows.h>
3 #include <ntsecapi.h>
4 #define NTOS_MODE_USER
5 #include <ndk/ntndk.h>
6
7 #include <wchar.h>
8 #include <string.h>
9
10
11 #include <wine/debug.h>
12
13
14 typedef struct
15 {
16 LUID Luid;
17 LPCWSTR Name;
18 } PRIVILEGE_DATA;
19
20
21 static const PRIVILEGE_DATA WellKnownPrivileges[] =
22 {
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"}
52 };
53
54
55 /* FUNCTIONS ***************************************************************/
56
57 NTSTATUS
58 LsarpLookupPrivilegeName(PLUID Value,
59 PUNICODE_STRING *Name)
60 {
61 PUNICODE_STRING NameBuffer;
62 ULONG Priv;
63
64 if (Value->HighPart != 0 ||
65 (Value->LowPart < SE_MIN_WELL_KNOWN_PRIVILEGE ||
66 Value->LowPart > SE_MAX_WELL_KNOWN_PRIVILEGE))
67 {
68 return STATUS_NO_SUCH_PRIVILEGE;
69 }
70
71 for (Priv = 0; Priv < sizeof(WellKnownPrivileges) / sizeof(WellKnownPrivileges[0]); Priv++)
72 {
73 if (Value->LowPart == WellKnownPrivileges[Priv].Luid.LowPart &&
74 Value->HighPart == WellKnownPrivileges[Priv].Luid.HighPart)
75 {
76 NameBuffer = MIDL_user_allocate(sizeof(UNICODE_STRING));
77 if (NameBuffer == NULL)
78 return STATUS_NO_MEMORY;
79
80 NameBuffer->Length = wcslen(WellKnownPrivileges[Priv].Name) * sizeof(WCHAR);
81 NameBuffer->MaximumLength = NameBuffer->Length + sizeof(WCHAR);
82
83 NameBuffer->Buffer = MIDL_user_allocate(NameBuffer->MaximumLength);
84 if (NameBuffer == NULL)
85 {
86 MIDL_user_free(NameBuffer);
87 return STATUS_NO_MEMORY;
88 }
89
90 wcscpy(NameBuffer->Buffer, WellKnownPrivileges[Priv].Name);
91
92 *Name = NameBuffer;
93
94 return STATUS_SUCCESS;
95 }
96 }
97
98 return STATUS_NO_SUCH_PRIVILEGE;
99 }
100
101
102 NTSTATUS
103 LsarpLookupPrivilegeValue(PUNICODE_STRING Name,
104 PLUID Value)
105 {
106 ULONG Priv;
107
108 if (Name->Length == 0 || Name->Buffer == NULL)
109 return STATUS_NO_SUCH_PRIVILEGE;
110
111 for (Priv = 0; Priv < sizeof(WellKnownPrivileges) / sizeof(WellKnownPrivileges[0]); Priv++)
112 {
113 if (_wcsicmp(Name->Buffer, WellKnownPrivileges[Priv].Name) == 0)
114 {
115 Value->LowPart = WellKnownPrivileges[Priv].Luid.LowPart;
116 Value->HighPart = WellKnownPrivileges[Priv].Luid.HighPart;
117 return STATUS_SUCCESS;
118 }
119 }
120
121 return STATUS_NO_SUCH_PRIVILEGE;
122 }