143 lines
3.7 KiB
C
143 lines
3.7 KiB
C
/*++
|
|
|
|
Copyright (c) 1987-1992 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
FieldSiz.c
|
|
|
|
Abstract:
|
|
|
|
RAP (remote admin protocol) utility code.
|
|
|
|
Author:
|
|
|
|
John Rogers (JohnRo) 05-Mar-1991
|
|
|
|
Environment:
|
|
|
|
Portable to any flat, 32-bit environment. (Uses Win32 typedefs.)
|
|
Requires ANSI C extensions: slash-slash comments, long external names.
|
|
|
|
Revision History:
|
|
|
|
(various NBU people)
|
|
LanMan 2.x code
|
|
05-Mar-1991 JohnRo
|
|
Created portable version from LanMan 2.x sources.
|
|
14-Apr-1991 JohnRo
|
|
Reduce recompiles. Got rid of tabs in source file, per NT standards.
|
|
17-Apr-1991 JohnRo
|
|
Added support for REM_IGNORE.
|
|
Added debug msg when unexpected desc char found.
|
|
07-Sep-1991 JohnRo
|
|
Move toward possibility of descs being in UNICODE.
|
|
21-Nov-1991 JohnRo
|
|
Removed NT dependencies to reduce recompiles.
|
|
16-Aug-1992 JohnRo
|
|
RAID 2920: Support UTC timezone in net code.
|
|
Use PREFIX_ equates.
|
|
|
|
--*/
|
|
|
|
|
|
// These must be included first:
|
|
|
|
#include <windef.h> // IN, LPDWORD, NULL, OPTIONAL, DWORD, etc.
|
|
#include <lmcons.h> // NET_API_STATUS
|
|
|
|
// These may be included in any order:
|
|
|
|
#include <netdebug.h> // NetpBreakPoint().
|
|
#include <prefix.h> // PREFIX_ equates.
|
|
#include <rap.h> // My prototype, FORMAT_LPDESC_CHAR, LPDESC.
|
|
#include <remtypes.h> // REM_WORD, etc.
|
|
|
|
DWORD
|
|
RapGetFieldSize(
|
|
IN LPDESC TypePointer,
|
|
IN OUT LPDESC * TypePointerAddress,
|
|
IN RAP_TRANSMISSION_MODE TransmissionMode
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
RapGetFieldSize gets the length of a field described by a type descriptor
|
|
element. It calculates the length of an field described by an element of
|
|
a descriptor string and updates the descriptor string pointer to point
|
|
to the last char in the element of the descriptor string.
|
|
|
|
Arguments:
|
|
|
|
TypePointer - Points to first character in the descriptor element to be
|
|
processed.
|
|
|
|
TypePointerAddress - The address of the pointer passed as TypePointer. On
|
|
exit, *TypePointerAddress points to last character in descriptor
|
|
element.
|
|
|
|
Transmission Mode - Indicates whether this array is part of a response,
|
|
a request, or both.
|
|
|
|
Return Value:
|
|
|
|
Length in bytes of the field described by the descriptor string element.
|
|
|
|
--*/
|
|
|
|
{
|
|
DESC_CHAR c;
|
|
|
|
c = *TypePointer; /* Get descriptor type char */
|
|
|
|
if ( (RapIsPointer(c)) || (c == REM_NULL_PTR) ) { // All pointers same size.
|
|
|
|
while ( ++TypePointer, DESC_CHAR_IS_DIGIT( *TypePointer ) ) {
|
|
|
|
(*TypePointerAddress)++; /* Move ptr to end of field size */
|
|
|
|
}
|
|
|
|
return (sizeof(LPVOID));
|
|
}
|
|
|
|
// Here if descriptor was not a pointer type so have to find the field
|
|
// length specifically.
|
|
|
|
switch ( c ) {
|
|
case (REM_WORD):
|
|
case (REM_BYTE):
|
|
case (REM_DWORD):
|
|
case (REM_SIGNED_DWORD):
|
|
return (RapArrayLength(TypePointer,
|
|
TypePointerAddress,
|
|
TransmissionMode));
|
|
case (REM_AUX_NUM):
|
|
case (REM_PARMNUM):
|
|
case (REM_RCV_BUF_LEN):
|
|
case (REM_SEND_BUF_LEN):
|
|
return (sizeof(unsigned short));
|
|
case (REM_DATA_BLOCK):
|
|
return (0); /* No structure for this */
|
|
case (REM_DATE_TIME):
|
|
case (REM_AUX_NUM_DWORD):
|
|
return (sizeof(unsigned long));
|
|
case (REM_IGNORE):
|
|
return (0);
|
|
case REM_EPOCH_TIME_GMT: /*FALLTHROUGH*/
|
|
case REM_EPOCH_TIME_LOCAL:
|
|
return (sizeof(DWORD));
|
|
default:
|
|
NetpKdPrint(( PREFIX_NETRAP
|
|
"RapGetFieldSize: unexpected desc '" FORMAT_LPDESC_CHAR
|
|
"'.\n", c));
|
|
NetpBreakPoint();
|
|
return (0);
|
|
}
|
|
|
|
/*NOTREACHED*/
|
|
|
|
} // RapGetFieldSize
|