COMMENT @----------------------------------------------------------------------

	Copyright (c) GeoWorks 1992 -- All Rights Reserved

PROJECT:	PC/GEOS
MODULE:		Network Library
FILE:		net.def

REVISION HISTORY
	Name	Date		Description
	----	----		-----------
	Eric	2/92		Initial version

ROUTINES
	Name			Description
	----			-----------

DESCRIPTION

	$Id: net.def,v 1.1 97/04/04 14:22:38 newdeal Exp $
------------------------------------------------------------------------------@

SetDef __NET


StartLibrary net

include	object.def		; for MessageFlags

;
; Realistically, net.def should not include anything in the Internal
; directory. It'd take too much time to remedy this, so I'm leaving it
; there for now.	
;
include Internal/netDr.def	;
;##############################################################################
;		READ THIS BEFORE YOU USE THE PC/GEOS NETWARE LIBRARY
;##############################################################################

;How to see if Dos 3.0, IPX, and the NetWare shell are present.

;how to find bugs in calls.

;where docs are located.
;-----------------------------------------------------------------------------
;	Net constants		
;-----------------------------------------------------------------------------
NetError	etype	word

NET_STATUS_OK	enum NetError, 0
; Not an error -- status is OK.

NET_ERROR_DRIVER_NOT_FOUND				enum NetError
; No net driver was found. Generally, this means no works was done

NET_ERROR_PRINT_QUEUE_NOT_FOUND	enum	NetError
; The requested print queue does not exist

NET_ERROR_UNSUPPORTED_FUNCTION	enum	NetError
; This function is not supported by the called driver

NET_ERROR_INSUFFICIENT_MEMORY	enum	NetError
; There's not enough memory to complete the requested operation

NET_ERR_WRONG_BAUD_RATE		enum	NetError
NET_ERR_INVALID_PORT_TOKEN	enum	NetError
NET_ERR_INVALID_SOCKET_TOKEN	enum	NetError
NET_ERR_SOCKET_ID_IN_USE	enum	NetError

NET_ERR_PORT_IN_USE		enum	NetError
; Returned by the Comm driver if the serial port is already in use

NET_ERR_INVALID_PORT		enum	NetError
; Returned by the Comm driver if the serial port couldn't be opened because
; the device didn't exist.

NET_ERR_REPLY_ERROR		enum	NetError
; Returned by the Comm driver if it got an ERR_PACKET returned

NET_ERR_SEND_TIMEOUT		enum	NetError
; Returned by the Comm driver if it never got an ACK_PACKET

NET_ERR_INVALID_DRIVER_FUNCTION	enum    NetError


NET_USER_FULL_NAME_BUFFER_SIZE equ 48
NetUserFullName	type NET_USER_FULL_NAME_BUFFER_SIZE dup (char)


NetObjectType	etype	word

; These first 5 object types correspond directly to the Novell NetWare
; object types.

HiLoEnum NOT_USER,			NetObjectType, 0x0001
HiLoEnum NOT_USER_GROUP,		NetObjectType, 0x0002
HiLoEnum NOT_PRINT_QUEUE,		NetObjectType, 0x0003
HiLoEnum NOT_FILE_SERVER,		NetObjectType, 0x0004
HiLoEnum NOT_WILD,			NetObjectType, 0xFFFF


; These names must be defined BEFORE netware.def is included

NetObjectName	type	48 dup (char)
; This is a "network independent" data type that JUST HAPPENS to be
; the same as the NetWareBinderyObjectNameZ data type...

NetPropertyName type	16 dup (char)
; This "network independent" type is used for object property names.
; It roughly corresponds to the NetWare bindery object property name.

NetStationAddress type	6 dup (byte)
; This "network independent" type is used for holding the value which uniquely
; identifies a node or workstation, usually with a value read from the
; network card. (See NovellStationAddress in netware.def.)

