2 * PROJECT: ReactOS Shell
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: Implements the Disconnct Network Drive dialog
5 * COPYRIGHT: Copyright 2018 Jared Smudde (computerwhiz02@hotmail.com)
9 #include <wine/debug.h>
11 WINE_DEFAULT_DEBUG_CHANNEL(netplwiz
);
15 VOID
InitializeListView(HWND hDlg
)
17 HWND hListView
= GetDlgItem(hDlg
, IDC_CONNECTEDDRIVELIST
);
19 WCHAR szLetter
[100], szPath
[100];
21 if (hListView
== NULL
)
24 LoadStringW(hInstance
, IDS_DRIVE_LETTER
, szLetter
, _countof(szLetter
));
25 LoadStringW(hInstance
, IDS_NETWORK_PATH
, szPath
, _countof(szPath
));
27 column
.mask
= LVCF_WIDTH
| LVCF_TEXT
;
28 column
.pszText
= szLetter
;
30 ListView_InsertColumn(hListView
, 0, &column
);
32 column
.mask
= LVCF_WIDTH
| LVCF_TEXT
;
33 column
.pszText
= szPath
;
35 ListView_InsertColumn(hListView
, 1, &column
);
38 VOID
EnumerateConnectedDrives(HWND hDlg
)
42 HICON hIconDrive
= NULL
;
44 HWND hListView
= GetDlgItem(hDlg
, IDC_CONNECTEDDRIVELIST
);
49 DWORD dwSize
= 0x1000;
54 hShell32
= GetModuleHandleW(L
"shell32.dll");
58 hIconDrive
= LoadImageW(hShell32
, MAKEINTRESOURCEW(10), IMAGE_ICON
,
59 GetSystemMetrics(SM_CXSMICON
),
60 GetSystemMetrics(SM_CYSMICON
), LR_DEFAULTCOLOR
);
61 if (hIconDrive
== NULL
)
64 hImgList
= ImageList_Create(16, 16, ILC_COLOR32
| ILC_MASK
, 1, 1);
67 DestroyIcon(hIconDrive
);
71 ImageList_AddIcon(hImgList
, hIconDrive
);
72 DestroyIcon(hIconDrive
);
73 ListView_SetImageList(hListView
, hImgList
, LVSIL_SMALL
);
75 dRet
= WNetOpenEnum(RESOURCE_CONNECTED
, RESOURCETYPE_DISK
, 0, NULL
, &hEnum
);
76 if (dRet
!= WN_SUCCESS
)
81 lpRes
= HeapAlloc(GetProcessHeap(), 0, dwSize
);
90 ZeroMemory(lpRes
, dwSize
);
91 dRet
= WNetEnumResource(hEnum
, &dwCount
, lpRes
, &dwSize
);
92 if (dRet
== WN_SUCCESS
|| dRet
== WN_MORE_DATA
)
95 for (; dwCount
; dwCount
--)
97 ZeroMemory(&item
, sizeof(item
));
98 item
.mask
= LVIF_TEXT
| LVIF_IMAGE
;
100 item
.pszText
= lpCur
->lpLocalName
;
102 item
.iItem
= ListView_InsertItem(hListView
, &item
);
103 ListView_SetItemText(hListView
, item
.iItem
, 1, lpCur
->lpRemoteName
);
107 } while (dRet
!= WN_NO_MORE_ENTRIES
);
109 HeapFree(GetProcessHeap(), 0, lpRes
);
110 WNetCloseEnum(hEnum
);
114 VOID
UpdateButtonStatus(WPARAM wParam
, LPARAM lParam
, HWND hDlg
)
116 LPNMHDR pnmh
= (LPNMHDR
)lParam
;
117 HWND hListView
= GetDlgItem(hDlg
, IDC_CONNECTEDDRIVELIST
);
118 HWND hOkButton
= GetDlgItem(hDlg
, ID_OK
);
120 if (pnmh
->hwndFrom
== hListView
)
124 case LVN_ITEMCHANGED
:
125 if (ListView_GetSelectedCount(hListView
))
127 EnableWindow(hOkButton
, TRUE
);
131 EnableWindow(hOkButton
, FALSE
);
138 DWORD
DisconnectDriveExit(HWND hDlg
)
140 TCHAR driveLetter
[10];
142 HWND hListView
= GetDlgItem(hDlg
, IDC_CONNECTEDDRIVELIST
);
143 INT nItem
= ListView_GetNextItem(hListView
, -1, LVNI_SELECTED
);
148 ListView_GetItemText(hListView
, nItem
, 0, driveLetter
, _countof(driveLetter
));
149 hr
= WNetCancelConnection2(driveLetter
, CONNECT_UPDATE_PROFILE
, FALSE
);
151 EndDialog(hDlg
, ID_OK
);
155 static INT_PTR CALLBACK
DisconnectDlgProc(HWND hDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
157 HICON hIcon
, hIconSm
;
161 hIcon
= (HICON
)LoadImageW(hInstance
, MAKEINTRESOURCEW(IDI_DISCONNECT_NET_DRIVES
), IMAGE_ICON
, 0, 0, LR_SHARED
| LR_DEFAULTSIZE
);
162 hIconSm
= (HICON
)CopyImage(hIcon
, IMAGE_ICON
, GetSystemMetrics(SM_CXSMICON
), GetSystemMetrics(SM_CYSMICON
), LR_COPYFROMRESOURCE
);
163 SendMessageW(hDlg
, WM_SETICON
, ICON_BIG
, (LPARAM
)hIcon
);
164 SendMessageW(hDlg
, WM_SETICON
, ICON_SMALL
, (LPARAM
)hIconSm
);
165 EnableWindow(GetDlgItem(hDlg
, ID_OK
), FALSE
);
166 InitializeListView(hDlg
);
167 EnumerateConnectedDrives(hDlg
);
171 switch (LOWORD(wParam
))
174 DisconnectDriveExit(hDlg
);
177 EndDialog(hDlg
, IDCANCEL
);
183 UpdateButtonStatus(wParam
, lParam
, hDlg
);
193 HRESULT WINAPI
SHDisconnectNetDrives(PVOID Unused
)
195 DialogBoxW(hInstance
, MAKEINTRESOURCEW(IDD_DISCONNECTDRIVES
), NULL
, DisconnectDlgProc
);