- Keep the value type of each environment variable that was read from the registry and assign the right type for new and modified variables.

- Read and write the the raw (non-expanded) environment variables and display the cooked (expanded) ones only.

svn path=/trunk/; revision=29729
This commit is contained in:
Eric Kohl 2007-10-21 11:13:03 +00:00
parent f546265f2f
commit 2689ce9561

View file

@ -12,6 +12,7 @@
typedef struct _VARIABLE_DATA typedef struct _VARIABLE_DATA
{ {
DWORD dwType;
LPTSTR lpName; LPTSTR lpName;
LPTSTR lpRawValue; LPTSTR lpRawValue;
LPTSTR lpCookedValue; LPTSTR lpCookedValue;
@ -53,7 +54,7 @@ EditVariableDlgProc(HWND hwndDlg,
case IDOK: case IDOK:
dwNameLength = (DWORD)SendDlgItemMessage(hwndDlg, IDC_VARIABLE_NAME, WM_GETTEXTLENGTH, 0, 0); dwNameLength = (DWORD)SendDlgItemMessage(hwndDlg, IDC_VARIABLE_NAME, WM_GETTEXTLENGTH, 0, 0);
dwValueLength = (DWORD)SendDlgItemMessage(hwndDlg, IDC_VARIABLE_VALUE, WM_GETTEXTLENGTH, 0, 0); dwValueLength = (DWORD)SendDlgItemMessage(hwndDlg, IDC_VARIABLE_VALUE, WM_GETTEXTLENGTH, 0, 0);
if (dwNameLength != 0 && dwValueLength != 0) if (dwNameLength > 0 && dwValueLength > 0)
{ {
if (VarData->lpName == NULL) if (VarData->lpName == NULL)
{ {
@ -77,20 +78,26 @@ EditVariableDlgProc(HWND hwndDlg,
} }
SendDlgItemMessage(hwndDlg, IDC_VARIABLE_VALUE, WM_GETTEXT, dwValueLength + 1, (LPARAM)VarData->lpRawValue); SendDlgItemMessage(hwndDlg, IDC_VARIABLE_VALUE, WM_GETTEXT, dwValueLength + 1, (LPARAM)VarData->lpRawValue);
if (VarData->lpCookedValue != NULL)
{
GlobalFree(VarData->lpCookedValue);
VarData->lpCookedValue = NULL;
}
if (_tcschr(VarData->lpRawValue, _T('%'))) if (_tcschr(VarData->lpRawValue, _T('%')))
{ {
if (VarData->lpCookedValue == NULL) VarData->dwType = REG_EXPAND_SZ;
{ VarData->lpCookedValue = GlobalAlloc(GPTR, 2 * MAX_PATH * sizeof(TCHAR));
VarData->lpCookedValue = GlobalAlloc(GPTR, 2 * MAX_PATH * sizeof(TCHAR));
}
ExpandEnvironmentStrings(VarData->lpRawValue, ExpandEnvironmentStrings(VarData->lpRawValue,
VarData->lpCookedValue, VarData->lpCookedValue,
2 * MAX_PATH); 2 * MAX_PATH);
} }
else if (VarData->lpCookedValue) else
{ {
GlobalFree(VarData->lpCookedValue); VarData->dwType = REG_SZ;
VarData->lpCookedValue = GlobalAlloc(GPTR, (dwValueLength + 1) * sizeof(TCHAR));
_tcscpy(VarData->lpCookedValue, VarData->lpRawValue);
} }
} }
EndDialog(hwndDlg, 1); EndDialog(hwndDlg, 1);
@ -119,7 +126,7 @@ SetEnvironmentVariables(HWND hwndListView,
DWORD i; DWORD i;
LPTSTR lpName; LPTSTR lpName;
LPTSTR lpData; LPTSTR lpData;
LPTSTR lpExpandData = NULL; LPTSTR lpExpandData;
DWORD dwNameLength; DWORD dwNameLength;
DWORD dwDataLength; DWORD dwDataLength;
DWORD dwType; DWORD dwType;
@ -167,19 +174,28 @@ SetEnvironmentVariables(HWND hwndListView,
return; return;
} }
lpExpandData = GlobalAlloc(GPTR, 2048 * sizeof(TCHAR));
if (lpExpandData == NULL)
{
GlobalFree(lpName);
GlobalFree(lpData);
RegCloseKey(hKey);
return;
}
for (i = 0; i < dwValues; i++) for (i = 0; i < dwValues; i++)
{ {
dwNameLength = dwMaxValueNameLength + 1; dwNameLength = dwMaxValueNameLength + 1;
dwDataLength = dwMaxValueDataLength + 1; dwDataLength = dwMaxValueDataLength + 1;
if (RegEnumValue(hKey, if (RegEnumValue(hKey,
i, i,
lpName, lpName,
&dwNameLength, &dwNameLength,
NULL, NULL,
&dwType, &dwType,
(LPBYTE)lpData, (LPBYTE)lpData,
&dwDataLength)) &dwDataLength))
{ {
GlobalFree(lpName); GlobalFree(lpName);
GlobalFree(lpData); GlobalFree(lpData);
@ -187,33 +203,23 @@ SetEnvironmentVariables(HWND hwndListView,
return; return;
} }
if (dwType != REG_SZ && dwType != REG_EXPAND_SZ)
continue;
VarData = GlobalAlloc(GPTR, sizeof(VARIABLE_DATA)); VarData = GlobalAlloc(GPTR, sizeof(VARIABLE_DATA));
VarData->dwType = dwType;
VarData->lpName = GlobalAlloc(GPTR, (dwNameLength + 1) * sizeof(TCHAR)); VarData->lpName = GlobalAlloc(GPTR, (dwNameLength + 1) * sizeof(TCHAR));
_tcscpy(VarData->lpName, lpName); _tcscpy(VarData->lpName, lpName);
VarData->lpRawValue = GlobalAlloc(GPTR, (dwDataLength + 1) * sizeof(TCHAR)); VarData->lpRawValue = GlobalAlloc(GPTR, (dwDataLength + 1) * sizeof(TCHAR));
_tcscpy(VarData->lpRawValue, lpData); _tcscpy(VarData->lpRawValue, lpData);
if (dwType == REG_EXPAND_SZ) ExpandEnvironmentStrings(lpData, lpExpandData, 2048);
{
lpExpandData = GlobalAlloc(GPTR, MAX_PATH * 2* sizeof(TCHAR));
if (lpExpandData == NULL)
{
GlobalFree(lpName);
GlobalFree(lpData);
RegCloseKey(hKey);
return;
}
ExpandEnvironmentStrings(lpData, VarData->lpCookedValue = GlobalAlloc(GPTR, (_tcslen(lpExpandData) + 1) * sizeof(TCHAR));
lpExpandData, _tcscpy(VarData->lpCookedValue, lpExpandData);
2 * MAX_PATH);
VarData->lpCookedValue = GlobalAlloc(GPTR, (_tcslen(lpExpandData) + 1) * sizeof(TCHAR));
_tcscpy(VarData->lpCookedValue, lpExpandData);
GlobalFree(lpExpandData);
}
memset(&lvi, 0x00, sizeof(lvi)); memset(&lvi, 0x00, sizeof(lvi));
lvi.mask = LVIF_TEXT | LVIF_STATE | LVIF_PARAM; lvi.mask = LVIF_TEXT | LVIF_STATE | LVIF_PARAM;
@ -222,10 +228,10 @@ SetEnvironmentVariables(HWND hwndListView,
lvi.state = (i == 0) ? LVIS_SELECTED : 0; lvi.state = (i == 0) ? LVIS_SELECTED : 0;
iItem = ListView_InsertItem(hwndListView, &lvi); iItem = ListView_InsertItem(hwndListView, &lvi);
ListView_SetItemText(hwndListView, iItem, 1, ListView_SetItemText(hwndListView, iItem, 1, VarData->lpCookedValue);
(VarData->lpCookedValue) ? VarData->lpCookedValue : VarData->lpRawValue);
} }
GlobalFree(lpExpandData);
GlobalFree(lpName); GlobalFree(lpName);
GlobalFree(lpData); GlobalFree(lpData);
RegCloseKey(hKey); RegCloseKey(hKey);
@ -316,7 +322,7 @@ OnNewVariable(HWND hwndDlg,
if (!DialogBoxParam(hApplet, if (!DialogBoxParam(hApplet,
MAKEINTRESOURCE(IDD_EDIT_VARIABLE), MAKEINTRESOURCE(IDD_EDIT_VARIABLE),
hwndDlg, hwndDlg,
(DLGPROC) EditVariableDlgProc, (DLGPROC)EditVariableDlgProc,
(LPARAM)VarData) > 0) (LPARAM)VarData) > 0)
{ {
if (VarData->lpName != NULL) if (VarData->lpName != NULL)
@ -332,7 +338,7 @@ OnNewVariable(HWND hwndDlg,
} }
else else
{ {
if(VarData->lpName != NULL && (VarData->lpCookedValue || VarData->lpRawValue)) if (VarData->lpName != NULL && (VarData->lpCookedValue || VarData->lpRawValue))
{ {
memset(&lvi, 0x00, sizeof(lvi)); memset(&lvi, 0x00, sizeof(lvi));
lvi.mask = LVIF_TEXT | LVIF_STATE | LVIF_PARAM; lvi.mask = LVIF_TEXT | LVIF_STATE | LVIF_PARAM;
@ -341,8 +347,7 @@ OnNewVariable(HWND hwndDlg,
lvi.state = 0; lvi.state = 0;
iItem = ListView_InsertItem(hwndListView, &lvi); iItem = ListView_InsertItem(hwndListView, &lvi);
ListView_SetItemText(hwndListView, iItem, 1, ListView_SetItemText(hwndListView, iItem, 1, VarData->lpCookedValue);
(VarData->lpCookedValue) ? VarData->lpCookedValue : VarData->lpRawValue);
} }
} }
} }
@ -373,12 +378,11 @@ OnEditVariable(HWND hwndDlg,
if (DialogBoxParam(hApplet, if (DialogBoxParam(hApplet,
MAKEINTRESOURCE(IDD_EDIT_VARIABLE), MAKEINTRESOURCE(IDD_EDIT_VARIABLE),
hwndDlg, hwndDlg,
(DLGPROC) EditVariableDlgProc, (DLGPROC)EditVariableDlgProc,
(LPARAM)VarData) > 0) (LPARAM)VarData) > 0)
{ {
ListView_SetItemText(hwndListView, iItem, 0, VarData->lpName); ListView_SetItemText(hwndListView, iItem, 0, VarData->lpName);
ListView_SetItemText(hwndListView, iItem, 1, ListView_SetItemText(hwndListView, iItem, 1, VarData->lpCookedValue);
(VarData->lpCookedValue) ? VarData->lpCookedValue : VarData->lpRawValue);
} }
} }
} }
@ -468,6 +472,7 @@ ReleaseListViewItems(HWND hwndDlg,
} }
} }
VOID VOID
SetAllVars(HWND hwndDlg, SetAllVars(HWND hwndDlg,
INT iDlgItem) INT iDlgItem)
@ -477,7 +482,6 @@ SetAllVars(HWND hwndDlg,
LV_ITEM lvi; LV_ITEM lvi;
INT iItem; INT iItem;
HKEY hk; HKEY hk;
DWORD Type = 0;
memset(&lvi, 0x00, sizeof(lvi)); memset(&lvi, 0x00, sizeof(lvi));
@ -503,28 +507,26 @@ SetAllVars(HWND hwndDlg,
return; return;
} }
/* loop through all system variables */ /* Loop through all variables */
while(ListView_GetItem(hwndListView, &lvi)) while(ListView_GetItem(hwndListView, &lvi))
{ {
/* Get the data in each item */ /* Get the data in each item */
VarData = (PVARIABLE_DATA)lvi.lParam; VarData = (PVARIABLE_DATA)lvi.lParam;
if (VarData != NULL) if (VarData != NULL)
{ {
/* Get the type */
RegQueryValueEx(hk,VarData->lpName,NULL,&Type,NULL,NULL);
/* Set the new value */ /* Set the new value */
if (RegSetValueEx(hk, if (RegSetValueEx(hk,
VarData->lpName, VarData->lpName,
0, 0,
Type, VarData->dwType,
(LPBYTE) VarData->lpRawValue, (LPBYTE)VarData->lpRawValue,
(DWORD)(_tcslen(VarData->lpRawValue) + 1) * sizeof(TCHAR))) (DWORD)(_tcslen(VarData->lpRawValue) + 1) * sizeof(TCHAR)))
{ {
RegCloseKey(hk); RegCloseKey(hk);
return; return;
} }
} }
/* Fill struct for next item */ /* Fill struct for next item */
lvi.mask = LVIF_PARAM; lvi.mask = LVIF_PARAM;
lvi.iItem = ++iItem; lvi.iItem = ++iItem;
@ -533,6 +535,7 @@ SetAllVars(HWND hwndDlg,
RegCloseKey(hk); RegCloseKey(hk);
} }
/* Environment dialog procedure */ /* Environment dialog procedure */
INT_PTR CALLBACK INT_PTR CALLBACK
EnvironmentDlgProc(HWND hwndDlg, EnvironmentDlgProc(HWND hwndDlg,
@ -576,15 +579,20 @@ EnvironmentDlgProc(HWND hwndDlg,
case IDOK: case IDOK:
SetAllVars(hwndDlg, IDC_USER_VARIABLE_LIST); SetAllVars(hwndDlg, IDC_USER_VARIABLE_LIST);
SetAllVars(hwndDlg, IDC_SYSTEM_VARIABLE_LIST); SetAllVars(hwndDlg, IDC_SYSTEM_VARIABLE_LIST);
EndDialog(hwndDlg, 0);
return TRUE;
case IDCANCEL: case IDCANCEL:
ReleaseListViewItems(hwndDlg, IDC_USER_VARIABLE_LIST);
ReleaseListViewItems(hwndDlg, IDC_SYSTEM_VARIABLE_LIST);
EndDialog(hwndDlg, 0); EndDialog(hwndDlg, 0);
return TRUE; return TRUE;
} }
break; break;
case WM_DESTROY:
ReleaseListViewItems(hwndDlg, IDC_USER_VARIABLE_LIST);
ReleaseListViewItems(hwndDlg, IDC_SYSTEM_VARIABLE_LIST);
break;
case WM_NOTIFY: case WM_NOTIFY:
{ {
NMHDR *phdr; NMHDR *phdr;