/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: NetAPI DLL
- * FILE: reactos/dll/win32/netapi32/misc.c
- * PURPOSE: Helper functions
- *
- * PROGRAMMERS: Eric Kohl
+ * PROJECT: NetAPI DLL
+ * LICENSE: GPL-2.0 (https://spdx.org/licenses/GPL-2.0)
+ * PURPOSE: Miscellaneous functions
+ * COPYRIGHT: Copyright 2017 Eric Kohl (eric.kohl@reactos.org)
*/
/* INCLUDES ******************************************************************/
#include "netapi32.h"
-WINE_DEFAULT_DEBUG_CHANNEL(netapi32);
+#include <rpc.h>
+#include "srvsvc_c.h"
+#include "wkssvc_c.h"
-/* GLOBALS *******************************************************************/
-static SID_IDENTIFIER_AUTHORITY NtAuthority = {SECURITY_NT_AUTHORITY};
+WINE_DEFAULT_DEBUG_CHANNEL(netapi32);
/* FUNCTIONS *****************************************************************/
-NTSTATUS
-GetAccountDomainSid(IN PUNICODE_STRING ServerName,
- OUT PSID *AccountDomainSid)
+NET_API_STATUS
+WINAPI
+NetRegisterDomainNameChangeNotification(
+ _Out_ PHANDLE NotificationEventHandle)
{
- PPOLICY_ACCOUNT_DOMAIN_INFO AccountDomainInfo = NULL;
- LSA_OBJECT_ATTRIBUTES ObjectAttributes;
- LSA_HANDLE PolicyHandle = NULL;
- ULONG Length = 0;
+ HANDLE EventHandle;
NTSTATUS Status;
- memset(&ObjectAttributes, 0, sizeof(LSA_OBJECT_ATTRIBUTES));
-
- Status = LsaOpenPolicy(ServerName,
- &ObjectAttributes,
- POLICY_VIEW_LOCAL_INFORMATION,
- &PolicyHandle);
- if (!NT_SUCCESS(Status))
- {
- ERR("LsaOpenPolicy failed (Status %08lx)\n", Status);
- return Status;
- }
+ TRACE("NetRegisterDomainNameChangeNotification(%p)\n",
+ NotificationEventHandle);
- Status = LsaQueryInformationPolicy(PolicyHandle,
- PolicyAccountDomainInformation,
- (PVOID *)&AccountDomainInfo);
- if (!NT_SUCCESS(Status))
- {
- ERR("LsaQueryInformationPolicy failed (Status %08lx)\n", Status);
- goto done;
- }
+ if (NotificationEventHandle == NULL)
+ return ERROR_INVALID_PARAMETER;
- Length = RtlLengthSid(AccountDomainInfo->DomainSid);
+ EventHandle = CreateEventW(NULL, FALSE, FALSE, NULL);
+ if (EventHandle == NULL)
+ return GetLastError();
- *AccountDomainSid = RtlAllocateHeap(RtlGetProcessHeap(), 0, Length);
- if (*AccountDomainSid == NULL)
+ Status = LsaRegisterPolicyChangeNotification(PolicyNotifyDnsDomainInformation,
+ NotificationEventHandle);
+ if (!NT_SUCCESS(Status))
{
- ERR("Failed to allocate SID\n");
- Status = STATUS_INSUFFICIENT_RESOURCES;
- goto done;
+ CloseHandle(EventHandle);
+ return NetpNtStatusToApiStatus(Status);
}
- memcpy(*AccountDomainSid, AccountDomainInfo->DomainSid, Length);
-
-done:
- if (AccountDomainInfo != NULL)
- LsaFreeMemory(AccountDomainInfo);
+ *NotificationEventHandle = EventHandle;
- LsaClose(PolicyHandle);
-
- return Status;
+ return NERR_Success;
}
-NTSTATUS
-GetBuiltinDomainSid(OUT PSID *BuiltinDomainSid)
+NET_API_STATUS
+WINAPI
+NetStatisticsGet(
+ _In_ LPWSTR server,
+ _In_ LPWSTR service,
+ _In_ DWORD level,
+ _In_ DWORD options,
+ _Out_ LPBYTE *bufptr)
{
- PSID Sid = NULL;
- PULONG Ptr;
- NTSTATUS Status = STATUS_SUCCESS;
-
- *BuiltinDomainSid = NULL;
-
- Sid = RtlAllocateHeap(RtlGetProcessHeap(),
- 0,
- RtlLengthRequiredSid(1));
- if (Sid == NULL)
- return STATUS_INSUFFICIENT_RESOURCES;
-
- Status = RtlInitializeSid(Sid,
- &NtAuthority,
- 1);
- if (!NT_SUCCESS(Status))
- goto done;
-
- Ptr = RtlSubAuthoritySid(Sid, 0);
- *Ptr = SECURITY_BUILTIN_DOMAIN_RID;
-
- *BuiltinDomainSid = Sid;
-
-done:
- if (!NT_SUCCESS(Status))
- {
- if (Sid != NULL)
- RtlFreeHeap(RtlGetProcessHeap(), 0, Sid);
- }
+ NET_API_STATUS status = ERROR_NOT_SUPPORTED;
- return Status;
-}
+ TRACE("NetStatisticsGet(%s %s %lu %lu %p)\n",
+ debugstr_w(server), debugstr_w(service), level, options, bufptr);
+ *bufptr = NULL;
-NTSTATUS
-OpenAccountDomain(IN SAM_HANDLE ServerHandle,
- IN PUNICODE_STRING ServerName,
- IN ULONG DesiredAccess,
- OUT PSAM_HANDLE DomainHandle)
-{
- PSID DomainSid = NULL;
- NTSTATUS Status;
-
- Status = GetAccountDomainSid(ServerName,
- &DomainSid);
- if (!NT_SUCCESS(Status))
+ if (_wcsicmp(service, L"LanmanWorkstation") == 0)
{
- ERR("GetAccountDomainSid failed (Status %08lx)\n", Status);
- return Status;
+ if (level != 0)
+ return ERROR_INVALID_LEVEL;
+
+ if (options != 0)
+ return ERROR_INVALID_PARAMETER;
+
+ RpcTryExcept
+ {
+ status = NetrWorkstationStatisticsGet(server,
+ L"LanmanWorkstation",
+ level,
+ options,
+ (LPSTAT_WORKSTATION_0*)bufptr);
+ }
+ RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+ {
+ status = I_RpcMapWin32Status(RpcExceptionCode());
+ }
+ RpcEndExcept;
}
-
- Status = SamOpenDomain(ServerHandle,
- DesiredAccess,
- DomainSid,
- DomainHandle);
-
- RtlFreeHeap(RtlGetProcessHeap(), 0, DomainSid);
-
- if (!NT_SUCCESS(Status))
+ else if (_wcsicmp(service, L"LanmanServer") == 0)
{
- ERR("SamOpenDomain failed (Status %08lx)\n", Status);
+ if (level != 0)
+ return ERROR_INVALID_LEVEL;
+
+ if (options != 0)
+ return ERROR_INVALID_PARAMETER;
+
+ RpcTryExcept
+ {
+ status = NetrServerStatisticsGet(server,
+ L"LanmanServer",
+ level,
+ options,
+ (LPSTAT_SERVER_0 *)bufptr);
+ }
+ RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+ {
+ status = I_RpcMapWin32Status(RpcExceptionCode());
+ }
+ RpcEndExcept;
}
- return Status;
+ return status;
}
-NTSTATUS
-OpenBuiltinDomain(IN SAM_HANDLE ServerHandle,
- IN ULONG DesiredAccess,
- OUT PSAM_HANDLE DomainHandle)
+NET_API_STATUS
+WINAPI
+NetUnregisterDomainNameChangeNotification(
+ _In_ HANDLE NotificationEventHandle)
{
- PSID DomainSid = NULL;
NTSTATUS Status;
- Status = GetBuiltinDomainSid(&DomainSid);
- if (!NT_SUCCESS(Status))
- {
- ERR("GetBuiltinDomainSid failed (Status %08lx)\n", Status);
- return Status;
- }
-
- Status = SamOpenDomain(ServerHandle,
- DesiredAccess,
- DomainSid,
- DomainHandle);
+ TRACE("NetUnregisterDomainNameChangeNotification(%p)\n",
+ NotificationEventHandle);
- RtlFreeHeap(RtlGetProcessHeap(), 0, DomainSid);
+ if (NotificationEventHandle == NULL)
+ return ERROR_INVALID_PARAMETER;
- if (!NT_SUCCESS(Status))
- {
- ERR("SamOpenDomain failed (Status %08lx)\n", Status);
- }
+ Status = LsaUnregisterPolicyChangeNotification(PolicyNotifyDnsDomainInformation,
+ NotificationEventHandle);
- return Status;
+ return NetpNtStatusToApiStatus(Status);
}
NET_API_STATUS
-BuildSidFromSidAndRid(IN PSID SrcSid,
- IN ULONG RelativeId,
- OUT PSID *DestSid)
+WINAPI
+NetpNtStatusToApiStatus(
+ _In_ NTSTATUS Status)
{
- UCHAR RidCount;
- PSID DstSid;
- ULONG i;
- ULONG DstSidSize;
- PULONG p, q;
- NET_API_STATUS ApiStatus = NERR_Success;
-
- RidCount = *RtlSubAuthorityCountSid(SrcSid);
- if (RidCount >= 8)
- return ERROR_INVALID_PARAMETER;
+ NET_API_STATUS ApiStatus;
- DstSidSize = RtlLengthRequiredSid(RidCount + 1);
+ switch (Status)
+ {
+ case STATUS_SUCCESS:
+ ApiStatus = NERR_Success;
+ break;
- ApiStatus = NetApiBufferAllocate(DstSidSize,
- &DstSid);
- if (ApiStatus != NERR_Success)
- return ApiStatus;
+ case STATUS_INVALID_ACCOUNT_NAME:
+ ApiStatus = NERR_BadUsername;
+ break;
- RtlInitializeSid(DstSid,
- RtlIdentifierAuthoritySid(SrcSid),
- RidCount + 1);
+ case STATUS_PASSWORD_RESTRICTION:
+ ApiStatus = NERR_PasswordTooShort;
+ break;
- for (i = 0; i < (ULONG)RidCount; i++)
- {
- p = RtlSubAuthoritySid(SrcSid, i);
- q = RtlSubAuthoritySid(DstSid, i);
- *q = *p;
+ default:
+ ApiStatus = RtlNtStatusToDosError(Status);
+ break;
}
- q = RtlSubAuthoritySid(DstSid, (ULONG)RidCount);
- *q = RelativeId;
-
- *DestSid = DstSid;
-
- return NERR_Success;
+ return ApiStatus;
}
/* EOF */