NetBannerText	type	14 dup (char)
; NetWare only allows 13 characters -- this is word-aligned.

NET_TEXT_MESSAGE_BUFFER_SIZE	equ	64
; No one knows what this constant should actually be.  The Novell docs
; say "55 bytes".  If a very long message is sent, it appears to be
; truncated at 58 bytes, so we'll be safe and use 64.


; This line should either be removed, or moved to netConstant.def
include netware.def

include Internal/semInt.def		;for PC/GEOS Semaphore structure
include geode.def			;for GeodeToken, etc.


;------------------------------------------------------------------------------
;			Calls into the Net Library
;------------------------------------------------------------------------------
;These are exported for our clients. (SEE SOURCE CODE IN NET LIBRARY FOR
;FULL DOCS.)

;registration

global	NetRegisterDomain:far
global	NetUnregisterDomain:far

; Connection related

global NetGetConnectionNumber:far

; User related

global	NetUserGetLoginName:far

NET_LOGIN_NAME_SIZE equ 47
NET_LOGIN_NAME_SIZE_ZT equ 48
NetLoginName	type	NET_LOGIN_NAME_SIZE dup (char)
NetLoginNameZT	type	NET_LOGIN_NAME_SIZE_ZT dup (char)

NET_SERVER_NAME_SIZE equ 47
NET_SERVER_NAME_SIZE_ZT equ 48
NetServerName	type	NET_SERVER_NAME_SIZE dup (char)
NetServerNameZT	type	NET_SERVER_NAME_SIZE_ZT dup (char)

global	NetUserGetFullName:far
global	NetUserCheckIfInGroup:far
global	NetEnumConnectedUsers:far
global	NetEnumUsers:far

;Messaging / sockets

global	NetObjMessage:far

;Semaphores

global	NetOpenSem:far
global	NetPSem:far
global	NetVSem:far
global	NetCloseSem:far
global	NetVAllSem:far
global	NetInfoSem:far

; Sockets

global  NetMsgOpenPort:far
; Destroys: ax, bp, di

global  NetMsgClosePort:far
global  NetMsgCreateSocket:far
; bx - port token
; cx - socket ID
; bp - dest ID
; si - data to pass to callback
; ds:dx - callback routine
;	CALLBACK is passed
;		CX - size of data being passed
;			(or SOCKET_DESTROYED if socket is being destroyed
;			 SOCKET_HEARTBEAT if data has been received over the
;			 port)
;		DS:SI - ptr to data
;		DI - data
;		DX - extra data passed (in BP) to NetMsgSendBuffer 
; Destroys: bp, di, bx
; 
SOCKET_HEARTBEAT	equ	-1
SOCKET_DESTROYED	equ	0
global  NetMsgDestroySocket:far
global  NetMsgSendBuffer:far
global  NetMsgSetTimeOut:far

; Printing

global	NetPrintEnumPrintQueues:far
global	NetPrintStartCapture:far
global	NetPrintEndCapture:far
global	NetPrintFlushCapture:far
global	NetPrintCancelCapture:far
global	NetPrintGetCaptureQueue:far
global	NetPrintGetBanner:far
global	NetPrintSetBanner:far
global	NetPrintGetBannerStatus:far
global	NetPrintSetBannerStatus:far
global	NetPrintGetTimeout:far
global	NetPrintSetTimeout:far

;These are exported for the benefit of the specific network drivers.

global	NetCreateHECB:far
global	NetUnpackHugeECBAndDispatchLocalMessage:far
global	NetEnumCallback:far

global NetRegisterDomain:far
global NetUnregisterDomain:far		

global	NetGetDefaultConnectionID:far	
;Password checking
	  
