From d1404a7a2a8237da2321d07c9edbcbf633d9696a Mon Sep 17 00:00:00 2001 From: Jared Smudde Date: Tue, 23 Apr 2019 00:45:49 -0500 Subject: [PATCH] [NETPLWIZ] Implement the Disconnect Network Drive dialog. (#1522) CORE-13516, CORE-13518 --- dll/shellext/CMakeLists.txt | 1 + dll/shellext/netplwiz/CMakeLists.txt | 17 ++ dll/shellext/netplwiz/SHDisconnectNetDrives.c | 197 ++++++++++++++++++ dll/shellext/netplwiz/lang/en-US.rc | 21 ++ dll/shellext/netplwiz/netplwiz.c | 51 +++++ dll/shellext/netplwiz/netplwiz.h | 19 ++ dll/shellext/netplwiz/netplwiz.rc | 26 +++ dll/shellext/netplwiz/netplwiz.spec | 14 ++ dll/shellext/netplwiz/res/4400.ico | Bin 0 -> 22486 bytes dll/shellext/netplwiz/resource.h | 21 ++ 10 files changed, 367 insertions(+) create mode 100644 dll/shellext/netplwiz/CMakeLists.txt create mode 100644 dll/shellext/netplwiz/SHDisconnectNetDrives.c create mode 100644 dll/shellext/netplwiz/lang/en-US.rc create mode 100644 dll/shellext/netplwiz/netplwiz.c create mode 100644 dll/shellext/netplwiz/netplwiz.h create mode 100644 dll/shellext/netplwiz/netplwiz.rc create mode 100644 dll/shellext/netplwiz/netplwiz.spec create mode 100644 dll/shellext/netplwiz/res/4400.ico create mode 100644 dll/shellext/netplwiz/resource.h diff --git a/dll/shellext/CMakeLists.txt b/dll/shellext/CMakeLists.txt index 0f57882163f..89980c3f5fa 100644 --- a/dll/shellext/CMakeLists.txt +++ b/dll/shellext/CMakeLists.txt @@ -5,6 +5,7 @@ add_subdirectory(deskadp) add_subdirectory(deskmon) add_subdirectory(devcpux) add_subdirectory(fontext) +add_subdirectory(netplwiz) add_subdirectory(netshell) add_subdirectory(ntobjshex) add_subdirectory(shellbtrfs) diff --git a/dll/shellext/netplwiz/CMakeLists.txt b/dll/shellext/netplwiz/CMakeLists.txt new file mode 100644 index 00000000000..7d1fc15dc2f --- /dev/null +++ b/dll/shellext/netplwiz/CMakeLists.txt @@ -0,0 +1,17 @@ + +spec2def(netplwiz.dll netplwiz.spec) + +list(APPEND SOURCE + netplwiz.c + SHDisconnectNetDrives.c) + +add_library(netplwiz SHARED + ${SOURCE} + netplwiz.rc + ${CMAKE_CURRENT_BINARY_DIR}/netplwiz_stubs.c + ${CMAKE_CURRENT_BINARY_DIR}/netplwiz.def) + +set_module_type(netplwiz win32dll UNICODE) +target_link_libraries(netplwiz wine) +add_importlibs(netplwiz comctl32 mpr ole32 user32 msvcrt kernel32 ntdll) +add_cd_file(TARGET netplwiz DESTINATION reactos/system32 FOR all) diff --git a/dll/shellext/netplwiz/SHDisconnectNetDrives.c b/dll/shellext/netplwiz/SHDisconnectNetDrives.c new file mode 100644 index 00000000000..c886052d5b8 --- /dev/null +++ b/dll/shellext/netplwiz/SHDisconnectNetDrives.c @@ -0,0 +1,197 @@ +/* + * PROJECT: ReactOS Shell + * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+) + * PURPOSE: Implements the Disconnct Network Drive dialog + * COPYRIGHT: Copyright 2018 Jared Smudde (computerwhiz02@hotmail.com) + */ + +#include "netplwiz.h" +#include + +WINE_DEFAULT_DEBUG_CHANNEL(netplwiz); + +HINSTANCE hInstance; + +VOID InitializeListView(HWND hDlg) +{ + HWND hListView = GetDlgItem(hDlg, IDC_CONNECTEDDRIVELIST); + LV_COLUMN column; + WCHAR szLetter[100], szPath[100]; + + if (hListView == NULL) + return; + + LoadStringW(hInstance, IDS_DRIVE_LETTER, szLetter, _countof(szLetter)); + LoadStringW(hInstance, IDS_NETWORK_PATH, szPath, _countof(szPath)); + + column.mask = LVCF_WIDTH | LVCF_TEXT; + column.pszText = szLetter; + column.cx = 75; + ListView_InsertColumn(hListView, 0, &column); + + column.mask = LVCF_WIDTH | LVCF_TEXT; + column.pszText = szPath; + column.cx = 150; + ListView_InsertColumn(hListView, 1, &column); +} + +VOID EnumerateConnectedDrives(HWND hDlg) +{ + LV_ITEM item; + HIMAGELIST hImgList; + HICON hIconDrive = NULL; + HMODULE hShell32; + HWND hListView = GetDlgItem(hDlg, IDC_CONNECTEDDRIVELIST); + + DWORD dRet; + HANDLE hEnum; + LPNETRESOURCE lpRes; + DWORD dwSize = 0x1000; + DWORD dwCount = -1; + LPNETRESOURCE lpCur; + + /* List View Icons */ + hShell32 = GetModuleHandleW(L"shell32.dll"); + if (hShell32 == NULL) + return; + + hIconDrive = LoadImageW(hShell32, MAKEINTRESOURCEW(10), IMAGE_ICON, + GetSystemMetrics(SM_CXSMICON), + GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR); + if (hIconDrive == NULL) + return; + + hImgList = ImageList_Create(16, 16, ILC_COLOR32 | ILC_MASK, 1, 1); + if (hImgList == NULL) + { + DestroyIcon(hIconDrive); + return; + } + + ImageList_AddIcon(hImgList, hIconDrive); + DestroyIcon(hIconDrive); + ListView_SetImageList(hListView, hImgList, LVSIL_SMALL); + + dRet = WNetOpenEnum(RESOURCE_CONNECTED, RESOURCETYPE_DISK, 0, NULL, &hEnum); + if (dRet != WN_SUCCESS) + { + return; + } + + lpRes = HeapAlloc(GetProcessHeap(), 0, dwSize); + if (!lpRes) + { + WNetCloseEnum(hEnum); + return; + } + + do + { + ZeroMemory(lpRes, dwSize); + dRet = WNetEnumResource(hEnum, &dwCount, lpRes, &dwSize); + if (dRet == WN_SUCCESS || dRet == WN_MORE_DATA) + { + lpCur = lpRes; + for (; dwCount; dwCount--) + { + ZeroMemory(&item, sizeof(item)); + item.mask = LVIF_TEXT | LVIF_IMAGE; + item.iImage = 0; + item.pszText = lpCur->lpLocalName; + item.lParam = 0; + item.iItem = ListView_InsertItem(hListView, &item); + ListView_SetItemText(hListView, item.iItem, 1, lpCur->lpRemoteName); + lpCur++; + } + } + } while (dRet != WN_NO_MORE_ENTRIES); + + HeapFree(GetProcessHeap(), 0, lpRes); + WNetCloseEnum(hEnum); +} + + +VOID UpdateButtonStatus(WPARAM wParam, LPARAM lParam, HWND hDlg) +{ + LPNMHDR pnmh = (LPNMHDR)lParam; + HWND hListView = GetDlgItem(hDlg, IDC_CONNECTEDDRIVELIST); + HWND hOkButton = GetDlgItem(hDlg, ID_OK); + + if (pnmh->hwndFrom == hListView) + { + switch (pnmh->code) + { + case LVN_ITEMCHANGED: + if (ListView_GetSelectedCount(hListView)) + { + EnableWindow(hOkButton, TRUE); + } + else + { + EnableWindow(hOkButton, FALSE); + } + break; + } + } +} + +DWORD DisconnectDriveExit(HWND hDlg) +{ + TCHAR driveLetter[10]; + HRESULT hr; + HWND hListView = GetDlgItem(hDlg, IDC_CONNECTEDDRIVELIST); + INT nItem = ListView_GetNextItem(hListView, -1, LVNI_SELECTED); + + if (nItem == -1) + return 0; + + ListView_GetItemText(hListView, nItem, 0, driveLetter, _countof(driveLetter)); + hr = WNetCancelConnection2(driveLetter, CONNECT_UPDATE_PROFILE, FALSE); + + EndDialog(hDlg, ID_OK); + return hr; +} + +static INT_PTR CALLBACK DisconnectDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + HICON hIcon, hIconSm; + switch (uMsg) + { + case WM_INITDIALOG: + hIcon = (HICON)LoadImageW(hInstance, MAKEINTRESOURCEW(IDI_DISCONNECT_NET_DRIVES), IMAGE_ICON, 0, 0, LR_SHARED | LR_DEFAULTSIZE); + hIconSm = (HICON)CopyImage(hIcon, IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_COPYFROMRESOURCE); + SendMessageW(hDlg, WM_SETICON, ICON_BIG, (LPARAM)hIcon); + SendMessageW(hDlg, WM_SETICON, ICON_SMALL, (LPARAM)hIconSm); + EnableWindow(GetDlgItem(hDlg, ID_OK), FALSE); + InitializeListView(hDlg); + EnumerateConnectedDrives(hDlg); + return TRUE; + + case WM_COMMAND: + switch (LOWORD(wParam)) + { + case ID_OK: + DisconnectDriveExit(hDlg); + break; + case IDCANCEL: + EndDialog(hDlg, IDCANCEL); + break; + } + break; + + case WM_NOTIFY: + UpdateButtonStatus(wParam, lParam, hDlg); + break; + + default: + return FALSE; + } + + return TRUE; +} + +HRESULT WINAPI SHDisconnectNetDrives(PVOID Unused) +{ + DialogBoxW(hInstance, MAKEINTRESOURCEW(IDD_DISCONNECTDRIVES), NULL, DisconnectDlgProc); + return S_OK; +} diff --git a/dll/shellext/netplwiz/lang/en-US.rc b/dll/shellext/netplwiz/lang/en-US.rc new file mode 100644 index 00000000000..4fae14baf76 --- /dev/null +++ b/dll/shellext/netplwiz/lang/en-US.rc @@ -0,0 +1,21 @@ +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +IDD_DISCONNECTDRIVES DIALOGEX 0, 0, 300, 200 +STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Disconnect Network Drives" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Select the network drive(s) you want to disconnect, then click OK.", -1, 7, 7, 286, 8 + LTEXT "&Network Drives:", -1, 7, 23, 286, 8 + CONTROL "", IDC_CONNECTEDDRIVELIST, "SysListView32", LVS_REPORT | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | LVS_SINGLESEL | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 7, 31, 286, 140 + PUSHBUTTON "OK", ID_OK, 189, 179, 50, 14 + PUSHBUTTON "Cancel", IDCANCEL, 243, 179, 50, 14 +END + +STRINGTABLE +BEGIN + IDS_DIALOG_CAPTION "Disconnect Network Drive" + IDS_DRIVE_LETTER "Drive Letter" + IDS_NETWORK_PATH "Network Path" + IDS_NO_DRIVES "You have no network drives to disconnect." +END diff --git a/dll/shellext/netplwiz/netplwiz.c b/dll/shellext/netplwiz/netplwiz.c new file mode 100644 index 00000000000..27fa3872ed8 --- /dev/null +++ b/dll/shellext/netplwiz/netplwiz.c @@ -0,0 +1,51 @@ +/* + * PROJECT: ReactOS Shell + * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+) + * PURPOSE: Implements the Connect/Disconnect Network places dialogs + * COPYRIGHT: Copyright 2018 Jared Smudde (computerwhiz02@hotmail.com) + */ + +#include "netplwiz.h" + +HRESULT WINAPI +DllCanUnloadNow(VOID) +{ + return S_OK; +} + +HRESULT WINAPI +DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) +{ + *ppv = NULL; + return E_NOINTERFACE; +} + +HRESULT WINAPI +DllRegisterServer(VOID) +{ + return S_OK; +} + +HRESULT WINAPI +DllUnregisterServer(VOID) +{ + return S_OK; +} + +BOOL WINAPI +DllMain(HINSTANCE hinstDLL, DWORD dwReason, LPVOID lpvReserved) +{ + INITCOMMONCONTROLSEX iccx; + hInstance = hinstDLL; + switch (dwReason) + { + case DLL_PROCESS_ATTACH: + iccx.dwSize = sizeof(INITCOMMONCONTROLSEX); + iccx.dwICC = ICC_STANDARD_CLASSES | ICC_LISTVIEW_CLASSES; + InitCommonControlsEx(&iccx); + DisableThreadLibraryCalls(hInstance); + break; + } + + return TRUE; +} diff --git a/dll/shellext/netplwiz/netplwiz.h b/dll/shellext/netplwiz/netplwiz.h new file mode 100644 index 00000000000..13e8b71ffce --- /dev/null +++ b/dll/shellext/netplwiz/netplwiz.h @@ -0,0 +1,19 @@ +#pragma once + +#include "resource.h" + +#include +#include + +#define WIN32_NO_STATUS +#define _INC_WINDOWS + +#include +#include +#include +#include +#include + +#include + +extern HINSTANCE hInstance; diff --git a/dll/shellext/netplwiz/netplwiz.rc b/dll/shellext/netplwiz/netplwiz.rc new file mode 100644 index 00000000000..aac48703fbf --- /dev/null +++ b/dll/shellext/netplwiz/netplwiz.rc @@ -0,0 +1,26 @@ +#include +#include +#include + +#include "resource.h" + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + +#define REACTOS_VERSION_DLL +#define REACTOS_STR_FILE_DESCRIPTION "Map Network Drives" +#define REACTOS_STR_INTERNAL_NAME "netplwiz.dll" +#define REACTOS_STR_ORIGINAL_FILENAME "netplwiz.dll" + +#include + +#include + +/* Icons */ +IDI_DISCONNECT_NET_DRIVES ICON "res/4400.ico" + +/* UTF-8 */ +#pragma code_page(65001) + +#ifdef LANGUAGE_EN_US + #include "lang/en-US.rc" +#endif diff --git a/dll/shellext/netplwiz/netplwiz.spec b/dll/shellext/netplwiz/netplwiz.spec new file mode 100644 index 00000000000..433874cb0b2 --- /dev/null +++ b/dll/shellext/netplwiz/netplwiz.spec @@ -0,0 +1,14 @@ +1 stub AddNetPlaceRunDll +2 stub PassportWizardRunDll +3 stub PublishRunDll +4 stub UsersRunDll +5 stub ClearAutoLogon +@ stdcall -private DllCanUnloadNow() +@ stdcall -private DllGetClassObject(ptr ptr ptr) +8 stub -private DllInstall +9 stdcall DllMain(ptr long ptr) +@ stdcall -private DllRegisterServer() +@ stdcall -private DllUnregisterServer() +12 stub NetAccessWizard +13 stub NetPlacesWizardDoModal +14 stdcall SHDisconnectNetDrives(ptr) diff --git a/dll/shellext/netplwiz/res/4400.ico b/dll/shellext/netplwiz/res/4400.ico new file mode 100644 index 0000000000000000000000000000000000000000..1498e69384e6c4ee22b80d33517823a0fdd6282b GIT binary patch literal 22486 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 GZ}s1mI2JVk literal 0 HcmV?d00001 diff --git a/dll/shellext/netplwiz/resource.h b/dll/shellext/netplwiz/resource.h new file mode 100644 index 00000000000..71fe5984904 --- /dev/null +++ b/dll/shellext/netplwiz/resource.h @@ -0,0 +1,21 @@ +#pragma once + +#ifndef IDC_STATIC +#define IDC_STATIC -1 +#endif + +/* Controls */ +#define IDC_CONNECTEDDRIVELIST 1071 +#define ID_OK 100 + +/* Dialogs */ +#define IDD_DISCONNECTDRIVES 2100 + +/* Icons */ +#define IDI_DISCONNECT_NET_DRIVES 4400 + +/* Strings */ +#define IDS_DIALOG_CAPTION 13000 +#define IDS_DRIVE_LETTER 13001 +#define IDS_NETWORK_PATH 13002 +#define IDS_NO_DRIVES 13003