mirror of
https://github.com/reactos/reactos.git
synced 2024-09-30 14:37:45 +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
|
@ -907,11 +907,35 @@ WINAPI
|
|||
LsaLookupPrivilegeDisplayName(IN LSA_HANDLE PolicyHandle,
|
||||
IN PLSA_UNICODE_STRING Name,
|
||||
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);
|
||||
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;
|
||||
}
|
||||
|
||||
/**********************************************************************
|
||||
* 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
|
||||
pGetSecurityInfoCheck(SECURITY_INFORMATION SecurityInfo,
|
||||
|
|
|
@ -1102,31 +1102,54 @@ WINAPI
|
|||
LookupPrivilegeDisplayNameA(LPCSTR lpSystemName,
|
||||
LPCSTR lpName,
|
||||
LPSTR lpDisplayName,
|
||||
LPDWORD cbDisplayName,
|
||||
LPDWORD cchDisplayName,
|
||||
LPDWORD lpLanguageId)
|
||||
{
|
||||
FIXME("%s() not implemented!\n", __FUNCTION__);
|
||||
SetLastError (ERROR_CALL_NOT_IMPLEMENTED);
|
||||
return FALSE;
|
||||
}
|
||||
UNICODE_STRING lpSystemNameW;
|
||||
UNICODE_STRING lpNameW;
|
||||
BOOL ret;
|
||||
DWORD wLen = 0;
|
||||
|
||||
TRACE("%s %s %p %p %p\n", debugstr_a(lpSystemName), debugstr_a(lpName), lpName, cchDisplayName, lpLanguageId);
|
||||
|
||||
/**********************************************************************
|
||||
* LookupPrivilegeDisplayNameW EXPORTED
|
||||
*
|
||||
* @unimplemented
|
||||
*/
|
||||
BOOL
|
||||
WINAPI
|
||||
LookupPrivilegeDisplayNameW(LPCWSTR lpSystemName,
|
||||
LPCWSTR lpName,
|
||||
LPWSTR lpDisplayName,
|
||||
LPDWORD cbDisplayName,
|
||||
LPDWORD lpLanguageId)
|
||||
{
|
||||
FIXME("%s() not implemented!\n", __FUNCTION__);
|
||||
SetLastError (ERROR_CALL_NOT_IMPLEMENTED);
|
||||
return FALSE;
|
||||
RtlCreateUnicodeStringFromAsciiz(&lpSystemNameW, lpSystemName);
|
||||
RtlCreateUnicodeStringFromAsciiz(&lpNameW, lpName);
|
||||
ret = LookupPrivilegeDisplayNameW(lpSystemNameW.Buffer, lpNameW.Buffer, NULL, &wLen, lpLanguageId);
|
||||
if (!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER)
|
||||
{
|
||||
LPWSTR lpDisplayNameW = HeapAlloc(GetProcessHeap(), 0, wLen * sizeof(WCHAR));
|
||||
|
||||
ret = LookupPrivilegeDisplayNameW(lpSystemNameW.Buffer, lpNameW.Buffer, lpDisplayNameW,
|
||||
&wLen, lpLanguageId);
|
||||
if (ret)
|
||||
{
|
||||
unsigned int len = WideCharToMultiByte(CP_ACP, 0, lpDisplayNameW, -1, lpDisplayName,
|
||||
*cchDisplayName, NULL, NULL);
|
||||
|
||||
if (len == 0)
|
||||
{
|
||||
/* 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,
|
||||
USHORT *LanguageReturned)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
NTSTATUS Status;
|
||||
|
||||
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,
|
||||
PRPC_UNICODE_STRING *Name);
|
||||
|
||||
NTSTATUS
|
||||
LsarpLookupPrivilegeDisplayName(PRPC_UNICODE_STRING Name,
|
||||
USHORT ClientLanguage,
|
||||
USHORT ClientSystemDefaultLanguage,
|
||||
PRPC_UNICODE_STRING *DisplayName,
|
||||
USHORT *LanguageReturned);
|
||||
|
||||
NTSTATUS
|
||||
LsarpLookupPrivilegeValue(PRPC_UNICODE_STRING Name,
|
||||
PLUID Value);
|
||||
|
|
|
@ -118,6 +118,39 @@ LsarpLookupPrivilegeName(PLUID Value,
|
|||
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
|
||||
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,
|
||||
PLSA_REFERENCED_DOMAIN_LIST*,PLSA_TRANSLATED_SID2*);
|
||||
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 LsaLookupPrivilegeValue(LSA_HANDLE,PLSA_UNICODE_STRING,PLUID);
|
||||
NTSTATUS NTAPI LsaLookupSids(LSA_HANDLE,ULONG,PSID*,
|
||||
|
|
Loading…
Reference in a new issue