|
|
/********************************************************************/ /** Copyright(c) 1995 Microsoft Corporation. **/ /********************************************************************/
//***
//
// Filename: misc.c
//
// Description: Contains miscillaneous functions and routines
//
// History: Feb 11,1998 NarenG Created original version.
//
#define UNICODE
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <rtutils.h>
#include <lmcons.h>
#include <rasauth.h>
#define INCL_MISC
#include "ppputil.h"
#include <stdio.h>
#include <stdlib.h>
//**
//
// Call: ExtractUsernameAndDomain
//
// Returns: NO_ERROR - Success
// Non-zero returns - Failure
//
// Description:
//
DWORD ExtractUsernameAndDomain( IN LPSTR szIdentity, OUT LPSTR szUserName, OUT LPSTR szDomainName OPTIONAL ) { WCHAR * pwchIdentity = NULL; WCHAR * pwchColon = NULL; WCHAR * pwchBackSlash = NULL; WCHAR * wszIdentity = NULL; DWORD dwLen, dwSize; DWORD dwErr = NO_ERROR;
*szUserName = (CHAR)NULL;
if ( szDomainName != NULL ) { *szDomainName = (CHAR)NULL; }
//
// First, allocate a buffer to hold the unicode version of the
// identity string
//
dwLen = strlen(szIdentity); if ( dwLen == 0 ) { dwErr = ERROR_BAD_USERNAME; goto LDone; } dwSize = (dwLen + 1) * sizeof(WCHAR); //
// Convert identity to UNICODE string for user name so that
// a search for '\\' doesn't accidentally succeed. (bug 152088)
//
wszIdentity = LocalAlloc ( LPTR, dwSize ); if ( wszIdentity == NULL ) { dwErr = ERROR_NOT_ENOUGH_MEMORY; goto LDone; }
if ( 0 == MultiByteToWideChar( CP_ACP, 0, szIdentity, -1, wszIdentity, dwLen + 1 ) ) { dwErr = GetLastError(); goto LDone; }
pwchIdentity = wszIdentity; //
// Parse out username and domain from the Name (domain\username or
// username format).
//
if ( ( pwchBackSlash = wcschr( wszIdentity, L'\\' ) ) != NULL ) { //
// Extract the domain.
//
DWORD cbDomain;
//
// Get the domain the user wants to logon to, if one was specified,
// and convert to UNICODE.
//
cbDomain = (DWORD)(pwchBackSlash - pwchIdentity);
if ( cbDomain > DNLEN ) { dwErr = ERROR_BAD_USERNAME; goto LDone; }
if ( szDomainName != NULL ) { dwLen = WideCharToMultiByte( CP_ACP, 0, pwchIdentity, cbDomain, szDomainName, cbDomain, NULL, NULL );
if ( dwLen > 0 ) { szDomainName[ dwLen ] = 0; } else { szDomainName[ 0 ] = 0; } }
pwchIdentity = pwchBackSlash + 1; } else { //
// No domain name
//
if ( szDomainName != NULL ) { szDomainName[ 0 ] = '\0'; } }
dwLen = wcslen( pwchIdentity ); if ( dwLen > UNLEN ) { dwErr = ERROR_BAD_USERNAME; goto LDone; }
if ( 0 == WideCharToMultiByte( CP_ACP, 0, pwchIdentity, -1, szUserName, UNLEN + 1, NULL, NULL ) ) { dwErr = GetLastError(); goto LDone; }
LDone:
LocalFree( wszIdentity );
return( dwErr ); }
|