mirror of
https://github.com/reactos/reactos.git
synced 2025-07-04 06:21:23 +00:00
[ADVAPI/LSASRV] Implement LookupPrivilegeDisplayNameA, LookupPrivilegeDisplayNameW, LsaLookupPrivilegeDisplayName, LsarLookupPrivilegeDisplayName
Also partly implement LsarpLookupPrivilegeDisplayName (currently, privilege description is the same as privilege name) svn path=/trunk/; revision=65853
This commit is contained in:
parent
a306e56c55
commit
040f158fa7
7 changed files with 203 additions and 27 deletions
|
@ -907,11 +907,35 @@ WINAPI
|
||||||
LsaLookupPrivilegeDisplayName(IN LSA_HANDLE PolicyHandle,
|
LsaLookupPrivilegeDisplayName(IN LSA_HANDLE PolicyHandle,
|
||||||
IN PLSA_UNICODE_STRING Name,
|
IN PLSA_UNICODE_STRING Name,
|
||||||
OUT PLSA_UNICODE_STRING *DisplayName,
|
OUT PLSA_UNICODE_STRING *DisplayName,
|
||||||
OUT PSHORT LanguageReturned)
|
OUT PUSHORT LanguageReturned)
|
||||||
{
|
{
|
||||||
FIXME("LsaLookupPrivilegeDisplayName(%p %p %p %p)\n",
|
PRPC_UNICODE_STRING DisplayNameBuffer = NULL;
|
||||||
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
TRACE("LsaLookupPrivilegeDisplayName(%p %p %p %p)\n",
|
||||||
PolicyHandle, Name, DisplayName, LanguageReturned);
|
PolicyHandle, Name, DisplayName, LanguageReturned);
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
|
||||||
|
RpcTryExcept
|
||||||
|
{
|
||||||
|
Status = LsarLookupPrivilegeDisplayName(PolicyHandle,
|
||||||
|
(PRPC_UNICODE_STRING)Name,
|
||||||
|
GetUserDefaultUILanguage(),
|
||||||
|
GetSystemDefaultUILanguage(),
|
||||||
|
&DisplayNameBuffer,
|
||||||
|
LanguageReturned);
|
||||||
|
|
||||||
|
*DisplayName = (PUNICODE_STRING)DisplayNameBuffer;
|
||||||
|
}
|
||||||
|
RpcExcept(EXCEPTION_EXECUTE_HANDLER)
|
||||||
|
{
|
||||||
|
if (DisplayNameBuffer != NULL)
|
||||||
|
MIDL_user_free(DisplayNameBuffer);
|
||||||
|
|
||||||
|
Status = I_RpcMapWin32Status(RpcExceptionCode());
|
||||||
|
}
|
||||||
|
RpcEndExcept;
|
||||||
|
|
||||||
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -891,6 +891,75 @@ LookupPrivilegeNameW(LPCWSTR lpSystemName,
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* LookupPrivilegeDisplayNameW EXPORTED
|
||||||
|
*
|
||||||
|
* @unimplemented
|
||||||
|
*/
|
||||||
|
BOOL
|
||||||
|
WINAPI
|
||||||
|
LookupPrivilegeDisplayNameW(LPCWSTR lpSystemName,
|
||||||
|
LPCWSTR lpName,
|
||||||
|
LPWSTR lpDisplayName,
|
||||||
|
LPDWORD cchDisplayName,
|
||||||
|
LPDWORD lpLanguageId)
|
||||||
|
{
|
||||||
|
OBJECT_ATTRIBUTES ObjectAttributes = {0};
|
||||||
|
UNICODE_STRING SystemName, Name;
|
||||||
|
PUNICODE_STRING DisplayName;
|
||||||
|
LSA_HANDLE PolicyHandle = NULL;
|
||||||
|
USHORT LanguageId;
|
||||||
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
TRACE("%S,%S,%p,%p,%p\n", lpSystemName, lpName, lpDisplayName, cchDisplayName, lpLanguageId);
|
||||||
|
|
||||||
|
RtlInitUnicodeString(&SystemName, lpSystemName);
|
||||||
|
RtlInitUnicodeString(&Name, lpName);
|
||||||
|
|
||||||
|
Status = LsaOpenPolicy(lpSystemName ? &SystemName : NULL,
|
||||||
|
&ObjectAttributes,
|
||||||
|
POLICY_LOOKUP_NAMES,
|
||||||
|
&PolicyHandle);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
SetLastError(LsaNtStatusToWinError(Status));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = LsaLookupPrivilegeDisplayName(PolicyHandle, &Name, &DisplayName, &LanguageId);
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
*lpLanguageId = LanguageId;
|
||||||
|
if (DisplayName->Length + sizeof(WCHAR) > *cchDisplayName * sizeof(WCHAR))
|
||||||
|
{
|
||||||
|
Status = STATUS_BUFFER_TOO_SMALL;
|
||||||
|
|
||||||
|
*cchDisplayName = (DisplayName->Length + sizeof(WCHAR)) / sizeof(WCHAR);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
RtlMoveMemory(lpDisplayName,
|
||||||
|
DisplayName->Buffer,
|
||||||
|
DisplayName->Length);
|
||||||
|
lpDisplayName[DisplayName->Length / sizeof(WCHAR)] = 0;
|
||||||
|
|
||||||
|
*cchDisplayName = DisplayName->Length / sizeof(WCHAR);
|
||||||
|
}
|
||||||
|
|
||||||
|
LsaFreeMemory(DisplayName->Buffer);
|
||||||
|
LsaFreeMemory(DisplayName);
|
||||||
|
}
|
||||||
|
|
||||||
|
LsaClose(PolicyHandle);
|
||||||
|
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
SetLastError(LsaNtStatusToWinError(Status));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static DWORD
|
static DWORD
|
||||||
pGetSecurityInfoCheck(SECURITY_INFORMATION SecurityInfo,
|
pGetSecurityInfoCheck(SECURITY_INFORMATION SecurityInfo,
|
||||||
|
|
|
@ -1102,31 +1102,54 @@ WINAPI
|
||||||
LookupPrivilegeDisplayNameA(LPCSTR lpSystemName,
|
LookupPrivilegeDisplayNameA(LPCSTR lpSystemName,
|
||||||
LPCSTR lpName,
|
LPCSTR lpName,
|
||||||
LPSTR lpDisplayName,
|
LPSTR lpDisplayName,
|
||||||
LPDWORD cbDisplayName,
|
LPDWORD cchDisplayName,
|
||||||
LPDWORD lpLanguageId)
|
LPDWORD lpLanguageId)
|
||||||
{
|
{
|
||||||
FIXME("%s() not implemented!\n", __FUNCTION__);
|
UNICODE_STRING lpSystemNameW;
|
||||||
SetLastError (ERROR_CALL_NOT_IMPLEMENTED);
|
UNICODE_STRING lpNameW;
|
||||||
return FALSE;
|
BOOL ret;
|
||||||
}
|
DWORD wLen = 0;
|
||||||
|
|
||||||
|
TRACE("%s %s %p %p %p\n", debugstr_a(lpSystemName), debugstr_a(lpName), lpName, cchDisplayName, lpLanguageId);
|
||||||
|
|
||||||
/**********************************************************************
|
RtlCreateUnicodeStringFromAsciiz(&lpSystemNameW, lpSystemName);
|
||||||
* LookupPrivilegeDisplayNameW EXPORTED
|
RtlCreateUnicodeStringFromAsciiz(&lpNameW, lpName);
|
||||||
*
|
ret = LookupPrivilegeDisplayNameW(lpSystemNameW.Buffer, lpNameW.Buffer, NULL, &wLen, lpLanguageId);
|
||||||
* @unimplemented
|
if (!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER)
|
||||||
*/
|
{
|
||||||
BOOL
|
LPWSTR lpDisplayNameW = HeapAlloc(GetProcessHeap(), 0, wLen * sizeof(WCHAR));
|
||||||
WINAPI
|
|
||||||
LookupPrivilegeDisplayNameW(LPCWSTR lpSystemName,
|
ret = LookupPrivilegeDisplayNameW(lpSystemNameW.Buffer, lpNameW.Buffer, lpDisplayNameW,
|
||||||
LPCWSTR lpName,
|
&wLen, lpLanguageId);
|
||||||
LPWSTR lpDisplayName,
|
if (ret)
|
||||||
LPDWORD cbDisplayName,
|
{
|
||||||
LPDWORD lpLanguageId)
|
unsigned int len = WideCharToMultiByte(CP_ACP, 0, lpDisplayNameW, -1, lpDisplayName,
|
||||||
{
|
*cchDisplayName, NULL, NULL);
|
||||||
FIXME("%s() not implemented!\n", __FUNCTION__);
|
|
||||||
SetLastError (ERROR_CALL_NOT_IMPLEMENTED);
|
if (len == 0)
|
||||||
return FALSE;
|
{
|
||||||
|
/* WideCharToMultiByte failed */
|
||||||
|
ret = FALSE;
|
||||||
|
}
|
||||||
|
else if (len > *cchDisplayName)
|
||||||
|
{
|
||||||
|
*cchDisplayName = len;
|
||||||
|
SetLastError(ERROR_INSUFFICIENT_BUFFER);
|
||||||
|
ret = FALSE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* WideCharToMultiByte succeeded, output length needs to be
|
||||||
|
* length not including NULL terminator
|
||||||
|
*/
|
||||||
|
*cchDisplayName = len - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
HeapFree(GetProcessHeap(), 0, lpDisplayNameW);
|
||||||
|
}
|
||||||
|
RtlFreeUnicodeString(&lpSystemNameW);
|
||||||
|
RtlFreeUnicodeString(&lpNameW);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
|
|
|
@ -2104,8 +2104,28 @@ NTSTATUS WINAPI LsarLookupPrivilegeDisplayName(
|
||||||
PRPC_UNICODE_STRING *DisplayName,
|
PRPC_UNICODE_STRING *DisplayName,
|
||||||
USHORT *LanguageReturned)
|
USHORT *LanguageReturned)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
NTSTATUS Status;
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
|
||||||
|
TRACE("LsarLookupPrivilegeDisplayName(%p, %p, %u, %u, %p, %p)\n",
|
||||||
|
PolicyHandle, Name, ClientLanguage, ClientSystemDefaultLanguage, DisplayName, LanguageReturned);
|
||||||
|
|
||||||
|
Status = LsapValidateDbObject(PolicyHandle,
|
||||||
|
LsaDbPolicyObject,
|
||||||
|
POLICY_LOOKUP_NAMES,
|
||||||
|
NULL);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
ERR("Invalid handle\n");
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = LsarpLookupPrivilegeDisplayName(Name,
|
||||||
|
ClientLanguage,
|
||||||
|
ClientSystemDefaultLanguage,
|
||||||
|
DisplayName,
|
||||||
|
LanguageReturned);
|
||||||
|
|
||||||
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -302,6 +302,13 @@ NTSTATUS
|
||||||
LsarpLookupPrivilegeName(PLUID Value,
|
LsarpLookupPrivilegeName(PLUID Value,
|
||||||
PRPC_UNICODE_STRING *Name);
|
PRPC_UNICODE_STRING *Name);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
LsarpLookupPrivilegeDisplayName(PRPC_UNICODE_STRING Name,
|
||||||
|
USHORT ClientLanguage,
|
||||||
|
USHORT ClientSystemDefaultLanguage,
|
||||||
|
PRPC_UNICODE_STRING *DisplayName,
|
||||||
|
USHORT *LanguageReturned);
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
LsarpLookupPrivilegeValue(PRPC_UNICODE_STRING Name,
|
LsarpLookupPrivilegeValue(PRPC_UNICODE_STRING Name,
|
||||||
PLUID Value);
|
PLUID Value);
|
||||||
|
|
|
@ -118,6 +118,39 @@ LsarpLookupPrivilegeName(PLUID Value,
|
||||||
return STATUS_NO_SUCH_PRIVILEGE;
|
return STATUS_NO_SUCH_PRIVILEGE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
LsarpLookupPrivilegeDisplayName(PRPC_UNICODE_STRING Name,
|
||||||
|
USHORT ClientLanguage,
|
||||||
|
USHORT ClientSystemDefaultLanguage,
|
||||||
|
PRPC_UNICODE_STRING *DisplayName,
|
||||||
|
USHORT *LanguageReturned)
|
||||||
|
{
|
||||||
|
PRPC_UNICODE_STRING DisplayNameBuffer;
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
|
||||||
|
/* For now, description is equal to privilege name */
|
||||||
|
|
||||||
|
DisplayNameBuffer = MIDL_user_allocate(sizeof(RPC_UNICODE_STRING));
|
||||||
|
if (DisplayNameBuffer == NULL)
|
||||||
|
{
|
||||||
|
return STATUS_NO_MEMORY;
|
||||||
|
}
|
||||||
|
DisplayNameBuffer->Length = Name->Length;
|
||||||
|
DisplayNameBuffer->MaximumLength = Name->MaximumLength;
|
||||||
|
|
||||||
|
DisplayNameBuffer->Buffer = MIDL_user_allocate(DisplayNameBuffer->MaximumLength);
|
||||||
|
if (DisplayNameBuffer->Buffer == NULL)
|
||||||
|
{
|
||||||
|
MIDL_user_free(DisplayNameBuffer);
|
||||||
|
return STATUS_NO_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
wcscpy(DisplayNameBuffer->Buffer, Name->Buffer);
|
||||||
|
|
||||||
|
*DisplayName = DisplayNameBuffer;
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
LsarpLookupPrivilegeValue(PRPC_UNICODE_STRING Name,
|
LsarpLookupPrivilegeValue(PRPC_UNICODE_STRING Name,
|
||||||
|
|
|
@ -724,7 +724,7 @@ NTSTATUS NTAPI LsaLookupNames(LSA_HANDLE,ULONG,PLSA_UNICODE_STRING,
|
||||||
NTSTATUS NTAPI LsaLookupNames2(LSA_HANDLE,ULONG,ULONG,PLSA_UNICODE_STRING,
|
NTSTATUS NTAPI LsaLookupNames2(LSA_HANDLE,ULONG,ULONG,PLSA_UNICODE_STRING,
|
||||||
PLSA_REFERENCED_DOMAIN_LIST*,PLSA_TRANSLATED_SID2*);
|
PLSA_REFERENCED_DOMAIN_LIST*,PLSA_TRANSLATED_SID2*);
|
||||||
NTSTATUS NTAPI LsaLookupPrivilegeDisplayName(LSA_HANDLE,PLSA_UNICODE_STRING,
|
NTSTATUS NTAPI LsaLookupPrivilegeDisplayName(LSA_HANDLE,PLSA_UNICODE_STRING,
|
||||||
PLSA_UNICODE_STRING*,PSHORT);
|
PLSA_UNICODE_STRING*,PUSHORT);
|
||||||
NTSTATUS NTAPI LsaLookupPrivilegeName(LSA_HANDLE,PLUID,PLSA_UNICODE_STRING*);
|
NTSTATUS NTAPI LsaLookupPrivilegeName(LSA_HANDLE,PLUID,PLSA_UNICODE_STRING*);
|
||||||
NTSTATUS NTAPI LsaLookupPrivilegeValue(LSA_HANDLE,PLSA_UNICODE_STRING,PLUID);
|
NTSTATUS NTAPI LsaLookupPrivilegeValue(LSA_HANDLE,PLSA_UNICODE_STRING,PLUID);
|
||||||
NTSTATUS NTAPI LsaLookupSids(LSA_HANDLE,ULONG,PSID*,
|
NTSTATUS NTAPI LsaLookupSids(LSA_HANDLE,ULONG,PSID*,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue