257 lines
8.2 KiB
C
257 lines
8.2 KiB
C
|
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
|
||
|
|