226 lines
6.1 KiB
C
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
|