|
|
static PWSTR cszFirst = L"First"; static PWSTR cszLast = L"Last"; static PWSTR cszUserName = L"Username"; static PWSTR cszMAC = L"MAC";
static const int iFirst = (sizeof(L"First") / sizeof(WCHAR)) - 1; static const int iLast = (sizeof(L"Last" ) / sizeof(WCHAR)) - 1; static const int iUserName = (sizeof(L"Username") / sizeof(WCHAR)) - 1; static const int iMAC = (sizeof(L"MAC" ) / sizeof(WCHAR)) - 1;
#define STRING_MISSING(_x) (((_x) == NULL) || (*(_x) == 0))
DWORD GenerateNameFromTemplate ( IN PWSTR Template, IN PGENNAME_VARIABLES Variables, IN PWSTR Name, IN DWORD NameLength, OUT PWSTR *MissingVariable OPTIONAL, OUT BOOL *UsedCounter OPTIONAL, OUT DWORD *MaximumGeneratedNameLength OPTIONAL ) { DWORD error; DWORD maxLength; DWORD fieldLength; WCHAR localString[10]; WCHAR localFormat[10]; BOOL padding; PWSTR pTemplate; PWSTR pOutput; PWSTR pOutputEnd; PWSTR stringToAdd; PWSTR pString; BOOL usedUserName;
pTemplate = Template; pOutput = Name; pOutputEnd = pOutput + NameLength - 1;
error = GENNAME_NO_ERROR; maxLength = 0; usedUserName = FALSE; if ( UsedCounter != NULL ) { *UsedCounter = FALSE; }
while ( *pTemplate != 0 ) {
if ( *pTemplate == L'%' ) {
pTemplate++; fieldLength = 0; padding = FALSE; if ( *pTemplate >= L'0' && *pTemplate <= L'9' ) { if (*pTemplate == L'0') { padding = TRUE; //
// see if this request to do padding is from the "sample"
// entrypoint. If we're doing padding, we want to make
// the sample output show that we will actually do some
// padding, so we make our counter small enough to show
// the padding.
//
if (Variables->Counter == 123456789 && Variables->AllowCounterTruncation && (0 == wcscmp(Variables->UserName, L"JOHNSMI")) && (0 == wcscmp(Variables->MacAddress, L"123456789012"))) { Variables->Counter = 1; } } do { fieldLength = (fieldLength * 10) + (*pTemplate - L'0'); pTemplate++; } while ( *pTemplate >= L'0' && *pTemplate <= L'9' ); }
if ( *pTemplate == L'#' ) {
DWORD maxCounter; DWORD counter; DWORD i;
if (fieldLength > 9) { fieldLength = 9; } if (fieldLength == 0) { fieldLength = 2; } if(padding){ wsprintf(localFormat,L"%s%d%s", L"%0",fieldLength,L"d"); } else { wcscpy(localFormat,L"%d"); } maxCounter = 10; for ( i = 1; i < fieldLength; i++ ) { maxCounter *= 10; }
counter = Variables->Counter; if ( counter >= maxCounter ) { if ( !Variables->AllowCounterTruncation ) { return GENNAME_COUNTER_TOO_HIGH; }
//
// Truncate the counter on the right.
//
while ( counter > maxCounter ) { counter /= 10; } }
if ( UsedCounter != NULL ) { *UsedCounter = TRUE; }
wsprintf( localString, localFormat, counter ); stringToAdd = localString;
pTemplate++;
} else if ( StrCmpNI( pTemplate, cszFirst, iFirst ) == 0 ) {
if (fieldLength > DNS_MAX_LABEL_LENGTH) { fieldLength = DNS_MAX_LABEL_LENGTH; } if (fieldLength == 0) { fieldLength = DNS_MAX_LABEL_LENGTH; }
stringToAdd = Variables->FirstName; if ( STRING_MISSING(stringToAdd) ) { if ( !usedUserName ) { stringToAdd = Variables->UserName; if ( STRING_MISSING(stringToAdd) ) { if ( MissingVariable != NULL ) { *MissingVariable = GENNAME_VARIABLE_FIRSTNAME; } return GENNAME_VARIABLE_MISSING; } usedUserName = TRUE; } }
pTemplate += iFirst; } else if ( StrCmpNI( pTemplate, cszLast, iLast ) == 0 ) {
if (fieldLength > DNS_MAX_LABEL_LENGTH) { fieldLength = DNS_MAX_LABEL_LENGTH; } if (fieldLength == 0) { fieldLength = DNS_MAX_LABEL_LENGTH; }
stringToAdd = Variables->LastName; if ( STRING_MISSING(stringToAdd) ) { if ( !usedUserName ) { stringToAdd = Variables->UserName; if ( STRING_MISSING(stringToAdd) ) { if ( MissingVariable != NULL ) { *MissingVariable = GENNAME_VARIABLE_LASTNAME; } return GENNAME_VARIABLE_MISSING; } usedUserName = TRUE; } }
pTemplate += iLast;
} else if ( StrCmpNI( pTemplate, cszUserName, iUserName ) == 0 ) {
if (fieldLength > DNS_MAX_LABEL_LENGTH) { fieldLength = DNS_MAX_LABEL_LENGTH; } if (fieldLength == 0) { fieldLength = DNS_MAX_LABEL_LENGTH; }
if ( !usedUserName ) { stringToAdd = Variables->UserName; if ( STRING_MISSING(stringToAdd) ) { if ( MissingVariable != NULL ) { *MissingVariable = GENNAME_VARIABLE_USERNAME; } return GENNAME_VARIABLE_MISSING; } usedUserName = TRUE; }
pTemplate += iUserName;
} else if ( StrCmpNI( pTemplate, cszMAC, iMAC ) == 0 ) {
if (fieldLength > 12) { fieldLength = 12; } if (fieldLength == 0) { fieldLength = 12; }
stringToAdd = Variables->MacAddress; if ( STRING_MISSING(stringToAdd) ) { if ( MissingVariable != NULL ) { *MissingVariable = GENNAME_VARIABLE_MAC; } return GENNAME_VARIABLE_MISSING; }
pTemplate += iMAC; } else {
return GENNAME_TEMPLATE_INVALID; }
} else {
fieldLength = 1;
localString[0] = *pTemplate; localString[1] = 0; stringToAdd = localString;
pTemplate++; }
maxLength += fieldLength;
pString = stringToAdd; for ( pString = stringToAdd; (fieldLength > 0) && (*pString != 0); fieldLength--, pString++ ) { if ( pOutput < pOutputEnd ) { *pOutput++ = *pString; } else { error = GENNAME_NAME_TOO_LONG; break; } } }
if ( MaximumGeneratedNameLength != NULL ) { *MaximumGeneratedNameLength = maxLength; }
*pOutput++ = 0; return error;
} // GenerateNameFromTemplate
|