windows-nt/Source/XPSP1/NT/net/rras/dim/admindll/usrparms.c
2020-09-26 16:20:57 +08:00

353 lines
8 KiB
C
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/********************************************************************/
/** Microsoft LAN Manager **/
/** Copyright(c) Microsoft Corp., 1990-1991 **/
/********************************************************************/
/*++
Filename:
USRPARMS.C
Description:
Contains code to get set and initialize the user_parms field.
The 49-byte user params structure is laid out as follows:
NOTE that the buffer is 48 byte + NULL byte.
+-+-------------------+-+------------------------+-+
|m|Macintosh Pri Group|d|Dial-in CallBack Number |0|
+-+-------------------+-+------------------------+-+
| | |
+---------------------+------ Signature +- NULL terminator
The routines were originally written for RAS 1.0 and deal only with
multi-byte strings. For NT unicodification, wcstombs() and mbstowcs()
have been used to convert string formats. Eventually these routines
can be converted to be native Unicode.
History:
20/3/91 Narendra Gidwani Created original version
July 14 92 Janakiram Cherala Modified for NT
May 13 93 Andy Herron Coexist with other apps using user parms
--*/
#include <windows.h>
#include <string.h>
#include <lm.h>
#include <stdlib.h>
#include <rasman.h>
#include <rasppp.h>
#include "usrparms.h"
/*++
Routine Description:
Initializes the user params buffer.
Arguments:
UserParms - Pointer to a USER_PARMS structure which is initialized.
After initializing, the UserParms structure would look
like:
0 49
+-+-------------------+-+------------------------+-+
|m|: |d|1 |0|
+-+-------------------+-+------------------------+-+
Return Value:
None.
--*/
void InitUsrParams(
USER_PARMS *pUserParms
)
{
//
// Null the whole structure and check for GP fault.
//
memset(pUserParms, '\0', sizeof(USER_PARMS));
//
// Initialize Macintosh fields
//
pUserParms->up_MACid = UP_CLIENT_MAC;
memset(pUserParms->up_PriGrp, ' ', UP_LEN_MAC);
pUserParms->up_PriGrp[0] = ':';
pUserParms->up_MAC_Terminater = ' ';
//
// Initialize RAS fields
//
pUserParms->up_DIALid = UP_CLIENT_DIAL;
pUserParms->up_CBNum[0] = 1;
}
USHORT SetUsrParams(
USHORT InfoType,
LPWSTR InBuf,
LPWSTR OutBuf
)
/*++
Routine Description:
Sets either dialin information or mac information into
the user_parms field in the proper format.
Arguments:
InfoType - An unsigned short representing the type of information
to be set: UP_CLIENT_DIAL or UP_CLIENT_MAC.
InBuf - Pointer to string ie either call back number and permissions
for dialin or primary group name for Macintosh.
OutBuf - Pointer to a USER_PARMS that has been initialized or is in
the correct format. This is loaded with the information
passed in InBuf.
Return Value:
0 indicating success
ERROR_BAD_FORMAT - failure.
ERROR_INVALID_PARAMETER - failure
--*/
{
USHORT len;
char Buffer[sizeof(USER_PARMS)];
char uBuffer[sizeof(USER_PARMS)];
USER_PARMS FAR * OutBufPtr;
char FAR * InBufPtr = Buffer;
//
// convert the unicode string to multi byte for processing
//
wcstombs(Buffer, InBuf, sizeof(USER_PARMS));
wcstombs(uBuffer, OutBuf, sizeof(USER_PARMS));
OutBufPtr = (USER_PARMS FAR *)uBuffer;
//
// Validate InfoType
//
if (InfoType != UP_CLIENT_MAC && InfoType != UP_CLIENT_DIAL )
{
return( ERROR_INVALID_PARAMETER );
}
//
// Make sure the field to be set is in the correct format
//
if (( OutBufPtr->up_MACid != UP_CLIENT_MAC ) ||
( OutBufPtr->up_DIALid != UP_CLIENT_DIAL ) )
{
return( ERROR_BAD_FORMAT );
}
len = (USHORT)strlen( InBufPtr );
switch ( InfoType )
{
case UP_CLIENT_MAC:
if ( len > UP_LEN_MAC )
{
return( ERROR_BAD_FORMAT );
}
//
// Set the MAC information
//
if ( len > 0 )
{
strcpy( OutBufPtr->up_PriGrp, InBufPtr );
}
OutBufPtr->up_PriGrp[len] = ':';
break;
case UP_CLIENT_DIAL:
if ( len > UP_LEN_DIAL )
{
return( ERROR_BAD_FORMAT );
}
//
// Set the dialin information
//
if ( len > 0 )
{
strcpy( OutBufPtr->up_CBNum, InBufPtr );
}
break;
default:
return( ERROR_INVALID_PARAMETER );
}
//
// convert multicode string to unicode
//
mbstowcs(OutBuf, uBuffer, sizeof(USER_PARMS));
return( 0 );
}
USHORT FAR APIENTRY
MprGetUsrParams(
USHORT InfoType,
LPWSTR InBuf,
LPWSTR OutBuf
)
/*++
Routine Description:
Extracts dialin or mac information from the user_parms
Arguments:
InfoType - An unsigned short representing the
type of information to be extracted.
UP_CLIENT_DIAL or UP_CLIENT_MAC.
InBuf - Pointer to a USER_PARMS that has been
initialized or is in the correct format.
and contains the information to be
extracted. This should be NULL
terminated.
OutBuf - Contains the extracted information.
This buffer should be large enough to
hold the information requested as well
as a NULL terminater.
Returns:
0 on success
ERROR_BAD_FORMAT - failure
ERROR_INVALID_PARAMETER - failure
--*/
{
USER_PARMS FAR * InBufPtr;
USHORT len;
char FAR * TerminaterPtr;
char FAR * OutBufPtr;
char Buffer[sizeof(USER_PARMS)];
char uBuffer[sizeof(USER_PARMS)];
// convert string to mulitbyte before processing
wcstombs(Buffer, InBuf, sizeof(USER_PARMS));
InBufPtr = (USER_PARMS FAR *)Buffer;
// Validate InfoType
//
if ( InfoType != UP_CLIENT_MAC && InfoType != UP_CLIENT_DIAL )
return( ERROR_INVALID_PARAMETER );
// First make sure the user parms field is at least the minimum length.
//
len = (USHORT)strlen( Buffer );
// 3 = 1 for MAC_Terminater + 1 for up_MACid + 1 for up_DIALid
//
if ( len < ( UP_LEN_MAC + 3 ) )
return( ERROR_BAD_FORMAT );
// Check for correct signatures.
//
if ( ( InBufPtr->up_MACid != UP_CLIENT_MAC) ||
( InBufPtr->up_DIALid != UP_CLIENT_DIAL ))
return( ERROR_BAD_FORMAT );
switch( InfoType ) {
case UP_CLIENT_MAC:
OutBufPtr = InBufPtr->up_PriGrp;
// Validate the information
//
if ( ( TerminaterPtr = strchr( OutBufPtr, ':')) == NULL)
return( ERROR_BAD_FORMAT );
if ( ( len = (USHORT)( TerminaterPtr - OutBufPtr ) ) > UP_LEN_MAC)
return( ERROR_BAD_FORMAT );
// Copy the data
//
strcpy( uBuffer, OutBufPtr);
break;
case UP_CLIENT_DIAL:
OutBufPtr = InBufPtr->up_CBNum;
len = (USHORT)strlen( OutBufPtr );
//
// AndyHe... Peal off all trailing blanks
//
while (len > 1 && *(OutBufPtr+len-1) == ' ')
{
*(OutBufPtr+len-1) = '\0';
len--;
}
if ( len > UP_LEN_DIAL)
return( ERROR_BAD_FORMAT );
if ( len > 0 )
strcpy( uBuffer, OutBufPtr);
break;
default:
return( ERROR_INVALID_PARAMETER );
}
// convert string to unicode before returning
mbstowcs(OutBuf, uBuffer, sizeof(USER_PARMS));
return( 0 );
}