2 * PROJECT: ReactOS System Control Panel Applet
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll/cpl/sysdm/environment.c
5 * PURPOSE: Environment variable settings
6 * COPYRIGHT: Copyright Eric Kohl
13 typedef struct _VARIABLE_DATA
18 } VARIABLE_DATA
, *PVARIABLE_DATA
;
23 EditVariableDlgProc(HWND hwndDlg
,
28 PVARIABLE_DATA VarData
;
32 VarData
= (PVARIABLE_DATA
)GetWindowLongPtr(hwndDlg
, GWL_USERDATA
);
37 SetWindowLongPtr(hwndDlg
, GWL_USERDATA
, (LONG_PTR
)lParam
);
38 VarData
= (PVARIABLE_DATA
)lParam
;
40 if (VarData
->lpName
!= NULL
)
42 SendDlgItemMessage(hwndDlg
, IDC_VARIABLE_NAME
, WM_SETTEXT
, 0, (LPARAM
)VarData
->lpName
);
45 if (VarData
->lpRawValue
!= NULL
)
47 SendDlgItemMessage(hwndDlg
, IDC_VARIABLE_VALUE
, WM_SETTEXT
, 0, (LPARAM
)VarData
->lpRawValue
);
52 switch (LOWORD(wParam
))
55 dwNameLength
= (DWORD
)SendDlgItemMessage(hwndDlg
, IDC_VARIABLE_NAME
, WM_GETTEXTLENGTH
, 0, 0);
56 dwValueLength
= (DWORD
)SendDlgItemMessage(hwndDlg
, IDC_VARIABLE_VALUE
, WM_GETTEXTLENGTH
, 0, 0);
57 if (dwNameLength
!= 0 && dwValueLength
!= 0)
59 if (VarData
->lpName
== NULL
)
61 VarData
->lpName
= GlobalAlloc(GPTR
, (dwNameLength
+ 1) * sizeof(TCHAR
));
63 else if (_tcslen(VarData
->lpName
) < dwNameLength
)
65 GlobalFree(VarData
->lpName
);
66 VarData
->lpName
= GlobalAlloc(GPTR
, (dwNameLength
+ 1) * sizeof(TCHAR
));
68 SendDlgItemMessage(hwndDlg
, IDC_VARIABLE_NAME
, WM_GETTEXT
, dwNameLength
+ 1, (LPARAM
)VarData
->lpName
);
70 if (VarData
->lpRawValue
== NULL
)
72 VarData
->lpRawValue
= GlobalAlloc(GPTR
, (dwValueLength
+ 1) * sizeof(TCHAR
));
74 else if (_tcslen(VarData
->lpRawValue
) < dwValueLength
)
76 GlobalFree(VarData
->lpRawValue
);
77 VarData
->lpRawValue
= GlobalAlloc(GPTR
, (dwValueLength
+ 1) * sizeof(TCHAR
));
79 SendDlgItemMessage(hwndDlg
, IDC_VARIABLE_VALUE
, WM_GETTEXT
, dwValueLength
+ 1, (LPARAM
)VarData
->lpRawValue
);
81 if (_tcschr(VarData
->lpRawValue
, _T('%')))
83 if (VarData
->lpCookedValue
== NULL
)
85 VarData
->lpCookedValue
= GlobalAlloc(GPTR
, 2 * MAX_PATH
* sizeof(TCHAR
));
88 ExpandEnvironmentStrings(VarData
->lpRawValue
,
89 VarData
->lpCookedValue
,
92 else if (VarData
->lpCookedValue
)
94 GlobalFree(VarData
->lpCookedValue
);
97 EndDialog(hwndDlg
, 1);
101 EndDialog(hwndDlg
, 0);
112 SetEnvironmentVariables(HWND hwndListView
,
118 DWORD dwMaxValueNameLength
;
119 DWORD dwMaxValueDataLength
;
123 LPTSTR lpExpandData
= NULL
;
127 PVARIABLE_DATA VarData
;
132 if (RegOpenKeyEx(hRootKey
,
139 if (RegQueryInfoKey(hKey
,
147 &dwMaxValueNameLength
,
148 &dwMaxValueDataLength
,
156 lpName
= GlobalAlloc(GPTR
, (dwMaxValueNameLength
+ 1) * sizeof(TCHAR
));
163 lpData
= GlobalAlloc(GPTR
, (dwMaxValueDataLength
+ 1) * sizeof(TCHAR
));
171 for (i
= 0; i
< dwValues
; i
++)
173 dwNameLength
= dwMaxValueNameLength
+ 1;
174 dwDataLength
= dwMaxValueDataLength
+ 1;
175 if (RegEnumValue(hKey
,
190 VarData
= GlobalAlloc(GPTR
, sizeof(VARIABLE_DATA
));
192 VarData
->lpName
= GlobalAlloc(GPTR
, (dwNameLength
+ 1) * sizeof(TCHAR
));
193 _tcscpy(VarData
->lpName
, lpName
);
195 VarData
->lpRawValue
= GlobalAlloc(GPTR
, (dwDataLength
+ 1) * sizeof(TCHAR
));
196 _tcscpy(VarData
->lpRawValue
, lpData
);
198 if (dwType
== REG_EXPAND_SZ
)
200 lpExpandData
= GlobalAlloc(GPTR
, MAX_PATH
* 2* sizeof(TCHAR
));
201 if (lpExpandData
== NULL
)
209 ExpandEnvironmentStrings(lpData
,
213 VarData
->lpCookedValue
= GlobalAlloc(GPTR
, (_tcslen(lpExpandData
) + 1) * sizeof(TCHAR
));
214 _tcscpy(VarData
->lpCookedValue
, lpExpandData
);
215 GlobalFree(lpExpandData
);
218 memset(&lvi
, 0x00, sizeof(lvi
));
219 lvi
.mask
= LVIF_TEXT
| LVIF_STATE
| LVIF_PARAM
;
220 lvi
.lParam
= (LPARAM
)VarData
;
221 lvi
.pszText
= VarData
->lpName
;
222 lvi
.state
= (i
== 0) ? LVIS_SELECTED
: 0;
223 iItem
= ListView_InsertItem(hwndListView
, &lvi
);
225 ListView_SetItemText(hwndListView
, iItem
, 1,
226 (VarData
->lpCookedValue
) ? VarData
->lpCookedValue
: VarData
->lpRawValue
);
236 SetListViewColumns(HWND hwndListView
)
242 GetClientRect(hwndListView
, &rect
);
244 memset(&column
, 0x00, sizeof(column
));
245 column
.mask
=LVCF_FMT
| LVCF_WIDTH
| LVCF_SUBITEM
| LVCF_TEXT
;
246 column
.fmt
=LVCFMT_LEFT
;
247 column
.cx
= (INT
)((rect
.right
- rect
.left
) * 0.32);
249 LoadString(hApplet
, IDS_VARIABLE
, szStr
, sizeof(szStr
) / sizeof(szStr
[0]));
250 column
.pszText
= szStr
;
251 (void)ListView_InsertColumn(hwndListView
, 0, &column
);
253 column
.cx
= (INT
)((rect
.right
- rect
.left
) * 0.63);
255 LoadString(hApplet
, IDS_VALUE
, szStr
, sizeof(szStr
) / sizeof(szStr
[0]));
256 column
.pszText
= szStr
;
257 (void)ListView_InsertColumn(hwndListView
, 1, &column
);
262 OnInitDialog(HWND hwndDlg
)
266 /* Set user environment variables */
267 hwndListView
= GetDlgItem(hwndDlg
, IDC_USER_VARIABLE_LIST
);
269 SetListViewColumns(hwndListView
);
271 SetEnvironmentVariables(hwndListView
,
275 (void)ListView_SetColumnWidth(hwndListView
,2,LVSCW_AUTOSIZE_USEHEADER
);
276 (void)ListView_Update(hwndListView
,0);
279 /* Set system environment variables */
280 hwndListView
= GetDlgItem(hwndDlg
, IDC_SYSTEM_VARIABLE_LIST
);
282 SetListViewColumns(hwndListView
);
284 SetEnvironmentVariables(hwndListView
,
286 _T("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment"));
288 (void)ListView_SetColumnWidth(hwndListView
,2,LVSCW_AUTOSIZE_USEHEADER
);
289 (void)ListView_Update(hwndListView
,0);
294 OnNewVariable(HWND hwndDlg
,
298 PVARIABLE_DATA VarData
;
302 hwndListView
= GetDlgItem(hwndDlg
, iDlgItem
);
304 VarData
= GlobalAlloc(GPTR
, sizeof(VARIABLE_DATA
));
306 if (!DialogBoxParam(hApplet
,
307 MAKEINTRESOURCE(IDD_EDIT_VARIABLE
),
309 (DLGPROC
) EditVariableDlgProc
,
310 (LPARAM
)VarData
) > 0)
312 if (VarData
->lpName
!= NULL
)
313 GlobalFree(VarData
->lpName
);
315 if (VarData
->lpRawValue
!= NULL
)
316 GlobalFree(VarData
->lpRawValue
);
318 if (VarData
->lpCookedValue
!= NULL
)
319 GlobalFree(VarData
->lpCookedValue
);
324 memset(&lvi
, 0x00, sizeof(lvi
));
325 lvi
.mask
= LVIF_TEXT
| LVIF_STATE
| LVIF_PARAM
;
326 lvi
.lParam
= (LPARAM
)VarData
;
327 lvi
.pszText
= VarData
->lpName
;
329 iItem
= ListView_InsertItem(hwndListView
, &lvi
);
331 ListView_SetItemText(hwndListView
, iItem
, 1,
332 (VarData
->lpCookedValue
) ? VarData
->lpCookedValue
: VarData
->lpRawValue
);
337 OnEditVariable(HWND hwndDlg
,
341 PVARIABLE_DATA VarData
;
345 hwndListView
= GetDlgItem(hwndDlg
, iDlgItem
);
347 iItem
= ListView_GetSelectionMark(hwndListView
);
350 memset(&lvi
, 0x00, sizeof(lvi
));
351 lvi
.mask
= LVIF_PARAM
;
354 if (ListView_GetItem(hwndListView
, &lvi
))
356 VarData
= (PVARIABLE_DATA
)lvi
.lParam
;
358 if (DialogBoxParam(hApplet
,
359 MAKEINTRESOURCE(IDD_EDIT_VARIABLE
),
361 (DLGPROC
) EditVariableDlgProc
,
362 (LPARAM
)VarData
) > 0)
364 ListView_SetItemText(hwndListView
, iItem
, 0, VarData
->lpName
);
365 ListView_SetItemText(hwndListView
, iItem
, 1,
366 (VarData
->lpCookedValue
) ? VarData
->lpCookedValue
: VarData
->lpRawValue
);
374 OnDeleteVariable(HWND hwndDlg
,
378 PVARIABLE_DATA VarData
;
382 hwndListView
= GetDlgItem(hwndDlg
, iDlgItem
);
384 iItem
= ListView_GetSelectionMark(hwndListView
);
387 memset(&lvi
, 0x00, sizeof(lvi
));
388 lvi
.mask
= LVIF_PARAM
;
391 if (ListView_GetItem(hwndListView
, &lvi
))
393 VarData
= (PVARIABLE_DATA
)lvi
.lParam
;
396 if (VarData
->lpName
!= NULL
)
397 GlobalFree(VarData
->lpName
);
399 if (VarData
->lpRawValue
!= NULL
)
400 GlobalFree(VarData
->lpRawValue
);
402 if (VarData
->lpCookedValue
!= NULL
)
403 GlobalFree(VarData
->lpCookedValue
);
410 (void)ListView_DeleteItem(hwndListView
, iItem
);
416 ReleaseListViewItems(HWND hwndDlg
,
420 PVARIABLE_DATA VarData
;
425 hwndListView
= GetDlgItem(hwndDlg
, iDlgItem
);
427 memset(&lvi
, 0x00, sizeof(lvi
));
429 nItemCount
= ListView_GetItemCount(hwndListView
);
430 for (i
= 0; i
< nItemCount
; i
++)
432 lvi
.mask
= LVIF_PARAM
;
435 if (ListView_GetItem(hwndListView
, &lvi
))
437 VarData
= (PVARIABLE_DATA
)lvi
.lParam
;
440 if (VarData
->lpName
!= NULL
)
441 GlobalFree(VarData
->lpName
);
443 if (VarData
->lpRawValue
!= NULL
)
444 GlobalFree(VarData
->lpRawValue
);
446 if (VarData
->lpCookedValue
!= NULL
)
447 GlobalFree(VarData
->lpCookedValue
);
457 SetAllVars(HWND hwndDlg
,
461 PVARIABLE_DATA VarData
;
467 memset(&lvi
, 0x00, sizeof(lvi
));
469 /* Get the handle to the list box with all system vars in it */
470 hwndListView
= GetDlgItem(hwndDlg
, iDlgItem
);
471 /* first item is 0 */
473 /* set up struct to retreive item */
474 lvi
.mask
= LVIF_PARAM
;
477 /* Open or create the key */
478 if (RegCreateKeyEx((iDlgItem
== IDC_SYSTEM_VARIABLE_LIST
? HKEY_LOCAL_MACHINE
: HKEY_CURRENT_USER
),
479 (iDlgItem
== IDC_SYSTEM_VARIABLE_LIST
? _T("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment") : _T("Environment")),
482 REG_OPTION_NON_VOLATILE
,
483 KEY_WRITE
| KEY_READ
,
491 /* loop through all system variables */
492 while(ListView_GetItem(hwndListView
, &lvi
))
494 /* Get the data in each item */
495 VarData
= (PVARIABLE_DATA
)lvi
.lParam
;
499 RegQueryValueEx(hk
,VarData
->lpName
,NULL
,&Type
,NULL
,NULL
);
501 /* Set the new value */
502 if (RegSetValueEx(hk
,
506 (LPBYTE
) VarData
->lpRawValue
,
507 (DWORD
) (_tcslen(VarData
->lpRawValue
)* sizeof(TCHAR
))+1)) // was _tcsclen. lstrlen?
513 /* Fill struct for next item */
514 lvi
.mask
= LVIF_PARAM
;
521 /* Environment dialog procedure */
523 EnvironmentDlgProc(HWND hwndDlg
,
531 OnInitDialog(hwndDlg
);
535 switch (LOWORD(wParam
))
537 case IDC_USER_VARIABLE_NEW
:
538 OnNewVariable(hwndDlg
, IDC_USER_VARIABLE_LIST
);
541 case IDC_USER_VARIABLE_EDIT
:
542 OnEditVariable(hwndDlg
, IDC_USER_VARIABLE_LIST
);
545 case IDC_USER_VARIABLE_DELETE
:
546 OnDeleteVariable(hwndDlg
, IDC_USER_VARIABLE_LIST
);
549 case IDC_SYSTEM_VARIABLE_NEW
:
550 OnNewVariable(hwndDlg
, IDC_SYSTEM_VARIABLE_LIST
);
553 case IDC_SYSTEM_VARIABLE_EDIT
:
554 OnEditVariable(hwndDlg
, IDC_SYSTEM_VARIABLE_LIST
);
557 case IDC_SYSTEM_VARIABLE_DELETE
:
558 OnDeleteVariable(hwndDlg
, IDC_SYSTEM_VARIABLE_LIST
);
562 SetAllVars(hwndDlg
, IDC_USER_VARIABLE_LIST
);
563 SetAllVars(hwndDlg
, IDC_SYSTEM_VARIABLE_LIST
);
566 ReleaseListViewItems(hwndDlg
, IDC_USER_VARIABLE_LIST
);
567 ReleaseListViewItems(hwndDlg
, IDC_SYSTEM_VARIABLE_LIST
);
568 EndDialog(hwndDlg
, 0);
577 phdr
= (NMHDR
*)lParam
;
582 if (phdr
->idFrom
== IDC_USER_VARIABLE_LIST
||
583 phdr
->idFrom
== IDC_SYSTEM_VARIABLE_LIST
)
585 OnEditVariable(hwndDlg
, (INT
)phdr
->idFrom
);