182 lines
3.9 KiB
C
182 lines
3.9 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1991-1992 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
fmtncbna.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
Contains a function for formatting a name NCB_style.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Dan Lafferty (danl) 29-May-1991
|
|||
|
|
|||
|
Environment:
|
|||
|
|
|||
|
User Mode -Win32
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
29-May-1991 danl
|
|||
|
ported from LM2.0
|
|||
|
01-Oct-1991 danl
|
|||
|
Working toward UNICODE.
|
|||
|
|
|||
|
--*/
|
|||
|
#include <nt.h> // needed by tstring.h
|
|||
|
#include <windef.h> // needed by tstring.h
|
|||
|
#include <nt.h> // (Needed by <tstring.h>.)
|
|||
|
#include <windef.h> // (Needed by <tstring.h>.)
|
|||
|
#include <tstring.h> // STRLEN
|
|||
|
#include "msrv.h" // For prototype definitions
|
|||
|
#include "msgdbg.h" // MSG_LOG
|
|||
|
#include <netdebug.h> // NetpAssert
|
|||
|
#include <netlib.h> // UNUSED macro
|
|||
|
#include <netlibnt.h> // NetpNtStatusToApiStatus
|
|||
|
#include <icanon.h> // Canonicalization Routines
|
|||
|
|
|||
|
|
|||
|
|
|||
|
NET_API_STATUS
|
|||
|
MsgFmtNcbName(
|
|||
|
OUT PCHAR DestBuf,
|
|||
|
IN LPTSTR Name,
|
|||
|
IN DWORD Type)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
FmtNcbName - format a name NCB-style
|
|||
|
|
|||
|
Given a name, a name type, and a destination address, this
|
|||
|
function copies the name and the type to the destination in
|
|||
|
the format used in the name fields of a Network Control
|
|||
|
Block.
|
|||
|
|
|||
|
|
|||
|
SIDE EFFECTS
|
|||
|
|
|||
|
Modifies 16 bytes starting at the destination address.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
DestBuf - Pointer to the destination buffer.
|
|||
|
|
|||
|
Name - Unicode NUL-terminated name string
|
|||
|
|
|||
|
Type - Name type number (0, 3, 5, or 32) (3=NON_FWD, 5=FWD)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
NERR_Success - The operation was successful
|
|||
|
|
|||
|
Translated Return Code from the Rtl Translate routine.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
DWORD i; // Counter
|
|||
|
NTSTATUS ntStatus;
|
|||
|
NET_API_STATUS status;
|
|||
|
OEM_STRING ansiString;
|
|||
|
UNICODE_STRING unicodeString;
|
|||
|
PCHAR pAnsiString;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Force the name to be upper case.
|
|||
|
//
|
|||
|
status = NetpNameCanonicalize(
|
|||
|
NULL,
|
|||
|
Name,
|
|||
|
Name,
|
|||
|
STRSIZE(Name),
|
|||
|
NAMETYPE_MESSAGEDEST,
|
|||
|
0);
|
|||
|
if (status != NERR_Success) {
|
|||
|
return(status);
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Convert the unicode name string into an ansi string - using the
|
|||
|
// current locale.
|
|||
|
//
|
|||
|
#ifdef UNICODE
|
|||
|
unicodeString.Length = (USHORT)(STRLEN(Name)*sizeof(WCHAR));
|
|||
|
unicodeString.MaximumLength = (USHORT)((STRLEN(Name)+1) * sizeof(WCHAR));
|
|||
|
unicodeString.Buffer = Name;
|
|||
|
|
|||
|
ntStatus = RtlUnicodeStringToOemString(
|
|||
|
&ansiString,
|
|||
|
&unicodeString,
|
|||
|
TRUE); // Allocate the ansiString Buffer.
|
|||
|
|
|||
|
if (!NT_SUCCESS(ntStatus))
|
|||
|
{
|
|||
|
MSG_LOG(ERROR,
|
|||
|
"FmtNcbName:RtlUnicodeStringToOemString Failed rc=%X\n",
|
|||
|
ntStatus);
|
|||
|
|
|||
|
return NetpNtStatusToApiStatus(ntStatus);
|
|||
|
}
|
|||
|
|
|||
|
pAnsiString = ansiString.Buffer;
|
|||
|
*(pAnsiString+ansiString.Length) = '\0';
|
|||
|
#else
|
|||
|
UNUSED(ntStatus);
|
|||
|
UNUSED(unicodeString);
|
|||
|
UNUSED(ansiString);
|
|||
|
pAnsiString = Name;
|
|||
|
#endif // UNICODE
|
|||
|
|
|||
|
//
|
|||
|
// copy each character until a NUL is reached, or until NCBNAMSZ-1
|
|||
|
// characters have been copied.
|
|||
|
//
|
|||
|
for (i=0; i < NCBNAMSZ - 1; ++i) {
|
|||
|
if (*pAnsiString == '\0') {
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Copy the Name
|
|||
|
//
|
|||
|
|
|||
|
*DestBuf++ = *pAnsiString++;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Free the buffer that RtlUnicodeStringToOemString created for us.
|
|||
|
// NOTE: only the ansiString.Buffer portion is free'd.
|
|||
|
//
|
|||
|
|
|||
|
#ifdef UNICODE
|
|||
|
RtlFreeOemString( &ansiString);
|
|||
|
#endif // UNICODE
|
|||
|
|
|||
|
//
|
|||
|
// Pad the name field with spaces
|
|||
|
//
|
|||
|
for(; i < NCBNAMSZ - 1; ++i) {
|
|||
|
*DestBuf++ = ' ';
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Set the name type.
|
|||
|
//
|
|||
|
NetpAssert( Type!=5 ); // 5 is not valid for NT.
|
|||
|
|
|||
|
*DestBuf = (CHAR) Type; // Set name type
|
|||
|
|
|||
|
return(NERR_Success);
|
|||
|
}
|
|||
|
|