windows-nt/Source/XPSP1/NT/base/headless/tcsrv/admin/console/utils.c
2020-09-26 16:20:57 +08:00

998 lines
26 KiB
C

/*
* Copyright (c) Microsoft Corporation
*
* Module Name :
* utils.c
*
* Contains all the work needed to present the console
*
*
* Sadagopan Rajaram -- Dec 20, 1999
*
*/
#include "tcadmin.h"
BOOL AnsiStatus = (sizeof(TCHAR) == sizeof(CHAR));
BOOL
Browse(
)
{
int index,j;
LONG retVal;
DWORD len;
TCHAR name[MAX_BUFFER_SIZE];
LPTSTR message[NUMBER_FIELDS + 1];
TCHAR device[MAX_BUFFER_SIZE];
int nameLen, deviceLen;
UINT baudRate;
LPTSTR temp;
UCHAR stopBits, parity, wordLen;
BOOL cont = TRUE;
TCHAR key;
LPTSTR confirm;
BOOL readRet;
for(index = 0; index < NUMBER_FIELDS; index ++){
message[index] = RetreiveMessageText(MSG_NAME_PROMPT+index);
if (!message[index]) {
for(j=index-1; j>=0;j--){
TCFree(message[j]);
}
_tprintf(_T("Cannot find Resources\n"));
return FALSE;
}
temp = message[index];
while(*temp != _T('%')){
temp++;
}
*temp = (TCHAR) 0;
}
message[index] = RetreiveMessageText(MSG_NAME_PROMPT+index);
if (!message[index]) {
for(j=index-1; j>=0;j--){
TCFree(message[j]);
}
_tprintf(_T("Cannot find Resources\n"));
index ++;
return FALSE;
}
confirm = RetreiveMessageText(MSG_CONFIRM_PROMPT);
if (!confirm) {
for(j=index-1; j>=0;j--){
TCFree(message[j]);
}
_tprintf(_T("Cannot find Resources\n"));
index ++;
return FALSE;
}
confirm[_tcslen(confirm) - 2] = _T('\0');
index = 0;
do{
parity = NO_PARITY;
baudRate = DEFAULT_BAUD_RATE;
stopBits = 0;
wordLen = 8;
nameLen = deviceLen =MAX_BUFFER_SIZE;
name[0] = device[0] = (TCHAR) 0;
retVal = (LONG) (getparams)(index,
name,
&nameLen,
device,
&deviceLen,
&stopBits,
&parity,
&baudRate,
&wordLen
);
if(retVal != ERROR_SUCCESS){
if (retVal == ERROR_NO_MORE_ITEMS){
index --;
if(index < 0 ) {
cont=FALSE;
continue;
}
goto input;
}
else{
_tprintf(_T("%d\n"),retVal);
cont=FALSE;
}
continue;
}
DisplayParameters(message,
name,
device,
baudRate,
wordLen,
parity,
stopBits
);
_tprintf(_T("%s"),message[6]);
input:
readRet = ReadFile(hConsoleInput,
&key,
sizeof(TCHAR),
&len,
NULL
);
if(!readRet || !len){
exit(1);
}
if(lastChar == _T('\r') && key == _T('\n')){
lastChar = key;
goto input;
}
lastChar = key;
switch(key){
case _T('p'):
case _T('P'):
if(index == 0){
goto input;
}
index --;
break;
case _T('n'):
case _T('N'):
index ++;
break;
case _T('m'):
case _T('M'):
cont=FALSE;
break;
case _T('d'):
case _T('D'):
retVal = (LONG) (deletekey)(name);
if(index > 0){
index --;
}
break;
case _T('e'):
case _T('E'):
retVal = DisplayEditMenu(name,
_tcslen(name),
device,
_tcslen(device),
&baudRate,
&wordLen,
&parity,
&stopBits
);
if(retVal == ERROR_SUCCESS){
DisplayParameters(message,
name,
device,
baudRate,
wordLen,
parity,
stopBits
);
_tprintf(_T("%s"),confirm);
do{
readRet = ReadFile(hConsoleInput,
&key,
sizeof(TCHAR),
&len,
NULL
);
if(!readRet || !len){
exit(1);
}
if(lastChar != _T('\r') || key != _T('\n')){
lastChar = key;
break;
}
lastChar = key;
}while(1);
if((key == _T('y'))
|| (key == _T('Y'))){
retVal = (LONG) (setparams)(name,
device,
&stopBits,
&parity,
&baudRate,
&wordLen
);
if(retVal != ERROR_SUCCESS){
temp = RetreiveMessageText(MSG_ERROR_SET);
temp[_tcslen(temp) - 2 ] = _T('\0');
if(temp){
_tprintf(_T("%s %d"),temp,retVal);
}
TCFree(temp);
}
}
}
break;
default:
goto input;
}
}while(cont);
for(index = 0; index <= NUMBER_FIELDS; index ++){
TCFree(message[index]);
}
return TRUE;
}
VOID DisplayScreen(
UINT MessageID
)
{
LPTSTR Message;
DWORD len;
Message = RetreiveMessageText(MessageID);
if (!Message) {
_tprintf(_T("Cannot retreive message\n"));
return;
}
_tprintf(_T("%s"),Message);
TCFree(Message);
return;
}
int
DisplayEditMenu(
TCHAR *name,
int nameLen,
TCHAR *device,
int deviceLen,
UINT *BaudRate,
UCHAR *WordLen,
UCHAR *Parity,
UCHAR *StopBits
)
{
LPTSTR message,temp,curr;
int i;
DWORD len;
BOOL ret;
TCHAR buffer[MAX_BUFFER_SIZE];
int dat;
message = RetreiveMessageText(MSG_NAME_PROMPT);
if(! message){
return -1;
}
temp = message;
while(*temp != _T('%')){
temp ++;
}
*temp = (TCHAR) 0;
_tprintf(_T("%s"),message);
TCFree(message);
while(!GetLine(name, nameLen, MAX_BUFFER_SIZE));
message = RetreiveMessageText(MSG_DEVICE_PROMPT);
if(! message){
return -1;
}
temp = message;
while(*temp != _T('%')){
temp ++;
}
*temp = (TCHAR) 0;
_tprintf(_T("%s"),message);
TCFree(message);
while(!GetLine(device, deviceLen, MAX_BUFFER_SIZE));
message = RetreiveMessageText(MSG_BAUD_PROMPT);
if(! message){
return -1;
}
temp = message;
while(*temp != _T('%')){
temp ++;
}
*temp = (TCHAR) 0;
_tprintf(_T("%s"),message);
TCFree(message);
_stprintf(buffer,_T("%d"),*BaudRate);
while(!GetLine(buffer,_tcslen(buffer) , MAX_BUFFER_SIZE));
_stscanf(buffer,_T("%d"),BaudRate);
message = RetreiveMessageText(MSG_WORD_PROMPT);
if(! message){
return -1;
}
temp = message;
while(*temp != _T('%')){
temp ++;
}
*temp = (TCHAR) 0;
_tprintf(_T("%s"),message);
TCFree(message);
_stprintf(buffer,_T("%d"),*WordLen);
while(!GetLine(buffer,_tcslen(buffer) , MAX_BUFFER_SIZE));
_stscanf(buffer,_T("%d"),&dat);
*WordLen = (UCHAR) dat;
message = RetreiveMessageText(MSG_PARITY_PROMPT2);
if(! message){
return -1;
}
temp = curr = message;
while(*temp != _T('%')){
temp ++;
}
*temp = (TCHAR) 0;
_tprintf(_T("%s%d"),curr,NO_PARITY);
curr = &(temp[1]);
while(*temp != _T('%')){
temp ++;
}
*temp = (TCHAR) 0;
_tprintf(_T("%s%d"),curr,ODD_PARITY);
curr = &(temp[1]);
while(*temp != _T('%')){
temp ++;
}
*temp = (TCHAR) 0;
_tprintf(_T("%s%d"),curr,EVEN_PARITY);
curr = &(temp[1]);
while(*temp != _T('%')){
temp ++;
}
*temp = (TCHAR) 0;
_tprintf(_T("%s%d"),curr,MARK_PARITY);
curr = &(temp[1]);
while(*temp != _T('%')){
temp ++;
}
*temp = (TCHAR) 0;
_tprintf(_T("%s%d"),curr,SPACE_PARITY);
curr = &(temp[1]);
while(*temp != _T('%')){
temp ++;
}
*temp = (TCHAR) 0;
_tprintf(_T("%s"),curr);
TCFree(message);
_stprintf(buffer,_T("%d"),*Parity);
while(!GetLine(buffer,_tcslen(buffer) , MAX_BUFFER_SIZE));
_stscanf(buffer,_T("%d"),&dat);
*Parity = (UCHAR) dat;
message = RetreiveMessageText(MSG_STOP_PROMPT2);
if(! message){
return -1;
}
temp = curr = message;
while(*temp != _T('%')){
temp ++;
}
*temp = (TCHAR) 0;
_tprintf(_T("%s%d"),curr,STOP_BIT_1);
curr = &(temp[1]);
while(*temp != _T('%')){
temp ++;
}
*temp = (TCHAR) 0;
_tprintf(_T("%s%d"),curr,STOP_BITS_1_5);
curr = &(temp[1]);
while(*temp != _T('%')){
temp ++;
}
*temp = (TCHAR) 0;
_tprintf(_T("%s%d"),curr,STOP_BITS_2);
curr = &(temp[1]);
while(*temp != _T('%')){
temp ++;
}
*temp = (TCHAR) 0;
_tprintf(_T("%s"),curr);
TCFree(message);
_stprintf(buffer,_T("%d"),*StopBits);
while(!GetLine(buffer,_tcslen(buffer) , MAX_BUFFER_SIZE));
_stscanf(buffer,_T("%d"),&dat);
*StopBits = (UCHAR) dat;
return ERROR_SUCCESS;
}
LPTSTR
RetreiveMessageText(
IN ULONG MessageId
)
{
ULONG LenBytes;
PMESSAGE_RESOURCE_ENTRY MessageEntry;
BOOLEAN IsUnicode;
ANSI_STRING AnsiString;
UNICODE_STRING UnicodeString;
NTSTATUS Status;
LPTSTR MessageText;
Status = RtlFindMessage(
ResourceImageBase,
(ULONG)(ULONG_PTR)RT_MESSAGETABLE,
0,
MessageId,
&MessageEntry
);
if(!NT_SUCCESS(Status)) {
_tprintf(_T("TCADMIN: Can't find message 0x%lx\n"),MessageId);
return(NULL);
}
IsUnicode = (BOOLEAN)((MessageEntry->Flags &
MESSAGE_RESOURCE_UNICODE) != 0);
//
// Get the size in bytes of a buffer large enough to hold the
// message and its terminating nul wchar. If the message is
// unicode, then this value is equal to the size of the message.
// If the message is not unicode, then we have to calculate this value.
//
if(IsUnicode) {
#ifdef UNICODE
LenBytes = (wcslen((PWSTR)MessageEntry->Text)
+ 1)*sizeof(WCHAR);
#else
LenBytes = wcstombs(NULL,(PWSTR)MessageEntry->Text, 0);
#endif
} else {
//
// RtlAnsiStringToUnicodeSize includes an implied wide-nul terminator
// in the count it returns.
//
#ifdef UNICODE
AnsiString.Buffer = MessageEntry->Text;
AnsiString.Length = (USHORT)strlen(MessageEntry->Text);
AnsiString.MaximumLength = AnsiString.Length;
LenBytes = RtlAnsiStringToUnicodeSize(&AnsiString);
#else
LenBytes = strlen((PCHAR) MessageEntry->Text);
#endif
}
LenBytes += sizeof(TCHAR);
//
// allocate a buffer.
//
MessageText = (LPTSTR) TCAlloc(LenBytes);
if(MessageText == NULL) {
return(NULL);
}
memset(MessageText,0,LenBytes);
if(IsUnicode) {
//
// Message is already unicode; just copy it into the buffer.
//
#ifdef UNICODE
wcscpy(MessageText,(PWSTR)MessageEntry->Text);
#else
LenBytes = wcstombs((PCHAR) MessageText,
(PWCHAR) MessageEntry->Text,
LenBytes);
#endif
} else {
//
// Message is not unicode; convert in into the buffer.
//
#ifdef UNICODE
UnicodeString.Buffer = MessageText;
UnicodeString.Length = 0;
UnicodeString.MaximumLength = (USHORT)LenBytes;
RtlAnsiStringToUnicodeString(&UnicodeString,
&AnsiString,
FALSE
);
#else
strcpy((PCHAR) MessageText, (PCHAR) MessageEntry->Text);
#endif
}
return(MessageText);
}
LONG
GetLine(
LPTSTR str,
int index,
int MaxLength
)
{
DWORD len;
DWORD size;
TCHAR buffer[3];
BOOL ret;
str[index] = (TCHAR) 0;
FlushConsoleInputBuffer(hConsoleInput);
_tprintf(_T("%s"),str);
buffer[0] = buffer[2] = (TCHAR) 0x8;
buffer[1] = (TCHAR) 0;
do{
if (index == MaxLength) {
index--;
}
//
// Read a (possibly) partial command line.
//
do{
ret = ReadFile(hConsoleInput,
&(str[index]),
sizeof(TCHAR),
&len,
NULL
);
if(!ret || !len){
exit(1);
}
if(lastChar != _T('\r') || str[index] != _T('\n')){
//ignore \r\n combinations
lastChar = str[index];
break;
}
lastChar = str[index];
}while(1);
lastChar = str[index];
if ((str[index] == (TCHAR) 0x8) || // backspace (^h)
(str[index] == (TCHAR) 0x7F)) { // delete
if (index > 0) {
WriteConsole(hConsoleOutput,
buffer,
3,
&len,
NULL
);
index--;
}
} else {
WriteConsole(hConsoleOutput,
&(str[index]),
1,
&len,
NULL
);
index++;
}
} while ((index == 0) || ((str[index - 1] != _T('\n')) &&(str[index-1] != _T('\r'))));
if(str[index-1] == _T('\r')){
buffer[0] = '\n';
str[index - 1] = '\0';
}
else{
buffer[0] = _T('\r');
str[index-1] ='\0';
}
WriteConsole(hConsoleOutput,
buffer,
1,
&len,
NULL
);
FlushConsoleInputBuffer(hConsoleInput);
return index;
}
VOID
DisplayParameters(
LPCTSTR *message,
LPCTSTR name,
LPCTSTR device,
UINT baudRate,
UCHAR wordLen,
UCHAR parity,
UCHAR stopBits
)
{
_tprintf(_T("%s "),message[0]);
_tprintf(_T("%s\n"),name);
_tprintf(_T("%s "),message[1]);
_tprintf(_T("%s\n"),device);
_tprintf(_T("%s "),message[2]);
_tprintf(_T("%d\n"),baudRate);
_tprintf(_T("%s "),message[3]);
_tprintf(_T("%d\n"),wordLen);
_tprintf(_T("%s "),message[4]);
switch(parity){
case NO_PARITY:
_tprintf(_T("NONE\n"));
break;
case ODD_PARITY:
_tprintf(_T("ODD\n"));
break;
case EVEN_PARITY:
_tprintf(_T("EVEN\n"));
break;
case MARK_PARITY:
_tprintf(_T("MARK\n"));
break;
case SPACE_PARITY:
_tprintf(_T("SPACE\n"));
break;
default:
_tprintf(_T("NONE\n"));
break;
}
_tprintf(_T("%s "),message[5]);
switch(stopBits){
case STOP_BIT_1:
_tprintf(_T("1\n"));
break;
case STOP_BITS_1_5:
_tprintf(_T("1.5\n"));
break;
case STOP_BITS_2:
_tprintf(_T("2\n"));
break;
default:
_tprintf(_T("1\n"));
break;
}
}
VOID SendParameterChange(
)
{
SC_HANDLE sc_handle;
SC_HANDLE tc_handle;
LPTSTR temp;
BOOL ret;
SERVICE_STATUS status;
sc_handle = OpenSCManager(NULL,
NULL,
GENERIC_READ
);
if (sc_handle == NULL){
temp = RetreiveMessageText(CANNOT_OPEN_SERVICE_MANAGER);
if(temp){
temp[_tcslen(temp) - 2] = (TCHAR) 0;
_tprintf(_T("%s"), temp);
return;
}
}
tc_handle = OpenService(sc_handle,
TCSERV_NAME,
SERVICE_ALL_ACCESS
);
if (tc_handle == NULL){
temp = RetreiveMessageText(CANNOT_OPEN_SERVICE);
if(temp){
temp[_tcslen(temp) - 2] = (TCHAR) 0;
_tprintf(_T("%s %d"), temp,GetLastError());
TCFree(temp);
CloseServiceHandle(sc_handle);
return;
}
}
ret = ControlService(tc_handle,
SERVICE_CONTROL_PARAMCHANGE,
&status
);
if(ret == FALSE){
temp = RetreiveMessageText(CANNOT_SEND_PARAMETER_CHANGE);
if(temp){
temp[_tcslen(temp) - 2] = (TCHAR) 0;
_tprintf(_T("%s %d"), temp, GetLastError());
TCFree(temp);
CloseServiceHandle(tc_handle);
CloseServiceHandle(sc_handle);
return;
}
}
temp = RetreiveMessageText(SUCCESSFULLY_SENT_PARAMETER_CHANGE);
if(temp){
_tprintf(_T("%s"), temp);
TCFree(temp);
}
CloseServiceHandle(tc_handle);
CloseServiceHandle(sc_handle);
return;
}
VOID
GetStatus(
)
{
SC_HANDLE sc_handle;
SC_HANDLE tc_handle;
DWORD len;
int i;
LPTSTR temp;
BOOL ret;
SERVICE_STATUS_PROCESS status;
DWORD val[] = {
SERVICE_STOPPED,
SERVICE_START_PENDING,
SERVICE_STOP_PENDING,
SERVICE_RUNNING,
SERVICE_CONTINUE_PENDING,
SERVICE_PAUSE_PENDING,
SERVICE_PAUSED
};
sc_handle = OpenSCManager(NULL,
NULL,
GENERIC_READ
);
if (sc_handle == NULL){
temp = RetreiveMessageText(CANNOT_OPEN_SERVICE_MANAGER);
if(temp){
temp[_tcslen(temp) - 2] = (TCHAR) 0;
_tprintf(_T("%s"), temp);
return;
}
}
tc_handle = OpenService(sc_handle,
TCSERV_NAME,
SERVICE_ALL_ACCESS
);
if (tc_handle == NULL){
temp = RetreiveMessageText(CANNOT_OPEN_SERVICE);
if(temp){
temp[_tcslen(temp) - 2] = (TCHAR) 0;
_tprintf(_T("%s %d"), temp,GetLastError());
TCFree(temp);
CloseServiceHandle(sc_handle);
return;
}
}
ret = QueryServiceStatusEx(tc_handle,
SC_STATUS_PROCESS_INFO,
(LPBYTE) &status,
sizeof(status),
&len
);
if(ret == FALSE){
temp = RetreiveMessageText(CANNOT_QUERY_STATUS);
if(temp){
temp[_tcslen(temp) - 2] = (TCHAR) 0;
_tprintf(_T("%s %d"), temp, GetLastError());
TCFree(temp);
CloseServiceHandle(tc_handle);
CloseServiceHandle(sc_handle);
return;
}
}
temp = RetreiveMessageText(QUERY_STATUS_SUCCESS);
if(temp){
temp[_tcslen(temp) -2 ] = (TCHAR) 0;
_tprintf(_T("%s"), temp);
TCFree(temp);
for(i = 0 ; i<NUMBER_OF_STATES; i++){
if(val[i] == status.dwCurrentState) break;
}
temp = RetreiveMessageText(SERVICE_STOPPED_MESSAGE + i);
if(temp){
_tprintf(_T("%s"),temp);
TCFree(temp);
}
}
CloseServiceHandle(tc_handle);
CloseServiceHandle(sc_handle);
return;
}
VOID StopTCService(
)
{
SC_HANDLE sc_handle;
SC_HANDLE tc_handle;
LPTSTR temp;
BOOL ret;
SERVICE_STATUS status;
sc_handle = OpenSCManager(NULL,
NULL,
GENERIC_READ
);
if (sc_handle == NULL){
temp = RetreiveMessageText(CANNOT_OPEN_SERVICE_MANAGER);
if(temp){
temp[_tcslen(temp) - 2] = (TCHAR) 0;
_tprintf(_T("%s"), temp);
return;
}
}
tc_handle = OpenService(sc_handle,
TCSERV_NAME,
SERVICE_ALL_ACCESS
);
if (tc_handle == NULL){
temp = RetreiveMessageText(CANNOT_OPEN_SERVICE);
if(temp){
temp[_tcslen(temp) - 2] = (TCHAR) 0;
_tprintf(_T("%s %d"), temp,GetLastError());
TCFree(temp);
CloseServiceHandle(sc_handle);
return;
}
}
ret = ControlService(tc_handle,
SERVICE_CONTROL_STOP,
&status
);
if(ret == FALSE){
temp = RetreiveMessageText(CANNOT_SEND_STOP);
if(temp){
temp[_tcslen(temp) - 2] = (TCHAR) 0;
_tprintf(_T("%s %d"), temp, GetLastError());
TCFree(temp);
CloseServiceHandle(tc_handle);
CloseServiceHandle(sc_handle);
return;
}
}
temp = RetreiveMessageText(SUCCESSFULLY_SENT_STOP);
if(temp){
_tprintf(_T("%s"), temp);
TCFree(temp);
}
CloseServiceHandle(tc_handle);
CloseServiceHandle(sc_handle);
return;
}
VOID StartTCService(
)
{
SC_HANDLE sc_handle;
SC_HANDLE tc_handle;
LPTSTR temp;
BOOL ret;
SERVICE_STATUS status;
sc_handle = OpenSCManager(NULL,
NULL,
GENERIC_READ
);
if (sc_handle == NULL){
temp = RetreiveMessageText(CANNOT_OPEN_SERVICE_MANAGER);
if(temp){
temp[_tcslen(temp) - 2] = (TCHAR) 0;
_tprintf(_T("%s"), temp);
return;
}
}
tc_handle = OpenService(sc_handle,
TCSERV_NAME,
SERVICE_ALL_ACCESS
);
if (tc_handle == NULL){
temp = RetreiveMessageText(CANNOT_OPEN_SERVICE);
if(temp){
temp[_tcslen(temp) - 2] = (TCHAR) 0;
_tprintf(_T("%s %d"), temp,GetLastError());
TCFree(temp);
CloseServiceHandle(sc_handle);
return;
}
}
ret = StartService(tc_handle,
0,
NULL
);
if(ret == FALSE){
temp = RetreiveMessageText(CANNOT_SEND_START);
if(temp){
temp[_tcslen(temp) - 2] = (TCHAR) 0;
_tprintf(_T("%s %d"), temp, GetLastError());
TCFree(temp);
CloseServiceHandle(tc_handle);
CloseServiceHandle(sc_handle);
return;
}
}
temp = RetreiveMessageText(SUCCESSFULLY_SENT_START);
if(temp){
_tprintf(_T("%s"), temp);
TCFree(temp);
}
CloseServiceHandle(tc_handle);
CloseServiceHandle(sc_handle);
return;
}
VOID
AddAllComPorts(
)
/*
* Adds all the Com ports in the system as parameters to bridge
* Reads key HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM
* Each value name is a com device name. The friendly name is the
* value data
*
*/
{
DWORD index;
HKEY m_hkey;
ULONG retVal;
LPTSTR temp;
TCHAR device[MAX_BUFFER_SIZE*2];
TCHAR name[MAX_BUFFER_SIZE];
UINT baudRate;
DWORD type;
DWORD deviceLen,nameLen;
UCHAR stopBits, parity, wordLen;
index = 0;
retVal = RegOpenKey(HKEY_LOCAL_MACHINE,
SERIAL_DEVICE_KEY,
&m_hkey
);
if(retVal != ERROR_SUCCESS){
_tprintf(_T("%d\n"),retVal);
return;
}
index = 0;
while(1){
deviceLen = nameLen = MAX_BUFFER_SIZE;
retVal = RegEnumValue(m_hkey,
index,
device,
&deviceLen,
NULL,
&type,
name,
&nameLen
);
if(retVal != ERROR_SUCCESS){
if(retVal != ERROR_NO_MORE_ITEMS){
_tprintf(_T("%d\n"),retVal);
}
break;
}
stopBits = STOP_BIT_1;
parity = NO_PARITY;
baudRate = DEFAULT_BAUD_RATE;
wordLen = SERIAL_DATABITS_8;
_stprintf(device, "\\??\\%s",name);
retVal = (ULONG) (setparams)(name,
device,
&stopBits,
&parity,
&baudRate,
&wordLen
);
if(retVal != ERROR_SUCCESS){
temp = RetreiveMessageText(MSG_ERROR_SET);
temp[_tcslen(temp) - 2 ] = _T('\0');
if(temp){
_tprintf(_T("%s %d"),temp,retVal);
}
TCFree(temp);
break;
}
index ++;
}
retVal = RegCloseKey(m_hkey);
}