mirror of https://github.com/tongzx/nt5src
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.
187 lines
3.9 KiB
187 lines
3.9 KiB
/********************************************************************/
|
|
/** 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 );
|
|
}
|