268 lines
6.7 KiB
C
268 lines
6.7 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1994 Microsoft Corporation
|
|||
|
Copyright (c) 1993 Micro Computer Systems, Inc.
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
net\svcdlls\nwsap\client\bindlib.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This routine handles the BindLib API for the SAP Agent
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Brian Walker (MCS) 06-15-1993
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#include "precomp.h"
|
|||
|
#pragma hdrstop
|
|||
|
|
|||
|
|
|||
|
/*++
|
|||
|
*******************************************************************
|
|||
|
S a p G e t O b j e c t N a m e
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine converts an Object ID into an Object Name
|
|||
|
and Type.
|
|||
|
|
|||
|
Arguments:
|
|||
|
ObjectID = Object ID to convert
|
|||
|
ObjectName = Ptr to where to store 48 byte object name
|
|||
|
ObjectType = Ptr to where to store the object type
|
|||
|
ObjectAddr = Ptr to where to store NET_ADDRESS (12 bytes)
|
|||
|
|
|||
|
ObjectName, ObjectType, ObjectAddr can be NULL.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
SAPRETURN_SUCCESS = OK - name and type are filled in
|
|||
|
SAPRETURN_NOTEXIST = Invalid object id.
|
|||
|
*******************************************************************
|
|||
|
--*/
|
|||
|
|
|||
|
INT
|
|||
|
SapGetObjectName(
|
|||
|
IN ULONG ObjectID,
|
|||
|
IN PUCHAR ObjectName,
|
|||
|
IN PUSHORT ObjectType,
|
|||
|
IN PUCHAR ObjectAddr)
|
|||
|
{
|
|||
|
NTSTATUS status;
|
|||
|
NWSAP_REQUEST_MESSAGE request;
|
|||
|
NWSAP_REPLY_MESSAGE reply;
|
|||
|
|
|||
|
/** If not initialized - return error **/
|
|||
|
|
|||
|
if (!SapLibInitialized)
|
|||
|
return SAPRETURN_NOTINIT;
|
|||
|
|
|||
|
/** Build the Get Object Name message **/
|
|||
|
|
|||
|
request.MessageType = NWSAP_LPCMSG_GETOBJECTNAME;
|
|||
|
request.PortMessage.u1.s1.DataLength = (USHORT)(sizeof(request) - sizeof(PORT_MESSAGE));
|
|||
|
request.PortMessage.u1.s1.TotalLength = sizeof(request);
|
|||
|
request.PortMessage.u2.ZeroInit = 0;
|
|||
|
request.PortMessage.MessageId = 0;
|
|||
|
|
|||
|
request.Message.BindLibApi.ObjectID = ObjectID;
|
|||
|
|
|||
|
/** 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 **/
|
|||
|
|
|||
|
if (ObjectType)
|
|||
|
*ObjectType = reply.Message.BindLibApi.ObjectType;
|
|||
|
|
|||
|
if (ObjectName)
|
|||
|
memcpy(ObjectName, reply.Message.BindLibApi.ObjectName, NWSAP_MAXNAME_LENGTH+1);
|
|||
|
|
|||
|
if (ObjectAddr)
|
|||
|
memcpy(ObjectAddr, reply.Message.BindLibApi.ObjectAddr, 12);
|
|||
|
|
|||
|
/** All Done OK **/
|
|||
|
|
|||
|
return SAPRETURN_SUCCESS;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*++
|
|||
|
*******************************************************************
|
|||
|
S a p G e t O b j e c t I D
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine converts a name and type into an object ID.
|
|||
|
|
|||
|
Arguments:
|
|||
|
ObjectName = Ptr to AsciiZ object name (Must be uppercase)
|
|||
|
ObjectType = Object type to look for
|
|||
|
ObjectID = Ptr to where to store the object ID.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
SAPRETURN_SUCCESS = OK - Object ID is filled in
|
|||
|
SAPRETURN_NOTEXIST = Name/Type not found
|
|||
|
*******************************************************************
|
|||
|
--*/
|
|||
|
|
|||
|
INT
|
|||
|
SapGetObjectID(
|
|||
|
IN PUCHAR ObjectName,
|
|||
|
IN USHORT ObjectType,
|
|||
|
IN PULONG ObjectID)
|
|||
|
{
|
|||
|
NTSTATUS status;
|
|||
|
NWSAP_REQUEST_MESSAGE request;
|
|||
|
NWSAP_REPLY_MESSAGE reply;
|
|||
|
|
|||
|
/** If not initialized - return error **/
|
|||
|
|
|||
|
if (!SapLibInitialized)
|
|||
|
return SAPRETURN_NOTINIT;
|
|||
|
|
|||
|
/** If the name is too long - error **/
|
|||
|
|
|||
|
if (strlen(ObjectName) > NWSAP_MAXNAME_LENGTH)
|
|||
|
return SAPRETURN_INVALIDNAME;
|
|||
|
|
|||
|
/** Build the Get Object Name message **/
|
|||
|
|
|||
|
request.MessageType = NWSAP_LPCMSG_GETOBJECTID;
|
|||
|
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.BindLibApi.ObjectName, 0, NWSAP_MAXNAME_LENGTH+1);
|
|||
|
strcpy(request.Message.BindLibApi.ObjectName, ObjectName);
|
|||
|
request.Message.BindLibApi.ObjectType = ObjectType;
|
|||
|
|
|||
|
/** 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 **/
|
|||
|
|
|||
|
*ObjectID = reply.Message.BindLibApi.ObjectID;
|
|||
|
|
|||
|
/** All Done OK **/
|
|||
|
|
|||
|
return SAPRETURN_SUCCESS;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*++
|
|||
|
*******************************************************************
|
|||
|
S a p S c a n O b j e c t
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine is used to scan thru the database list.
|
|||
|
|
|||
|
Arguments:
|
|||
|
ObjectID = Ptr to last Object ID we saw. On first call
|
|||
|
this should point to a 0xFFFFFFFF.
|
|||
|
ObjectName = Ptr to where to store 48 byte object name
|
|||
|
ObjectType = Ptr to where to store the object type
|
|||
|
ScanType = Object Type that we are scanning for
|
|||
|
(0xFFFF = All)
|
|||
|
|
|||
|
ObjectName, ObjectType can be NULL.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
SAPRETURN_SUCCESS = OK - name and type are filled in
|
|||
|
ObjectID has the object ID of this entry.
|
|||
|
SAPRETURN_NOTEXIST = Invalid object id.
|
|||
|
*******************************************************************
|
|||
|
--*/
|
|||
|
|
|||
|
INT
|
|||
|
SapScanObject(
|
|||
|
IN PULONG ObjectID,
|
|||
|
IN PUCHAR ObjectName,
|
|||
|
IN PUSHORT ObjectType,
|
|||
|
IN USHORT ScanType)
|
|||
|
{
|
|||
|
NTSTATUS status;
|
|||
|
NWSAP_REQUEST_MESSAGE request;
|
|||
|
NWSAP_REPLY_MESSAGE reply;
|
|||
|
|
|||
|
/** If not initialized - return error **/
|
|||
|
|
|||
|
if (!SapLibInitialized)
|
|||
|
return SAPRETURN_NOTINIT;
|
|||
|
|
|||
|
/** Build the Get Object Name message **/
|
|||
|
|
|||
|
request.MessageType = NWSAP_LPCMSG_SEARCH;
|
|||
|
request.PortMessage.u1.s1.DataLength = (USHORT)(sizeof(request) - sizeof(PORT_MESSAGE));
|
|||
|
request.PortMessage.u1.s1.TotalLength = sizeof(request);
|
|||
|
request.PortMessage.u2.ZeroInit = 0;
|
|||
|
|
|||
|
request.Message.BindLibApi.ObjectID = *ObjectID;
|
|||
|
request.Message.BindLibApi.ScanType = ScanType;
|
|||
|
|
|||
|
/** 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 **/
|
|||
|
|
|||
|
if (ObjectType)
|
|||
|
*ObjectType = reply.Message.BindLibApi.ObjectType;
|
|||
|
|
|||
|
if (ObjectName)
|
|||
|
memcpy(ObjectName, reply.Message.BindLibApi.ObjectName, NWSAP_MAXNAME_LENGTH+1);
|
|||
|
|
|||
|
*ObjectID = reply.Message.BindLibApi.ObjectID;
|
|||
|
|
|||
|
/** All Done OK **/
|
|||
|
|
|||
|
return SAPRETURN_SUCCESS;
|
|||
|
}
|
|||
|
|