[NETLOGON] Add the netlogon service.
authorEric Kohl <eric.kohl@reactos.org>
Wed, 29 May 2019 11:27:49 +0000 (13:27 +0200)
committerEric Kohl <eric.kohl@reactos.org>
Wed, 29 May 2019 11:37:20 +0000 (13:37 +0200)
base/services/CMakeLists.txt
base/services/netlogon/CMakeLists.txt [new file with mode: 0644]
base/services/netlogon/netlogon.c [new file with mode: 0644]
base/services/netlogon/netlogon.rc [new file with mode: 0644]
base/services/netlogon/netlogon.spec [new file with mode: 0644]
base/services/netlogon/precomp.h [new file with mode: 0644]
base/services/netlogon/rpcserver.c [new file with mode: 0644]

index 64cd734..15bdd77 100644 (file)
@@ -3,6 +3,7 @@ add_subdirectory(audiosrv)
 add_subdirectory(dcomlaunch)
 add_subdirectory(dhcpcsvc)
 add_subdirectory(eventlog)
+add_subdirectory(netlogon)
 add_subdirectory(nfsd)
 add_subdirectory(rpcss)
 add_subdirectory(schedsvc)
diff --git a/base/services/netlogon/CMakeLists.txt b/base/services/netlogon/CMakeLists.txt
new file mode 100644 (file)
index 0000000..f0e533b
--- /dev/null
@@ -0,0 +1,22 @@
+
+include_directories(${REACTOS_SOURCE_DIR}/sdk/include/reactos/idl)
+add_rpc_files(server ${REACTOS_SOURCE_DIR}/sdk/include/reactos/idl/netlogon.idl)
+spec2def(netlogon.dll netlogon.spec ADD_IMPORTLIB)
+
+list(APPEND SOURCE
+    netlogon.c
+    rpcserver.c
+    precomp.h)
+
+add_library(netlogon MODULE
+    ${SOURCE}
+    netlogon.rc
+    ${CMAKE_CURRENT_BINARY_DIR}/netlogon_s.c
+    ${CMAKE_CURRENT_BINARY_DIR}/netlogon_stubs.c
+    ${CMAKE_CURRENT_BINARY_DIR}/netlogon.def)
+
+set_module_type(netlogon win32dll UNICODE)
+target_link_libraries(netlogon wine ${PSEH_LIB})
+add_importlibs(netlogon advapi32 rpcrt4 msvcrt kernel32 ntdll)
+add_pch(netlogon precomp.h SOURCE)
+add_cd_file(TARGET netlogon DESTINATION reactos/system32 FOR all)
diff --git a/base/services/netlogon/netlogon.c b/base/services/netlogon/netlogon.c
new file mode 100644 (file)
index 0000000..0f8c4e5
--- /dev/null
@@ -0,0 +1,183 @@
+/*
+ * PROJECT:     ReactOS NetLogon Service
+ * LICENSE:     GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
+ * PURPOSE:     NetLogon service RPC server
+ * COPYRIGHT:   Eric Kohl 2019 <eric.kohl@reactos.org>
+ */
+
+/* INCLUDES *****************************************************************/
+
+#include "precomp.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(netlogon);
+
+
+/* GLOBALS ******************************************************************/
+
+HINSTANCE hDllInstance;
+
+static WCHAR ServiceName[] = L"netlogon";
+
+static SERVICE_STATUS_HANDLE ServiceStatusHandle;
+static SERVICE_STATUS ServiceStatus;
+
+
+/* FUNCTIONS *****************************************************************/
+
+static
+VOID
+UpdateServiceStatus(
+    DWORD dwState)
+{
+    ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
+    ServiceStatus.dwCurrentState = dwState;
+    ServiceStatus.dwControlsAccepted = 0;
+    ServiceStatus.dwWin32ExitCode = 0;
+    ServiceStatus.dwServiceSpecificExitCode = 0;
+    ServiceStatus.dwCheckPoint = 0;
+
+    if (dwState == SERVICE_START_PENDING ||
+        dwState == SERVICE_STOP_PENDING ||
+        dwState == SERVICE_PAUSE_PENDING ||
+        dwState == SERVICE_CONTINUE_PENDING)
+        ServiceStatus.dwWaitHint = 10000;
+    else
+        ServiceStatus.dwWaitHint = 0;
+
+    SetServiceStatus(ServiceStatusHandle,
+                     &ServiceStatus);
+}
+
+
+static
+DWORD
+WINAPI
+ServiceControlHandler(
+    DWORD dwControl,
+    DWORD dwEventType,
+    LPVOID lpEventData,
+    LPVOID lpContext)
+{
+    TRACE("ServiceControlHandler()\n");
+
+    switch (dwControl)
+    {
+        case SERVICE_CONTROL_STOP:
+            TRACE("  SERVICE_CONTROL_STOP received\n");
+            /* Stop listening to incoming RPC messages */
+            RpcMgmtStopServerListening(NULL);
+            UpdateServiceStatus(SERVICE_STOPPED);
+            return ERROR_SUCCESS;
+
+        case SERVICE_CONTROL_PAUSE:
+            TRACE("  SERVICE_CONTROL_PAUSE received\n");
+            UpdateServiceStatus(SERVICE_PAUSED);
+            return ERROR_SUCCESS;
+
+        case SERVICE_CONTROL_CONTINUE:
+            TRACE("  SERVICE_CONTROL_CONTINUE received\n");
+            UpdateServiceStatus(SERVICE_RUNNING);
+            return ERROR_SUCCESS;
+
+        case SERVICE_CONTROL_INTERROGATE:
+            TRACE("  SERVICE_CONTROL_INTERROGATE received\n");
+            SetServiceStatus(ServiceStatusHandle,
+                             &ServiceStatus);
+            return ERROR_SUCCESS;
+
+        case SERVICE_CONTROL_SHUTDOWN:
+            TRACE("  SERVICE_CONTROL_SHUTDOWN received\n");
+            UpdateServiceStatus(SERVICE_STOPPED);
+            return ERROR_SUCCESS;
+
+        default :
+            TRACE("  Control %lu received\n", dwControl);
+            return ERROR_CALL_NOT_IMPLEMENTED;
+    }
+}
+
+
+static
+DWORD
+ServiceInit(VOID)
+{
+    HANDLE hThread;
+
+    hThread = CreateThread(NULL,
+                           0,
+                           (LPTHREAD_START_ROUTINE)RpcThreadRoutine,
+                           NULL,
+                           0,
+                           NULL);
+
+    if (!hThread)
+    {
+        ERR("Can't create PortThread\n");
+        return GetLastError();
+    }
+    else
+        CloseHandle(hThread);
+
+    return ERROR_SUCCESS;
+}
+
+
+VOID WINAPI
+NlNetlogonMain(
+    _In_ INT ArgCount,
+    _In_ PWSTR *ArgVector)
+{
+    DWORD dwError;
+
+    UNREFERENCED_PARAMETER(ArgCount);
+    UNREFERENCED_PARAMETER(ArgVector);
+
+    TRACE("NlNetlogonMain(%d %p)\n", ArgCount, ArgVector);
+
+    ServiceStatusHandle = RegisterServiceCtrlHandlerExW(ServiceName,
+                                                        ServiceControlHandler,
+                                                        NULL);
+    if (!ServiceStatusHandle)
+    {
+        ERR("RegisterServiceCtrlHandlerExW() failed! (Error %lu)\n", GetLastError());
+        return;
+    }
+
+    UpdateServiceStatus(SERVICE_START_PENDING);
+
+    dwError = ServiceInit();
+    if (dwError != ERROR_SUCCESS)
+    {
+        ERR("Service stopped (dwError: %lu\n", dwError);
+        UpdateServiceStatus(SERVICE_STOPPED);
+        return;
+    }
+
+    UpdateServiceStatus(SERVICE_RUNNING);
+}
+
+
+BOOL
+WINAPI
+DllMain(
+    _In_ HINSTANCE hinstDLL,
+    _In_ DWORD fdwReason,
+    _In_ PVOID pvReserved)
+{
+    UNREFERENCED_PARAMETER(pvReserved);
+
+    switch (fdwReason)
+    {
+        case DLL_PROCESS_ATTACH:
+            DisableThreadLibraryCalls(hinstDLL);
+            hDllInstance = hinstDLL;
+            break;
+
+        case DLL_PROCESS_DETACH:
+            break;
+    }
+
+    return TRUE;
+}
+
+/* EOF */
diff --git a/base/services/netlogon/netlogon.rc b/base/services/netlogon/netlogon.rc
new file mode 100644 (file)
index 0000000..19c828e
--- /dev/null
@@ -0,0 +1,5 @@
+#define REACTOS_VERSION_DLL
+#define REACTOS_STR_FILE_DESCRIPTION  "Net Logon Services Dll"
+#define REACTOS_STR_INTERNAL_NAME     "netlogon"
+#define REACTOS_STR_ORIGINAL_FILENAME "netlogon.dll"
+#include <reactos/version.rc>
diff --git a/base/services/netlogon/netlogon.spec b/base/services/netlogon/netlogon.spec
new file mode 100644 (file)
index 0000000..2fe6ee3
--- /dev/null
@@ -0,0 +1,29 @@
+@ stdcall DsrGetDcName(wstr wstr ptr ptr long ptr)
+@ stdcall DsrGetDcNameEx2(wstr wstr long wstr ptr wstr long ptr)
+@ stub I_DsGetDcCache
+@ stub I_NetLogonAddressToSiteName
+@ stub I_NetLogonAppendChangeLog
+@ stub I_NetLogonCloseChangeLog
+@ stub I_NetLogonFree
+@ stub I_NetLogonGetAuthDataEx
+@ stub I_NetLogonGetDirectDomain
+@ stub I_NetLogonGetIpAddresses
+@ stub I_NetLogonGetSerialNumber
+@ stub I_NetLogonLdapLookup
+@ stub I_NetLogonLdapLookupEx
+@ stub I_NetLogonMixedDomain
+@ stub I_NetLogonNewChangeLog
+@ stub I_NetLogonReadChangeLog
+@ stub I_NetLogonSendToSamOnPdc
+@ stub I_NetLogonSetServiceBits
+@ stub I_NetNotifyDelta
+@ stub I_NetNotifyDsChange
+@ stub I_NetNotifyMachineAccount
+@ stub I_NetNotifyNetlogonDllHandle
+@ stub I_NetNotifyNtdsDsaDeletion
+@ stub I_NetNotifyRole
+@ stub I_NetNotifyTrustedDomain
+@ stub InitSecurityInterfaceW
+@ stdcall NetrLogonSamLogoff(wstr wstr ptr ptr long ptr)
+@ stdcall NetrLogonSamLogon(wstr wstr ptr ptr long ptr long ptr ptr)
+@ stdcall NlNetlogonMain(long ptr)
diff --git a/base/services/netlogon/precomp.h b/base/services/netlogon/precomp.h
new file mode 100644 (file)
index 0000000..b531795
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * PROJECT:     ReactOS NetLogon Service
+ * LICENSE:     GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
+ * PURPOSE:     NetLogon service RPC server
+ * COPYRIGHT:   Eric Kohl 2019 <eric.kohl@reactos.org>
+ */
+
+#ifndef _NETLOGON_PCH_
+#define _NETLOGON_PCH_
+
+#define WIN32_NO_STATUS
+#define _INC_WINDOWS
+#define COM_NO_WINDOWS_H
+#include <limits.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <windef.h>
+#include <winbase.h>
+#include <winreg.h>
+#include <winsvc.h>
+#include <lmerr.h>
+
+#include <netlogon_s.h>
+
+#include <wine/debug.h>
+
+extern HINSTANCE hDllInstance;
+
+DWORD
+WINAPI
+RpcThreadRoutine(
+    LPVOID lpParameter);
+
+#endif /* _NETLOGON_PCH_ */
diff --git a/base/services/netlogon/rpcserver.c b/base/services/netlogon/rpcserver.c
new file mode 100644 (file)
index 0000000..e4115ad
--- /dev/null
@@ -0,0 +1,805 @@
+/*
+ * PROJECT:     ReactOS NetLogon Service
+ * LICENSE:     GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
+ * PURPOSE:     NetLogon service RPC server
+ * COPYRIGHT:   Eric Kohl 2019 <eric.kohl@reactos.org>
+ */
+
+/* INCLUDES *****************************************************************/
+
+#include "precomp.h"
+
+//#include "lmerr.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(netlogon);
+
+/* FUNCTIONS *****************************************************************/
+
+DWORD
+WINAPI
+RpcThreadRoutine(
+    LPVOID lpParameter)
+{
+    RPC_STATUS Status;
+
+    Status = RpcServerUseProtseqEpW(L"ncacn_np", 20, L"\\pipe\\netlogon", NULL);
+    if (Status != RPC_S_OK)
+    {
+        ERR("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status);
+        return 0;
+    }
+
+    Status = RpcServerRegisterIf(logon_v1_0_s_ifspec, NULL, NULL);
+    if (Status != RPC_S_OK)
+    {
+        ERR("RpcServerRegisterIf() failed (Status %lx)\n", Status);
+        return 0;
+    }
+
+    Status = RpcServerListen(1, RPC_C_LISTEN_MAX_CALLS_DEFAULT, FALSE);
+    if (Status != RPC_S_OK)
+    {
+        ERR("RpcServerListen() failed (Status %lx)\n", Status);
+    }
+
+    return 0;
+}
+
+
+void __RPC_FAR * __RPC_USER midl_user_allocate(SIZE_T len)
+{
+    return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len);
+}
+
+
+void __RPC_USER midl_user_free(void __RPC_FAR * ptr)
+{
+    HeapFree(GetProcessHeap(), 0, ptr);
+}
+
+
+/* Function 0 */
+NET_API_STATUS
+__stdcall
+NetrLogonUasLogon(
+    _In_opt_ LOGONSRV_HANDLE ServerName,
+    _In_ wchar_t *UserName,
+    _In_ wchar_t *Workstation,
+    _Out_ PNETLOGON_VALIDATION_UAS_INFO *ValidationInformation)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 1 */
+NET_API_STATUS
+__stdcall
+NetrLogonUasLogoff(
+    _In_opt_ LOGONSRV_HANDLE ServerName,
+    _In_ wchar_t *UserName,
+    _In_ wchar_t *Workstation,
+    _Out_ PNETLOGON_LOGOFF_UAS_INFO LogoffInformation)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 2 */
+NTSTATUS
+__stdcall
+NetrLogonSamLogon(
+    _In_opt_ LOGONSRV_HANDLE LogonServer,
+    _In_opt_ wchar_t *ComputerName,
+    _In_opt_ PNETLOGON_AUTHENTICATOR Authenticator,
+    _Inout_opt_ PNETLOGON_AUTHENTICATOR ReturnAuthenticator,
+    _In_ NETLOGON_LOGON_INFO_CLASS LogonLevel,
+    _In_ PNETLOGON_LEVEL LogonInformation,
+    _In_ NETLOGON_VALIDATION_INFO_CLASS ValidationLevel,
+    _Out_ PNETLOGON_VALIDATION ValidationInformation,
+    _Out_ UCHAR *Authoritative)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 3 */
+NTSTATUS
+__stdcall
+NetrLogonSamLogoff(
+    _In_opt_ LOGONSRV_HANDLE LogonServer,
+    _In_opt_ wchar_t *ComputerName,
+    _In_opt_ PNETLOGON_AUTHENTICATOR Authenticator,
+    _Inout_opt_ PNETLOGON_AUTHENTICATOR ReturnAuthenticator,
+    _In_ NETLOGON_LOGON_INFO_CLASS LogonLevel,
+    _In_ PNETLOGON_LEVEL LogonInformation)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 4 */
+NTSTATUS
+__stdcall
+NetrServerReqChallenge(
+    _In_opt_ LOGONSRV_HANDLE PrimaryName,
+    _In_ wchar_t *ComputerName,
+    _In_ PNETLOGON_CREDENTIAL ClientChallenge,
+    _Out_ PNETLOGON_CREDENTIAL ServerChallenge)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 5 */
+NTSTATUS
+__stdcall
+NetrServerAuthenticate(
+    _In_opt_ LOGONSRV_HANDLE PrimaryName,
+    _In_ wchar_t *AccountName,
+    _In_ NETLOGON_SECURE_CHANNEL_TYPE SecureChannelType,
+    _In_ wchar_t *ComputerName,
+    _In_ PNETLOGON_CREDENTIAL ClientCredential,
+    _Out_ PNETLOGON_CREDENTIAL ServerCredential)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 6 */
+NTSTATUS
+__stdcall
+NetrServerPasswordSet(
+    _In_opt_ LOGONSRV_HANDLE PrimaryName,
+    _In_ wchar_t *AccountName,
+    _In_ NETLOGON_SECURE_CHANNEL_TYPE SecureChannelType,
+    _In_ wchar_t *ComputerName,
+    _In_ PNETLOGON_AUTHENTICATOR Authenticator,
+    _Out_ PNETLOGON_AUTHENTICATOR ReturnAuthenticator,
+    _In_ PENCRYPTED_NT_OWF_PASSWORD UasNewPassword)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 7 */
+NTSTATUS
+__stdcall
+NetrDatabaseDeltas(
+    _In_ LOGONSRV_HANDLE PrimaryName,
+    _In_ wchar_t *ComputerName,
+    _In_ PNETLOGON_AUTHENTICATOR Authenticator,
+    _Inout_ PNETLOGON_AUTHENTICATOR ReturnAuthenticator,
+    _In_ DWORD DatabaseID,
+    _Inout_ PNLPR_MODIFIED_COUNT DomainModifiedCount,
+    _Out_ PNETLOGON_DELTA_ENUM_ARRAY *DeltaArray,
+    _In_ DWORD PreferredMaximumLength)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 8 */
+NTSTATUS
+__stdcall
+NetrDatabaseSync(
+    _In_ LOGONSRV_HANDLE PrimaryName,
+    _In_ wchar_t *ComputerName,
+    _In_ PNETLOGON_AUTHENTICATOR Authenticator,
+    _Inout_ PNETLOGON_AUTHENTICATOR ReturnAuthenticator,
+    _In_ DWORD DatabaseID,
+    _Inout_ ULONG *SyncContext,
+    _Out_ PNETLOGON_DELTA_ENUM_ARRAY *DeltaArray,
+    _In_ DWORD PreferredMaximumLength)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 9 */
+NTSTATUS
+__stdcall
+NetrAccountDeltas(
+    _In_opt_ LOGONSRV_HANDLE PrimaryName,
+    _In_ wchar_t * ComputerName,
+    _In_ PNETLOGON_AUTHENTICATOR Authenticator,
+    _Inout_ PNETLOGON_AUTHENTICATOR ReturnAuthenticator,
+    _In_ PUAS_INFO_0 RecordId,
+    _In_ DWORD Count,
+    _In_ DWORD Level,
+    _Out_ UCHAR *Buffer,
+    _In_ DWORD BufferSize,
+    _Out_ ULONG *CountReturned,
+    _Out_ ULONG *TotalEntries,
+    _Out_ PUAS_INFO_0 NextRecordId)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 10 */
+NTSTATUS
+__stdcall
+NetrAccountSync(
+    _In_opt_ LOGONSRV_HANDLE PrimaryName,
+    _In_ wchar_t *ComputerName,
+    _In_ PNETLOGON_AUTHENTICATOR Authenticator,
+    _Inout_ PNETLOGON_AUTHENTICATOR ReturnAuthenticator,
+    _In_ DWORD Reference,
+    _In_ DWORD Level,
+    _Out_ UCHAR *Buffer,
+    _In_ DWORD BufferSize,
+    _Out_ ULONG *CountReturned,
+    _Out_ ULONG *TotalEntries,
+    _Out_ ULONG *NextReference,
+    _Out_ PUAS_INFO_0 LastRecordId)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 11 */
+NET_API_STATUS
+__stdcall
+NetrGetDCName(
+    _In_ LOGONSRV_HANDLE ServerName,
+    _In_opt_ wchar_t *DomainName,
+    _Out_ wchar_t **Buffer)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 12 */
+NET_API_STATUS
+__stdcall
+NetrLogonControl(
+    _In_opt_ LOGONSRV_HANDLE ServerName,
+    _In_ DWORD FunctionCode,
+    _In_ DWORD QueryLevel,
+    _Out_ PNETLOGON_CONTROL_QUERY_INFORMATION Buffer)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 13 */
+NET_API_STATUS
+__stdcall
+NetrGetAnyDCName(
+    _In_opt_ LOGONSRV_HANDLE ServerName,
+    _In_opt_ wchar_t *DomainName,
+    _Out_ wchar_t **Buffer)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 14 */
+NET_API_STATUS
+__stdcall
+NetrLogonControl2(
+    _In_opt_ LOGONSRV_HANDLE ServerName,
+    _In_ DWORD FunctionCode,
+    _In_ DWORD QueryLevel,
+    _In_ PNETLOGON_CONTROL_DATA_INFORMATION Data,
+    _Out_ PNETLOGON_CONTROL_QUERY_INFORMATION Buffer)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 15 */
+NTSTATUS
+__stdcall
+NetrServerAuthenticate2(
+    _In_opt_ LOGONSRV_HANDLE PrimaryName,
+    _In_ wchar_t *AccountName,
+    _In_ NETLOGON_SECURE_CHANNEL_TYPE SecureChannelType,
+    _In_ wchar_t *ComputerName,
+    _In_ PNETLOGON_CREDENTIAL ClientCredential,
+    _Out_ PNETLOGON_CREDENTIAL ServerCredential,
+    _Inout_ ULONG *NegotiateFlags)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 16 */
+NTSTATUS
+__stdcall
+NetrDatabaseSync2(
+    _In_ LOGONSRV_HANDLE PrimaryName,
+    _In_ wchar_t *ComputerName,
+    _In_ PNETLOGON_AUTHENTICATOR Authenticator,
+    _Inout_ PNETLOGON_AUTHENTICATOR ReturnAuthenticator,
+    _In_ DWORD DatabaseID,
+    _In_ SYNC_STATE RestartState,
+    _Inout_ ULONG *SyncContext,
+    _Out_ PNETLOGON_DELTA_ENUM_ARRAY *DeltaArray,
+    _In_ DWORD PreferredMaximumLength)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 17 */
+NTSTATUS
+__stdcall
+NetrDatabaseRedo(
+    _In_ LOGONSRV_HANDLE PrimaryName,
+    _In_ wchar_t *ComputerName,
+    _In_ PNETLOGON_AUTHENTICATOR Authenticator,
+    _Inout_ PNETLOGON_AUTHENTICATOR ReturnAuthenticator,
+    _In_ UCHAR *ChangeLogEntry,
+    _In_ DWORD ChangeLogEntrySize,
+    _Out_ PNETLOGON_DELTA_ENUM_ARRAY *DeltaArray)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 18 */
+NET_API_STATUS
+__stdcall
+NetrLogonControl2Ex(
+    _In_opt_ LOGONSRV_HANDLE ServerName,
+    _In_ DWORD FunctionCode,
+    _In_ DWORD QueryLevel,
+    _In_ PNETLOGON_CONTROL_DATA_INFORMATION Data,
+    _Out_ PNETLOGON_CONTROL_QUERY_INFORMATION Buffer)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 19 */
+NTSTATUS
+__stdcall
+NetrEnumerateTrustedDomains(
+    _In_opt_ LOGONSRV_HANDLE ServerName,
+    _Out_ PDOMAIN_NAME_BUFFER DomainNameBuffer)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 20 */
+NET_API_STATUS
+__stdcall
+DsrGetDcName(
+    _In_opt_ LOGONSRV_HANDLE ComputerName,
+    _In_opt_ wchar_t *DomainName,
+    _In_opt_ GUID *DomainGuid,
+    _In_opt_ GUID *SiteGuid,
+    _In_ ULONG Flags,
+    _Out_ PDOMAIN_CONTROLLER_INFOW *DomainControllerInfo)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 21 */
+NTSTATUS
+__stdcall
+NetrLogonGetCapabilities(
+    _In_ LOGONSRV_HANDLE ServerName,
+    _In_opt_ wchar_t *ComputerName,
+    _In_ PNETLOGON_AUTHENTICATOR Authenticator,
+    _Inout_ PNETLOGON_AUTHENTICATOR ReturnAuthenticator,
+    _In_ DWORD QueryLevel,
+    _Out_ PNETLOGON_CAPABILITIES ServerCapabilities)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 22 */
+NTSTATUS
+__stdcall
+NetrLogonSetServiceBits(
+    _In_opt_ LOGONSRV_HANDLE ServerName,
+    _In_ DWORD ServiceBitsOfInterest,
+    _In_ DWORD ServiceBits)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 23 */
+NET_API_STATUS
+__stdcall
+NetrLogonGetTrustRid(
+    _In_opt_ LOGONSRV_HANDLE ServerName,
+    _In_opt_ wchar_t *DomainName,
+    _Out_ ULONG *Rid)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 24 */
+NET_API_STATUS
+__stdcall
+NetrLogonComputeServerDigest(
+    _In_opt_ LOGONSRV_HANDLE ServerName,
+    _In_ ULONG Rid,
+    _In_ UCHAR *Message,
+    _In_ ULONG MessageSize,
+    _Out_ CHAR NewMessageDigest[16],
+    _Out_ CHAR OldMessageDigest[16])
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 25 */
+NET_API_STATUS
+__stdcall
+NetrLogonComputeClientDigest(
+    _In_opt_ LOGONSRV_HANDLE ServerName,
+    _In_opt_ wchar_t *DomainName,
+    _In_ UCHAR *Message,
+    _In_ ULONG MessageSize,
+    _Out_ CHAR NewMessageDigest[16],
+    _Out_ CHAR OldMessageDigest[16])
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 26 */
+NTSTATUS
+__stdcall
+NetrServerAuthenticate3(
+    _In_opt_ LOGONSRV_HANDLE PrimaryName,
+    _In_ wchar_t *AccountName,
+    _In_ NETLOGON_SECURE_CHANNEL_TYPE SecureChannelType,
+    _In_ wchar_t *ComputerName,
+    _In_ PNETLOGON_CREDENTIAL ClientCredential,
+    _Out_ PNETLOGON_CREDENTIAL ServerCredential,
+    _Inout_ ULONG *NegotiateFlags,
+    _Out_ ULONG *AccountRid)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 27 */
+NET_API_STATUS
+__stdcall
+DsrGetDcNameEx(
+    _In_opt_ LOGONSRV_HANDLE ComputerName,
+    _In_opt_ wchar_t *DomainName,
+    _In_opt_ GUID *DomainGuid,
+    _In_opt_ wchar_t *SiteName,
+    _In_ ULONG Flags,
+    _Out_ PDOMAIN_CONTROLLER_INFOW *DomainControllerInfo)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 28 */
+NET_API_STATUS
+__stdcall
+DsrGetSiteName(
+    _In_opt_ LOGONSRV_HANDLE ComputerName,
+    _Out_ wchar_t **SiteName)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 29 */
+NTSTATUS
+__stdcall
+NetrLogonGetDomainInfo(
+    _In_ LOGONSRV_HANDLE ServerName,
+    _In_opt_ wchar_t *ComputerName,
+    _In_ PNETLOGON_AUTHENTICATOR Authenticator,
+    _Inout_ PNETLOGON_AUTHENTICATOR ReturnAuthenticator,
+    _In_ DWORD Level,
+    _In_ PNETLOGON_WORKSTATION_INFORMATION WkstaBuffer,
+    _Out_ PNETLOGON_DOMAIN_INFORMATION DomBuffer)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 30 */
+NTSTATUS
+__stdcall
+NetrServerPasswordSet2(
+    _In_opt_ LOGONSRV_HANDLE PrimaryName,
+    _In_ wchar_t *AccountName,
+    _In_ NETLOGON_SECURE_CHANNEL_TYPE SecureChannelType,
+    _In_ wchar_t *ComputerName,
+    _In_ PNETLOGON_AUTHENTICATOR Authenticator,
+    _Out_ PNETLOGON_AUTHENTICATOR ReturnAuthenticator,
+    _In_ PNL_TRUST_PASSWORD ClearNewPassword)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 31 */
+NTSTATUS
+__stdcall
+NetrServerPasswordGet(
+    _In_opt_ LOGONSRV_HANDLE PrimaryName,
+    _In_ wchar_t *AccountName,
+    _In_ NETLOGON_SECURE_CHANNEL_TYPE AccountType,
+    _In_ wchar_t *ComputerName,
+    _In_ PNETLOGON_AUTHENTICATOR Authenticator,
+    _Out_ PNETLOGON_AUTHENTICATOR ReturnAuthenticator,
+    _Out_ PENCRYPTED_NT_OWF_PASSWORD EncryptedNtOwfPassword)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 32 */
+NTSTATUS
+__stdcall
+NetrLogonSendToSam(
+    _In_opt_ LOGONSRV_HANDLE PrimaryName,
+    _In_ wchar_t *ComputerName,
+    _In_ PNETLOGON_AUTHENTICATOR Authenticator,
+    _Out_ PNETLOGON_AUTHENTICATOR ReturnAuthenticator,
+    _In_ UCHAR *OpaqueBuffer,
+    _In_ ULONG OpaqueBufferSize)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 33 */
+NET_API_STATUS
+__stdcall
+DsrAddressToSiteNamesW(
+    _In_opt_ LOGONSRV_HANDLE ComputerName,
+    _In_ DWORD EntryCount,
+    _In_ PNL_SOCKET_ADDRESS SocketAddresses,
+    _Out_ PNL_SITE_NAME_ARRAY *SiteNames)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 34 */
+NET_API_STATUS
+__stdcall
+DsrGetDcNameEx2(
+    _In_opt_ LOGONSRV_HANDLE ComputerName,
+    _In_opt_ wchar_t *AccountName,
+    _In_ ULONG AllowableAccountControlBits,
+    _In_opt_ wchar_t *DomainName,
+    _In_opt_ GUID *DomainGuid,
+    _In_opt_ wchar_t *SiteName,
+    _In_ ULONG Flags,
+    _Out_ PDOMAIN_CONTROLLER_INFOW *DomainControllerInfo)
+{
+    UNIMPLEMENTED;
+    return NERR_DCNotFound;
+}
+
+
+/* Function 35 */
+NET_API_STATUS
+__stdcall
+NetrLogonGetTimeServiceParentDomain(
+    _In_opt_ LOGONSRV_HANDLE ServerName,
+    _Out_ wchar_t **DomainName,
+    _Out_ int *PdcSameSite)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 36 */
+NET_API_STATUS
+__stdcall
+NetrEnumerateTrustedDomainsEx(
+    _In_opt_ LOGONSRV_HANDLE ServerName,
+    _Out_ PNETLOGON_TRUSTED_DOMAIN_ARRAY Domains)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 37 */
+NET_API_STATUS
+__stdcall
+DsrAddressToSiteNamesExW(
+    _In_opt_ LOGONSRV_HANDLE ComputerName,
+    _In_ DWORD EntryCount,
+    _In_ PNL_SOCKET_ADDRESS SocketAddresses,
+    _Out_ PNL_SITE_NAME_EX_ARRAY *SiteNames)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 38 */
+NET_API_STATUS
+__stdcall
+DsrGetDcSiteCoverageW(
+    _In_opt_ LOGONSRV_HANDLE ServerName,
+    _Out_ PNL_SITE_NAME_ARRAY *SiteNames)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 39 */
+NTSTATUS
+__stdcall
+NetrLogonSamLogonEx(
+    _In_ handle_t ContextHandle,
+    _In_opt_ wchar_t *LogonServer,
+    _In_opt_ wchar_t *ComputerName,
+    _In_ NETLOGON_LOGON_INFO_CLASS LogonLevel,
+    _In_ PNETLOGON_LEVEL LogonInformation,
+    _In_ NETLOGON_VALIDATION_INFO_CLASS ValidationLevel,
+    _Out_ PNETLOGON_VALIDATION ValidationInformation,
+    _Out_ UCHAR *Authoritative,
+    _Inout_ ULONG *ExtraFlags)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 40 */
+NET_API_STATUS
+__stdcall
+DsrEnumerateDomainTrusts(
+    _In_opt_ LOGONSRV_HANDLE ServerName,
+    _In_ ULONG Flags,
+    _Out_ PNETLOGON_TRUSTED_DOMAIN_ARRAY Domains)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 41 */
+NET_API_STATUS
+__stdcall
+DsrDeregisterDnsHostRecords(
+    _In_opt_ LOGONSRV_HANDLE ServerName,
+    _In_opt_ wchar_t *DnsDomainName,
+    _In_opt_ GUID *DomainGuid,
+    _In_opt_ GUID *DsaGuid,
+    _In_ wchar_t *DnsHostName)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 42 */
+NTSTATUS
+__stdcall
+NetrServerTrustPasswordsGet(
+    _In_opt_ LOGONSRV_HANDLE TrustedDcName,
+    _In_ wchar_t *AccountName,
+    _In_ NETLOGON_SECURE_CHANNEL_TYPE SecureChannelType,
+    _In_ wchar_t *ComputerName,
+    _In_ PNETLOGON_AUTHENTICATOR Authenticator,
+    _Out_ PNETLOGON_AUTHENTICATOR ReturnAuthenticator,
+    _Out_ PENCRYPTED_NT_OWF_PASSWORD EncryptedNewOwfPassword,
+    _Out_ PENCRYPTED_NT_OWF_PASSWORD EncryptedOldOwfPassword)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 43 */
+NET_API_STATUS
+__stdcall
+DsrGetForestTrustInformation(
+    _In_opt_ LOGONSRV_HANDLE ServerName,
+    _In_opt_ wchar_t *TrustedDomainName,
+    _In_ DWORD Flags,
+    _Out_ PLSA_FOREST_TRUST_INFORMATION *ForestTrustInfo)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 44 */
+NTSTATUS
+__stdcall
+NetrGetForestTrustInformation(
+    _In_opt_ LOGONSRV_HANDLE ServerName,
+    _In_ wchar_t *ComputerName,
+    _In_ PNETLOGON_AUTHENTICATOR Authenticator,
+    _Out_ PNETLOGON_AUTHENTICATOR ReturnAuthenticator,
+    _In_ DWORD Flags,
+    _Out_ PLSA_FOREST_TRUST_INFORMATION *ForestTrustInfo)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 45 */
+NTSTATUS
+__stdcall
+NetrLogonSamLogonWithFlags(
+    _In_opt_ LOGONSRV_HANDLE LogonServer,
+    _In_opt_ wchar_t *ComputerName,
+    _In_opt_ PNETLOGON_AUTHENTICATOR Authenticator,
+    _Inout_opt_ PNETLOGON_AUTHENTICATOR ReturnAuthenticator,
+    _In_ NETLOGON_LOGON_INFO_CLASS LogonLevel,
+    _In_ PNETLOGON_LEVEL LogonInformation,
+    _In_ NETLOGON_VALIDATION_INFO_CLASS ValidationLevel,
+    _Out_ PNETLOGON_VALIDATION ValidationInformation,
+    _Out_ UCHAR *Authoritative,
+    _Inout_ ULONG *ExtraFlags)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+
+/* Function 46 */
+NTSTATUS
+__stdcall
+NetrServerGetTrustInfo(
+    _In_opt_ LOGONSRV_HANDLE TrustedDcName,
+    _In_ wchar_t *AccountName,
+    _In_ NETLOGON_SECURE_CHANNEL_TYPE SecureChannelType,
+    _In_ wchar_t *ComputerName,
+    _In_ PNETLOGON_AUTHENTICATOR Authenticator,
+    _Out_ PNETLOGON_AUTHENTICATOR ReturnAuthenticator,
+    _Out_ PENCRYPTED_NT_OWF_PASSWORD EncryptedNewOwfPassword,
+    _Out_ PENCRYPTED_NT_OWF_PASSWORD EncryptedOldOwfPassword,
+    _Out_ PNL_GENERIC_RPC_DATA *TrustInfo)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+/* EOF */