global NetVerifyUserPassword:far
global NetGetServerNameTable:far
global NetGetConnectionIDTable:far              
global NetScanForServer:far       
global NetServerAttach:far       
global NetServerLogin:far       
global NetServerLogout:far       
global NetServerChangeUserPassword:far       
global NetServerVerifyUserPassword:far       
global NetServerGetNetAddr:far       
global NetServerGetWSNetAddr:far       
global NetMapDrive:far       
global NetUnmapDrive:far       
global NetGetVolumeName:far
global NetGetDriveCurrentPath:far
global NetGetStationAddress:far

; Object related
global NetObjectReadPropertyValue:far
global NetObjectEnumProperties:far


; Text messages

global NetTextMessagePoll:far
global NetTextMessageSend:far

 
;C Stubs
global NETENUMUSERS:far
global NETENUMCONNECTEDUSERS:far
global NETUSERGETLOGINNAME:far
global NETUSERCHECKIFINGROUP:far
global NETGETDEFAULTCONNECTIONID:far	
global NETVERIFYUSERPASSWORD:far          
global NETGETSERVERNAMETABLE:far
global NETGETCONNECTIONIDTABLE:far              
global NETSCANFORSERVER:far       
global NETSERVERATTACH:far
global NETSERVERLOGIN:far       
global NETSERVERLOGOUT:far       
global NETSERVERCHANGEUSERPASSWORD:far       
global NETSERVERVERIFYUSERPASSWORD:far       
global NETSERVERGETNETADDR:far       
global NETSERVERGETWSNETADDR:far       
global NETMAPDRIVE:far       
global NETUNMAPDRIVE:far       
global NETGETCONNECTIONNUMBER:far       
global NETMSGOPENPORT:far       
global NETMSGCLOSEPORT:far       	  	
global NETMSGCREATESOCKET:far       	  	
global NETMSGDESTROYSOCKET:far
global NETMSGSENDBUFFER:far
global NETMSGSETTIMEOUT:far
global NETOPENSEM:far
global NETPSEM:far
global NETVSEM:far
global NETCLOSESEM:far
global NETPRINTSETBANNERSTATUS:far
global NETPRINTSETTIMEOUT:far
;
;	Structure passed in to NetMsgOpenPort
;
SerialPortInfo	struct
	SPI_portNumber	SerialPortNum
	SPI_baudRate	SerialBaud
SerialPortInfo	ends




;##############################################################################
;		Definitions for the PC/GEOS Net Library
;##############################################################################
;This is an abstract data type that represents a Network-based semaphore's
;handle.
;
;(In reality, our NetWare driver creates and manages these handles.
;They are actually chunk handles within the LMem heap that keeps track
;of opened semaphores. When we support multiple simultaneous specific
;network drivers, may have to find a way to keep these unique between
;the various drivers.)

NetSemaphore			type	lptr	;(Is a chunk within a data
						;block internal to the Net lib)

;I once thought that we should prepend the word "GEOS" to all semaphores
;that our drivers create. This will mess up compatibility with some current
;Novell-based software packages that we work with.

;NET_SEMAPHORE_NAME_ROOT_LENGTH	equ	4	;'GEOS' (see code)
;						;length of string

NET_SEMAPHORE_NAME_ROOT_LENGTH	equ	0	;no prefix for now.

NET_SEMAPHORE_NAME_LENGTH	equ	NW_SEMAPHORE_NAME_LENGTH - \
					NET_SEMAPHORE_NAME_ROOT_LENGTH+1
						;=124 including null term.
						;We prepend "GEOS" to the
						;beginning, and strip off the
						;null term before NetWare gets
						;this name.

;------------------------------------------------------------------------------
;			NetRequestReplyBufferStruct
;------------------------------------------------------------------------------
;This structure is placed inside a block on the global heap. It contains
;both the request buffer that the specific network driver (such as NW)
;will examine, and the reply buffer that it will place its return data into.
;Many of the Net Library calls return ES pointing to such a structure,
;locked on the heap. To free it when you are done, use:
;
;	mov	bx, es:[NRR_handle]
;	call	MemFree
;

