1 /* 2 * PROJECT: ReactOS Zip Shell Extension 3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+) 4 * PURPOSE: zipfldr entrypoint 5 * COPYRIGHT: Copyright 2017 Mark Jansen (mark.jansen@reactos.org) 6 */ 7 8 #include "precomp.h" 9 10 HMODULE g_hModule = NULL; 11 LONG g_ModuleRefCnt = 0; 12 13 #include <initguid.h> 14 15 DEFINE_GUID(CLSID_ZipFolderStorageHandler, 0xe88dcce0, 0xb7b3, 0x11d1, 0xa9, 0xf0, 0x00, 0xaa, 0x00, 0x60, 0xfa, 0x31); 16 DEFINE_GUID(CLSID_ZipFolderSendTo, 0x888dca60, 0xfc0a, 0x11cf, 0x8f, 0x0f, 0x00, 0xc0, 0x4f, 0xd7, 0xd0, 0x62); 17 DEFINE_GUID(CLSID_ZipFolderContextMenu, 0xb8cdcb65, 0xb1bf, 0x4b42, 0x94, 0x28, 0x1d, 0xfd, 0xb7, 0xee, 0x92, 0xaf); 18 DEFINE_GUID(CLSID_ZipFolderRightDragHandler,0xbd472f60, 0x27fa, 0x11cf, 0xb8, 0xb4, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00); 19 DEFINE_GUID(CLSID_ZipFolderDropHandler, 0xed9d80b9, 0xd157, 0x457b, 0x91, 0x92, 0x0e, 0x72, 0x80, 0x31, 0x3b, 0xf0); 20 21 /* IExplorerCommand: Extract All */ 22 DEFINE_GUID(CLSID_ZipFolderExtractAllCommand, 0xc3d9647b, 0x8fd9, 0x4ee6, 0x8b, 0xc7, 0x82, 0x7, 0x80, 0x9, 0x10, 0x5a); 23 24 25 class CZipFldrModule : public CComModule 26 { 27 public: 28 }; 29 30 31 BEGIN_OBJECT_MAP(ObjectMap) 32 OBJECT_ENTRY(CLSID_ZipFolderStorageHandler, CZipFolder) 33 OBJECT_ENTRY(CLSID_ZipFolderContextMenu, CZipFolder) 34 OBJECT_ENTRY(CLSID_ZipFolderSendTo, CSendToZip) 35 END_OBJECT_MAP() 36 37 CZipFldrModule gModule; 38 39 40 #include "minizip/ioapi.h" 41 #include "minizip/iowin32.h" 42 43 zlib_filefunc64_def g_FFunc; 44 45 static void init_zlib() 46 { 47 fill_win32_filefunc64W(&g_FFunc); 48 } 49 50 EXTERN_C 51 BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) 52 { 53 switch (dwReason) 54 { 55 case DLL_PROCESS_ATTACH: 56 DisableThreadLibraryCalls(hInstance); 57 g_hModule = hInstance; 58 gModule.Init(ObjectMap, hInstance, NULL); 59 init_zlib(); 60 break; 61 } 62 63 return TRUE; 64 } 65 66 STDAPI DllCanUnloadNow() 67 { 68 if (g_ModuleRefCnt) 69 return S_FALSE; 70 return gModule.DllCanUnloadNow(); 71 } 72 73 STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) 74 { 75 return gModule.DllGetClassObject(rclsid, riid, ppv); 76 } 77 78 STDAPI DllRegisterServer() 79 { 80 HRESULT hr; 81 82 hr = gModule.DllRegisterServer(FALSE); 83 if (FAILED_UNEXPECTEDLY(hr)) 84 return hr; 85 86 hr = gModule.UpdateRegistryFromResource(IDR_ZIPFLDR, TRUE, NULL); 87 if (FAILED(hr)) 88 return hr; 89 90 return S_OK; 91 } 92 93 STDAPI DllUnregisterServer() 94 { 95 HRESULT hr; 96 97 hr = gModule.DllUnregisterServer(FALSE); 98 if (FAILED_UNEXPECTEDLY(hr)) 99 return hr; 100 101 hr = gModule.UpdateRegistryFromResource(IDR_ZIPFLDR, FALSE, NULL); 102 if (FAILED(hr)) 103 return hr; 104 105 return S_OK; 106 } 107 108 EXTERN_C 109 BOOL WINAPI 110 RouteTheCall( 111 IN HWND hWndOwner, 112 IN HINSTANCE hInstance, 113 IN LPCSTR lpStringArg, 114 IN INT Show) 115 { 116 CStringW path = lpStringArg; 117 PathRemoveBlanksW(path.GetBuffer()); 118 path.ReleaseBuffer(); 119 path = L"\"" + path + L"\""; 120 ShellExecuteW(NULL, L"open", L"explorer.exe", path.GetString(), NULL, SW_SHOWNORMAL); 121 return TRUE; 122 } 123