windows-nt/Source/XPSP1/NT/net/rras/ipx/sap/client/advapi.c

185 lines
4.6 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1994 Microsoft Corporation
Copyright (c) 1993 Micro Computer Systems, Inc.
Module Name:
net\svcdlls\nwsap\client\advapi.c
Abstract:
This routine handles the Advertise API for the SAP Agent
Author:
Brian Walker (MCS) 06-15-1993
Revision History:
--*/
#include "precomp.h"
#pragma hdrstop
/*++
*******************************************************************
S a p A d d A d v e r t i s e
Routine Description:
This routine adds an entry to the list of servers
that we advertise.
Arguments:
ServerName = Ptr to AsciiZ server name
ServerType = USHORT of object type to add
ServerAddr = Ptr to 12 byte aerver address
RespondNearest = TRUE = Use me for respond nearest call
FALSE = Don't use me for respond nearest call
Return Value:
SAPRETURN_SUCCESS - Added OK
SAPRETURN_NOMEMORY - Error allocating memory
SAPRETURN_EXISTS - Already exists in list
SAPRETURN_NOTINIT - SAP Agent is not running
*******************************************************************
--*/
INT
SapAddAdvertise(
IN PUCHAR ServerName,
IN USHORT ServerType,
IN PUCHAR ServerAddr,
IN BOOL RespondNearest)
{
NTSTATUS status;
NWSAP_REQUEST_MESSAGE request;
NWSAP_REPLY_MESSAGE reply;
/** If not running - return error **/
if (!SapLibInitialized)
return SAPRETURN_NOTINIT;
/** Make sure name is not too long **/
if (strlen(ServerName) > NWSAP_MAXNAME_LENGTH) {
return SAPRETURN_INVALIDNAME;
}
/** Build the Add Advertise message **/
request.MessageType = NWSAP_LPCMSG_ADDADVERTISE;
request.PortMessage.u1.s1.DataLength = (USHORT)(sizeof(request) - sizeof(PORT_MESSAGE));
request.PortMessage.u1.s1.TotalLength = sizeof(request);
request.PortMessage.u2.ZeroInit = 0;
memset(request.Message.AdvApi.ServerName, 0, NWSAP_MAXNAME_LENGTH+1);
strcpy(request.Message.AdvApi.ServerName, ServerName);
memcpy(request.Message.AdvApi.ServerAddr, ServerAddr, 12);
request.Message.AdvApi.ServerType = ServerType;
request.Message.AdvApi.RespondNearest = RespondNearest;
/** Send it and get a response **/
status = NtRequestWaitReplyPort(
SapXsPortHandle,
(PPORT_MESSAGE)&request,
(PPORT_MESSAGE)&reply);
if (!NT_SUCCESS(status)) {
return status;
}
/** If we got a SAP error - return it **/
if (reply.Error)
return reply.Error;
/** Return the entry **/
memcpy(ServerAddr, reply.Message.AdvApi.ServerAddr, 12);
/** All Done OK **/
return SAPRETURN_SUCCESS;
}
/*++
*******************************************************************
S a p R e m o v e A d v e r t i s e
Routine Description:
This routine removes an entry to the list of servers
that we advertise.
Arguments:
ServerName = Ptr to AsciiZ server name
ServerType = USHORT of object type to remove
Return Value:
SAPRETURN_SUCCESS - Added OK
SAPRETURN_NOTEXIST - Entry does not exist in list
SAPRETURN_NOTINIT - SAP Agent is not running
*******************************************************************
--*/
INT
SapRemoveAdvertise(
IN PUCHAR ServerName,
IN USHORT ServerType)
{
NTSTATUS status;
NWSAP_REQUEST_MESSAGE request;
NWSAP_REPLY_MESSAGE reply;
/** If not running - return error **/
if (!SapLibInitialized)
return SAPRETURN_NOTINIT;
/** Make sure name is not too long **/
if (strlen(ServerName) > NWSAP_MAXNAME_LENGTH) {
return SAPRETURN_INVALIDNAME;
}
/** Build the Add Advertise message **/
request.MessageType = NWSAP_LPCMSG_REMOVEADVERTISE;
request.PortMessage.u1.s1.DataLength = (USHORT)(sizeof(request) - sizeof(PORT_MESSAGE));
request.PortMessage.u1.s1.TotalLength = sizeof(request);
request.PortMessage.u2.ZeroInit = 0;
memset(request.Message.AdvApi.ServerName, 0, NWSAP_MAXNAME_LENGTH+1);
strcpy(request.Message.AdvApi.ServerName, ServerName);
request.Message.AdvApi.ServerType = ServerType;
/** Send it and get a response **/
status = NtRequestWaitReplyPort(
SapXsPortHandle,
(PPORT_MESSAGE)&request,
(PPORT_MESSAGE)&reply);
if (!NT_SUCCESS(status)) {
return status;
}
/** If we got a SAP error - return it **/
if (reply.Error)
return reply.Error;
/** All Done OK **/
return SAPRETURN_SUCCESS;
}