NetRequestReplyBufferStruct	struct
    NRR_handle		hptr.NetWareRequestReplyBufferStruct
					;handle of this block, for convenience
EC <NRR_protect		word		;protect word, for identification >

    ;the Request Buffer starts here, and can be any length.

    NRR_requestSize	label	word

    ;the Reply Buffer comes next. No field name necessary, because its
    ;position will change.

NetRequestReplyBufferStruct	ends


;------------------------------------------------------------------------------
;		NetLibraryMinorAddress
;------------------------------------------------------------------------------
;When specifying a Minor Address in a NetWareLibraryMessagePacketStruc,
;you can either pass an OD (for a specific object at the other end of
;the established connection), or one of the following values in the high
;word, with 0 as the low word. See the docs for NetObjMessage for
;full info.

NLMinorAddress	etype	word, 0

    ;These first values are used to indicate which object within an application 
    ;we want to reach. These are generally used when we specify the token
    ;for the type of application we are broadcasting to.

    NLMA_APP_PROCESS			enum NLMinorAddress
					;This value can also be used when you
					;send a message across a connection,
					;to send the message to the object
					;which created the destination
					;of the connection.

    NLMA_APP_GEN_APP_OBJECT		enum NLMinorAddress

    NLMA_APP_GEN_PRIMARY_OBJECT		enum NLMinorAddress

    NLMA_APP_NON_PRIMARY_FOCUSED_TOP_LEVEL_OBJECT \
					enum NLMinorAddress
					;This might be useful, to reach
					;the top-most dialog box, etc.
					;Hmmm...

    ;can add new values here, without changing the major protocol of the
    ;NetWare library...

    NLMA_NET_LIBRARY			enum NLMinorAddress, 8
					;Use this to send a message to the
					;NetWare library on the dest machine.

    NLMA_SYSTEM_OBJECT			enum NLMinorAddress

    NLMA_FOCUSED_FIELD_OBJECT		enum NLMinorAddress

    NLMA_FOCUSED_APP_PROCESS		enum NLMinorAddress

    ;can add new values here, without changing the major protocol of the
    ;NetWare library...


;------------------------------------------------------------------------------
;		NLMessageFlags
;------------------------------------------------------------------------------
;Since NetObjMessage will untimately pass a lot of this information onto
;ObjMessage on the destination machine, we've got our own version of
;"MessageFlags". Note that this record is used for two reasons:
;
;	1) For a caller to indicate to NetObjMessage exactly what type
;	of message to send, and where to gather arguments from.
;
;	2) This record is stored in the NetWareLibraryMessagePacketStruc,
;	indicating some specifics about that structure, such as the type
;	of message, whether stack data is included, etc.

NLMessageFlags	record
    NLMF_CALL:1			;Send message to destination, and await
				;reply. Will return values, as in ObjMessage.
				;THIS CAN ONLY BE sent through the "master"
				;end of an established SPX connection.

    NLMF_SEND:1			;This has the same effect as MF_FORCE_QUEUE,
				;but has a new name because you either have
				;to set this flag, or pass NLMF_CALL. Send
				;message to destination, placing it on the
				;queue for the dest object.

    NLMF_STACK:1		;Same idea as MF_STACK. See note below.

    ;one new flag, for NetObjMessage only:

    NLMF_MAJOR_ADDR_ON_STACK:1	;set this if the "Major Address" for the
				;destination is on the stack (see note below)

    NLMF_CHECK_DUPLICATE:1	;same as MF_CHECK_DUPLICATE, at dest.
    NLMF_CHECK_LAST_ONLY:1	;same as MF_CHECK_LAST_ONLY, at dest.
    NLMF_REPLACE:1		;same as MF_REPLACE, at dest.

    :1
