windows-nt/Source/XPSP1/NT/ds/nw/svcdlls/nwwks/inc/rnrdefs.h
2020-09-26 16:20:57 +08:00

226 lines
6.1 KiB
C

/*++
Copyright (c) 1992-1993 Microsoft Corporation
Module Name:
nwmisc.h
Abstract:
Header which specifies the misc routines used by the workstation service.
Author:
Arnold Miller (arnoldm) 15-Feb-1996
Revision History:
--*/
#ifndef __RNRDEFS_H__
#define __RNRDEFS_H__
#include "sapcmn.h"
//
// Bit defs for the protocols
//
#define IPX_BIT 1
#define SPX_BIT 2
#define SPXII_BIT 4
//
// forwards\
//
struct _SAP_RNR_CONTEXT;
//
// Bindery control
//
typedef struct _BinderyControl
{
LONG lIndex;
} BINDERYCONTROL, *PBINDERYCONTROL;
//
// SAP RnR context information. This is linked off of the
// SAP_BCAST_CONTROL defined ahead
//
typedef struct _SAP_DATA
{
struct _SAP_DATA * sapNext;
// save everything except hop count
WORD sapid; // for a sanity check
CHAR sapname[48]; // what we don't know
BYTE socketAddr[IPX_ADDRESS_LENGTH]; // and what we seek
} SAP_DATA, *PSAP_DATA;
//
//
// Sap bcast control
// An important note. fFlags is set only by the thread executing
// a LookupServiceBegin or a LookupServiceNext. It may be tested by
// any thread. Its counterpart, dwControlFlags in SAP_RNR_CONTEXT
// is reserved for setting by LookupServiceBegin and LookupServiceEnd. Once
// again any thread may look at it. This insures no loss of data on an
// MP machine without needing a critical section.
//
typedef struct _SAP_BCAST_CONTROL
{
DWORD dwIndex; // loop control
DWORD dwTickCount; // tick count of last send
DWORD fFlags; // various flags
PVOID pvArg;
SOCKET s;
CRITICAL_SECTION csMonitor; // This is to keep
// out internal structures sane. Note
// it does not provide rational
// serialization. In particular, if
// multiple threads use the same
// handle simultaneously, there is no
// guaranteed serialization.
PSAP_DATA psdNext1; // next to return
PSAP_DATA psdHead; // list head
PSAP_DATA psdTail;
struct _SAP_RNR_CONTEXT * psrc; // need this
DWORD (*Func)(PVOID pvArg1, PSAP_IDENT_HEADER pSap, PDWORD pdwErr);
BOOL (*fCheckCancel)(PVOID pvArg1);
WORD wQueryType;
} SAP_BCAST_CONTROL, *PSAP_BCAST_CONTROL;
//
// Flags for above
#define SBC_FLAG_NOMORE 0x1
//
// Structure used by the old RnR Sap lookup as the pvArg value in
// SAP_BCAST control
//
#ifndef _NTDEF_
typedef struct _STRING {
USHORT Length;
USHORT MaximumLength;
#ifdef MIDL_PASS
[size_is(MaximumLength), length_is(Length) ]
#endif // MIDL_PASS
PCHAR Buffer;
} OEM_STRING;
#endif
typedef struct _OldRnRSap
{
OEM_STRING * poem;
HANDLE hCancel;
LPVOID lpCsAddrBuffer;
LPDWORD lpdwBufferLength;
DWORD nProt;
LPDWORD lpcAddress;
} OLDRNRSAP, *POLDRNRSAP;
//
// Return codes from the coroutine
//
#define dwrcDone 1 // all done, return success
#define dwrcCancel 2 // all done, return cancelled
#define dwrcNoWait 3 // keep going, but never wait.
#define dwrcNil 4 // do whatever you want
//
// Sap service query packet format
//
typedef struct _SAP_REQUEST {
USHORT QueryType;
USHORT ServerType;
} SAP_REQUEST, *PSAP_REQUEST;
#define QT_GENERAL_QUERY 1
#define QT_NEAREST_QUERY 3
// The context information we put inside of an RNRNSHANDLE structure
// to keep track of what we are doing
// N.B. See comment on SAP_BCAST_CONTROL about the use of dwControlFlags.
//
typedef struct _SAP_RNR_CONTEXT
{
struct _SAP_RNR_CONTEXT * pNextContext;
LONG lSig;
LONG lInUse;
DWORD dwCount; // count of queries made
DWORD fFlags; // always nice to have
DWORD dwControlFlags;
DWORD fConnectionOriented;
WORD wSapId; // the type desired
HANDLE Handle; // the corresponding RnR handle
DWORD nProt;
GUID gdType; // the type we are seeking
GUID gdProvider;
HANDLE hServer;
WCHAR wszContext[48];
WCHAR chwName[48]; // the name, if any
CHAR chName[48]; // OEM form of the name for SAP
DWORD dwUnionType; // type of lookup, once we know
union
{
SAP_BCAST_CONTROL sbc;
BINDERYCONTROL bc;
} u_type;
PVOID pvVersion; // a trick to get the version here.
} SAP_RNR_CONTEXT, *PSAP_RNR_CONTEXT;
#define RNR_SIG 0xaabbccdd
//
// union types
//
#define LOOKUP_TYPE_NIL 0
#define LOOKUP_TYPE_SAP 1
#define LOOKUP_TYPE_BINDERY 2
#define SAP_F_END_CALLED 0x1 // generic cancel
//
// Defs for the bindery Class info
// This defines the format of each ClassInfo property segement. It looks
// somewhat like an actual ClassInfo, but considerably compressed. Note
// due to marshalling problems, any complex value, such as a GUID,
// should be stored as a string and then imported. Hence, we define
// types for what we can anticipate.
//
typedef struct _BinderyClasses
{
BYTE bType;
BYTE bSizeOfType;
BYTE bSizeOfString;
BYTE bOffset; // where the data area begins
BYTE bFlags;
BYTE bFiller;
WORD wNameSpace; // the applicable namespace
CHAR cDataArea[120]; // where the type and string are placed
} BINDERYCLASSES, *PBINDERYCLASSES;
#define BT_DWORD 1 // DWORD
#define BT_WORD 2 // WORD
#define BT_GUID 3 // a string GUID (ASCII)
#define BT_STR 3 // an OEM string
#define BT_OID 4 // an object ID (TBD)
#define BT_BSTR 5 // a binary string (very dangerous)
#define BT_WSTR 6 // UNICODE string. Unmarshalled!
#define RNRTYPE "RNR_TYPE" // prop containing the GUID
#define RNRCLASSES "RNR_CLASSES" // the other property
#endif