mirror of
https://github.com/reactos/reactos.git
synced 2025-08-04 08:15:41 +00:00
- 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:
parent
f546265f2f
commit
2689ce9561
1 changed files with 59 additions and 51 deletions
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue