Leaked source code of windows server 2003
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*++
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); }
|