211 lines
4.3 KiB
C
211 lines
4.3 KiB
C
|
#ifdef BLDR_KERNEL_RUNTIME
|
|||
|
#include <bootdefs.h>
|
|||
|
#endif
|
|||
|
#include <stddef.h>
|
|||
|
#include <ntlmsspi.h>
|
|||
|
#include <debug.h>
|
|||
|
#include <memory.h>
|
|||
|
#include <string.h>
|
|||
|
|
|||
|
#if 0
|
|||
|
PSTRING
|
|||
|
SspAllocateStringBlock(
|
|||
|
PVOID Value,
|
|||
|
int Length
|
|||
|
)
|
|||
|
{
|
|||
|
PSTRING String;
|
|||
|
|
|||
|
String = (PSTRING) SspAlloc (sizeof(STRING));
|
|||
|
if (String == NULL) {
|
|||
|
return (NULL);
|
|||
|
}
|
|||
|
|
|||
|
String->Buffer = (PCHAR) SspAlloc (Length);
|
|||
|
if (String->Buffer == NULL) {
|
|||
|
SspFree (String);
|
|||
|
return (NULL);
|
|||
|
}
|
|||
|
|
|||
|
String->Length = String->MaximumLength = Length;
|
|||
|
|
|||
|
_fmemcpy(String->Buffer, Value, Length);
|
|||
|
|
|||
|
return (String);
|
|||
|
}
|
|||
|
|
|||
|
PSTRING
|
|||
|
SspAllocateString(
|
|||
|
PVOID Value
|
|||
|
)
|
|||
|
{
|
|||
|
int Length;
|
|||
|
|
|||
|
Length = _fstrlen(Value);
|
|||
|
return (SspAllocateStringBlock(Value, Length));
|
|||
|
}
|
|||
|
|
|||
|
void
|
|||
|
SspFreeString(
|
|||
|
PSTRING * String
|
|||
|
)
|
|||
|
{
|
|||
|
if (*String == NULL) {
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if ((*String)->MaximumLength) {
|
|||
|
SspFree ((*String)->Buffer);
|
|||
|
}
|
|||
|
|
|||
|
SspFree (*String);
|
|||
|
|
|||
|
*String = NULL;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void
|
|||
|
SspCopyString(
|
|||
|
IN PVOID MessageBuffer,
|
|||
|
OUT PSTRING OutString,
|
|||
|
IN PSTRING InString,
|
|||
|
IN OUT PCHAR *Where,
|
|||
|
IN BOOLEAN Absolute
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine copies the InString into the MessageBuffer at Where.
|
|||
|
It then updates OutString to be a descriptor for the copied string. The
|
|||
|
descriptor 'address' is an offset from the MessageBuffer unless 'Absolute'
|
|||
|
is TRUE.
|
|||
|
|
|||
|
Where is updated to point to the next available space in the MessageBuffer.
|
|||
|
|
|||
|
The caller is responsible for any alignment requirements and for ensuring
|
|||
|
there is room in the buffer for the string.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
MessageBuffer - Specifies the base address of the buffer being copied into.
|
|||
|
|
|||
|
OutString - Returns a descriptor for the copied string. The descriptor
|
|||
|
is relative to the begining of the buffer.
|
|||
|
|
|||
|
InString - Specifies the string to copy.
|
|||
|
|
|||
|
Where - On input, points to where the string is to be copied.
|
|||
|
On output, points to the first byte after the string.
|
|||
|
|
|||
|
Absolute - If TRUE, OutString->Buffer will be set to the actual buffer
|
|||
|
address rather than an offset.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
//
|
|||
|
// Copy the data to the Buffer.
|
|||
|
//
|
|||
|
|
|||
|
if ( InString->Buffer != NULL ) {
|
|||
|
_fmemcpy( *Where, InString->Buffer, InString->Length );
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Build a descriptor to the newly copied data.
|
|||
|
//
|
|||
|
|
|||
|
OutString->Length = OutString->MaximumLength = InString->Length;
|
|||
|
if ( Absolute ) {
|
|||
|
OutString->Buffer = *Where;
|
|||
|
} else {
|
|||
|
*(unsigned long *) &OutString->Buffer = *Where - ((PCHAR)MessageBuffer);
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Update Where to point past the copied data.
|
|||
|
//
|
|||
|
|
|||
|
*Where += InString->Length;
|
|||
|
}
|
|||
|
#endif // 0
|
|||
|
|
|||
|
void
|
|||
|
SspCopyStringFromRaw(
|
|||
|
IN PVOID MessageBuffer,
|
|||
|
OUT PSTRING OutString,
|
|||
|
IN PCHAR InString,
|
|||
|
IN int InStringLength,
|
|||
|
IN OUT PCHAR *Where
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine copies the InString into the MessageBuffer at Where.
|
|||
|
It then updates OutString to be a descriptor for the copied string. The
|
|||
|
descriptor 'address' is an offset from the MessageBuffer.
|
|||
|
|
|||
|
Where is updated to point to the next available space in the MessageBuffer.
|
|||
|
|
|||
|
The caller is responsible for any alignment requirements and for ensuring
|
|||
|
there is room in the buffer for the string.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
MessageBuffer - Specifies the base address of the buffer being copied into.
|
|||
|
|
|||
|
OutString - Returns a descriptor for the copied string. The descriptor
|
|||
|
is relative to the begining of the buffer. (Always a relative Out).
|
|||
|
|
|||
|
InString - Specifies the string to copy.
|
|||
|
|
|||
|
Where - On input, points to where the string is to be copied.
|
|||
|
On output, points to the first byte after the string.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
//
|
|||
|
// Copy the data to the Buffer.
|
|||
|
//
|
|||
|
|
|||
|
if ( InString != NULL ) {
|
|||
|
_fmemcpy( *Where, InString, InStringLength );
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Build a descriptor to the newly copied data.
|
|||
|
//
|
|||
|
|
|||
|
OutString->Length = OutString->MaximumLength = (USHORT)InStringLength;
|
|||
|
swapshort(OutString->Length) ;
|
|||
|
swapshort(OutString->MaximumLength) ;
|
|||
|
|
|||
|
*(unsigned long *) &OutString->Buffer = (ULONG)(*Where - ((PCHAR)MessageBuffer));
|
|||
|
swaplong(*(unsigned long *) &OutString->Buffer) ; //MACBUG: this is weird !!
|
|||
|
|
|||
|
//
|
|||
|
// Update Where to point past the copied data.
|
|||
|
//
|
|||
|
|
|||
|
*Where += InStringLength;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|