168 lines
5 KiB
C
168 lines
5 KiB
C
/*++
|
||
|
||
Copyright (c) 1989-91 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
mapsupp.c
|
||
|
||
Abstract:
|
||
|
||
Support routines used by the LanMan 16/32 mapping routines.
|
||
|
||
Author:
|
||
|
||
Dan Hinsley (danhi) 25-Mar-1991
|
||
|
||
Environment:
|
||
|
||
User mode only.
|
||
|
||
Revision History:
|
||
|
||
25-Mar-1991 DanHi
|
||
Created.
|
||
18-Aug-1991 JohnRo
|
||
Implement downlevel NetWksta APIs. (Moved this routine to NetLib for
|
||
use by RpcXlate as well as NetCmd/Map32 stuff.)
|
||
Changed to allow UNICODE.
|
||
Changed name to NetpMoveStrings.
|
||
Got rid of tabs in source file.
|
||
|
||
--*/
|
||
|
||
|
||
// These must be included first:
|
||
|
||
#include <windef.h> // BOOL, IN, LPTSTR, etc.
|
||
|
||
// These may be included in any order:
|
||
|
||
#include <mapsupp.h> // My prototype, LPMOVESTRING.
|
||
#include <tstring.h> // STRCPY().
|
||
|
||
|
||
|
||
BOOL
|
||
NetpMoveStrings(
|
||
IN OUT LPTSTR * Floor,
|
||
IN LPTSTR pInputBuffer,
|
||
OUT LPTSTR pOutputBuffer,
|
||
IN LPMOVESTRING MoveStringArray,
|
||
IN LPDWORD MoveStringLength
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This function is used to move a variable number of strings into a user's
|
||
buffer, and to update pointers in a structure to point to the location
|
||
where they are copied. According to the semantics of the LM 2.0 API,
|
||
each buffer is filled with fixed length structures from the top, while
|
||
variable length strings are copied in from the bottom.
|
||
|
||
There are two companion arrays, MoveStringArray and MoveStringLength.
|
||
MoveStringArray contains the offset to the source string in the input
|
||
buffer, and the offset of the pointers in the fixed structure from the
|
||
beginning of the output buffer.
|
||
|
||
MoveStringLength contains an entry for each entry in MoveStringArray,
|
||
and this entry is the length of the source string in MoveStringArray.
|
||
This was broken into two arrays so that MoveStringArray could be built
|
||
at compile time and not be modified at run time.
|
||
|
||
Arguments:
|
||
|
||
Floor - This is the bottom of the user's buffer, where the strings
|
||
will be copied. This must be updated to reflect the strings
|
||
that are copied into the buffer
|
||
|
||
pInputBuffer - The buffer which contains the source strings.
|
||
MoveStringArray contains offsets into this buffer.
|
||
|
||
pOutputBuffer - The buffer which contains the fixed portion of the info
|
||
structure, which contains fields that need to be set to point
|
||
to the string locations in the output buffer. MoveStringArray
|
||
contains offsets into this buffer.
|
||
|
||
MoveStringArray - This is an array of MOVESTRING entries, terminated
|
||
by an entry with a source offset of MOVESTRING_END_MARKER. Each
|
||
entry describes a string, and the address of a variable which will
|
||
hold the address where the string is copied.
|
||
|
||
MoveStringLength - This is a companion array to MoveStringArray.
|
||
Each entry contains the length of the matching source string
|
||
from MoveStringArray.
|
||
|
||
Side Effects:
|
||
|
||
There are pointers in the MoveStringArray that point to pointers in the
|
||
fixed length portion of the structure. These are updated with the
|
||
location in the buffer where the string is copied.
|
||
|
||
Return Value:
|
||
|
||
TRUE if the strings were successfully copied,
|
||
FALSE if the strings would not all fit in the buffer.
|
||
|
||
--*/
|
||
|
||
{
|
||
|
||
//
|
||
// Move them all in, and update Floor
|
||
//
|
||
|
||
while(MoveStringArray->Source != MOVESTRING_END_MARKER) {
|
||
|
||
//
|
||
// Since the following is a really gross piece of code, let me
|
||
// explain:
|
||
// pInputBuffer is a pointer to the start of a lanman struct and
|
||
// MoveStringArray->Source is an offset from the start of that
|
||
// structure to a PSZ.
|
||
//
|
||
|
||
// If this is a 0 length string, just place NULL in the pointer and
|
||
// press on.
|
||
|
||
if (*MoveStringLength == 0) {
|
||
*((LPTSTR *) (((LPBYTE) pOutputBuffer)
|
||
+ MoveStringArray->Destination)) = NULL;
|
||
}
|
||
else {
|
||
//
|
||
// Back the pointer up since we're filling the buffer from the
|
||
// bottom up, then do the copy
|
||
//
|
||
|
||
*Floor -= *MoveStringLength;
|
||
|
||
(void) STRCPY(*Floor,
|
||
*((LPTSTR*)((LPBYTE)pInputBuffer + MoveStringArray->Source)));
|
||
|
||
//
|
||
// Update the field in the structure which points to the string
|
||
//
|
||
// pOutputBuffer is a pointer to the start of a lanman struct
|
||
// and MoveStringArray->Destination is an offset from the start
|
||
// of that structure to a PSZ that needs to have the address of
|
||
// the just copied string put into it.
|
||
//
|
||
|
||
*((LPTSTR*) ((LPBYTE)pOutputBuffer + MoveStringArray->Destination)) =
|
||
*Floor;
|
||
}
|
||
|
||
//
|
||
// Now let's do the next one
|
||
//
|
||
|
||
MoveStringArray++;
|
||
MoveStringLength++;
|
||
}
|
||
|
||
return(TRUE);
|
||
}
|