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
;
22 EditVariableDlgProc(HWND hwndDlg
,
27 PVARIABLE_DATA VarData
;
31 VarData
= (PVARIABLE_DATA
)GetWindowLongPtr(hwndDlg
, GWL_USERDATA
);
36 SetWindowLongPtr(hwndDlg
, GWL_USERDATA
, (LONG_PTR
)lParam
);
37 VarData
= (PVARIABLE_DATA
)lParam
;
39 if (VarData
->lpName
!= NULL
)
41 SendDlgItemMessage(hwndDlg
, IDC_VARIABLE_NAME
, WM_SETTEXT
, 0, (LPARAM
)VarData
->lpName
);
44 if (VarData
->lpRawValue
!= NULL
)
46 SendDlgItemMessage(hwndDlg
, IDC_VARIABLE_VALUE
, WM_SETTEXT
, 0, (LPARAM
)VarData
->lpRawValue
);
51 switch (LOWORD(wParam
))
54 dwNameLength
= (DWORD
)SendDlgItemMessage(hwndDlg
, IDC_VARIABLE_NAME
, WM_GETTEXTLENGTH
, 0, 0);
55 dwValueLength
= (DWORD
)SendDlgItemMessage(hwndDlg
, IDC_VARIABLE_VALUE
, WM_GETTEXTLENGTH
, 0, 0);
56 if (dwNameLength
!= 0 && dwValueLength
!= 0)
58 if (VarData
->lpName
== NULL
)
60 VarData
->lpName
= GlobalAlloc(GPTR
, (dwNameLength
+ 1) * sizeof(TCHAR
));
62 else if (_tcslen(VarData
->lpName
) < dwNameLength
)
64 GlobalFree(VarData
->lpName
);
65 VarData
->lpName
= GlobalAlloc(GPTR
, (dwNameLength
+ 1) * sizeof(TCHAR
));
67 SendDlgItemMessage(hwndDlg
, IDC_VARIABLE_NAME
, WM_GETTEXT
, dwNameLength
+ 1, (LPARAM
)VarData
->lpName
);
69 if (VarData
->lpRawValue
== NULL
)
71 VarData
->lpRawValue
= GlobalAlloc(GPTR
, (dwValueLength
+ 1) * sizeof(TCHAR
));
73 else if (_tcslen(VarData
->lpRawValue
) < dwValueLength
)
75 GlobalFree(VarData
->lpRawValue
);
76 VarData
->lpRawValue
= GlobalAlloc(GPTR
, (dwValueLength
+ 1) * sizeof(TCHAR
));
78 SendDlgItemMessage(hwndDlg
, IDC_VARIABLE_VALUE
, WM_GETTEXT
, dwValueLength
+ 1, (LPARAM
)VarData
->lpRawValue
);
80 if (_tcschr(VarData
->lpRawValue
, _T('%')))
82 if (VarData
->lpCookedValue
== NULL
)
84 VarData
->lpCookedValue
= GlobalAlloc(GPTR
, 2 * MAX_PATH
* sizeof(TCHAR
));
87 ExpandEnvironmentStrings(VarData
->lpRawValue
,
88 VarData
->lpCookedValue
,
91 else if (VarData
->lpCookedValue
)
93 GlobalFree(VarData
->lpCookedValue
);
96 EndDialog(hwndDlg
, 1);
100 EndDialog(hwndDlg
, 0);
111 SetEnvironmentVariables(HWND hwndListView
,
117 DWORD dwMaxValueNameLength
;
118 DWORD dwMaxValueDataLength
;
122 LPTSTR lpExpandData
= NULL
;
126 PVARIABLE_DATA VarData
;
131 if (RegOpenKeyEx(hRootKey
,
138 if (RegQueryInfoKey(hKey
,
146 &dwMaxValueNameLength
,
147 &dwMaxValueDataLength
,
155 lpName
= GlobalAlloc(GPTR
, (dwMaxValueNameLength
+ 1) * sizeof(TCHAR
));
162 lpData
= GlobalAlloc(GPTR
, (dwMaxValueDataLength
+ 1) * sizeof(TCHAR
));
170 for (i
= 0; i
< dwValues
; i
++)
172 dwNameLength
= dwMaxValueNameLength
+ 1;
173 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 (void)ListView_SetExtendedListViewStyle(hwndListView
, LVS_EX_FULLROWSELECT
);
271 SetListViewColumns(hwndListView
);
273 SetEnvironmentVariables(hwndListView
,
277 (void)ListView_SetColumnWidth(hwndListView
,2,LVSCW_AUTOSIZE_USEHEADER
);
279 ListView_SetItemState(hwndListView
,0,LVIS_FOCUSED
,LVIS_FOCUSED
);
281 (void)ListView_Update(hwndListView
,0);
284 /* Set system environment variables */
285 hwndListView
= GetDlgItem(hwndDlg
, IDC_SYSTEM_VARIABLE_LIST
);
287 (void)ListView_SetExtendedListViewStyle(hwndListView
, LVS_EX_FULLROWSELECT
);
289 SetListViewColumns(hwndListView
);
291 SetEnvironmentVariables(hwndListView
,
293 _T("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment"));
295 (void)ListView_SetColumnWidth(hwndListView
,2,LVSCW_AUTOSIZE_USEHEADER
);
297 ListView_SetItemState(hwndListView
,0,LVIS_FOCUSED
,LVIS_FOCUSED
);
299 (void)ListView_Update(hwndListView
,0);
304 OnNewVariable(HWND hwndDlg
,
308 PVARIABLE_DATA VarData
;
312 hwndListView
= GetDlgItem(hwndDlg
, iDlgItem
);
314 VarData
= GlobalAlloc(GPTR
, sizeof(VARIABLE_DATA
));
316 if (!DialogBoxParam(hApplet
,
317 MAKEINTRESOURCE(IDD_EDIT_VARIABLE
),
319 (DLGPROC
) EditVariableDlgProc
,
320 (LPARAM
)VarData
) > 0)
322 if (VarData
->lpName
!= NULL
)
323 GlobalFree(VarData
->lpName
);
325 if (VarData
->lpRawValue
!= NULL
)
326 GlobalFree(VarData
->lpRawValue
);
328 if (VarData
->lpCookedValue
!= NULL
)
329 GlobalFree(VarData
->lpCookedValue
);
335 if(VarData
->lpName
!= NULL
&& (VarData
->lpCookedValue
|| VarData
->lpRawValue
))
337 memset(&lvi
, 0x00, sizeof(lvi
));
338 lvi
.mask
= LVIF_TEXT
| LVIF_STATE
| LVIF_PARAM
;
339 lvi
.lParam
= (LPARAM
)VarData
;
340 lvi
.pszText
= VarData
->lpName
;
342 iItem
= ListView_InsertItem(hwndListView
, &lvi
);
344 ListView_SetItemText(hwndListView
, iItem
, 1,
345 (VarData
->lpCookedValue
) ? VarData
->lpCookedValue
: VarData
->lpRawValue
);
352 OnEditVariable(HWND hwndDlg
,
356 PVARIABLE_DATA VarData
;
360 hwndListView
= GetDlgItem(hwndDlg
, iDlgItem
);
362 iItem
= ListView_GetSelectionMark(hwndListView
);
365 memset(&lvi
, 0x00, sizeof(lvi
));
366 lvi
.mask
= LVIF_PARAM
;
369 if (ListView_GetItem(hwndListView
, &lvi
))
371 VarData
= (PVARIABLE_DATA
)lvi
.lParam
;
373 if (DialogBoxParam(hApplet
,
374 MAKEINTRESOURCE(IDD_EDIT_VARIABLE
),
376 (DLGPROC
) EditVariableDlgProc
,
377 (LPARAM
)VarData
) > 0)
379 ListView_SetItemText(hwndListView
, iItem
, 0, VarData
->lpName
);
380 ListView_SetItemText(hwndListView
, iItem
, 1,
381 (VarData
->lpCookedValue
) ? VarData
->lpCookedValue
: VarData
->lpRawValue
);
389 OnDeleteVariable(HWND hwndDlg
,
393 PVARIABLE_DATA VarData
;
397 hwndListView
= GetDlgItem(hwndDlg
, iDlgItem
);
399 iItem
= ListView_GetSelectionMark(hwndListView
);
402 memset(&lvi
, 0x00, sizeof(lvi
));
403 lvi
.mask
= LVIF_PARAM
;
406 if (ListView_GetItem(hwndListView
, &lvi
))
408 VarData
= (PVARIABLE_DATA
)lvi
.lParam
;
411 if (VarData
->lpName
!= NULL
)
412 GlobalFree(VarData
->lpName
);
414 if (VarData
->lpRawValue
!= NULL
)
415 GlobalFree(VarData
->lpRawValue
);
417 if (VarData
->lpCookedValue
!= NULL
)
418 GlobalFree(VarData
->lpCookedValue
);
425 (void)ListView_DeleteItem(hwndListView
, iItem
);
431 ReleaseListViewItems(HWND hwndDlg
,
435 PVARIABLE_DATA VarData
;
440 hwndListView
= GetDlgItem(hwndDlg
, iDlgItem
);
442 memset(&lvi
, 0x00, sizeof(lvi
));
444 nItemCount
= ListView_GetItemCount(hwndListView
);
445 for (i
= 0; i
< nItemCount
; i
++)
447 lvi
.mask
= LVIF_PARAM
;
450 if (ListView_GetItem(hwndListView
, &lvi
))
452 VarData
= (PVARIABLE_DATA
)lvi
.lParam
;
455 if (VarData
->lpName
!= NULL
)
456 GlobalFree(VarData
->lpName
);
458 if (VarData
->lpRawValue
!= NULL
)
459 GlobalFree(VarData
->lpRawValue
);
461 if (VarData
->lpCookedValue
!= NULL
)
462 GlobalFree(VarData
->lpCookedValue
);
472 SetAllVars(HWND hwndDlg
,
476 PVARIABLE_DATA VarData
;
482 memset(&lvi
, 0x00, sizeof(lvi
));
484 /* Get the handle to the list box with all system vars in it */
485 hwndListView
= GetDlgItem(hwndDlg
, iDlgItem
);
486 /* first item is 0 */
488 /* set up struct to retreive item */
489 lvi
.mask
= LVIF_PARAM
;
492 /* Open or create the key */
493 if (RegCreateKeyEx((iDlgItem
== IDC_SYSTEM_VARIABLE_LIST
? HKEY_LOCAL_MACHINE
: HKEY_CURRENT_USER
),
494 (iDlgItem
== IDC_SYSTEM_VARIABLE_LIST
? _T("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment") : _T("Environment")),
497 REG_OPTION_NON_VOLATILE
,
498 KEY_WRITE
| KEY_READ
,
506 /* loop through all system variables */
507 while(ListView_GetItem(hwndListView
, &lvi
))
509 /* Get the data in each item */
510 VarData
= (PVARIABLE_DATA
)lvi
.lParam
;
514 RegQueryValueEx(hk
,VarData
->lpName
,NULL
,&Type
,NULL
,NULL
);
516 /* Set the new value */
517 if (RegSetValueEx(hk
,
521 (LPBYTE
) VarData
->lpRawValue
,
522 (DWORD
)(_tcslen(VarData
->lpRawValue
) + 1) * sizeof(TCHAR
)))
528 /* Fill struct for next item */
529 lvi
.mask
= LVIF_PARAM
;
536 /* Environment dialog procedure */
538 EnvironmentDlgProc(HWND hwndDlg
,
546 OnInitDialog(hwndDlg
);
550 switch (LOWORD(wParam
))
552 case IDC_USER_VARIABLE_NEW
:
553 OnNewVariable(hwndDlg
, IDC_USER_VARIABLE_LIST
);
556 case IDC_USER_VARIABLE_EDIT
:
557 OnEditVariable(hwndDlg
, IDC_USER_VARIABLE_LIST
);
560 case IDC_USER_VARIABLE_DELETE
:
561 OnDeleteVariable(hwndDlg
, IDC_USER_VARIABLE_LIST
);
564 case IDC_SYSTEM_VARIABLE_NEW
:
565 OnNewVariable(hwndDlg
, IDC_SYSTEM_VARIABLE_LIST
);
568 case IDC_SYSTEM_VARIABLE_EDIT
:
569 OnEditVariable(hwndDlg
, IDC_SYSTEM_VARIABLE_LIST
);
572 case IDC_SYSTEM_VARIABLE_DELETE
:
573 OnDeleteVariable(hwndDlg
, IDC_SYSTEM_VARIABLE_LIST
);
577 SetAllVars(hwndDlg
, IDC_USER_VARIABLE_LIST
);
578 SetAllVars(hwndDlg
, IDC_SYSTEM_VARIABLE_LIST
);
581 ReleaseListViewItems(hwndDlg
, IDC_USER_VARIABLE_LIST
);
582 ReleaseListViewItems(hwndDlg
, IDC_SYSTEM_VARIABLE_LIST
);
583 EndDialog(hwndDlg
, 0);
592 phdr
= (NMHDR
*)lParam
;
597 if (phdr
->idFrom
== IDC_USER_VARIABLE_LIST
||
598 phdr
->idFrom
== IDC_SYSTEM_VARIABLE_LIST
)
600 OnEditVariable(hwndDlg
, (INT
)phdr
->idFrom
);