;   NLMF_CUSTOM_IN_BLOCK:1	;similar to MF_CUSTOM, except that the
;				;actual code for the callback is passed
;				;in the passed data block (see below).
;				;(THIS IS A NASTY HOLE FOR VIRUSES...)

    ;There is no need for MF_FIXUP_DS and MF_FIXUP_ES, since NetObjMessage
    ;just copies stuff to a block on the global heap, falls asleep on
    ;a semaphore, and returns. There is no chance that the caller's Object
    ;Block will move, unless we permit NetObjMessage to deliver messages
    ;locally...

    NLMF_PASSED_DATA_BLOCK:1	;set this if ^hcx points to an unlocked
				;shared block on the global heap. This data
				;in this block will be sent along with the
				;remote message. THIS BLOCK WILL BE FREED.
				;IMPORTANT: during transmission, the block
				;will expand to the nearest paragraph
				;(16 byte) boundary.

    NLMF_RETURNS_DATA_BLOCK:1	;set this if we expect that on return, ^hcx
				;will point to an unlocked shared block on
				;the global heap of the dest. machine.
				;This block will be copied back across the
				;connection, along with other return values.
				;If cx is returned as 0, it means that no
				;such block is necessary. IMPORTANT: during
				;transmission, the block will expand to the
				;nearest paragraph (16 byte) boundary.
   
    NLMF_DISCARD_IF_NO_MATCH:1	;same as MF_DISCARD_IF_NO_MATCH, at dest.
    NLMF_MATCH_ALL:1		;same as MF_MATCH_ALL, at dest.
    NLMF_INSERT_AT_FRONT:1	;same as MF_INSERT_AT_FRONT, at dest.
    NLMF_CAN_DISCARD_IF_DESPERATE:1
				;same as MF_CAN_DISCARD_IF_DESPERATE, at dest.
    NLMF_RECORD:1		;same as MF_RECORD, at dest.

    ;one new flag, for NetObjMessage only:

    NLMF_CONNECTION_ID_ES:1	;set this if ES contains the connection ID
				;value which constitutes the "Major Address"
				;for the destination.
NLMessageFlags	end

;This mask is equal to all of the MessageFlags that we have NOT redefined.

MASK_MF_ONLY_FLAGS	equ (mask MessageFlags) and \
			    (not mask MF_FIXUP_DS) and \
			    (not mask MF_FIXUP_ES) and \
			    (not mask MF_CUSTOM)

.assert (mask NLMF_CALL) eq (mask MF_CALL)
.assert (mask NLMF_SEND) eq (mask MF_FORCE_QUEUE)
.assert (mask NLMF_STACK) eq (mask MF_STACK)

.assert (mask NLMF_CHECK_DUPLICATE) eq (mask MF_CHECK_DUPLICATE)
.assert (mask NLMF_CHECK_LAST_ONLY) eq (mask MF_CHECK_LAST_ONLY)
.assert (mask NLMF_REPLACE) eq (mask MF_REPLACE)
.assert (mask NLMF_PASSED_DATA_BLOCK) eq (mask MF_FIXUP_DS)
.assert (mask NLMF_RETURNS_DATA_BLOCK) eq (mask MF_FIXUP_ES)
.assert (mask NLMF_DISCARD_IF_NO_MATCH) eq (mask MF_DISCARD_IF_NO_MATCH)
.assert (mask NLMF_MATCH_ALL) eq (mask MF_MATCH_ALL)
.assert (mask NLMF_INSERT_AT_FRONT) eq (mask MF_INSERT_AT_FRONT)
.assert (mask NLMF_CAN_DISCARD_IF_DESPERATE) eq \
					(mask MF_CAN_DISCARD_IF_DESPERATE)

.assert (mask NLMF_RECORD) eq (mask MF_RECORD)

;NOTE ON MAJOR AND MINOR ADDRESSES:
;
;NetObjMessage offers several ways to address a message:
;
;	Major Address (18 bytes) 	Minor Address (4 bytes)
;	------------------------	---------------------------------------
;1)	<NodeSocketAddr><TokenID>	A specific type of object in all of the
;	 (passed on stack)		applications which have that token
;					on the destination machine.
;					For example (low word = 0):
;
;					high word = NLMA_APP_PROCESS
;						  = NLMA_APP_GEN_APP_OBJECT
;						  = NLMA_APP_GEN_PRIMARY_OBJECT
;							etc...
;
;2)	<NodeSocketAddr><0>		A specific type of system-level object
;	 (passed on stack)		on the destination machine.
;					For example (low word = 0):
;
;					high word = NLMA_NET_LIBRARY
;						  = NLMA_SYSTEM_OBJECT
;						  = NLMA_FOCUSED_FIELD_OBJECT
;						  = NLMA_FOCUSED_APP_PROCESS
;
;3)	<ConnectionID>			The OD of an object which is run
;	 (passed in ES register)	by the thread which created the
;					destination end of the connection,
;					OR 0 (NLMA_APP_PROCESS) for the process
;					which created the destination end of
;					the connection. The latter is generally
;					preferred, because it is simpler,
;					and we would not have handle relocation
;					problems if one machine exited to DOS
;					temporarily.
;
;If you pass NLMF_MAJOR_ADDR_ON_STACK, then case #1 or #2 apply, and the
;information for the Major Address is passed on the stack. If you pass
;NLMF_CONNECTION_ID_ES instead, then NetObjMessage will just get the
;connection ID from the low byte of ES. (I guess we could hide it in BX:SI...).
;
;In all cases, the Minor Address is passed in BX:SI.
;
;NOTE ON STACK ARGUMENTS:
;
;NetObjMessage allows you to pass data on the stack, and/or the Major Address
;information as described above. You pass one or both of the NLMF_STACK
;and NLMF_MAJOR_ADDR_ON_STACK flags to indicate which. In either case,
;DX will contain the total size of everything you have pushed onto the stack,
;and ss:bp points to the bottom of the data. If you push both onto the stack,
;push the NLNodeSocketAddrAndTokenID structure FIRST, so that it ends up
;above your data in the stack.

NLNodeSocketAddrAndTokenID	struct
    NLNST_nodeSocket		NovellNodeSocketAddrStruct <>
    NLNST_token			GeodeToken <>
NLNodeSocketAddrAndTokenID	ends


;------------------------------------------------------------------------------
;		NLMessagePacketStruct
;------------------------------------------------------------------------------

;In order to properly deliver PC/GEOS messages across Novell, we place
;this structure at the beginning of the data portion of EVERY IPX and SPX
;packet that we create and manage.

NLMessagePacketStruct	struct
    NLMPS_spx			IPX_SPXPacketHeaderStruct <>
					;IPX/SPX packet header structure

    ;Think of packets going between PC/GEOS machines as small documents.
    ;Since the NetLibrary and/or the application on the destination machine
    ;may have different software, let's make sure we pass along some
    ;protocol information.

    NLMPS_nlProtocol		ProtocolNumber
					;protocol number (major, minor) for
					;the NetLibrary.

    NLMPS_appProtocol		ProtocolNumber
					;protocol number for application
					;which sent this message.

    NLMPS_minorAddress		optr	;See NetObjMessage docs for full info
					;on this field. It contains an OD,
					;or NetWareLibraryMinorAddress value
					;as defined above.

    NLMPS_message		word	;message to send/call

    NLMPS_nlMessageFlags	NLMessageFlags
					;see above for full definition

    NLMPS_cx			word	;value for CX register
					;(size of passed/returned data block
					;if NLMF_PASSED_DATA_BLOCK and/of
					;NLMF_RETURNS_DATA_BLOCK is set.)

    NLMPS_dx			word	;value for DX register
					;(size of stack data if NLMF_STACK
					;and/or NLMF_MAJOR_ADDR_ON_STACK
					;is set.)

    NLMPS_bp			word	;value for BP register
					;(as long as NLMF_STACK and
					;NLMF_MAJOR_ADDR_ON_STACK are both 0.)

    NLMPS_msgData		label byte

    ;if NLMF_STACK and/or NLMF_MAJOR_ADDR_ON_STACK is set, then the data
    ;from the stack is placed here.

    ;if NLMF_PASSED_DATA_BLOCK or NLMF_RETURNS_DATA_BLOCK is set, then
    ;the pass or return data is placed here.

