3 * Copyright (C) 2004 ReactOS Team
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 * PROJECT: ReactOS System Control Panel
22 * FILE: lib/cpl/sysdm/environment.c
23 * PURPOSE: Environment variable settings
24 * PROGRAMMER: Eric Kohl
36 typedef struct _VARIABLE_DATA
41 } VARIABLE_DATA
, *PVARIABLE_DATA
;
46 EditVariableDlgProc(HWND hwndDlg
,
51 PVARIABLE_DATA VarData
;
55 VarData
= (PVARIABLE_DATA
)GetWindowLongPtr(hwndDlg
, GWL_USERDATA
);
60 SetWindowLongPtr(hwndDlg
, GWL_USERDATA
, (DWORD_PTR
)lParam
);
61 VarData
= (PVARIABLE_DATA
)lParam
;
63 if (VarData
->lpName
!= NULL
)
65 SendDlgItemMessage(hwndDlg
, IDC_VARIABLE_NAME
, WM_SETTEXT
, 0, (LPARAM
)VarData
->lpName
);
68 if (VarData
->lpRawValue
!= NULL
)
70 SendDlgItemMessage(hwndDlg
, IDC_VARIABLE_VALUE
, WM_SETTEXT
, 0, (LPARAM
)VarData
->lpRawValue
);
75 switch (LOWORD(wParam
))
78 dwNameLength
= (DWORD
)SendDlgItemMessage(hwndDlg
, IDC_VARIABLE_NAME
, WM_GETTEXTLENGTH
, 0, 0);
79 dwValueLength
= (DWORD
)SendDlgItemMessage(hwndDlg
, IDC_VARIABLE_VALUE
, WM_GETTEXTLENGTH
, 0, 0);
80 if (dwNameLength
!= 0 && dwValueLength
!= 0)
82 if (VarData
->lpName
== NULL
)
84 VarData
->lpName
= GlobalAlloc(GPTR
, (dwNameLength
+ 1) * sizeof(TCHAR
));
86 else if (_tcslen(VarData
->lpName
) < dwNameLength
)
88 GlobalFree(VarData
->lpName
);
89 VarData
->lpName
= GlobalAlloc(GPTR
, (dwNameLength
+ 1) * sizeof(TCHAR
));
91 SendDlgItemMessage(hwndDlg
, IDC_VARIABLE_NAME
, WM_GETTEXT
, dwNameLength
+ 1, (LPARAM
)VarData
->lpName
);
93 if (VarData
->lpRawValue
== NULL
)
95 VarData
->lpRawValue
= GlobalAlloc(GPTR
, (dwValueLength
+ 1) * sizeof(TCHAR
));
97 else if (_tcslen(VarData
->lpRawValue
) < dwValueLength
)
99 GlobalFree(VarData
->lpRawValue
);
100 VarData
->lpRawValue
= GlobalAlloc(GPTR
, (dwValueLength
+ 1) * sizeof(TCHAR
));
102 SendDlgItemMessage(hwndDlg
, IDC_VARIABLE_VALUE
, WM_GETTEXT
, dwValueLength
+ 1, (LPARAM
)VarData
->lpRawValue
);
104 if (_tcschr(VarData
->lpRawValue
, _T('%')))
106 if (VarData
->lpCookedValue
== NULL
)
108 VarData
->lpCookedValue
= GlobalAlloc(GPTR
, 2 * MAX_PATH
* sizeof(TCHAR
));
111 ExpandEnvironmentStrings(VarData
->lpRawValue
,
112 VarData
->lpCookedValue
,
115 else if (VarData
->lpCookedValue
)
117 GlobalFree(VarData
->lpCookedValue
);
120 EndDialog(hwndDlg
, 1);
124 EndDialog(hwndDlg
, 0);
135 SetEnvironmentVariables(HWND hwndListView
,
141 DWORD dwMaxValueNameLength
;
142 DWORD dwMaxValueDataLength
;
146 LPTSTR lpExpandData
= NULL
;
150 PVARIABLE_DATA VarData
;
155 if (RegOpenKeyEx(hRootKey
,
162 if (RegQueryInfoKey(hKey
,
170 &dwMaxValueNameLength
,
171 &dwMaxValueDataLength
,
179 lpName
= GlobalAlloc(GPTR
, (dwMaxValueNameLength
+ 1) * sizeof(TCHAR
));
186 lpData
= GlobalAlloc(GPTR
, (dwMaxValueDataLength
+ 1) * sizeof(TCHAR
));
194 for (i
= 0; i
< dwValues
; i
++)
196 dwNameLength
= dwMaxValueNameLength
+ 1;
197 dwDataLength
= dwMaxValueDataLength
+ 1;
198 if (RegEnumValue(hKey
,
213 VarData
= GlobalAlloc(GPTR
, sizeof(VARIABLE_DATA
));
215 VarData
->lpName
= GlobalAlloc(GPTR
, (dwNameLength
+ 1) * sizeof(TCHAR
));
216 _tcscpy(VarData
->lpName
, lpName
);
218 VarData
->lpRawValue
= GlobalAlloc(GPTR
, (dwDataLength
+ 1) * sizeof(TCHAR
));
219 _tcscpy(VarData
->lpRawValue
, lpData
);
221 if (dwType
== REG_EXPAND_SZ
)
223 lpExpandData
= GlobalAlloc(GPTR
, MAX_PATH
* 2* sizeof(TCHAR
));
224 if (lpExpandData
== NULL
)
232 ExpandEnvironmentStrings(lpData
,
236 VarData
->lpCookedValue
= GlobalAlloc(GPTR
, (_tcslen(lpExpandData
) + 1) * sizeof(TCHAR
));
237 _tcscpy(VarData
->lpCookedValue
, lpExpandData
);
238 GlobalFree(lpExpandData
);
241 memset(&lvi
, 0x00, sizeof(lvi
));
242 lvi
.mask
= LVIF_TEXT
| LVIF_STATE
| LVIF_PARAM
;
243 lvi
.lParam
= (LPARAM
)VarData
;
244 lvi
.pszText
= VarData
->lpName
;
245 lvi
.state
= (i
== 0) ? LVIS_SELECTED
: 0;
246 iItem
= ListView_InsertItem(hwndListView
, &lvi
);
248 ListView_SetItemText(hwndListView
, iItem
, 1,
249 (VarData
->lpCookedValue
) ? VarData
->lpCookedValue
: VarData
->lpRawValue
);
259 SetListViewColumns(HWND hwndListView
)
264 GetClientRect(hwndListView
, &rect
);
266 memset(&column
, 0x00, sizeof(column
));
267 column
.mask
=LVCF_FMT
| LVCF_WIDTH
| LVCF_SUBITEM
| LVCF_TEXT
;
268 column
.fmt
=LVCFMT_LEFT
;
269 column
.cx
= (rect
.right
- rect
.left
) / 3;
271 column
.pszText
= _T("Variable");
272 ListView_InsertColumn(hwndListView
, 0, &column
);
274 column
.cx
= (rect
.right
- rect
.left
) - ((rect
.right
- rect
.left
) / 3) - 1;
276 column
.pszText
= _T("Value");
277 ListView_InsertColumn(hwndListView
, 1, &column
);
282 OnInitDialog(HWND hwndDlg
)
286 /* Set user environment variables */
287 hwndListView
= GetDlgItem(hwndDlg
, IDC_USER_VARIABLE_LIST
);
289 SetListViewColumns(hwndListView
);
291 SetEnvironmentVariables(hwndListView
,
295 ListView_SetColumnWidth(hwndListView
,2,LVSCW_AUTOSIZE_USEHEADER
);
296 ListView_Update(hwndListView
,0);
299 /* Set system environment variables */
300 hwndListView
= GetDlgItem(hwndDlg
, IDC_SYSTEM_VARIABLE_LIST
);
302 SetListViewColumns(hwndListView
);
304 SetEnvironmentVariables(hwndListView
,
306 _T("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment"));
308 ListView_SetColumnWidth(hwndListView
,2,LVSCW_AUTOSIZE_USEHEADER
);
309 ListView_Update(hwndListView
,0);
314 OnNewVariable(HWND hwndDlg
,
318 PVARIABLE_DATA VarData
;
322 hwndListView
= GetDlgItem(hwndDlg
, iDlgItem
);
324 VarData
= GlobalAlloc(GPTR
, sizeof(VARIABLE_DATA
));
326 if (!DialogBoxParam(hApplet
,
327 MAKEINTRESOURCE(IDD_EDIT_VARIABLE
),
330 (LPARAM
)VarData
) > 0)
332 if (VarData
->lpName
!= NULL
)
333 GlobalFree(VarData
->lpName
);
335 if (VarData
->lpRawValue
!= NULL
)
336 GlobalFree(VarData
->lpRawValue
);
338 if (VarData
->lpCookedValue
!= NULL
)
339 GlobalFree(VarData
->lpCookedValue
);
344 memset(&lvi
, 0x00, sizeof(lvi
));
345 lvi
.mask
= LVIF_TEXT
| LVIF_STATE
| LVIF_PARAM
;
346 lvi
.lParam
= (LPARAM
)VarData
;
347 lvi
.pszText
= VarData
->lpName
;
349 iItem
= ListView_InsertItem(hwndListView
, &lvi
);
351 ListView_SetItemText(hwndListView
, iItem
, 1,
352 (VarData
->lpCookedValue
) ? VarData
->lpCookedValue
: VarData
->lpRawValue
);
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
),
382 (LPARAM
)VarData
) > 0)
384 ListView_SetItemText(hwndListView
, iItem
, 0, VarData
->lpName
);
385 ListView_SetItemText(hwndListView
, iItem
, 1,
386 (VarData
->lpCookedValue
) ? VarData
->lpCookedValue
: VarData
->lpRawValue
);
394 OnDeleteVariable(HWND hwndDlg
,
398 PVARIABLE_DATA VarData
;
402 hwndListView
= GetDlgItem(hwndDlg
, iDlgItem
);
404 iItem
= ListView_GetSelectionMark(hwndListView
);
407 memset(&lvi
, 0x00, sizeof(lvi
));
408 lvi
.mask
= LVIF_PARAM
;
411 if (ListView_GetItem(hwndListView
, &lvi
))
413 VarData
= (PVARIABLE_DATA
)lvi
.lParam
;
416 if (VarData
->lpName
!= NULL
)
417 GlobalFree(VarData
->lpName
);
419 if (VarData
->lpRawValue
!= NULL
)
420 GlobalFree(VarData
->lpRawValue
);
422 if (VarData
->lpCookedValue
!= NULL
)
423 GlobalFree(VarData
->lpCookedValue
);
430 ListView_DeleteItem(hwndListView
, iItem
);
436 ReleaseListViewItems(HWND hwndDlg
,
440 PVARIABLE_DATA VarData
;
445 hwndListView
= GetDlgItem(hwndDlg
, iDlgItem
);
447 memset(&lvi
, 0x00, sizeof(lvi
));
449 nItemCount
= ListView_GetItemCount(hwndListView
);
450 for (i
= 0; i
< nItemCount
; i
++)
452 lvi
.mask
= LVIF_PARAM
;
455 if (ListView_GetItem(hwndListView
, &lvi
))
457 VarData
= (PVARIABLE_DATA
)lvi
.lParam
;
460 if (VarData
->lpName
!= NULL
)
461 GlobalFree(VarData
->lpName
);
463 if (VarData
->lpRawValue
!= NULL
)
464 GlobalFree(VarData
->lpRawValue
);
466 if (VarData
->lpCookedValue
!= NULL
)
467 GlobalFree(VarData
->lpCookedValue
);
477 SetAllVars(HWND hwndDlg
,
481 PVARIABLE_DATA VarData
;
487 memset(&lvi
, 0x00, sizeof(lvi
));
489 /* Get the handle to the list box with all system vars in it */
490 hwndListView
= GetDlgItem(hwndDlg
, iDlgItem
);
491 /* first item is 0 */
493 /* set up struct to retreive item */
494 lvi
.mask
= LVIF_PARAM
;
497 /* Open or create the key */
498 if (RegCreateKeyEx((iDlgItem
== IDC_SYSTEM_VARIABLE_LIST
? HKEY_LOCAL_MACHINE
: HKEY_CURRENT_USER
),
499 (iDlgItem
== IDC_SYSTEM_VARIABLE_LIST
? _T("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment") : _T("Environment")),
502 REG_OPTION_NON_VOLATILE
,
503 KEY_WRITE
| KEY_READ
,
511 /* loop through all system variables */
512 while(ListView_GetItem(hwndListView
, &lvi
))
514 /* Get the data in each item */
515 VarData
= (PVARIABLE_DATA
)lvi
.lParam
;
519 RegQueryValueEx(hk
,VarData
->lpName
,NULL
,&Type
,NULL
,NULL
);
521 /* Set the new value */
522 if (RegSetValueEx(hk
,
526 (LPBYTE
) VarData
->lpRawValue
,
527 (DWORD
) (_tcsclen(VarData
->lpRawValue
)* sizeof(TCHAR
))+1))
533 /* Fill struct for next item */
534 lvi
.mask
= LVIF_PARAM
;
541 /* Environment dialog procedure */
543 EnvironmentDlgProc(HWND hwndDlg
,
551 OnInitDialog(hwndDlg
);
555 switch (LOWORD(wParam
))
557 case IDC_USER_VARIABLE_NEW
:
558 OnNewVariable(hwndDlg
, IDC_USER_VARIABLE_LIST
);
561 case IDC_USER_VARIABLE_EDIT
:
562 OnEditVariable(hwndDlg
, IDC_USER_VARIABLE_LIST
);
565 case IDC_USER_VARIABLE_DELETE
:
566 OnDeleteVariable(hwndDlg
, IDC_USER_VARIABLE_LIST
);
569 case IDC_SYSTEM_VARIABLE_NEW
:
570 OnNewVariable(hwndDlg
, IDC_SYSTEM_VARIABLE_LIST
);
573 case IDC_SYSTEM_VARIABLE_EDIT
:
574 OnEditVariable(hwndDlg
, IDC_SYSTEM_VARIABLE_LIST
);
577 case IDC_SYSTEM_VARIABLE_DELETE
:
578 OnDeleteVariable(hwndDlg
, IDC_SYSTEM_VARIABLE_LIST
);
582 SetAllVars(hwndDlg
, IDC_USER_VARIABLE_LIST
);
583 SetAllVars(hwndDlg
, IDC_SYSTEM_VARIABLE_LIST
);
586 ReleaseListViewItems(hwndDlg
, IDC_USER_VARIABLE_LIST
);
587 ReleaseListViewItems(hwndDlg
, IDC_SYSTEM_VARIABLE_LIST
);
588 EndDialog(hwndDlg
, 0);
597 phdr
= (NMHDR
*)lParam
;
602 if (phdr
->idFrom
== IDC_USER_VARIABLE_LIST
||
603 phdr
->idFrom
== IDC_SYSTEM_VARIABLE_LIST
)
605 OnEditVariable(hwndDlg
, phdr
->idFrom
);