394 lines
8.9 KiB
C
394 lines
8.9 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1991 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
XsProcsP.h
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This header file contains private procedure prototypes for XACTSRV.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
David Treadwell (davidtr) 05-Jan-1991
|
||
|
Shanku Niyogi (w-shanku)
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#ifndef _XSPROCSP_
|
||
|
#define _XSPROCSP_
|
||
|
|
||
|
//
|
||
|
// This header file is full of expressions that are always false. These
|
||
|
// expressions manifest themselves in macros that take unsigned values
|
||
|
// and make tests, for example, of greater than or equal to zero.
|
||
|
//
|
||
|
// Turn off these warnings until the authors fix this code.
|
||
|
//
|
||
|
|
||
|
#pragma warning(disable:4296)
|
||
|
|
||
|
//
|
||
|
// Helper subroutines.
|
||
|
//
|
||
|
|
||
|
//
|
||
|
// XsAddVarString(
|
||
|
// IN OUT LPSTR StringLocation,
|
||
|
// IN LPTSTR String,
|
||
|
// IN OUT LPBYTE *Pointer,
|
||
|
// IN LPBYTE OffsetBegin
|
||
|
// )
|
||
|
//
|
||
|
// Copy string to location, put the offset of location from OffsetBegin
|
||
|
// in Pointer, and update location to point past string.
|
||
|
//
|
||
|
// !!UNICODE!! - Changed strcpy to NetpCopyTStrToStr. Fix WKSTA.H to use this!
|
||
|
|
||
|
#define XsAddVarString( StringLocation, String, Pointer, OffsetBegin ) \
|
||
|
NetpCopyWStrToStrDBCS((StringLocation), (String)); \
|
||
|
SmbPutUlong((LPDWORD)(Pointer), \
|
||
|
(ULONG)((LPBYTE)(StringLocation)-(LPBYTE)(OffsetBegin))); \
|
||
|
StringLocation += (strlen((LPSTR)StringLocation) + 1)
|
||
|
|
||
|
//
|
||
|
// XsAuxiliaryDescriptor - return second argument if 'N' character is present
|
||
|
// in first argument (an LPDESC), or NULL otherwise.
|
||
|
//
|
||
|
// !!UNICODE!! - Descriptor strings are always Ascii. No conversion.
|
||
|
|
||
|
#define XsAuxiliaryDescriptor( DataDescriptor, EndOfParameters ) \
|
||
|
(( strchr(( DataDescriptor ), REM_AUX_NUM ) != NULL ) \
|
||
|
? (EndOfParameters) : NULL )
|
||
|
|
||
|
//
|
||
|
// BOOL
|
||
|
// XsApiSuccess(
|
||
|
// IN NET_API_STATUS Status
|
||
|
// )
|
||
|
//
|
||
|
// XsApiSuccess - check if status is one of three allowable ones.
|
||
|
//
|
||
|
|
||
|
#define XsApiSuccess( Status ) \
|
||
|
(( (Status) == NERR_Success ) || ( (Status) == ERROR_MORE_DATA ) || \
|
||
|
( (Status) == NERR_BufTooSmall ))
|
||
|
|
||
|
//
|
||
|
// WORD
|
||
|
// XsDwordToWord(
|
||
|
// IN DWORD d
|
||
|
// )
|
||
|
//
|
||
|
// Returns the WORD which is closest in value to the supplied DWORD.
|
||
|
//
|
||
|
|
||
|
#define XsDwordToWord(d) \
|
||
|
( (WORD) ( (DWORD) (d) > 0xffff ? 0xffff : (d) ) )
|
||
|
|
||
|
//
|
||
|
// BYTE
|
||
|
// XsDwordToByte(
|
||
|
// IN DWORD d
|
||
|
// )
|
||
|
//
|
||
|
// Returns the BYTE which is closest in value to the supplied DWORD.
|
||
|
//
|
||
|
|
||
|
#define XsDwordToByte(d) \
|
||
|
( (BYTE) ( (DWORD) (d) > 0xff ? 0xff : (d) ) )
|
||
|
|
||
|
//
|
||
|
// BYTE
|
||
|
// XsBoolToDigit(
|
||
|
// IN BOOL b
|
||
|
// )
|
||
|
//
|
||
|
// Returns '1' if the supplied boolean is true, or '0' if it is false.
|
||
|
//
|
||
|
|
||
|
#define XsBoolToDigit(b) \
|
||
|
( (BYTE) ( (BOOL)(b) ? '0' : '1' ) )
|
||
|
|
||
|
DWORD
|
||
|
XsBytesForConvertedStructure (
|
||
|
IN LPBYTE InStructure,
|
||
|
IN LPDESC InStructureDesc,
|
||
|
IN LPDESC OutStructureDesc,
|
||
|
IN RAP_CONVERSION_MODE Mode,
|
||
|
IN BOOL MeaninglessInputPointers
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
XsCheckBufferSize (
|
||
|
IN WORD BufferLength,
|
||
|
IN LPDESC Descriptor,
|
||
|
IN BOOL NativeFormat
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// XsDwordParamOutOfRange(
|
||
|
// IN DWORD Field,
|
||
|
// IN DWORD Min,
|
||
|
// IN DWORD Max
|
||
|
// )
|
||
|
//
|
||
|
// Check if parameter is out of range.
|
||
|
//
|
||
|
|
||
|
|
||
|
#define XsDwordParamOutOfRange( Field, Min, Max ) \
|
||
|
(((DWORD)SmbGetUlong( &( Field )) < ( Min )) || \
|
||
|
((DWORD)SmbGetUlong( &( Field )) > ( Max )))
|
||
|
|
||
|
// !!UNICODE!! - Validation on ASCII string - leave as LPSTR
|
||
|
NET_API_STATUS
|
||
|
XsValidateShareName(
|
||
|
IN LPSTR ShareName
|
||
|
);
|
||
|
|
||
|
NET_API_STATUS
|
||
|
XsConvertSetInfoBuffer(
|
||
|
IN LPBYTE InBuffer,
|
||
|
IN WORD BufferLength,
|
||
|
IN WORD ParmNum,
|
||
|
IN BOOL ConvertStrings,
|
||
|
IN BOOL MeaninglessInputPointers,
|
||
|
IN LPDESC InStructureDesc,
|
||
|
IN LPDESC OutStructureDesc,
|
||
|
IN LPDESC InSetInfoDesc,
|
||
|
IN LPDESC OutSetInfoDesc,
|
||
|
OUT LPBYTE * OutBuffer,
|
||
|
OUT LPDWORD OutBufferLength OPTIONAL
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// BOOL
|
||
|
// XsDigitToBool(
|
||
|
// IN BYTE b
|
||
|
// )
|
||
|
//
|
||
|
// Returns false if the supplied digit is '0', true otherwise.
|
||
|
//
|
||
|
|
||
|
#define XsDigitToBool(b) \
|
||
|
(BOOL)((( b ) == '0' ) ? FALSE : TRUE )
|
||
|
|
||
|
VOID
|
||
|
XsFillAuxEnumBuffer (
|
||
|
IN LPBYTE InBuffer,
|
||
|
IN DWORD NumberOfEntries,
|
||
|
IN LPDESC InStructureDesc,
|
||
|
IN LPDESC InAuxStructureDesc,
|
||
|
IN OUT LPBYTE OutBuffer,
|
||
|
IN LPBYTE OutBufferStart,
|
||
|
IN DWORD OutBufferLength,
|
||
|
IN LPDESC OutStructureDesc,
|
||
|
IN LPDESC OutAuxStructureDesc,
|
||
|
IN PXACTSRV_ENUM_VERIFY_FUNCTION VerifyFunction OPTIONAL,
|
||
|
OUT LPDWORD BytesRequired,
|
||
|
OUT LPDWORD EntriesFilled,
|
||
|
OUT LPDWORD InvalidEntries OPTIONAL
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
XsFillEnumBuffer (
|
||
|
IN LPBYTE InBuffer,
|
||
|
IN DWORD NumberOfEntries,
|
||
|
IN LPDESC InStructureDesc,
|
||
|
IN OUT LPBYTE OutBuffer,
|
||
|
IN LPBYTE OutBufferStart,
|
||
|
IN DWORD OutBufferLength,
|
||
|
IN LPDESC OutStructureDesc,
|
||
|
IN PXACTSRV_ENUM_VERIFY_FUNCTION VerifyFunction OPTIONAL,
|
||
|
OUT LPDWORD BytesRequired,
|
||
|
OUT LPDWORD EntriesFilled,
|
||
|
OUT LPDWORD InvalidEntries OPTIONAL
|
||
|
);
|
||
|
|
||
|
LPBYTE
|
||
|
XsFindParameters (
|
||
|
IN LPTRANSACTION Transaction
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// DWORD
|
||
|
// XsLevelFromParmNum(
|
||
|
// WORD Level,
|
||
|
// WORD ParmNum
|
||
|
// )
|
||
|
//
|
||
|
// Translate an old parmnum to an info level. If parmnum is PARMNUM_ALL,
|
||
|
// this is just the old level, otherwise it is the old parmnum plus
|
||
|
// PARMNUM_BASE_INFOLEVEL.
|
||
|
//
|
||
|
|
||
|
#define XsLevelFromParmNum( Level, ParmNum ) \
|
||
|
((( ParmNum ) == PARMNUM_ALL ) ? (DWORD)( Level ) \
|
||
|
: (DWORD)( ParmNum ) \
|
||
|
+ PARMNUM_BASE_INFOLEVEL )
|
||
|
|
||
|
//
|
||
|
// Maps downlevel service names to nt service names
|
||
|
//
|
||
|
|
||
|
#define XS_MAP_SERVICE_NAME( ServiceName ) \
|
||
|
(!STRICMP( ServiceName, SERVICE_LM20_SERVER ) ? SERVICE_SERVER : \
|
||
|
!STRICMP( ServiceName, SERVICE_LM20_WORKSTATION ) ? SERVICE_WORKSTATION : \
|
||
|
ServiceName )
|
||
|
|
||
|
|
||
|
//
|
||
|
// DWORD
|
||
|
// XsNativeBufferSize(
|
||
|
// IN WORD Size
|
||
|
// )
|
||
|
//
|
||
|
// Uses XS_BUFFER_SCALE constant to calculate a reasonable maximum for the host
|
||
|
// buffer, and rounds it to an even number for alignment.
|
||
|
//
|
||
|
|
||
|
#define XsNativeBufferSize( Size ) \
|
||
|
( (( XS_BUFFER_SCALE * (DWORD)( Size )) + 1) & (~1) )
|
||
|
|
||
|
WORD
|
||
|
XsPackReturnData (
|
||
|
IN LPVOID Buffer,
|
||
|
IN WORD BufferLength,
|
||
|
IN LPDESC Descriptor,
|
||
|
IN DWORD EntriesRead
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
XsSetDataCount(
|
||
|
IN OUT LPWORD DataCount,
|
||
|
IN LPDESC Descriptor,
|
||
|
IN WORD Converter,
|
||
|
IN DWORD EntriesRead,
|
||
|
IN WORD ReturnStatus
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// XsWordParamOutOfRange(
|
||
|
// IN WORD Field,
|
||
|
// IN WORD Min,
|
||
|
// IN WORD Max
|
||
|
// )
|
||
|
//
|
||
|
// Check if parameter is out of range.
|
||
|
//
|
||
|
// N.B. If Min is zero, then the first part of the following expression is
|
||
|
// always FALSE.
|
||
|
//
|
||
|
|
||
|
#define XsWordParamOutOfRange( Field, Min, Max ) \
|
||
|
(((DWORD)SmbGetUshort( &( Field )) < ( (DWORD)Min )) || \
|
||
|
((DWORD)SmbGetUshort( &( Field )) > ( (DWORD)Max )))
|
||
|
|
||
|
VOID
|
||
|
XsAnnounceServiceStatus( VOID );
|
||
|
|
||
|
//
|
||
|
// API bogus stub.
|
||
|
//
|
||
|
|
||
|
NTSTATUS
|
||
|
XsNetUnsupportedApi (
|
||
|
API_HANDLER_PARAMETERS
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Convert an NT style server info array into a packed
|
||
|
// RAP server info array
|
||
|
//
|
||
|
|
||
|
typedef
|
||
|
USHORT
|
||
|
(XS_CONVERT_SERVER_ENUM_BUFFER_FUNCTION)(
|
||
|
IN LPVOID ServerEnumBuffer,
|
||
|
IN DWORD EntriesRead,
|
||
|
IN OUT PDWORD TotalEntries,
|
||
|
IN USHORT Level,
|
||
|
OUT LPBYTE ClientBuffer,
|
||
|
IN USHORT BufferLength,
|
||
|
OUT PDWORD EntriesFilled,
|
||
|
OUT PUSHORT Converter
|
||
|
);
|
||
|
|
||
|
extern XS_CONVERT_SERVER_ENUM_BUFFER_FUNCTION XsConvertServerEnumBuffer;
|
||
|
|
||
|
|
||
|
//++
|
||
|
//
|
||
|
// ULONG
|
||
|
// XsSmbGetPointer (
|
||
|
// IN PSMB_ULONG SrcAddress
|
||
|
// )
|
||
|
//
|
||
|
// Routine Description:
|
||
|
//
|
||
|
// This macro retrieves a ULONG value from the possibly misaligned
|
||
|
// source address, avoiding alignment faults.
|
||
|
// This also takes into account the fact that pointers are 8-bytes on 64-bit.
|
||
|
//
|
||
|
// Arguments:
|
||
|
//
|
||
|
// SrcAddress - where to retrieve ULONG value from
|
||
|
//
|
||
|
// Return Value:
|
||
|
//
|
||
|
// ULONG - the value retrieved. The target must be aligned.
|
||
|
//
|
||
|
//--
|
||
|
#if defined (_WIN64)
|
||
|
#define XsSmbGetPointer(SrcAddress) ((LPBYTE)( ((__int64)SmbGetUlong((LPVOID)SrcAddress)) + (((__int64)SmbGetUlong( ( ((LPBYTE)SrcAddress) + 4 ) ) ) << 32) ))
|
||
|
#else
|
||
|
#define XsSmbGetPointer SmbGetUlong
|
||
|
#endif
|
||
|
|
||
|
|
||
|
//++
|
||
|
//
|
||
|
// VOID
|
||
|
// XsSmbPutPointer (
|
||
|
// OUT PSMB_ULONG DestAddress,
|
||
|
// IN LPVOID Value
|
||
|
// )
|
||
|
//
|
||
|
// Routine Description:
|
||
|
//
|
||
|
// This macro stores a POINTER value at the possibly misaligned
|
||
|
// destination address, avoiding alignment faults.
|
||
|
// This also takes into account the fact that 64-bit pointers are 8-bytes
|
||
|
//
|
||
|
// Arguments:
|
||
|
//
|
||
|
// DestAddress - where to store ULONG value
|
||
|
//
|
||
|
// Value - ULONG to store. Value must be a constant or an aligned
|
||
|
// field.
|
||
|
//
|
||
|
// Return Value:
|
||
|
//
|
||
|
// None.
|
||
|
//
|
||
|
//--
|
||
|
#if defined (_WIN64)
|
||
|
#define XsSmbPutPointer(DestAddress64,Value) \
|
||
|
{ \
|
||
|
LPDWORD Source = (LPDWORD)(&Value); \
|
||
|
LPDWORD Dest = (LPDWORD)DestAddress64; \
|
||
|
SmbPutUlong( Dest, SmbGetUlong(Source) ); \
|
||
|
SmbPutUlong( Dest+1, SmbGetUlong(Source+1) ); \
|
||
|
}
|
||
|
|
||
|
#else
|
||
|
#define XsSmbPutPointer(DEST,VAL) SmbPutUlong(DEST, (ULONG)VAL)
|
||
|
#endif
|
||
|
|
||
|
#endif // ndef _XSPROCSP_
|