/* This is the implementation of the netlogon pipe. */
#include "includes.h"
+#include "../libcli/auth/libcli_auth.h"
extern userdom_struct current_user_info;
WERROR _netr_LogonControl(pipes_struct *p,
struct netr_LogonControl *r)
{
- struct netr_NETLOGON_INFO_1 *info1;
- uint32_t flags = 0x0;
- uint32_t pdc_connection_status = W_ERROR_V(WERR_OK);
-
- /* Setup the Logon Control response */
+ struct netr_LogonControl2Ex l;
switch (r->in.level) {
- case 1:
- info1 = TALLOC_ZERO_P(p->mem_ctx, struct netr_NETLOGON_INFO_1);
- if (!info1) {
- return WERR_NOMEM;
- }
- init_netlogon_info1(info1,
- flags,
- pdc_connection_status);
- r->out.info->info1 = info1;
- break;
- default:
- return WERR_UNKNOWN_LEVEL;
+ case 1:
+ break;
+ case 2:
+ return WERR_NOT_SUPPORTED;
+ default:
+ return WERR_UNKNOWN_LEVEL;
}
- return WERR_OK;
+ l.in.logon_server = r->in.logon_server;
+ l.in.function_code = r->in.function_code;
+ l.in.level = r->in.level;
+ l.in.data = NULL;
+ l.out.query = r->out.query;
+
+ return _netr_LogonControl2Ex(p, &l);
}
/****************************************************************************
WERROR _netr_LogonControl2(pipes_struct *p,
struct netr_LogonControl2 *r)
+{
+ struct netr_LogonControl2Ex l;
+
+ l.in.logon_server = r->in.logon_server;
+ l.in.function_code = r->in.function_code;
+ l.in.level = r->in.level;
+ l.in.data = r->in.data;
+ l.out.query = r->out.query;
+
+ return _netr_LogonControl2Ex(p, &l);
+}
+
+/****************************************************************
+ _netr_LogonControl2Ex
+****************************************************************/
+
+WERROR _netr_LogonControl2Ex(pipes_struct *p,
+ struct netr_LogonControl2Ex *r)
{
uint32 flags = 0x0;
uint32 pdc_connection_status = 0x0;
struct netr_NETLOGON_INFO_1 *info1;
struct netr_NETLOGON_INFO_2 *info2;
struct netr_NETLOGON_INFO_3 *info3;
+ const char *fn;
+
+ switch (p->hdr_req.opnum) {
+ case NDR_NETR_LOGONCONTROL:
+ fn = "_netr_LogonControl";
+ break;
+ case NDR_NETR_LOGONCONTROL2:
+ fn = "_netr_LogonControl2";
+ break;
+ case NDR_NETR_LOGONCONTROL2EX:
+ fn = "_netr_LogonControl2Ex";
+ break;
+ default:
+ return WERR_INVALID_PARAM;
+ }
tc_status = W_ERROR_V(WERR_NO_SUCH_DOMAIN);
default:
/* no idea what this should be */
- DEBUG(0,("_netr_LogonControl2: unimplemented function level [%d]\n",
- r->in.function_code));
+ DEBUG(0,("%s: unimplemented function level [%d]\n",
+ fn, r->in.function_code));
return WERR_UNKNOWN_LEVEL;
}
gets a machine password entry. checks access rights of the host.
******************************************************************/
-static NTSTATUS get_md4pw(char *md4pw, const char *mach_acct, uint16 sec_chan_type)
+static NTSTATUS get_md4pw(char *md4pw, const char *mach_acct,
+ uint16_t sec_chan_type, uint32_t *rid)
{
struct samu *sampass = NULL;
const uint8 *pass;
memcpy(md4pw, pass, 16);
dump_data(5, (uint8 *)md4pw, 16);
+ if (rid) {
+ *rid = pdb_get_user_rid(sampass);
+ }
+
TALLOC_FREE(sampass);
return NT_STATUS_OK;
NTSTATUS _netr_ServerAuthenticate(pipes_struct *p,
struct netr_ServerAuthenticate *r)
{
- NTSTATUS status;
- struct netr_Credential srv_chal_out;
-
- if (!p->dc || !p->dc->challenge_sent) {
- return NT_STATUS_ACCESS_DENIED;
- }
-
- status = get_md4pw((char *)p->dc->mach_pw,
- r->in.account_name,
- r->in.secure_channel_type);
- if (!NT_STATUS_IS_OK(status)) {
- DEBUG(0,("_netr_ServerAuthenticate: get_md4pw failed. Failed to "
- "get password for machine account %s "
- "from client %s: %s\n",
- r->in.account_name,
- r->in.computer_name,
- nt_errstr(status) ));
- /* always return NT_STATUS_ACCESS_DENIED */
- return NT_STATUS_ACCESS_DENIED;
- }
-
- /* From the client / server challenges and md4 password, generate sess key */
- creds_server_init(0, /* No neg flags. */
- p->dc,
- &p->dc->clnt_chal, /* Stored client chal. */
- &p->dc->srv_chal, /* Stored server chal. */
- p->dc->mach_pw,
- &srv_chal_out);
-
- /* Check client credentials are valid. */
- if (!netlogon_creds_server_check(p->dc, r->in.credentials)) {
- DEBUG(0,("_netr_ServerAuthenticate: netlogon_creds_server_check failed. Rejecting auth "
- "request from client %s machine account %s\n",
- r->in.computer_name,
- r->in.account_name));
- return NT_STATUS_ACCESS_DENIED;
- }
+ struct netr_ServerAuthenticate3 a;
+ uint32_t negotiate_flags = 0;
+ uint32_t rid;
- fstrcpy(p->dc->mach_acct, r->in.account_name);
- fstrcpy(p->dc->remote_machine, r->in.computer_name);
- p->dc->authenticated = True;
+ a.in.server_name = r->in.server_name;
+ a.in.account_name = r->in.account_name;
+ a.in.secure_channel_type = r->in.secure_channel_type;
+ a.in.computer_name = r->in.computer_name;
+ a.in.credentials = r->in.credentials;
+ a.in.negotiate_flags = &negotiate_flags;
- /* set up the LSA AUTH response */
- /* Return the server credentials. */
+ a.out.return_credentials = r->out.return_credentials;
+ a.out.rid = &rid;
+ a.out.negotiate_flags = &negotiate_flags;
- memcpy(r->out.return_credentials->data, &srv_chal_out.data,
- sizeof(r->out.return_credentials->data));
+ return _netr_ServerAuthenticate3(p, &a);
- return NT_STATUS_OK;
}
/*************************************************************************
- _netr_ServerAuthenticate2
+ _netr_ServerAuthenticate3
*************************************************************************/
-NTSTATUS _netr_ServerAuthenticate2(pipes_struct *p,
- struct netr_ServerAuthenticate2 *r)
+NTSTATUS _netr_ServerAuthenticate3(pipes_struct *p,
+ struct netr_ServerAuthenticate3 *r)
{
NTSTATUS status;
uint32_t srv_flgs;
+ /* r->in.negotiate_flags is an aliased pointer to r->out.negotiate_flags,
+ * so use a copy to avoid destroying the client values. */
+ uint32_t in_neg_flags = *r->in.negotiate_flags;
struct netr_Credential srv_chal_out;
+ const char *fn;
+ uint32_t rid;
+
+ /* According to Microsoft (see bugid #6099)
+ * Windows 7 looks at the negotiate_flags
+ * returned in this structure *even if the
+ * call fails with access denied* ! So in order
+ * to allow Win7 to connect to a Samba NT style
+ * PDC we set the flags before we know if it's
+ * an error or not.
+ */
+
+ /* 0x000001ff */
+ srv_flgs = NETLOGON_NEG_ACCOUNT_LOCKOUT |
+ NETLOGON_NEG_PERSISTENT_SAMREPL |
+ NETLOGON_NEG_ARCFOUR |
+ NETLOGON_NEG_PROMOTION_COUNT |
+ NETLOGON_NEG_CHANGELOG_BDC |
+ NETLOGON_NEG_FULL_SYNC_REPL |
+ NETLOGON_NEG_MULTIPLE_SIDS |
+ NETLOGON_NEG_REDO |
+ NETLOGON_NEG_PASSWORD_CHANGE_REFUSAL;
+
+ /* Ensure we support strong (128-bit) keys. */
+ if (in_neg_flags & NETLOGON_NEG_STRONG_KEYS) {
+ srv_flgs |= NETLOGON_NEG_STRONG_KEYS;
+ }
+
+ if (lp_server_schannel() != false) {
+ srv_flgs |= NETLOGON_NEG_SCHANNEL;
+ }
+
+ switch (p->hdr_req.opnum) {
+ case NDR_NETR_SERVERAUTHENTICATE:
+ fn = "_netr_ServerAuthenticate";
+ break;
+ case NDR_NETR_SERVERAUTHENTICATE2:
+ fn = "_netr_ServerAuthenticate2";
+ break;
+ case NDR_NETR_SERVERAUTHENTICATE3:
+ fn = "_netr_ServerAuthenticate3";
+ break;
+ default:
+ return NT_STATUS_INTERNAL_ERROR;
+ }
/* We use this as the key to store the creds: */
/* r->in.computer_name */
if (!p->dc || !p->dc->challenge_sent) {
- DEBUG(0,("_netr_ServerAuthenticate2: no challenge sent to client %s\n",
+ DEBUG(0,("%s: no challenge sent to client %s\n", fn,
r->in.computer_name));
- return NT_STATUS_ACCESS_DENIED;
+ status = NT_STATUS_ACCESS_DENIED;
+ goto out;
}
if ( (lp_server_schannel() == true) &&
- ((*r->in.negotiate_flags & NETLOGON_NEG_SCHANNEL) == 0) ) {
+ ((in_neg_flags & NETLOGON_NEG_SCHANNEL) == 0) ) {
/* schannel must be used, but client did not offer it. */
- DEBUG(0,("_netr_ServerAuthenticate2: schannel required but client failed "
+ DEBUG(0,("%s: schannel required but client failed "
"to offer it. Client was %s\n",
- r->in.account_name));
- return NT_STATUS_ACCESS_DENIED;
+ fn, r->in.account_name));
+ status = NT_STATUS_ACCESS_DENIED;
+ goto out;
}
status = get_md4pw((char *)p->dc->mach_pw,
r->in.account_name,
- r->in.secure_channel_type);
+ r->in.secure_channel_type,
+ &rid);
if (!NT_STATUS_IS_OK(status)) {
- DEBUG(0,("_netr_ServerAuthenticate2: failed to get machine password for "
+ DEBUG(0,("%s: failed to get machine password for "
"account %s: %s\n",
- r->in.account_name, nt_errstr(status) ));
+ fn, r->in.account_name, nt_errstr(status) ));
/* always return NT_STATUS_ACCESS_DENIED */
- return NT_STATUS_ACCESS_DENIED;
+ status = NT_STATUS_ACCESS_DENIED;
+ goto out;
}
/* From the client / server challenges and md4 password, generate sess key */
- creds_server_init(*r->in.negotiate_flags,
+ creds_server_init(in_neg_flags,
p->dc,
&p->dc->clnt_chal, /* Stored client chal. */
&p->dc->srv_chal, /* Stored server chal. */
/* Check client credentials are valid. */
if (!netlogon_creds_server_check(p->dc, r->in.credentials)) {
- DEBUG(0,("_netr_ServerAuthenticate2: netlogon_creds_server_check failed. Rejecting auth "
+ DEBUG(0,("%s: netlogon_creds_server_check failed. Rejecting auth "
"request from client %s machine account %s\n",
- r->in.computer_name,
+ fn, r->in.computer_name,
r->in.account_name));
- return NT_STATUS_ACCESS_DENIED;
- }
-
- /* 0x000001ff */
- srv_flgs = NETLOGON_NEG_ACCOUNT_LOCKOUT |
- NETLOGON_NEG_PERSISTENT_SAMREPL |
- NETLOGON_NEG_ARCFOUR |
- NETLOGON_NEG_PROMOTION_COUNT |
- NETLOGON_NEG_CHANGELOG_BDC |
- NETLOGON_NEG_FULL_SYNC_REPL |
- NETLOGON_NEG_MULTIPLE_SIDS |
- NETLOGON_NEG_REDO |
- NETLOGON_NEG_PASSWORD_CHANGE_REFUSAL;
-
- if (lp_server_schannel() != false) {
- srv_flgs |= NETLOGON_NEG_SCHANNEL;
+ status = NT_STATUS_ACCESS_DENIED;
+ goto out;
}
-
/* set up the LSA AUTH 2 response */
memcpy(r->out.return_credentials->data, &srv_chal_out.data,
sizeof(r->out.return_credentials->data));
- *r->out.negotiate_flags = srv_flgs;
fstrcpy(p->dc->mach_acct, r->in.account_name);
fstrcpy(p->dc->remote_machine, r->in.computer_name);
p->dc);
unbecome_root();
- return NT_STATUS_OK;
+ *r->out.rid = rid;
+
+ status = NT_STATUS_OK;
+
+ out:
+
+ *r->out.negotiate_flags = srv_flgs;
+ return status;
+}
+
+/*************************************************************************
+ _netr_ServerAuthenticate2
+ *************************************************************************/
+
+NTSTATUS _netr_ServerAuthenticate2(pipes_struct *p,
+ struct netr_ServerAuthenticate2 *r)
+{
+ struct netr_ServerAuthenticate3 a;
+ uint32_t rid;
+
+ a.in.server_name = r->in.server_name;
+ a.in.account_name = r->in.account_name;
+ a.in.secure_channel_type = r->in.secure_channel_type;
+ a.in.computer_name = r->in.computer_name;
+ a.in.credentials = r->in.credentials;
+ a.in.negotiate_flags = r->in.negotiate_flags;
+
+ a.out.return_credentials = r->out.return_credentials;
+ a.out.rid = &rid;
+ a.out.negotiate_flags = r->out.negotiate_flags;
+
+ return _netr_ServerAuthenticate3(p, &a);
}
/*************************************************************************
struct netr_ServerPasswordSet *r)
{
NTSTATUS status = NT_STATUS_OK;
- fstring remote_machine;
struct samu *sampass=NULL;
bool ret = False;
unsigned char pwd[16];
DEBUG(5,("_netr_ServerPasswordSet: %d\n", __LINE__));
- /* We need the remote machine name for the creds lookup. */
- fstrcpy(remote_machine, r->in.computer_name);
-
if ( (lp_server_schannel() == True) && (p->auth.auth_type != PIPE_AUTH_TYPE_SCHANNEL) ) {
/* 'server schannel = yes' should enforce use of
schannel, the client did offer it in auth2, but
obviously did not use it. */
DEBUG(0,("_netr_ServerPasswordSet: client %s not using schannel for netlogon\n",
- remote_machine ));
+ r->in.computer_name));
return NT_STATUS_ACCESS_DENIED;
}
if (!p->dc) {
/* Restore the saved state of the netlogon creds. */
become_root();
- ret = secrets_restore_schannel_session_info(p, remote_machine,
+ ret = secrets_restore_schannel_session_info(p, r->in.computer_name,
&p->dc);
unbecome_root();
if (!ret) {
}
DEBUG(3,("_netr_ServerPasswordSet: Server Password Set by remote machine:[%s] on account [%s]\n",
- remote_machine, p->dc->mach_acct));
+ r->in.computer_name, p->dc->mach_acct));
/* Step the creds chain forward. */
if (!netlogon_creds_server_step(p->dc, r->in.credential, &cred_out)) {
DEBUG(2,("_netr_ServerPasswordSet: netlogon_creds_server_step failed. Rejecting auth "
"request from client %s machine account %s\n",
- remote_machine, p->dc->mach_acct ));
+ r->in.computer_name, p->dc->mach_acct ));
return NT_STATUS_INVALID_PARAMETER;
}
}
become_root();
- secrets_store_schannel_session_info(p, remote_machine, p->dc);
+ secrets_store_schannel_session_info(p, r->in.computer_name, p->dc);
ret = pdb_getsampwnam(sampass, p->dc->mach_acct);
unbecome_root();
/* set up the LSA Server Password Set response */
memcpy(r->out.return_authenticator, &cred_out,
- sizeof(r->out.return_authenticator));
+ sizeof(*(r->out.return_authenticator)));
TALLOC_FREE(sampass);
return status;
struct netr_LogonSamLogon *r)
{
NTSTATUS status = NT_STATUS_OK;
- struct netr_SamInfo3 *sam3 = NULL;
- union netr_LogonInfo *logon = r->in.logon;
- fstring nt_username, nt_domain, nt_workstation;
+ union netr_LogonLevel *logon = r->in.logon;
+ const char *nt_username, *nt_domain, *nt_workstation;
auth_usersupplied_info *user_info = NULL;
auth_serversupplied_info *server_info = NULL;
struct auth_context *auth_context = NULL;
uint8_t pipe_session_key[16];
bool process_creds = true;
+ const char *fn;
switch (p->hdr_req.opnum) {
case NDR_NETR_LOGONSAMLOGON:
process_creds = true;
+ fn = "_netr_LogonSamLogon";
break;
case NDR_NETR_LOGONSAMLOGONEX:
+ fn = "_netr_LogonSamLogonEx";
default:
+ fn = "";
process_creds = false;
}
/* 'server schannel = yes' should enforce use of
schannel, the client did offer it in auth2, but
obviously did not use it. */
- DEBUG(0,("_netr_LogonSamLogon: client %s not using schannel for netlogon\n",
- get_remote_machine_name() ));
+ DEBUG(0,("%s: client %s not using schannel for netlogon\n",
+ fn, get_remote_machine_name() ));
return NT_STATUS_ACCESS_DENIED;
}
- sam3 = TALLOC_ZERO_P(p->mem_ctx, struct netr_SamInfo3);
- if (!sam3) {
- return NT_STATUS_NO_MEMORY;
- }
-
- /* store the user information, if there is any. */
- r->out.validation->sam3 = sam3;
*r->out.authoritative = true; /* authoritative response */
- if (r->in.validation_level != 2 && r->in.validation_level != 3) {
- DEBUG(0,("_netr_LogonSamLogon: bad validation_level value %d.\n",
- (int)r->in.validation_level));
- return NT_STATUS_ACCESS_DENIED;
+
+ switch (r->in.validation_level) {
+ case 2:
+ r->out.validation->sam2 = TALLOC_ZERO_P(p->mem_ctx, struct netr_SamInfo2);
+ if (!r->out.validation->sam2) {
+ return NT_STATUS_NO_MEMORY;
+ }
+ break;
+ case 3:
+ r->out.validation->sam3 = TALLOC_ZERO_P(p->mem_ctx, struct netr_SamInfo3);
+ if (!r->out.validation->sam3) {
+ return NT_STATUS_NO_MEMORY;
+ }
+ break;
+ default:
+ DEBUG(0,("%s: bad validation_level value %d.\n",
+ fn, (int)r->in.validation_level));
+ return NT_STATUS_INVALID_INFO_CLASS;
}
if (process_creds) {
- fstring remote_machine;
/* Get the remote machine name for the creds store. */
/* Note this is the remote machine this request is coming from (member server),
not neccessarily the workstation name the user is logging onto.
*/
- fstrcpy(remote_machine, r->in.computer_name);
-
if (!p->dc) {
/* Restore the saved state of the netlogon creds. */
bool ret;
become_root();
ret = secrets_restore_schannel_session_info(
- p, remote_machine, &p->dc);
+ p, r->in.computer_name, &p->dc);
unbecome_root();
if (!ret) {
return NT_STATUS_INVALID_HANDLE;
/* checks and updates credentials. creates reply credentials */
if (!netlogon_creds_server_step(p->dc, r->in.credential, r->out.return_authenticator)) {
- DEBUG(2,("_netr_LogonSamLogon: creds_server_step failed. Rejecting auth "
+ DEBUG(2,("%s: creds_server_step failed. Rejecting auth "
"request from client %s machine account %s\n",
- remote_machine, p->dc->mach_acct ));
+ fn, r->in.computer_name, p->dc->mach_acct ));
return NT_STATUS_INVALID_PARAMETER;
}
/* We must store the creds state after an update. */
become_root();
- secrets_store_schannel_session_info(p, remote_machine, p->dc);
+ secrets_store_schannel_session_info(p, r->in.computer_name, p->dc);
unbecome_root();
}
switch (r->in.logon_level) {
- case INTERACTIVE_LOGON_TYPE:
- fstrcpy(nt_username,
- logon->password->identity_info.account_name.string);
- fstrcpy(nt_domain,
- logon->password->identity_info.domain_name.string);
- fstrcpy(nt_workstation,
- logon->password->identity_info.workstation.string);
+ case NetlogonInteractiveInformation:
+ nt_username = logon->password->identity_info.account_name.string;
+ nt_domain = logon->password->identity_info.domain_name.string;
+ nt_workstation = logon->password->identity_info.workstation.string;
DEBUG(3,("SAM Logon (Interactive). Domain:[%s]. ", lp_workgroup()));
break;
- case NET_LOGON_TYPE:
- fstrcpy(nt_username,
- logon->network->identity_info.account_name.string);
- fstrcpy(nt_domain,
- logon->network->identity_info.domain_name.string);
- fstrcpy(nt_workstation,
- logon->network->identity_info.workstation.string);
+ case NetlogonNetworkInformation:
+ nt_username = logon->network->identity_info.account_name.string;
+ nt_domain = logon->network->identity_info.domain_name.string;
+ nt_workstation = logon->network->identity_info.workstation.string;
DEBUG(3,("SAM Logon (Network). Domain:[%s]. ", lp_workgroup()));
break;
status = NT_STATUS_OK;
switch (r->in.logon_level) {
- case NET_LOGON_TYPE:
+ case NetlogonNetworkInformation:
{
const char *wksname = nt_workstation;
}
break;
}
- case INTERACTIVE_LOGON_TYPE:
+ case NetlogonInteractiveInformation:
/* 'Interactive' authentication, supplies the password in its
MD4 form, encrypted with the session key. We will convert
this to challenge/response for the auth subsystem to chew
on */
{
- const uint8 *chal;
+ uint8_t chal[8];
if (!NT_STATUS_IS_OK(status = make_auth_context_subsystem(&auth_context))) {
return status;
}
- chal = auth_context->get_ntlm_challenge(auth_context);
+ auth_context->get_ntlm_challenge(auth_context, chal);
if (!make_user_info_netlogon_interactive(&user_info,
nt_username, nt_domain,
(auth_context->free)(&auth_context);
free_user_info(&user_info);
- DEBUG(5,("_netr_LogonSamLogon: check_password returned status %s\n",
- nt_errstr(status)));
+ DEBUG(5,("%s: check_password returned status %s\n",
+ fn, nt_errstr(status)));
/* Check account and password */
if (server_info->guest) {
/* We don't like guest domain logons... */
- DEBUG(5,("_netr_LogonSamLogon: Attempted domain logon as GUEST "
- "denied.\n"));
+ DEBUG(5,("%s: Attempted domain logon as GUEST "
+ "denied.\n", fn));
TALLOC_FREE(server_info);
return NT_STATUS_LOGON_FAILURE;
}
memcpy(pipe_session_key, p->auth.a_u.schannel_auth->sess_key, 16);
}
- status = serverinfo_to_SamInfo3(server_info, pipe_session_key, sam3);
+ switch (r->in.validation_level) {
+ case 2:
+ status = serverinfo_to_SamInfo2(server_info, pipe_session_key, 16,
+ r->out.validation->sam2);
+ break;
+ case 3:
+ status = serverinfo_to_SamInfo3(server_info, pipe_session_key, 16,
+ r->out.validation->sam3);
+ break;
+ }
+
TALLOC_FREE(server_info);
+
return status;
}
/* Only allow this if the pipe is protected. */
if (p->auth.auth_type != PIPE_AUTH_TYPE_SCHANNEL) {
- DEBUG(0,("_net_sam_logon_ex: client %s not using schannel for netlogon\n",
+ DEBUG(0,("_netr_LogonSamLogonEx: client %s not using schannel for netlogon\n",
get_remote_machine_name() ));
return NT_STATUS_INVALID_PARAMETER;
}
/****************************************************************
****************************************************************/
-WERROR _netr_LogonControl2Ex(pipes_struct *p,
- struct netr_LogonControl2Ex *r)
-{
- p->rng_fault_state = true;
- return WERR_NOT_SUPPORTED;
-}
-
-/****************************************************************
-****************************************************************/
-
WERROR _netr_DsRGetDCName(pipes_struct *p,
struct netr_DsRGetDCName *r)
{
/****************************************************************
****************************************************************/
-WERROR _netr_NETRLOGONDUMMYROUTINE1(pipes_struct *p,
- struct netr_NETRLOGONDUMMYROUTINE1 *r)
+NTSTATUS _netr_LogonGetCapabilities(pipes_struct *p,
+ struct netr_LogonGetCapabilities *r)
{
- p->rng_fault_state = true;
- return WERR_NOT_SUPPORTED;
+ return NT_STATUS_NOT_IMPLEMENTED;
}
/****************************************************************
/****************************************************************
****************************************************************/
-NTSTATUS _netr_ServerAuthenticate3(pipes_struct *p,
- struct netr_ServerAuthenticate3 *r)
-{
- p->rng_fault_state = true;
- return NT_STATUS_NOT_IMPLEMENTED;
-}
-
-/****************************************************************
-****************************************************************/
-
WERROR _netr_DsRGetDCNameEx(pipes_struct *p,
struct netr_DsRGetDCNameEx *r)
{
/****************************************************************
****************************************************************/
-WERROR _netr_NETRSERVERGETTRUSTINFO(pipes_struct *p,
- struct netr_NETRSERVERGETTRUSTINFO *r)
+NTSTATUS _netr_ServerGetTrustInfo(pipes_struct *p,
+ struct netr_ServerGetTrustInfo *r)
{
p->rng_fault_state = true;
- return WERR_NOT_SUPPORTED;
+ return NT_STATUS_NOT_IMPLEMENTED;
}