/********************************************************************/ /** 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 #include #include #include #include #include #include #define INCL_MISC #include "ppputil.h" #include #include //** // // 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 ); }