Implement RtlAdjustPrivilege.
This commit is contained in:
parent
b44c2a3d8c
commit
a9983c8d16
|
@ -300,7 +300,7 @@
|
||||||
@ stub RtlAddAttributeActionToRXact
|
@ stub RtlAddAttributeActionToRXact
|
||||||
@ stub RtlAddAuditAccessAce
|
@ stub RtlAddAuditAccessAce
|
||||||
@ stdcall RtlAddVectoredExceptionHandler(long ptr)
|
@ stdcall RtlAddVectoredExceptionHandler(long ptr)
|
||||||
@ stdcall RtlAdjustPrivilege(long long long long)
|
@ stdcall RtlAdjustPrivilege(long long long ptr)
|
||||||
@ stdcall RtlAllocateAndInitializeSid (ptr long long long long long long long long long ptr)
|
@ stdcall RtlAllocateAndInitializeSid (ptr long long long long long long long long long ptr)
|
||||||
@ stdcall RtlAllocateHandle(ptr ptr)
|
@ stdcall RtlAllocateHandle(ptr ptr)
|
||||||
@ stdcall RtlAllocateHeap(long long long)
|
@ stdcall RtlAllocateHeap(long long long)
|
||||||
|
|
|
@ -1154,11 +1154,89 @@ NTSTATUS WINAPI RtlGetAce(PACL pAcl,DWORD dwAceIndex,LPVOID *pAce )
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* RtlAdjustPrivilege [NTDLL.@]
|
* RtlAdjustPrivilege [NTDLL.@]
|
||||||
|
*
|
||||||
|
* Enables or disables a privilege from the calling thread or process.
|
||||||
|
*
|
||||||
|
* PARAMS
|
||||||
|
* Privilege [I] Privilege index to change.
|
||||||
|
* Enable [I] If TRUE, then enable the privilege otherwise disable.
|
||||||
|
* CurrentThread [I] If TRUE, then enable in calling thread, otherwise process.
|
||||||
|
* Enabled [O] Whether privilege was previously enabled or disabled.
|
||||||
|
*
|
||||||
|
* RETURNS
|
||||||
|
* Success: STATUS_SUCCESS.
|
||||||
|
* Failure: NTSTATUS code.
|
||||||
|
*
|
||||||
|
* SEE ALSO
|
||||||
|
* NtAdjustPrivilegesToken, NtOpenThreadToken, NtOpenProcessToken.
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
DWORD WINAPI RtlAdjustPrivilege(DWORD x1,DWORD x2,DWORD x3,DWORD x4)
|
NTSTATUS WINAPI
|
||||||
|
RtlAdjustPrivilege(ULONG Privilege,
|
||||||
|
BOOLEAN Enable,
|
||||||
|
BOOLEAN CurrentThread,
|
||||||
|
PBOOLEAN Enabled)
|
||||||
{
|
{
|
||||||
FIXME("(0x%08lx,0x%08lx,0x%08lx,0x%08lx),stub!\n",x1,x2,x3,x4);
|
TOKEN_PRIVILEGES NewState;
|
||||||
return 0;
|
TOKEN_PRIVILEGES OldState;
|
||||||
|
ULONG ReturnLength;
|
||||||
|
HANDLE TokenHandle;
|
||||||
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
TRACE("(%ld, %s, %s, %p)\n", Privilege, Enable ? "TRUE" : "FALSE",
|
||||||
|
CurrentThread ? "TRUE" : "FALSE", Enabled);
|
||||||
|
|
||||||
|
if (CurrentThread)
|
||||||
|
{
|
||||||
|
Status = NtOpenThreadToken(GetCurrentThread(),
|
||||||
|
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
|
||||||
|
FALSE,
|
||||||
|
&TokenHandle);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Status = NtOpenProcessToken(GetCurrentProcess(),
|
||||||
|
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
|
||||||
|
&TokenHandle);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
WARN("Retrieving token handle failed (Status %lx)\n", Status);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
OldState.PrivilegeCount = 1;
|
||||||
|
|
||||||
|
NewState.PrivilegeCount = 1;
|
||||||
|
NewState.Privileges[0].Luid.LowPart = Privilege;
|
||||||
|
NewState.Privileges[0].Luid.HighPart = 0;
|
||||||
|
NewState.Privileges[0].Attributes = (Enable) ? SE_PRIVILEGE_ENABLED : 0;
|
||||||
|
|
||||||
|
Status = NtAdjustPrivilegesToken(TokenHandle,
|
||||||
|
FALSE,
|
||||||
|
&NewState,
|
||||||
|
sizeof(TOKEN_PRIVILEGES),
|
||||||
|
&OldState,
|
||||||
|
&ReturnLength);
|
||||||
|
NtClose (TokenHandle);
|
||||||
|
if (Status == STATUS_NOT_ALL_ASSIGNED)
|
||||||
|
{
|
||||||
|
TRACE("Failed to assign all privileges\n");
|
||||||
|
return STATUS_PRIVILEGE_NOT_HELD;
|
||||||
|
}
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
WARN("NtAdjustPrivilegesToken() failed (Status %lx)\n", Status);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (OldState.PrivilegeCount == 0)
|
||||||
|
*Enabled = Enable;
|
||||||
|
else
|
||||||
|
*Enabled = (OldState.Privileges[0].Attributes & SE_PRIVILEGE_ENABLED);
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
|
|
|
@ -1613,7 +1613,7 @@ NTSTATUS WINAPI RtlAddAccessDeniedAce(PACL,DWORD,DWORD,PSID);
|
||||||
NTSTATUS WINAPI RtlAddAccessDeniedAceEx(PACL,DWORD,DWORD,DWORD,PSID);
|
NTSTATUS WINAPI RtlAddAccessDeniedAceEx(PACL,DWORD,DWORD,DWORD,PSID);
|
||||||
NTSTATUS WINAPI RtlAddAtomToAtomTable(RTL_ATOM_TABLE,const WCHAR*,RTL_ATOM*);
|
NTSTATUS WINAPI RtlAddAtomToAtomTable(RTL_ATOM_TABLE,const WCHAR*,RTL_ATOM*);
|
||||||
PVOID WINAPI RtlAddVectoredExceptionHandler(ULONG,PVECTORED_EXCEPTION_HANDLER);
|
PVOID WINAPI RtlAddVectoredExceptionHandler(ULONG,PVECTORED_EXCEPTION_HANDLER);
|
||||||
DWORD WINAPI RtlAdjustPrivilege(DWORD,DWORD,DWORD,DWORD);
|
NTSTATUS WINAPI RtlAdjustPrivilege(ULONG,BOOLEAN,BOOLEAN,PBOOLEAN);
|
||||||
NTSTATUS WINAPI RtlAllocateAndInitializeSid(PSID_IDENTIFIER_AUTHORITY,BYTE,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,PSID *);
|
NTSTATUS WINAPI RtlAllocateAndInitializeSid(PSID_IDENTIFIER_AUTHORITY,BYTE,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,PSID *);
|
||||||
RTL_HANDLE * WINAPI RtlAllocateHandle(RTL_HANDLE_TABLE *,ULONG *);
|
RTL_HANDLE * WINAPI RtlAllocateHandle(RTL_HANDLE_TABLE *,ULONG *);
|
||||||
PVOID WINAPI RtlAllocateHeap(HANDLE,ULONG,ULONG);
|
PVOID WINAPI RtlAllocateHeap(HANDLE,ULONG,ULONG);
|
||||||
|
|
Loading…
Reference in New Issue