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
19 } 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 (VarData
->lpCookedValue
!= NULL
)
83 GlobalFree(VarData
->lpCookedValue
);
84 VarData
->lpCookedValue
= NULL
;
87 if (_tcschr(VarData
->lpRawValue
, _T('%')))
89 VarData
->dwType
= REG_EXPAND_SZ
;
90 VarData
->lpCookedValue
= GlobalAlloc(GPTR
, 2 * MAX_PATH
* sizeof(TCHAR
));
92 ExpandEnvironmentStrings(VarData
->lpRawValue
,
93 VarData
->lpCookedValue
,
98 VarData
->dwType
= REG_SZ
;
99 VarData
->lpCookedValue
= GlobalAlloc(GPTR
, (dwValueLength
+ 1) * sizeof(TCHAR
));
100 _tcscpy(VarData
->lpCookedValue
, VarData
->lpRawValue
);
103 EndDialog(hwndDlg
, 1);
107 EndDialog(hwndDlg
, 0);
118 SetEnvironmentVariables(HWND hwndListView
,
124 DWORD dwMaxValueNameLength
;
125 DWORD dwMaxValueDataLength
;
133 PVARIABLE_DATA VarData
;
138 if (RegOpenKeyEx(hRootKey
,
145 if (RegQueryInfoKey(hKey
,
153 &dwMaxValueNameLength
,
154 &dwMaxValueDataLength
,
162 lpName
= GlobalAlloc(GPTR
, (dwMaxValueNameLength
+ 1) * sizeof(TCHAR
));
169 lpData
= GlobalAlloc(GPTR
, (dwMaxValueDataLength
+ 1) * sizeof(TCHAR
));
177 lpExpandData
= GlobalAlloc(GPTR
, 2048 * sizeof(TCHAR
));
178 if (lpExpandData
== NULL
)
186 for (i
= 0; i
< dwValues
; i
++)
188 dwNameLength
= dwMaxValueNameLength
+ 1;
189 dwDataLength
= dwMaxValueDataLength
+ 1;
191 if (RegEnumValue(hKey
,
206 if (dwType
!= REG_SZ
&& dwType
!= REG_EXPAND_SZ
)
209 VarData
= GlobalAlloc(GPTR
, sizeof(VARIABLE_DATA
));
211 VarData
->dwType
= dwType
;
213 VarData
->lpName
= GlobalAlloc(GPTR
, (dwNameLength
+ 1) * sizeof(TCHAR
));
214 _tcscpy(VarData
->lpName
, lpName
);
216 VarData
->lpRawValue
= GlobalAlloc(GPTR
, (dwDataLength
+ 1) * sizeof(TCHAR
));
217 _tcscpy(VarData
->lpRawValue
, lpData
);
219 ExpandEnvironmentStrings(lpData
, lpExpandData
, 2048);
221 VarData
->lpCookedValue
= GlobalAlloc(GPTR
, (_tcslen(lpExpandData
) + 1) * sizeof(TCHAR
));
222 _tcscpy(VarData
->lpCookedValue
, lpExpandData
);
224 memset(&lvi
, 0x00, sizeof(lvi
));
225 lvi
.mask
= LVIF_TEXT
| LVIF_STATE
| LVIF_PARAM
;
226 lvi
.lParam
= (LPARAM
)VarData
;
227 lvi
.pszText
= VarData
->lpName
;
228 lvi
.state
= (i
== 0) ? LVIS_SELECTED
: 0;
229 iItem
= ListView_InsertItem(hwndListView
, &lvi
);
231 ListView_SetItemText(hwndListView
, iItem
, 1, VarData
->lpCookedValue
);
234 GlobalFree(lpExpandData
);
242 SetListViewColumns(HWND hwndListView
)
248 GetClientRect(hwndListView
, &rect
);
250 memset(&column
, 0x00, sizeof(column
));
251 column
.mask
=LVCF_FMT
| LVCF_WIDTH
| LVCF_SUBITEM
| LVCF_TEXT
;
252 column
.fmt
=LVCFMT_LEFT
;
253 column
.cx
= (INT
)((rect
.right
- rect
.left
) * 0.32);
255 LoadString(hApplet
, IDS_VARIABLE
, szStr
, sizeof(szStr
) / sizeof(szStr
[0]));
256 column
.pszText
= szStr
;
257 (void)ListView_InsertColumn(hwndListView
, 0, &column
);
259 column
.cx
= (INT
)((rect
.right
- rect
.left
) * 0.63);
261 LoadString(hApplet
, IDS_VALUE
, szStr
, sizeof(szStr
) / sizeof(szStr
[0]));
262 column
.pszText
= szStr
;
263 (void)ListView_InsertColumn(hwndListView
, 1, &column
);
268 OnInitDialog(HWND hwndDlg
)
272 /* Set user environment variables */
273 hwndListView
= GetDlgItem(hwndDlg
, IDC_USER_VARIABLE_LIST
);
275 (void)ListView_SetExtendedListViewStyle(hwndListView
, LVS_EX_FULLROWSELECT
);
277 SetListViewColumns(hwndListView
);
279 SetEnvironmentVariables(hwndListView
,
283 (void)ListView_SetColumnWidth(hwndListView
,2,LVSCW_AUTOSIZE_USEHEADER
);
285 ListView_SetItemState(hwndListView
,0,LVIS_FOCUSED
,LVIS_FOCUSED
);
287 (void)ListView_Update(hwndListView
,0);
290 /* Set system environment variables */
291 hwndListView
= GetDlgItem(hwndDlg
, IDC_SYSTEM_VARIABLE_LIST
);
293 (void)ListView_SetExtendedListViewStyle(hwndListView
, LVS_EX_FULLROWSELECT
);
295 SetListViewColumns(hwndListView
);
297 SetEnvironmentVariables(hwndListView
,
299 _T("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment"));
301 (void)ListView_SetColumnWidth(hwndListView
,2,LVSCW_AUTOSIZE_USEHEADER
);
303 ListView_SetItemState(hwndListView
,0,LVIS_FOCUSED
,LVIS_FOCUSED
);
305 (void)ListView_Update(hwndListView
,0);
310 OnNewVariable(HWND hwndDlg
,
314 PVARIABLE_DATA VarData
;
318 hwndListView
= GetDlgItem(hwndDlg
, iDlgItem
);
320 VarData
= GlobalAlloc(GPTR
, sizeof(VARIABLE_DATA
));
322 if (!DialogBoxParam(hApplet
,
323 MAKEINTRESOURCE(IDD_EDIT_VARIABLE
),
325 (DLGPROC
)EditVariableDlgProc
,
326 (LPARAM
)VarData
) > 0)
328 if (VarData
->lpName
!= NULL
)
329 GlobalFree(VarData
->lpName
);
331 if (VarData
->lpRawValue
!= NULL
)
332 GlobalFree(VarData
->lpRawValue
);
334 if (VarData
->lpCookedValue
!= NULL
)
335 GlobalFree(VarData
->lpCookedValue
);
341 if (VarData
->lpName
!= NULL
&& (VarData
->lpCookedValue
|| VarData
->lpRawValue
))
343 memset(&lvi
, 0x00, sizeof(lvi
));
344 lvi
.mask
= LVIF_TEXT
| LVIF_STATE
| LVIF_PARAM
;
345 lvi
.lParam
= (LPARAM
)VarData
;
346 lvi
.pszText
= VarData
->lpName
;
348 iItem
= ListView_InsertItem(hwndListView
, &lvi
);
350 ListView_SetItemText(hwndListView
, iItem
, 1, VarData
->lpCookedValue
);
357 OnEditVariable(HWND hwndDlg
,
361 PVARIABLE_DATA VarData
;
365 hwndListView
= GetDlgItem(hwndDlg
, iDlgItem
);
367 iItem
= ListView_GetSelectionMark(hwndListView
);
370 memset(&lvi
, 0x00, sizeof(lvi
));
371 lvi
.mask
= LVIF_PARAM
;
374 if (ListView_GetItem(hwndListView
, &lvi
))
376 VarData
= (PVARIABLE_DATA
)lvi
.lParam
;
378 if (DialogBoxParam(hApplet
,
379 MAKEINTRESOURCE(IDD_EDIT_VARIABLE
),
381 (DLGPROC
)EditVariableDlgProc
,
382 (LPARAM
)VarData
) > 0)
384 ListView_SetItemText(hwndListView
, iItem
, 0, VarData
->lpName
);
385 ListView_SetItemText(hwndListView
, iItem
, 1, VarData
->lpCookedValue
);
393 OnDeleteVariable(HWND hwndDlg
,
397 PVARIABLE_DATA VarData
;
401 hwndListView
= GetDlgItem(hwndDlg
, iDlgItem
);
403 iItem
= ListView_GetSelectionMark(hwndListView
);
406 memset(&lvi
, 0x00, sizeof(lvi
));
407 lvi
.mask
= LVIF_PARAM
;
410 if (ListView_GetItem(hwndListView
, &lvi
))
412 VarData
= (PVARIABLE_DATA
)lvi
.lParam
;
415 if (VarData
->lpName
!= NULL
)
416 GlobalFree(VarData
->lpName
);
418 if (VarData
->lpRawValue
!= NULL
)
419 GlobalFree(VarData
->lpRawValue
);
421 if (VarData
->lpCookedValue
!= NULL
)
422 GlobalFree(VarData
->lpCookedValue
);
429 (void)ListView_DeleteItem(hwndListView
, iItem
);
435 ReleaseListViewItems(HWND hwndDlg
,
439 PVARIABLE_DATA VarData
;
444 hwndListView
= GetDlgItem(hwndDlg
, iDlgItem
);
446 memset(&lvi
, 0x00, sizeof(lvi
));
448 nItemCount
= ListView_GetItemCount(hwndListView
);
449 for (i
= 0; i
< nItemCount
; i
++)
451 lvi
.mask
= LVIF_PARAM
;
454 if (ListView_GetItem(hwndListView
, &lvi
))
456 VarData
= (PVARIABLE_DATA
)lvi
.lParam
;
459 if (VarData
->lpName
!= NULL
)
460 GlobalFree(VarData
->lpName
);
462 if (VarData
->lpRawValue
!= NULL
)
463 GlobalFree(VarData
->lpRawValue
);
465 if (VarData
->lpCookedValue
!= NULL
)
466 GlobalFree(VarData
->lpCookedValue
);
477 SetAllVars(HWND hwndDlg
,
481 PVARIABLE_DATA VarData
;
486 memset(&lvi
, 0x00, sizeof(lvi
));
488 /* Get the handle to the list box with all system vars in it */
489 hwndListView
= GetDlgItem(hwndDlg
, iDlgItem
);
490 /* first item is 0 */
492 /* set up struct to retreive item */
493 lvi
.mask
= LVIF_PARAM
;
496 /* Open or create the key */
497 if (RegCreateKeyEx((iDlgItem
== IDC_SYSTEM_VARIABLE_LIST
? HKEY_LOCAL_MACHINE
: HKEY_CURRENT_USER
),
498 (iDlgItem
== IDC_SYSTEM_VARIABLE_LIST
? _T("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment") : _T("Environment")),
501 REG_OPTION_NON_VOLATILE
,
502 KEY_WRITE
| KEY_READ
,
510 /* Loop through all variables */
511 while(ListView_GetItem(hwndListView
, &lvi
))
513 /* Get the data in each item */
514 VarData
= (PVARIABLE_DATA
)lvi
.lParam
;
517 /* Set the new value */
518 if (RegSetValueEx(hk
,
522 (LPBYTE
)VarData
->lpRawValue
,
523 (DWORD
)(_tcslen(VarData
->lpRawValue
) + 1) * sizeof(TCHAR
)))
530 /* Fill struct for next item */
531 lvi
.mask
= LVIF_PARAM
;
539 /* Environment dialog procedure */
541 EnvironmentDlgProc(HWND hwndDlg
,
549 OnInitDialog(hwndDlg
);
553 switch (LOWORD(wParam
))
555 case IDC_USER_VARIABLE_NEW
:
556 OnNewVariable(hwndDlg
, IDC_USER_VARIABLE_LIST
);
559 case IDC_USER_VARIABLE_EDIT
:
560 OnEditVariable(hwndDlg
, IDC_USER_VARIABLE_LIST
);
563 case IDC_USER_VARIABLE_DELETE
:
564 OnDeleteVariable(hwndDlg
, IDC_USER_VARIABLE_LIST
);
567 case IDC_SYSTEM_VARIABLE_NEW
:
568 OnNewVariable(hwndDlg
, IDC_SYSTEM_VARIABLE_LIST
);
571 case IDC_SYSTEM_VARIABLE_EDIT
:
572 OnEditVariable(hwndDlg
, IDC_SYSTEM_VARIABLE_LIST
);
575 case IDC_SYSTEM_VARIABLE_DELETE
:
576 OnDeleteVariable(hwndDlg
, IDC_SYSTEM_VARIABLE_LIST
);
580 SetAllVars(hwndDlg
, IDC_USER_VARIABLE_LIST
);
581 SetAllVars(hwndDlg
, IDC_SYSTEM_VARIABLE_LIST
);
582 EndDialog(hwndDlg
, 0);
586 EndDialog(hwndDlg
, 0);
592 ReleaseListViewItems(hwndDlg
, IDC_USER_VARIABLE_LIST
);
593 ReleaseListViewItems(hwndDlg
, IDC_SYSTEM_VARIABLE_LIST
);
600 phdr
= (NMHDR
*)lParam
;
605 if (phdr
->idFrom
== IDC_USER_VARIABLE_LIST
||
606 phdr
->idFrom
== IDC_SYSTEM_VARIABLE_LIST
)
608 OnEditVariable(hwndDlg
, (INT
)phdr
->idFrom
);