windows-nt/Source/XPSP1/NT/ds/netapi/rap/validsmb.c
2020-09-26 16:20:57 +08:00

171 lines
4.4 KiB
C

/*++
Copyright (c) 1991-1992 Microsoft Corporation
Module Name:
ValidSmb.c
Abstract:
This module contains RapIsValidDescriptorSmb, which tests a descriptor to
make sure it is a valid descriptor which can be placed in an SMB..
Author:
John Rogers (JohnRo) 17-Apr-1991
Environment:
Portable to any flat, 32-bit environment. (Uses Win32 typedefs.)
Requires ANSI C extensions: slash-slash comments, long external names.
Revision History:
17-Apr-1991 JohnRo
Created.
03-Jun-1991 JohnRo
PC-LINT found a bug.
19-Aug-1991 JohnRo
Allow UNICODE use.
Avoid FORMAT_POINTER equate (nonportable).
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(), NetpKdPrint(()).
#include <prefix.h> // PREFIX_ equates.
#include <rap.h> // My prototype, LPDESC, DESC_CHAR_IS_DIGIT().
#include <remtypes.h> // REM_WORD, etc.
BOOL
RapIsValidDescriptorSmb (
IN LPDESC Desc
)
/*++
Routine Description:
RapIsValidDescriptorSmb checks a given descriptor to make sure it is
valid for sending to a 16-bit downlevel machine in an SMB.
Arguments:
Desc - the alleged descriptor string. Note that a null pointer is
invalid, but a pointer to a null string is OK.
Return Value:
BOOL - TRUE if valid, FALSE otherwise.
--*/
{
if (Desc == NULL) {
return (FALSE);
}
if (*Desc == '\0') {
return (TRUE);
}
//
// Loop through the input descriptor string.
//
while ( *Desc != '\0' ) {
switch ( *Desc++ ) {
///////////////////////////////////////
// Items which allow trailing digits //
///////////////////////////////////////
case REM_BYTE:
case REM_WORD:
case REM_DWORD:
case REM_BYTE_PTR:
case REM_WORD_PTR:
case REM_DWORD_PTR:
case REM_RCV_BYTE_PTR:
case REM_RCV_WORD_PTR:
case REM_RCV_DWORD_PTR:
case REM_FILL_BYTES:
// Skip digits...
while (DESC_CHAR_IS_DIGIT(*Desc)) {
Desc++;
}
break;
/////////////////////////////////////////////
// Items which don't allow trailing digits //
/////////////////////////////////////////////
case REM_ASCIZ: // Strings with trailing digits are internal use only.
case REM_NULL_PTR:
case REM_SEND_BUF_PTR:
case REM_SEND_BUF_LEN:
case REM_SEND_LENBUF:
case REM_DATE_TIME:
case REM_RCV_BUF_PTR:
case REM_RCV_BUF_LEN:
case REM_PARMNUM:
case REM_ENTRIES_READ:
case REM_AUX_NUM:
case REM_AUX_NUM_DWORD:
case REM_DATA_BLOCK:
if (DESC_CHAR_IS_DIGIT( *Desc )) {
NetpKdPrint(( PREFIX_NETRAP
"RapIsValidDescriptorSmb: "
"Unsupported digit(s) at " FORMAT_LPVOID
": for " FORMAT_LPDESC_CHAR "\n",
(LPVOID) (Desc-1), *(Desc-1) ));
NetpBreakPoint();
return (FALSE);
}
break;
///////////////////////////////////////
// Items which are internal use only //
///////////////////////////////////////
case REM_SIGNED_DWORD:
case REM_SIGNED_DWORD_PTR:
case REM_ASCIZ_TRUNCATABLE:
case REM_IGNORE:
case REM_WORD_LINEAR:
case REM_UNSUPPORTED_FIELD:
case REM_EPOCH_TIME_GMT: /*FALLTHROUGH*/
case REM_EPOCH_TIME_LOCAL:
// Internal only!
NetpKdPrint(( PREFIX_NETRAP
"RapIsValidDescriptorSmb: Internal use only desc"
" at " FORMAT_LPVOID ": " FORMAT_LPDESC_CHAR "\n",
(LPVOID) (Desc-1), *(Desc-1) ));
NetpBreakPoint();
return (FALSE);
default:
NetpKdPrint(( PREFIX_NETRAP
"RapIsValidDescriptorSmb: Unsupported input character"
" at " FORMAT_LPVOID ": " FORMAT_LPDESC_CHAR "\n",
(LPVOID) (Desc-1), *(Desc-1) ));
NetpBreakPoint();
return (FALSE);
}
}
return (TRUE); // All OK.
} // RapIsValidDescriptorSmb