/*
- * 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"
+#include <rpc.h>
+#include "srvsvc_c.h"
+#include "wkssvc_c.h"
-WINE_DEFAULT_DEBUG_CHANNEL(netapi32);
-
-
-/* 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));
+ TRACE("NetRegisterDomainNameChangeNotification(%p)\n",
+ NotificationEventHandle);
- Status = LsaOpenPolicy(ServerName,
- &ObjectAttributes,
- POLICY_VIEW_LOCAL_INFORMATION,
- &PolicyHandle);
- if (!NT_SUCCESS(Status))
- {
- ERR("LsaOpenPolicy failed (Status %08lx)\n", Status);
- return Status;
- }
+ if (NotificationEventHandle == NULL)
+ return ERROR_INVALID_PARAMETER;
- Status = LsaQueryInformationPolicy(PolicyHandle,
- PolicyAccountDomainInformation,
- (PVOID *)&AccountDomainInfo);
- if (!NT_SUCCESS(Status))
- {
- ERR("LsaQueryInformationPolicy failed (Status %08lx)\n", Status);
- goto done;
- }
+ EventHandle = CreateEventW(NULL, FALSE, FALSE, NULL);
+ if (EventHandle == NULL)
+ return GetLastError();
- Length = RtlLengthSid(AccountDomainInfo->DomainSid);
-
- *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);
+ *NotificationEventHandle = EventHandle;
-done:
- if (AccountDomainInfo != NULL)
- LsaFreeMemory(AccountDomainInfo);
-
- 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;
+ NET_API_STATUS status = ERROR_NOT_SUPPORTED;
- Status = RtlInitializeSid(Sid,
- &NtAuthority,
- 1);
- if (!NT_SUCCESS(Status))
- goto done;
-
- Ptr = RtlSubAuthoritySid(Sid, 0);
- *Ptr = SECURITY_BUILTIN_DOMAIN_RID;
+ TRACE("NetStatisticsGet(%s %s %lu %lu %p)\n",
+ debugstr_w(server), debugstr_w(service), level, options, bufptr);
- *BuiltinDomainSid = Sid;
+ *bufptr = NULL;
-done:
- if (!NT_SUCCESS(Status))
+ if (_wcsicmp(service, L"LanmanWorkstation") == 0)
+ {
+ 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;
+ }
+ else if (_wcsicmp(service, L"LanmanServer") == 0)
{
- if (Sid != NULL)
- RtlFreeHeap(RtlGetProcessHeap(), 0, Sid);
+ 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
-OpenAccountDomain(IN SAM_HANDLE ServerHandle,
- IN PUNICODE_STRING ServerName,
- IN ULONG DesiredAccess,
- OUT PSAM_HANDLE DomainHandle)
+NET_API_STATUS
+WINAPI
+NetUnregisterDomainNameChangeNotification(
+ _In_ HANDLE NotificationEventHandle)
{
- PSID DomainSid = NULL;
NTSTATUS Status;
- Status = GetAccountDomainSid(ServerName,
- &DomainSid);
- if (!NT_SUCCESS(Status))
- {
- ERR("GetAccountDomainSid failed (Status %08lx)\n", Status);
- return Status;
- }
+ TRACE("NetUnregisterDomainNameChangeNotification(%p)\n",
+ NotificationEventHandle);
- Status = SamOpenDomain(ServerHandle,
- DesiredAccess,
- DomainSid,
- DomainHandle);
+ if (NotificationEventHandle == NULL)
+ return ERROR_INVALID_PARAMETER;
- RtlFreeHeap(RtlGetProcessHeap(), 0, DomainSid);
+ Status = LsaUnregisterPolicyChangeNotification(PolicyNotifyDnsDomainInformation,
+ NotificationEventHandle);
- if (!NT_SUCCESS(Status))
- {
- ERR("SamOpenDomain failed (Status %08lx)\n", Status);
- }
-
- return Status;
+ return NetpNtStatusToApiStatus(Status);
}
-NTSTATUS
-OpenBuiltinDomain(IN SAM_HANDLE ServerHandle,
- IN ULONG DesiredAccess,
- OUT PSAM_HANDLE DomainHandle)
+NET_API_STATUS
+WINAPI
+NetpNtStatusToApiStatus(
+ _In_ NTSTATUS Status)
{
- PSID DomainSid = NULL;
- NTSTATUS Status;
+ NET_API_STATUS ApiStatus;
- Status = GetBuiltinDomainSid(&DomainSid);
- if (!NT_SUCCESS(Status))
+ switch (Status)
{
- ERR("GetBuiltinDomainSid failed (Status %08lx)\n", Status);
- return Status;
- }
+ case STATUS_SUCCESS:
+ ApiStatus = NERR_Success;
+ break;
- Status = SamOpenDomain(ServerHandle,
- DesiredAccess,
- DomainSid,
- DomainHandle);
+ case STATUS_INVALID_ACCOUNT_NAME:
+ ApiStatus = NERR_BadUsername;
+ break;
- RtlFreeHeap(RtlGetProcessHeap(), 0, DomainSid);
+ case STATUS_PASSWORD_RESTRICTION:
+ ApiStatus = NERR_PasswordTooShort;
+ break;
- if (!NT_SUCCESS(Status))
- {
- ERR("SamOpenDomain failed (Status %08lx)\n", Status);
+ default:
+ ApiStatus = RtlNtStatusToDosError(Status);
+ break;
}
- return Status;
+ return ApiStatus;
}
/* EOF */