NLMessagePacketStruct	ends

;This is the maximum number of bytes which can be passed in a block on the
;global heap, assuming that no stack data is also passed.
;514 = 576-62

MAX_MSG_DATA_SIZE	equ	MAX_IPXSPX_PACKET_SIZE - \
				(size NLMessagePacketStruct)

;If you pass a NLNodeSocketAddrAndTokenID structure on the stack to
;indicate the destination node, AND you want to pass a data block,
;then this is your maximum for the data block:
;496 = 514-18

MAX_MSG_DATA_SIZE_WITH_NETADDR_ON_STACK	equ	MAX_MSG_DATA_SIZE - \
				(size NLNodeSocketAddrAndTokenID)


;------------------------------------------------------------------------------
;		NLHugeECB
;------------------------------------------------------------------------------
;We use this structure to keep track of a message as it travels through our
;queues, on its way to IPX/SPX.

HUGE_ECB_PROTECT1	equ	0xED27

NLHugeECB		struct

    ;first, we store the EventControlBlock structure

    HECB_ecb		EventControlBlockStruct <>

    ;this is a constant word value that just assures us that this structure
    ;is what we think it is.

    HECB_protect1	word		;will equal HUGE_ECB_PROTECT1 value.

    HECB_handle		hptr.NLHugeECB	;handle of this block

    ;this semaphore permits us to put the application's thread to sleep
    ;while the NetLibrary thread attempts to send the HugeECB. Initial
    ;value is 0, so that the first PSem will block.

    HECB_semaphore	Semaphore <>	;semaphore <0,0>

    ;The packet structure (IPX or SPX) comes next. (Has a variable length.)

    HECB_msg		NLMessagePacketStruct <>

NLHugeECB		ends

HECB_SIZE_WITHOUT_MESSAGE_PACKET	equ (size NLHugeECB) - \
					    (size NLMessagePacketStruct)

;		NLServerLogin
; this structure is used to pass arguments to the NetServerLogin and 
; NetServerVerifyUserPassword calls (they require 2 strings and a return
; buffer), so that 1 structure in ds:si can represent both strings.

NLServerLogin		struct
	NLSL_size1	word		; 1st string - Server name
	NLSL_size2	word		; 2nd string - login name
	NLSL_string1	label	byte 	; start of string1
NLServerLogin		ends



 	

NetObjectReadPropertyValueStruct	struct
	NORPVS_objectType		NetObjectType
	NORPVS_objectName		fptr.char
	; Null-terminated object name

	NORPVS_propertyName		fptr.char
	; Null-terminated property name

	NORPVS_buffer			fptr.char
	; buffer that will contain return data

	NORPVS_bufferSize		word
	; size of return buffer

NetObjectReadPropertyValueStruct	ends    

; NetMsg structures

PortInfoStruct			struct
	portNum			word
	baudRate		word
PortInfoStruct			ends

NetMsgCCallbackStruct		struct
	NMCC_Callback		fptr.far
	NMCC_Other		word
NetMsgCCallbackStruct		ends

;
; This is the NetWare-specific structure for the Net Library semaphore block.
;
NSOS_Frame	struct
	NSOS_nwSemHandle	dword
	NSOS_nameLen		byte
	NSOS_name		char NET_SEMAPHORE_NAME_LENGTH dup (?)
	NSOS_initialValue	byte
	NSOS_pollInterval	word
	NSOS_psp		word
NSOS_Frame	ends



EndLibrary net




