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
)
241 GetClientRect(hwndListView
, &rect
);
243 memset(&column
, 0x00, sizeof(column
));
244 column
.mask
=LVCF_FMT
| LVCF_WIDTH
| LVCF_SUBITEM
| LVCF_TEXT
;
245 column
.fmt
=LVCFMT_LEFT
;
246 column
.cx
= (INT
)((rect
.right
- rect
.left
) * 0.32);
248 column
.pszText
= _T("Variable");
249 (void)ListView_InsertColumn(hwndListView
, 0, &column
);
251 column
.cx
= (INT
)((rect
.right
- rect
.left
) * 0.63);
253 column
.pszText
= _T("Value");
254 (void)ListView_InsertColumn(hwndListView
, 1, &column
);
259 OnInitDialog(HWND hwndDlg
)
263 /* Set user environment variables */
264 hwndListView
= GetDlgItem(hwndDlg
, IDC_USER_VARIABLE_LIST
);
266 SetListViewColumns(hwndListView
);
268 SetEnvironmentVariables(hwndListView
,
272 (void)ListView_SetColumnWidth(hwndListView
,2,LVSCW_AUTOSIZE_USEHEADER
);
273 (void)ListView_Update(hwndListView
,0);
276 /* Set system environment variables */
277 hwndListView
= GetDlgItem(hwndDlg
, IDC_SYSTEM_VARIABLE_LIST
);
279 SetListViewColumns(hwndListView
);
281 SetEnvironmentVariables(hwndListView
,
283 _T("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment"));
285 (void)ListView_SetColumnWidth(hwndListView
,2,LVSCW_AUTOSIZE_USEHEADER
);
286 (void)ListView_Update(hwndListView
,0);
291 OnNewVariable(HWND hwndDlg
,
295 PVARIABLE_DATA VarData
;
299 hwndListView
= GetDlgItem(hwndDlg
, iDlgItem
);
301 VarData
= GlobalAlloc(GPTR
, sizeof(VARIABLE_DATA
));
303 if (!DialogBoxParam(hApplet
,
304 MAKEINTRESOURCE(IDD_EDIT_VARIABLE
),
306 (DLGPROC
) EditVariableDlgProc
,
307 (LPARAM
)VarData
) > 0)
309 if (VarData
->lpName
!= NULL
)
310 GlobalFree(VarData
->lpName
);
312 if (VarData
->lpRawValue
!= NULL
)
313 GlobalFree(VarData
->lpRawValue
);
315 if (VarData
->lpCookedValue
!= NULL
)
316 GlobalFree(VarData
->lpCookedValue
);
321 memset(&lvi
, 0x00, sizeof(lvi
));
322 lvi
.mask
= LVIF_TEXT
| LVIF_STATE
| LVIF_PARAM
;
323 lvi
.lParam
= (LPARAM
)VarData
;
324 lvi
.pszText
= VarData
->lpName
;
326 iItem
= ListView_InsertItem(hwndListView
, &lvi
);
328 ListView_SetItemText(hwndListView
, iItem
, 1,
329 (VarData
->lpCookedValue
) ? VarData
->lpCookedValue
: VarData
->lpRawValue
);
334 OnEditVariable(HWND hwndDlg
,
338 PVARIABLE_DATA VarData
;
342 hwndListView
= GetDlgItem(hwndDlg
, iDlgItem
);
344 iItem
= ListView_GetSelectionMark(hwndListView
);
347 memset(&lvi
, 0x00, sizeof(lvi
));
348 lvi
.mask
= LVIF_PARAM
;
351 if (ListView_GetItem(hwndListView
, &lvi
))
353 VarData
= (PVARIABLE_DATA
)lvi
.lParam
;
355 if (DialogBoxParam(hApplet
,
356 MAKEINTRESOURCE(IDD_EDIT_VARIABLE
),
358 (DLGPROC
) EditVariableDlgProc
,
359 (LPARAM
)VarData
) > 0)
361 ListView_SetItemText(hwndListView
, iItem
, 0, VarData
->lpName
);
362 ListView_SetItemText(hwndListView
, iItem
, 1,
363 (VarData
->lpCookedValue
) ? VarData
->lpCookedValue
: VarData
->lpRawValue
);
371 OnDeleteVariable(HWND hwndDlg
,
375 PVARIABLE_DATA VarData
;
379 hwndListView
= GetDlgItem(hwndDlg
, iDlgItem
);
381 iItem
= ListView_GetSelectionMark(hwndListView
);
384 memset(&lvi
, 0x00, sizeof(lvi
));
385 lvi
.mask
= LVIF_PARAM
;
388 if (ListView_GetItem(hwndListView
, &lvi
))
390 VarData
= (PVARIABLE_DATA
)lvi
.lParam
;
393 if (VarData
->lpName
!= NULL
)
394 GlobalFree(VarData
->lpName
);
396 if (VarData
->lpRawValue
!= NULL
)
397 GlobalFree(VarData
->lpRawValue
);
399 if (VarData
->lpCookedValue
!= NULL
)
400 GlobalFree(VarData
->lpCookedValue
);
407 (void)ListView_DeleteItem(hwndListView
, iItem
);
413 ReleaseListViewItems(HWND hwndDlg
,
417 PVARIABLE_DATA VarData
;
422 hwndListView
= GetDlgItem(hwndDlg
, iDlgItem
);
424 memset(&lvi
, 0x00, sizeof(lvi
));
426 nItemCount
= ListView_GetItemCount(hwndListView
);
427 for (i
= 0; i
< nItemCount
; i
++)
429 lvi
.mask
= LVIF_PARAM
;
432 if (ListView_GetItem(hwndListView
, &lvi
))
434 VarData
= (PVARIABLE_DATA
)lvi
.lParam
;
437 if (VarData
->lpName
!= NULL
)
438 GlobalFree(VarData
->lpName
);
440 if (VarData
->lpRawValue
!= NULL
)
441 GlobalFree(VarData
->lpRawValue
);
443 if (VarData
->lpCookedValue
!= NULL
)
444 GlobalFree(VarData
->lpCookedValue
);
454 SetAllVars(HWND hwndDlg
,
458 PVARIABLE_DATA VarData
;
464 memset(&lvi
, 0x00, sizeof(lvi
));
466 /* Get the handle to the list box with all system vars in it */
467 hwndListView
= GetDlgItem(hwndDlg
, iDlgItem
);
468 /* first item is 0 */
470 /* set up struct to retreive item */
471 lvi
.mask
= LVIF_PARAM
;
474 /* Open or create the key */
475 if (RegCreateKeyEx((iDlgItem
== IDC_SYSTEM_VARIABLE_LIST
? HKEY_LOCAL_MACHINE
: HKEY_CURRENT_USER
),
476 (iDlgItem
== IDC_SYSTEM_VARIABLE_LIST
? _T("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment") : _T("Environment")),
479 REG_OPTION_NON_VOLATILE
,
480 KEY_WRITE
| KEY_READ
,
488 /* loop through all system variables */
489 while(ListView_GetItem(hwndListView
, &lvi
))
491 /* Get the data in each item */
492 VarData
= (PVARIABLE_DATA
)lvi
.lParam
;
496 RegQueryValueEx(hk
,VarData
->lpName
,NULL
,&Type
,NULL
,NULL
);
498 /* Set the new value */
499 if (RegSetValueEx(hk
,
503 (LPBYTE
) VarData
->lpRawValue
,
504 (DWORD
) (_tcslen(VarData
->lpRawValue
)* sizeof(TCHAR
))+1)) // was _tcsclen. lstrlen?
510 /* Fill struct for next item */
511 lvi
.mask
= LVIF_PARAM
;
518 /* Environment dialog procedure */
520 EnvironmentDlgProc(HWND hwndDlg
,
528 OnInitDialog(hwndDlg
);
532 switch (LOWORD(wParam
))
534 case IDC_USER_VARIABLE_NEW
:
535 OnNewVariable(hwndDlg
, IDC_USER_VARIABLE_LIST
);
538 case IDC_USER_VARIABLE_EDIT
:
539 OnEditVariable(hwndDlg
, IDC_USER_VARIABLE_LIST
);
542 case IDC_USER_VARIABLE_DELETE
:
543 OnDeleteVariable(hwndDlg
, IDC_USER_VARIABLE_LIST
);
546 case IDC_SYSTEM_VARIABLE_NEW
:
547 OnNewVariable(hwndDlg
, IDC_SYSTEM_VARIABLE_LIST
);
550 case IDC_SYSTEM_VARIABLE_EDIT
:
551 OnEditVariable(hwndDlg
, IDC_SYSTEM_VARIABLE_LIST
);
554 case IDC_SYSTEM_VARIABLE_DELETE
:
555 OnDeleteVariable(hwndDlg
, IDC_SYSTEM_VARIABLE_LIST
);
559 SetAllVars(hwndDlg
, IDC_USER_VARIABLE_LIST
);
560 SetAllVars(hwndDlg
, IDC_SYSTEM_VARIABLE_LIST
);
563 ReleaseListViewItems(hwndDlg
, IDC_USER_VARIABLE_LIST
);
564 ReleaseListViewItems(hwndDlg
, IDC_SYSTEM_VARIABLE_LIST
);
565 EndDialog(hwndDlg
, 0);
574 phdr
= (NMHDR
*)lParam
;
579 if (phdr
->idFrom
== IDC_USER_VARIABLE_LIST
||
580 phdr
->idFrom
== IDC_SYSTEM_VARIABLE_LIST
)
582 OnEditVariable(hwndDlg
, (INT
)phdr
->idFrom
);