From e573b7a1b14102139fcc99b54f445b8dda5302d1 Mon Sep 17 00:00:00 2001 From: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com> Date: Tue, 20 Feb 2024 12:16:55 +0100 Subject: [PATCH] [FileLocksmith]Add Windows11 (tier1) context menu (#31388) * Add project * Cleanup project file and add resource file * Move common logic to FileLocksmithLib * Cleanup interop vcxproj * Implement handler, add assets and appx manifest * Revert "Cleanup interop vcxproj" This reverts commit 97bf991f2e5a7c06f1b6bbae5a628b7dab5c05a5. * Remove package on uninstall Install package on enable Fix launching app Cleanup * Revert non-related change * Spellcheck * Update src/modules/FileLocksmith/FileLocksmithContextMenu/Resources.resx * Wire Show in extended context menu setting --- .github/actions/spell-check/expect.txt | 1 + .pipelines/ESRPSigning_core.json | 2 + PowerToys.sln | 30 +++ .../CustomAction.cpp | 2 +- .../FileLocksmithContextMenu/AppxManifest.xml | 56 ++++++ .../Assets/FileLocksmith/FileLocksmith.ico | Bin 0 -> 173942 bytes .../Assets/FileLocksmith/LargeTile.png | Bin 0 -> 1407 bytes .../Assets/FileLocksmith/SmallTile.png | Bin 0 -> 433 bytes .../Assets/FileLocksmith/SplashScreen.png | Bin 0 -> 1314 bytes .../FileLocksmith/Square150x150Logo.png | Bin 0 -> 1407 bytes .../Assets/FileLocksmith/Square44x44Logo.png | Bin 0 -> 433 bytes .../Assets/FileLocksmith/Wide310x150Logo.png | Bin 0 -> 1278 bytes .../Assets/FileLocksmith/storelogo.png | Bin 0 -> 328 bytes .../FileLocksmithContextMenu.base.rc | 50 +++++ .../FileLocksmithContextMenu.vcxproj | 130 ++++++++++++ .../FileLocksmithContextMenu.vcxproj.filters | 46 +++++ .../FileLocksmithContextMenu/Resources.resx | 130 ++++++++++++ .../FileLocksmithContextMenu/Source.def | 5 + .../FileLocksmithContextMenu/dllmain.cpp | 189 ++++++++++++++++++ .../FileLocksmithContextMenu/framework.h | 5 + .../FileLocksmithContextMenu/packages.config | 4 + .../FileLocksmithContextMenu/pch.cpp | 5 + .../FileLocksmithContextMenu/pch.h | 13 ++ .../FileLocksmithContextMenu/resource.base.h | 13 ++ .../FileLocksmithExt/ExplorerCommand.cpp | 9 +- .../FileLocksmithExt/ExplorerCommand.h | 2 +- .../FileLocksmithExt/FileLocksmithExt.vcxproj | 171 +--------------- .../FileLocksmithExt.vcxproj.filters | 24 --- .../FileLocksmithExt/PowerToysModule.cpp | 21 +- .../FileLocksmithExt/dllmain.cpp | 3 +- .../Constants.h | 3 + .../FileLocksmithLib/FileLocksmithLib.cpp | 10 + .../FileLocksmithLib/FileLocksmithLib.vcxproj | 86 ++++++++ .../FileLocksmithLib.vcxproj.filters | 54 +++++ .../IPC.cpp | 0 .../IPC.h | 2 + .../Settings.cpp | 0 .../Settings.h | 0 .../Trace.cpp | 0 .../Trace.h | 0 .../FileLocksmithLib/framework.h | 15 ++ .../FileLocksmith/FileLocksmithLib/pch.cpp | 5 + .../FileLocksmith/FileLocksmithLib/pch.h | 13 ++ .../FileLocksmithLibInterop/interop.cpp | 2 +- 44 files changed, 906 insertions(+), 195 deletions(-) create mode 100644 src/modules/FileLocksmith/FileLocksmithContextMenu/AppxManifest.xml create mode 100644 src/modules/FileLocksmith/FileLocksmithContextMenu/Assets/FileLocksmith/FileLocksmith.ico create mode 100644 src/modules/FileLocksmith/FileLocksmithContextMenu/Assets/FileLocksmith/LargeTile.png create mode 100644 src/modules/FileLocksmith/FileLocksmithContextMenu/Assets/FileLocksmith/SmallTile.png create mode 100644 src/modules/FileLocksmith/FileLocksmithContextMenu/Assets/FileLocksmith/SplashScreen.png create mode 100644 src/modules/FileLocksmith/FileLocksmithContextMenu/Assets/FileLocksmith/Square150x150Logo.png create mode 100644 src/modules/FileLocksmith/FileLocksmithContextMenu/Assets/FileLocksmith/Square44x44Logo.png create mode 100644 src/modules/FileLocksmith/FileLocksmithContextMenu/Assets/FileLocksmith/Wide310x150Logo.png create mode 100644 src/modules/FileLocksmith/FileLocksmithContextMenu/Assets/FileLocksmith/storelogo.png create mode 100644 src/modules/FileLocksmith/FileLocksmithContextMenu/FileLocksmithContextMenu.base.rc create mode 100644 src/modules/FileLocksmith/FileLocksmithContextMenu/FileLocksmithContextMenu.vcxproj create mode 100644 src/modules/FileLocksmith/FileLocksmithContextMenu/FileLocksmithContextMenu.vcxproj.filters create mode 100644 src/modules/FileLocksmith/FileLocksmithContextMenu/Resources.resx create mode 100644 src/modules/FileLocksmith/FileLocksmithContextMenu/Source.def create mode 100644 src/modules/FileLocksmith/FileLocksmithContextMenu/dllmain.cpp create mode 100644 src/modules/FileLocksmith/FileLocksmithContextMenu/framework.h create mode 100644 src/modules/FileLocksmith/FileLocksmithContextMenu/packages.config create mode 100644 src/modules/FileLocksmith/FileLocksmithContextMenu/pch.cpp create mode 100644 src/modules/FileLocksmith/FileLocksmithContextMenu/pch.h create mode 100644 src/modules/FileLocksmith/FileLocksmithContextMenu/resource.base.h rename src/modules/FileLocksmith/{FileLocksmithExt => FileLocksmithLib}/Constants.h (90%) create mode 100644 src/modules/FileLocksmith/FileLocksmithLib/FileLocksmithLib.cpp create mode 100644 src/modules/FileLocksmith/FileLocksmithLib/FileLocksmithLib.vcxproj create mode 100644 src/modules/FileLocksmith/FileLocksmithLib/FileLocksmithLib.vcxproj.filters rename src/modules/FileLocksmith/{FileLocksmithExt => FileLocksmithLib}/IPC.cpp (100%) rename src/modules/FileLocksmith/{FileLocksmithExt => FileLocksmithLib}/IPC.h (93%) rename src/modules/FileLocksmith/{FileLocksmithExt => FileLocksmithLib}/Settings.cpp (100%) rename src/modules/FileLocksmith/{FileLocksmithExt => FileLocksmithLib}/Settings.h (100%) rename src/modules/FileLocksmith/{FileLocksmithExt => FileLocksmithLib}/Trace.cpp (100%) rename src/modules/FileLocksmith/{FileLocksmithExt => FileLocksmithLib}/Trace.h (100%) create mode 100644 src/modules/FileLocksmith/FileLocksmithLib/framework.h create mode 100644 src/modules/FileLocksmith/FileLocksmithLib/pch.cpp create mode 100644 src/modules/FileLocksmith/FileLocksmithLib/pch.h diff --git a/.github/actions/spell-check/expect.txt b/.github/actions/spell-check/expect.txt index bb8cd1032098..0ecb28a1eae6 100644 --- a/.github/actions/spell-check/expect.txt +++ b/.github/actions/spell-check/expect.txt @@ -468,6 +468,7 @@ FILEEXPLORER FILEFLAGS FILEFLAGSMASK FILELOCKSMITH +FILELOCKSMITHCONTEXTMENU FILELOCKSMITHEXT FILELOCKSMITHLIB FILELOCKSMITHLIBINTEROP diff --git a/.pipelines/ESRPSigning_core.json b/.pipelines/ESRPSigning_core.json index 097645b6758b..0e6a887ec9ca 100644 --- a/.pipelines/ESRPSigning_core.json +++ b/.pipelines/ESRPSigning_core.json @@ -102,6 +102,8 @@ "WinUI3Apps\\PowerToys.FileLocksmithExt.dll", "WinUI3Apps\\PowerToys.FileLocksmithUI.exe", "WinUI3Apps\\PowerToys.FileLocksmithUI.dll", + "WinUI3Apps\\PowerToys.FileLocksmithContextMenu.dll", + "FileLocksmithContextMenuPackage.msix", "WinUI3Apps\\Peek.Common.dll", "WinUI3Apps\\Peek.FilePreviewer.dll", diff --git a/PowerToys.sln b/PowerToys.sln index 6c37839b19c7..4cd3e110c694 100644 --- a/PowerToys.sln +++ b/PowerToys.sln @@ -564,6 +564,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UnitTests-QoiThumbnailProvi EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CmdNotFoundModuleInterface", "src\modules\cmdNotFound\CmdNotFoundModuleInterface\CmdNotFoundModuleInterface.vcxproj", "{0014D652-901F-4456-8D65-06FC5F997FB0}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FileLocksmithContextMenu", "src\modules\FileLocksmith\FileLocksmithContextMenu\FileLocksmithContextMenu.vcxproj", "{799A50D8-DE89-4ED1-8FF8-AD5A9ED8C0CA}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FileLocksmithLib", "src\modules\FileLocksmith\FileLocksmithLib\FileLocksmithLib.vcxproj", "{9D52FD25-EF90-4F9A-A015-91EFC5DAF54F}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|ARM64 = Debug|ARM64 @@ -2466,6 +2470,30 @@ Global {0014D652-901F-4456-8D65-06FC5F997FB0}.Release|x64.Build.0 = Release|x64 {0014D652-901F-4456-8D65-06FC5F997FB0}.Release|x86.ActiveCfg = Release|Win32 {0014D652-901F-4456-8D65-06FC5F997FB0}.Release|x86.Build.0 = Release|Win32 + {799A50D8-DE89-4ED1-8FF8-AD5A9ED8C0CA}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {799A50D8-DE89-4ED1-8FF8-AD5A9ED8C0CA}.Debug|ARM64.Build.0 = Debug|ARM64 + {799A50D8-DE89-4ED1-8FF8-AD5A9ED8C0CA}.Debug|x64.ActiveCfg = Debug|x64 + {799A50D8-DE89-4ED1-8FF8-AD5A9ED8C0CA}.Debug|x64.Build.0 = Debug|x64 + {799A50D8-DE89-4ED1-8FF8-AD5A9ED8C0CA}.Debug|x86.ActiveCfg = Debug|x64 + {799A50D8-DE89-4ED1-8FF8-AD5A9ED8C0CA}.Debug|x86.Build.0 = Debug|x64 + {799A50D8-DE89-4ED1-8FF8-AD5A9ED8C0CA}.Release|ARM64.ActiveCfg = Release|ARM64 + {799A50D8-DE89-4ED1-8FF8-AD5A9ED8C0CA}.Release|ARM64.Build.0 = Release|ARM64 + {799A50D8-DE89-4ED1-8FF8-AD5A9ED8C0CA}.Release|x64.ActiveCfg = Release|x64 + {799A50D8-DE89-4ED1-8FF8-AD5A9ED8C0CA}.Release|x64.Build.0 = Release|x64 + {799A50D8-DE89-4ED1-8FF8-AD5A9ED8C0CA}.Release|x86.ActiveCfg = Release|x64 + {799A50D8-DE89-4ED1-8FF8-AD5A9ED8C0CA}.Release|x86.Build.0 = Release|x64 + {9D52FD25-EF90-4F9A-A015-91EFC5DAF54F}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {9D52FD25-EF90-4F9A-A015-91EFC5DAF54F}.Debug|ARM64.Build.0 = Debug|ARM64 + {9D52FD25-EF90-4F9A-A015-91EFC5DAF54F}.Debug|x64.ActiveCfg = Debug|x64 + {9D52FD25-EF90-4F9A-A015-91EFC5DAF54F}.Debug|x64.Build.0 = Debug|x64 + {9D52FD25-EF90-4F9A-A015-91EFC5DAF54F}.Debug|x86.ActiveCfg = Debug|x64 + {9D52FD25-EF90-4F9A-A015-91EFC5DAF54F}.Debug|x86.Build.0 = Debug|x64 + {9D52FD25-EF90-4F9A-A015-91EFC5DAF54F}.Release|ARM64.ActiveCfg = Release|ARM64 + {9D52FD25-EF90-4F9A-A015-91EFC5DAF54F}.Release|ARM64.Build.0 = Release|ARM64 + {9D52FD25-EF90-4F9A-A015-91EFC5DAF54F}.Release|x64.ActiveCfg = Release|x64 + {9D52FD25-EF90-4F9A-A015-91EFC5DAF54F}.Release|x64.Build.0 = Release|x64 + {9D52FD25-EF90-4F9A-A015-91EFC5DAF54F}.Release|x86.ActiveCfg = Release|x64 + {9D52FD25-EF90-4F9A-A015-91EFC5DAF54F}.Release|x86.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -2673,6 +2701,8 @@ Global {3940AD4D-F748-4BE4-9083-85769CD553EF} = {2F305555-C296-497E-AC20-5FA1B237996A} {F8FFFC12-A31A-4AFA-B3DF-14DCF42B5E38} = {2F305555-C296-497E-AC20-5FA1B237996A} {0014D652-901F-4456-8D65-06FC5F997FB0} = {4C0D0746-BE5B-49EE-BD5D-A7811628AE8B} + {799A50D8-DE89-4ED1-8FF8-AD5A9ED8C0CA} = {AB82E5DD-C32D-4F28-9746-2C780846188E} + {9D52FD25-EF90-4F9A-A015-91EFC5DAF54F} = {AB82E5DD-C32D-4F28-9746-2C780846188E} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {C3A2F9D1-7930-4EF4-A6FC-7EE0A99821D0} diff --git a/installer/PowerToysSetupCustomActions/CustomAction.cpp b/installer/PowerToysSetupCustomActions/CustomAction.cpp index 290df09898f4..a24713b5ac99 100644 --- a/installer/PowerToysSetupCustomActions/CustomAction.cpp +++ b/installer/PowerToysSetupCustomActions/CustomAction.cpp @@ -952,7 +952,7 @@ UINT __stdcall UnRegisterContextMenuPackagesCA(MSIHANDLE hInstall) try { // Packages to unregister - const std::vector packagesToRemoveDisplayName{ { L"PowerRenameContextMenu" }, { L"ImageResizerContextMenu" } }; + const std::vector packagesToRemoveDisplayName{ { L"PowerRenameContextMenu" }, { L"ImageResizerContextMenu" }, { L"FileLocksmithContextMenu" } }; PackageManager packageManager; diff --git a/src/modules/FileLocksmith/FileLocksmithContextMenu/AppxManifest.xml b/src/modules/FileLocksmith/FileLocksmithContextMenu/AppxManifest.xml new file mode 100644 index 000000000000..1fd5adf83203 --- /dev/null +++ b/src/modules/FileLocksmith/FileLocksmithContextMenu/AppxManifest.xml @@ -0,0 +1,56 @@ + + + + + PowerToys FileLocksmith Context Menu + Microsoft + Assets\FileLocksmith\storelogo.png + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/modules/FileLocksmith/FileLocksmithContextMenu/Assets/FileLocksmith/FileLocksmith.ico b/src/modules/FileLocksmith/FileLocksmithContextMenu/Assets/FileLocksmith/FileLocksmith.ico new file mode 100644 index 0000000000000000000000000000000000000000..629b1190692a5a9f1bbf8024a3aebc62a5cdcaa8 GIT binary patch literal 173942 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 L`njxgN@xNAcgV8q literal 0 HcmV?d00001 diff --git a/src/modules/FileLocksmith/FileLocksmithContextMenu/Assets/FileLocksmith/SmallTile.png b/src/modules/FileLocksmith/FileLocksmithContextMenu/Assets/FileLocksmith/SmallTile.png new file mode 100644 index 0000000000000000000000000000000000000000..8773d6366a6d242e8e9ec0597c660161b9709cd4 GIT binary patch literal 433 zcmeAS@N?(olHy`uVBq!ia0vp^5g^RM3?!R(>#_qWl>na**Z=?j?GD;vtX2*RPHY3>=3YF6_@Xk-4j}K>Mdd<25T;uAbRq zC&Q*pyML~W@7j_Emt#*)w_a4ee)LYR6Hmt)U!TcuB6{WtI6Y|D;NH*`;HwbuLFjxjV_6xeDn;=Qe51TX}y}rkRbAPHVO6cLvcPB@sl=KhKZn`TRb=?{k0L zsf_eAd9)%LK@hoib!sMpNJ#{dEQpGL6K!Z_4{UhGy6jbgAo%@$p6BoXn-#d0l?Sup z_hzPN!7d>5>{$!i&P$?gx82H0`=YrMW8U^&G&L=3cP5SRsH#Vh$PL=m71;+Q@7?1i z(nUz5Ma>>z$npS>xyr%t`(?RYfKkdo1?7)zi~H=@8Y}54m!EiYf{aJ+l#!2R)vbPK z!7x`%P8rDyJ$AhOtoPSUedW1^oZj*JVCyhi@i$f$nIWFL!_y_1p^~a z#^?#_@G7Iqt8}+;Cykf~H)W#4Y|(*`*0yb;4Xt%y_rae}J<|BTcmQW6qtr*80dNgK zyZ#Ou6iq7c`Qvy`y7S`=g%=8=-tsc=Qt%TUTDj+L{^QNl8g%QYlAzaw}IJWqEO zx}}uaKCLi6v00rjx^eWIlfESJF2Z?=zx+yx|NY~AWJ_3S#HDo4nbTG0deyn?vNO_6A-IC7}gtA z99}Hc@exEBbP&*?pe#e99U9+Ls40hnN&uEkCakpCCG+)|UF;nVN}B5a0JzL7xk-H* z3=afs!(>CBZn literal 0 HcmV?d00001 diff --git a/src/modules/FileLocksmith/FileLocksmithContextMenu/Assets/FileLocksmith/Square150x150Logo.png b/src/modules/FileLocksmith/FileLocksmithContextMenu/Assets/FileLocksmith/Square150x150Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f8a9f8f193b66d9ddc4521b44e585224184ce63c GIT binary patch literal 1407 zcmeAS@N?(olHy`uVBq!ia0y~yVAKI&7G|JGckpC4Af*-H6XN>+|Ns5O0pSTQHb7l` zB|(0{3=ID_ni|hzn!8?KmwEoPi)_ys7+Ah}x;TbZFuu96P>?}^$NA!cjSM*l{vF=P z)V6x9w&4Gjr|Jc#@&Zj*aMbkc{fn1VGd1R~uG6``^~9-(u40kf;_cR~^$LIgPWbs6 zeg8QFP7xtuHVqT<~fJ=t|py`OHAct4oKOi?a!Dug?7vuP-I9#pK!(=D99J8L)r)4Z{kHkE!#;E09o|`W@nV}6oZkFT z?{wr1)=2y5Pj%jZ(n+tJo^E-1w@r8C-qV}sJdK@)B6>RV-qXl)pY+ZbO)IaQws{Y2 zl)TiUT{UuG~MMCmfE}Se*Xl~$i=U}ifz)$E@@qJ zMk>~H^=7y5^RL#teib>_bXQeadTjWKs=lwk!p(ZN>LwV-uHVdf?1$|PzrTsqT**Jx zd6d$R$}?;zI&Q*nz<}ZKl0D3(r&z-oR1>-W3D;*$V65nbBd zOLrWK=+N$I-Ek?RO}jUB$D@cA?LOBXpCX#H`&H2>p@@0fjZb&do?188dczq7oQ>9~*Vva;i>XtfP7?^CSSEO^)wQuQ;7aMuRZKpk4blfQBOGI0@-06ag z$&z|iI)`2RQ;Cs$uq!oI@!G*s+mxvh>erpGg?E$|{IyG28o@sOMArtsb+=J1c>VY7 zzW(>;H@$XG+Z*TT^MNUKvspF>^=a3yy_UEA_S>@Eck{m2e`CLqQN)+_A}$VCvN3qN L`njxgN@xNAcgV8q literal 0 HcmV?d00001 diff --git a/src/modules/FileLocksmith/FileLocksmithContextMenu/Assets/FileLocksmith/Square44x44Logo.png b/src/modules/FileLocksmith/FileLocksmithContextMenu/Assets/FileLocksmith/Square44x44Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8773d6366a6d242e8e9ec0597c660161b9709cd4 GIT binary patch literal 433 zcmeAS@N?(olHy`uVBq!ia0vp^5g^RM3?!R(>#_qWl>na**Z=?j?GD;vtX2*RPHY3>=3YF6_@Xk-4j}K>Mdd<25T;uAbRq zC&Q*pyML~W@7j_Emt#*)w_a4ee)LYR6Hmt)U!TcuB6{WtI6Y|D;NH*`;HwbuLFjXn3Oy$zH=low+7k9S(Nwc_dJXJ& z_e^r4HU~-Zd55=nOTtM<8=ER_&t7}Ktz5Y)nq#_i&wdT&5tp70SPW0BQ<$0DbWUs) zTk)~P7~*40-m#N)h2x6%MDzXoxQt3uS7_m;WmM6*KzW~y(ePPzMuVCiGyHms{E;Vt zkae6T3&|mTnsr5e3V+jI-siB>?xhbqSVK}3ZZua$b`u>wU`sI;A4WUl@fxZTK}nm0 zD=^7h1vv@G*#)_3KmxQg#(17ma7xm~u!Sb6ONW}}m|q`o`aFhXl&dp=pnF)n#_o+Ioyxu~&T0uer5^@Jfe22sV z!sY_P{^()~#R?klG?fU^8bG&Nh$dL)gSGOXAd5i- zQ-eX!yJa(|4oo;cIG=Egm>4V+#+EHADQx=eyuCB=)!p8-jPy+{2V_?huUyy3>W(0)iEAyZ7nmN2PrS8^as$}suziJZBtCqG%6R9{X7Gq|@2P@_eq?KhjwA;L%lb+7$ nt6bjR7b%fn!rgG==|=Fv z_5W}VK0bCG2G{d~p-eIxc-a)nU)x_hCs7l2iRcXNTJv)9yswo9L^4BRNOl{^kjx>bH^=oQ|($H7e|}b&_Ad zR-kXAyU*JRht=QoGYGV8bT8mIUck~`zyoD$5P!zO$H@Jl!%v{EvDmUjw?kQ@CE23M z*`iJPjUvxsL765)nS+WF#n%g1S{QnmL|6nkPp)mXfAjO}Z2OLH?o(_`o*C{td{k@w zF1{}QNWP+g1)rmh&MIyDzpd%NTmSxR(SOojtb1I&A?~-*Pmfh<|Lo;sRPByrK60!} X;=f-PViMO53?T+jS3j3^P6 +#include "Generated Files/resource.h" +#include "../../../common/version/version.h" + +#define APSTUDIO_READONLY_SYMBOLS +#include "winres.h" +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION FILE_VERSION + PRODUCTVERSION PRODUCT_VERSION + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "CompanyName", COMPANY_NAME + VALUE "FileDescription", FILE_DESCRIPTION + VALUE "FileVersion", FILE_VERSION_STRING + VALUE "InternalName", INTERNAL_NAME + VALUE "LegalCopyright", COPYRIGHT_NOTE + VALUE "OriginalFilename", ORIGINAL_FILENAME + VALUE "ProductName", PRODUCT_NAME + VALUE "ProductVersion", PRODUCT_VERSION_STRING + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END diff --git a/src/modules/FileLocksmith/FileLocksmithContextMenu/FileLocksmithContextMenu.vcxproj b/src/modules/FileLocksmith/FileLocksmithContextMenu/FileLocksmithContextMenu.vcxproj new file mode 100644 index 000000000000..f1d35839c0c9 --- /dev/null +++ b/src/modules/FileLocksmith/FileLocksmithContextMenu/FileLocksmithContextMenu.vcxproj @@ -0,0 +1,130 @@ + + + + + + + 17.0 + Win32Proj + {799a50d8-de89-4ed1-8ff8-ad5a9ed8c0ca} + FileLocksmithContextMenu + + + + PowerToys.FileLocksmithContextMenu + + $(SolutionDir)$(Platform)\$(Configuration)\TemporaryBuild\obj\$(ProjectName)\ + ..\..\..\..\$(Platform)\$(Configuration)\WinUI3Apps\ + + + DynamicLibrary + true + v143 + Unicode + + + DynamicLibrary + false + v143 + true + Unicode + + + + + + + + + + + + + Level3 + true + WIN32;_DEBUG;FILELOCKSMITHCONTEXTMENU_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + Use + ..;../../..; + + + Windows + true + false + runtimeobject.lib;%(AdditionalDependencies) + Source.def + + + del $(OutDir)\FileLocksmithContextMenuPackage.msix /q +MakeAppx.exe pack /d . /p $(OutDir)FileLocksmithContextMenuPackage.msix /nv + + + + + Level3 + true + true + true + WIN32;NDEBUG;FILELOCKSMITHCONTEXTMENU_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + Use + ..;../../..; + + + Windows + true + true + true + false + runtimeobject.lib;%(AdditionalDependencies) + Source.def + + + del $(OutDir)\FileLocksmithContextMenuPackage.msix /q +MakeAppx.exe pack /d . /p $(OutDir)FileLocksmithContextMenuPackage.msix /nv + + + + + + + + + + + Create + + + + + + + + + + + + {6955446d-23f7-4023-9bb3-8657f904af99} + + + {cc6e41ac-8174-4e8a-8d22-85dd7f4851df} + + + {9d52fd25-ef90-4f9a-a015-91efc5daf54f} + + + + + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + \ No newline at end of file diff --git a/src/modules/FileLocksmith/FileLocksmithContextMenu/FileLocksmithContextMenu.vcxproj.filters b/src/modules/FileLocksmith/FileLocksmithContextMenu/FileLocksmithContextMenu.vcxproj.filters new file mode 100644 index 000000000000..4e95cc85ee07 --- /dev/null +++ b/src/modules/FileLocksmith/FileLocksmithContextMenu/FileLocksmithContextMenu.vcxproj.filters @@ -0,0 +1,46 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + + + Resource Files + + + + + Resource Files + + + \ No newline at end of file diff --git a/src/modules/FileLocksmith/FileLocksmithContextMenu/Resources.resx b/src/modules/FileLocksmith/FileLocksmithContextMenu/Resources.resx new file mode 100644 index 000000000000..beb863e7e861 --- /dev/null +++ b/src/modules/FileLocksmith/FileLocksmithContextMenu/Resources.resx @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Unlock with File Locksmith + This text will be shown when the user opens the context menu (right clicks) a file. File Locksmith is the product name, do not loc. + + + File Locksmith + + \ No newline at end of file diff --git a/src/modules/FileLocksmith/FileLocksmithContextMenu/Source.def b/src/modules/FileLocksmith/FileLocksmithContextMenu/Source.def new file mode 100644 index 000000000000..1ffdadd7a1d8 --- /dev/null +++ b/src/modules/FileLocksmith/FileLocksmithContextMenu/Source.def @@ -0,0 +1,5 @@ +LIBRARY +EXPORTS +DllCanUnloadNow PRIVATE +DllGetClassObject PRIVATE +DllGetActivationFactory PRIVATE \ No newline at end of file diff --git a/src/modules/FileLocksmith/FileLocksmithContextMenu/dllmain.cpp b/src/modules/FileLocksmith/FileLocksmithContextMenu/dllmain.cpp new file mode 100644 index 000000000000..1abf0e947b28 --- /dev/null +++ b/src/modules/FileLocksmith/FileLocksmithContextMenu/dllmain.cpp @@ -0,0 +1,189 @@ +// dllmain.cpp : Defines the entry point for the DLL application. +#include "pch.h" + +#include +#include +#include + +#include "FileLocksmithLib/IPC.h" +#include "FileLocksmithLib/Settings.h" +#include "FileLocksmithLib/Trace.h" + +#include +#include +#include +#include + +#include "Generated Files/resource.h" + + +using namespace Microsoft::WRL; + +HINSTANCE g_hInst = 0; + +BOOL APIENTRY DllMain( HMODULE hModule, + DWORD ul_reason_for_call, + LPVOID lpReserved + ) +{ + switch (ul_reason_for_call) + { + case DLL_PROCESS_ATTACH: + g_hInst = hModule; + Trace::RegisterProvider(); + break; + case DLL_PROCESS_DETACH: + Trace::UnregisterProvider(); + break; + } + return TRUE; +} + +class __declspec(uuid("AAF1E27D-4976-49C2-8895-AAFA743C0A7E")) FileLocksmithContextMenuCommand final : public RuntimeClass, IExplorerCommand, IObjectWithSite> +{ +public: + virtual const wchar_t* Title() { return L"File Locksmith"; } + virtual const EXPCMDFLAGS Flags() { return ECF_DEFAULT; } + virtual const EXPCMDSTATE State(_In_opt_ IShellItemArray* selection) { return ECS_ENABLED; } + + // IExplorerCommand + IFACEMETHODIMP GetTitle(_In_opt_ IShellItemArray* items, _Outptr_result_nullonfailure_ PWSTR* name) + { + return SHStrDup(context_menu_caption.c_str(), name); + } + + IFACEMETHODIMP GetIcon(_In_opt_ IShellItemArray*, _Outptr_result_nullonfailure_ PWSTR* icon) + { + std::wstring iconResourcePath = get_module_folderpath(g_hInst); + iconResourcePath += L"\\Assets\\FileLocksmith\\"; + iconResourcePath += L"FileLocksmith.ico"; + return SHStrDup(iconResourcePath.c_str(), icon); + } + + IFACEMETHODIMP GetToolTip(_In_opt_ IShellItemArray*, _Outptr_result_nullonfailure_ PWSTR* infoTip) + { + *infoTip = nullptr; + return E_NOTIMPL; + } + + IFACEMETHODIMP GetCanonicalName(_Out_ GUID* guidCommandName) + { + *guidCommandName = __uuidof(this); + return S_OK; + } + + IFACEMETHODIMP GetState(_In_opt_ IShellItemArray* selection, _In_ BOOL okToBeSlow, _Out_ EXPCMDSTATE* cmdState) + { + *cmdState = ECS_ENABLED; + + if (!FileLocksmithSettingsInstance().GetEnabled()) + { + *cmdState = ECS_HIDDEN; + } + + if (FileLocksmithSettingsInstance().GetShowInExtendedContextMenu()) + { + *cmdState = ECS_HIDDEN; + } + + return S_OK; + } + + IFACEMETHODIMP Invoke(_In_opt_ IShellItemArray* selection, _In_opt_ IBindCtx*) noexcept + { + Trace::Invoked(); + ipc::Writer writer; + + if (selection == nullptr) + { + return S_OK; + } + + if (HRESULT result = writer.start(); FAILED(result)) + { + Trace::InvokedRet(result); + return result; + } + + std::wstring path = get_module_folderpath(g_hInst); + path = path + L"\\PowerToys.FileLocksmithUI.exe"; + + HRESULT result; + + if (!RunNonElevatedEx(path.c_str(), L"", get_module_folderpath(g_hInst))) + { + result = E_FAIL; + Trace::InvokedRet(result); + return result; + } + + DWORD num_items; + selection->GetCount(&num_items); + + for (DWORD i = 0; i < num_items; i++) + { + IShellItem* item; + result = selection->GetItemAt(i, &item); + if (SUCCEEDED(result)) + { + LPWSTR file_path; + result = item->GetDisplayName(SIGDN_FILESYSPATH, &file_path); + if (SUCCEEDED(result)) + { + // TODO Aggregate items and send to UI + writer.add_path(file_path); + CoTaskMemFree(file_path); + } + + item->Release(); + } + } + + Trace::InvokedRet(S_OK); + return S_OK; + } + + IFACEMETHODIMP GetFlags(_Out_ EXPCMDFLAGS* flags) + { + *flags = Flags(); + return S_OK; + } + IFACEMETHODIMP EnumSubCommands(_COM_Outptr_ IEnumExplorerCommand** enumCommands) + { + *enumCommands = nullptr; + return E_NOTIMPL; + } + + // IObjectWithSite + IFACEMETHODIMP SetSite(_In_ IUnknown* site) noexcept + { + m_site = site; + return S_OK; + } + IFACEMETHODIMP GetSite(_In_ REFIID riid, _COM_Outptr_ void** site) noexcept { return m_site.CopyTo(riid, site); } + +protected: + ComPtr m_site; + +private: + std::wstring context_menu_caption = GET_RESOURCE_STRING_FALLBACK(IDS_FILE_LOCKSMITH_CONTEXT_MENU_ENTRY, L"Unlock with File Locksmith"); +}; + +CoCreatableClass(FileLocksmithContextMenuCommand) +CoCreatableClassWrlCreatorMapInclude(FileLocksmithContextMenuCommand) + + +STDAPI DllGetActivationFactory(_In_ HSTRING activatableClassId, _COM_Outptr_ IActivationFactory** factory) +{ + return Module::GetModule().GetActivationFactory(activatableClassId, factory); +} + +STDAPI DllCanUnloadNow() +{ + return Module::GetModule().GetObjectCount() == 0 ? S_OK : S_FALSE; +} + +STDAPI DllGetClassObject(_In_ REFCLSID rclsid, _In_ REFIID riid, _COM_Outptr_ void** instance) +{ + return Module::GetModule().GetClassObject(rclsid, riid, instance); +} diff --git a/src/modules/FileLocksmith/FileLocksmithContextMenu/framework.h b/src/modules/FileLocksmith/FileLocksmithContextMenu/framework.h new file mode 100644 index 000000000000..54b83e94fd33 --- /dev/null +++ b/src/modules/FileLocksmith/FileLocksmithContextMenu/framework.h @@ -0,0 +1,5 @@ +#pragma once + +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers +// Windows Header Files +#include diff --git a/src/modules/FileLocksmith/FileLocksmithContextMenu/packages.config b/src/modules/FileLocksmith/FileLocksmithContextMenu/packages.config new file mode 100644 index 000000000000..6199e2345ccd --- /dev/null +++ b/src/modules/FileLocksmith/FileLocksmithContextMenu/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/modules/FileLocksmith/FileLocksmithContextMenu/pch.cpp b/src/modules/FileLocksmith/FileLocksmithContextMenu/pch.cpp new file mode 100644 index 000000000000..64b7eef6d6b9 --- /dev/null +++ b/src/modules/FileLocksmith/FileLocksmithContextMenu/pch.cpp @@ -0,0 +1,5 @@ +// pch.cpp: source file corresponding to the pre-compiled header + +#include "pch.h" + +// When you are using pre-compiled headers, this source file is necessary for compilation to succeed. diff --git a/src/modules/FileLocksmith/FileLocksmithContextMenu/pch.h b/src/modules/FileLocksmith/FileLocksmithContextMenu/pch.h new file mode 100644 index 000000000000..885d5d62e48e --- /dev/null +++ b/src/modules/FileLocksmith/FileLocksmithContextMenu/pch.h @@ -0,0 +1,13 @@ +// pch.h: This is a precompiled header file. +// Files listed below are compiled only once, improving build performance for future builds. +// This also affects IntelliSense performance, including code completion and many code browsing features. +// However, files listed here are ALL re-compiled if any one of them is updated between builds. +// Do not add files here that you will be updating frequently as this negates the performance advantage. + +#ifndef PCH_H +#define PCH_H + +// add headers that you want to pre-compile here +#include "framework.h" + +#endif //PCH_H diff --git a/src/modules/FileLocksmith/FileLocksmithContextMenu/resource.base.h b/src/modules/FileLocksmith/FileLocksmithContextMenu/resource.base.h new file mode 100644 index 000000000000..0f984b9721a1 --- /dev/null +++ b/src/modules/FileLocksmith/FileLocksmithContextMenu/resource.base.h @@ -0,0 +1,13 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by ImageResizerContextMenu.rc + +////////////////////////////// +// Non-localizable + +#define FILE_DESCRIPTION "PowerToys File Locksmith Context Menu" +#define INTERNAL_NAME "PowerToys.FileLocksmithContextMenu.dll" +#define ORIGINAL_FILENAME "PowerToys.FileLocksmithContextMenu.dll" + +// Non-localizable +////////////////////////////// diff --git a/src/modules/FileLocksmith/FileLocksmithExt/ExplorerCommand.cpp b/src/modules/FileLocksmith/FileLocksmithExt/ExplorerCommand.cpp index fabd02d9512d..e0eee3d7819c 100644 --- a/src/modules/FileLocksmith/FileLocksmithExt/ExplorerCommand.cpp +++ b/src/modules/FileLocksmith/FileLocksmithExt/ExplorerCommand.cpp @@ -1,12 +1,13 @@ #include "pch.h" #include "ExplorerCommand.h" -#include "Constants.h" -#include "Settings.h" #include "dllmain.h" -#include "Trace.h" #include "Generated Files/resource.h" +#include "FileLocksmithLib/Constants.h" +#include "FileLocksmithLib/Settings.h" +#include "FileLocksmithLib/Trace.h" + #include #include #include @@ -284,4 +285,4 @@ HRESULT ExplorerCommand::LaunchUI(CMINVOKECOMMANDINFO* pici, ipc::Writer* writer CloseHandle(processInformation.hThread); return S_OK; -} +} \ No newline at end of file diff --git a/src/modules/FileLocksmith/FileLocksmithExt/ExplorerCommand.h b/src/modules/FileLocksmith/FileLocksmithExt/ExplorerCommand.h index dda50f99496f..d59f2661579d 100644 --- a/src/modules/FileLocksmith/FileLocksmithExt/ExplorerCommand.h +++ b/src/modules/FileLocksmith/FileLocksmithExt/ExplorerCommand.h @@ -2,7 +2,7 @@ #include "pch.h" -#include "IPC.h" +#include "FileLocksmithLib/IPC.h" #define EXPLORER_COMMAND_UUID_STR "84d68575-e186-46ad-b0cb-baeb45ee29c0" diff --git a/src/modules/FileLocksmith/FileLocksmithExt/FileLocksmithExt.vcxproj b/src/modules/FileLocksmith/FileLocksmithExt/FileLocksmithExt.vcxproj index 43760403b96a..969658a40ae4 100644 --- a/src/modules/FileLocksmith/FileLocksmithExt/FileLocksmithExt.vcxproj +++ b/src/modules/FileLocksmith/FileLocksmithExt/FileLocksmithExt.vcxproj @@ -4,32 +4,6 @@ - - - Debug - ARM64 - - - Debug - Win32 - - - Release - ARM64 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - 16.0 Win32Proj @@ -39,39 +13,13 @@ PowerToys.FileLocksmithExt - - DynamicLibrary - true - v143 - Unicode - - - DynamicLibrary - false - v143 - true - Unicode - - + DynamicLibrary true v143 Unicode - - DynamicLibrary - true - v143 - Unicode - - - DynamicLibrary - false - v143 - true - Unicode - - + DynamicLibrary false v143 @@ -83,33 +31,18 @@ - - - - - - - - - - - - - - - - + - + Level3 true WIN32;_DEBUG;FILELOCKSMITHEXT_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) true Use - ../../;../../../;%(AdditionalIncludeDirectories) + ..;../../;../../../;%(AdditionalIncludeDirectories) Windows @@ -118,7 +51,7 @@ dll.def - + Level3 true @@ -127,79 +60,7 @@ WIN32;NDEBUG;FILELOCKSMITHEXT_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) true Use - ../../;../../../;%(AdditionalIncludeDirectories) - - - Windows - true - true - true - false - dll.def - - - - - Level3 - true - _DEBUG;FILELOCKSMITHEXT_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) - true - Use - ../../;../../../;%(AdditionalIncludeDirectories) - - - Windows - true - false - dll.def - - - - - Level3 - true - _DEBUG;FILELOCKSMITHEXT_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) - true - Use - ../../;../../../;%(AdditionalIncludeDirectories) - - - Windows - true - false - dll.def - - - - - Level3 - true - true - true - NDEBUG;FILELOCKSMITHLIB_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) - true - Use - ../../;../../../;%(AdditionalIncludeDirectories) - - - Windows - true - true - true - false - dll.def - - - - - Level3 - true - true - true - NDEBUG;FILELOCKSMITHLIB_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) - true - Use - ../../;../../../;%(AdditionalIncludeDirectories) + ..;../../;../../../;%(AdditionalIncludeDirectories) Windows @@ -212,16 +73,11 @@ - - - - - @@ -234,18 +90,10 @@ - - Create - Create - Create - Create - Create - Create + Create - - @@ -260,6 +108,9 @@ {98537082-0fdb-40de-abd8-0dc5a4269bab} + + {9d52fd25-ef90-4f9a-a015-91efc5daf54f} + diff --git a/src/modules/FileLocksmith/FileLocksmithExt/FileLocksmithExt.vcxproj.filters b/src/modules/FileLocksmith/FileLocksmithExt/FileLocksmithExt.vcxproj.filters index d0a249143fa0..c3b4f47ebc79 100644 --- a/src/modules/FileLocksmith/FileLocksmithExt/FileLocksmithExt.vcxproj.filters +++ b/src/modules/FileLocksmith/FileLocksmithExt/FileLocksmithExt.vcxproj.filters @@ -21,27 +21,12 @@ Header Files - - Header Files - Header Files Header Files - - Header Files - - - Header Files - - - Header Files - - - Header Files - @@ -59,15 +44,6 @@ Source Files - - Source Files - - - Source Files - - - Source Files - diff --git a/src/modules/FileLocksmith/FileLocksmithExt/PowerToysModule.cpp b/src/modules/FileLocksmith/FileLocksmithExt/PowerToysModule.cpp index 2c06bc403b6b..ee692603d2af 100644 --- a/src/modules/FileLocksmith/FileLocksmithExt/PowerToysModule.cpp +++ b/src/modules/FileLocksmith/FileLocksmithExt/PowerToysModule.cpp @@ -5,12 +5,15 @@ #include #include #include +#include +#include #include -#include "Constants.h" +#include "FileLocksmithLib/Constants.h" +#include "FileLocksmithLib/Settings.h" +#include "FileLocksmithLib/Trace.h" + #include "dllmain.h" -#include "Settings.h" -#include "Trace.h" #include "Generated Files/resource.h" class FileLocksmithModule : public PowertoyModuleIface @@ -74,6 +77,18 @@ class FileLocksmithModule : public PowertoyModuleIface virtual void enable() override { Logger::info(L"File Locksmith enabled"); + + if (package::IsWin11OrGreater()) + { + std::wstring path = get_module_folderpath(globals::instance); + std::wstring packageUri = path + L"\\FileLocksmithContextMenuPackage.msix"; + + if (!package::IsPackageRegistered(constants::nonlocalizable::ContextMenuPackageName)) + { + package::RegisterSparsePackage(path, packageUri); + } + } + m_enabled = true; save_settings(); } diff --git a/src/modules/FileLocksmith/FileLocksmithExt/dllmain.cpp b/src/modules/FileLocksmith/FileLocksmithExt/dllmain.cpp index 934139da9585..e2a5adcc254c 100644 --- a/src/modules/FileLocksmith/FileLocksmithExt/dllmain.cpp +++ b/src/modules/FileLocksmith/FileLocksmithExt/dllmain.cpp @@ -5,7 +5,8 @@ #pragma comment(lib, "shlwapi") #include "ClassFactory.h" -#include "Trace.h" + +#include "FileLocksmithLib/Trace.h" namespace globals { diff --git a/src/modules/FileLocksmith/FileLocksmithExt/Constants.h b/src/modules/FileLocksmith/FileLocksmithLib/Constants.h similarity index 90% rename from src/modules/FileLocksmith/FileLocksmithExt/Constants.h rename to src/modules/FileLocksmith/FileLocksmithLib/Constants.h index d6ac9c9b73b4..98a141831b7b 100644 --- a/src/modules/FileLocksmith/FileLocksmithExt/Constants.h +++ b/src/modules/FileLocksmith/FileLocksmithLib/Constants.h @@ -28,6 +28,9 @@ namespace constants::nonlocalizable // Name of the file where the list of files to checked will be stored constexpr WCHAR LastRunPath[] = L"\\last-run.log"; + + // Name of the tier 1 context menu package + constexpr WCHAR ContextMenuPackageName[] = L"FileLocksmithContextMenu"; } // Macros, non-localizable diff --git a/src/modules/FileLocksmith/FileLocksmithLib/FileLocksmithLib.cpp b/src/modules/FileLocksmith/FileLocksmithLib/FileLocksmithLib.cpp new file mode 100644 index 000000000000..aa0124ea7019 --- /dev/null +++ b/src/modules/FileLocksmith/FileLocksmithLib/FileLocksmithLib.cpp @@ -0,0 +1,10 @@ +// FileLocksmithLib.cpp : Defines the functions for the static library. +// + +#include "pch.h" +#include "framework.h" + +// TODO: This is an example of a library function +void fnFileLocksmithLib() +{ +} diff --git a/src/modules/FileLocksmith/FileLocksmithLib/FileLocksmithLib.vcxproj b/src/modules/FileLocksmith/FileLocksmithLib/FileLocksmithLib.vcxproj new file mode 100644 index 000000000000..3e3ecc875682 --- /dev/null +++ b/src/modules/FileLocksmith/FileLocksmithLib/FileLocksmithLib.vcxproj @@ -0,0 +1,86 @@ + + + + 17.0 + Win32Proj + {9d52fd25-ef90-4f9a-a015-91efc5daf54f} + FileLocksmithLib + 10.0 + + + + StaticLibrary + true + v143 + Unicode + + + StaticLibrary + false + v143 + Unicode + + + + + + + + + + + + + Level3 + true + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + true + Use + ../../..;../..; + + + + + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + true + Use + ../../..;../..; + + + + + true + true + true + + + + + + + + + + + + + + + + + Create + + + + + + \ No newline at end of file diff --git a/src/modules/FileLocksmith/FileLocksmithLib/FileLocksmithLib.vcxproj.filters b/src/modules/FileLocksmith/FileLocksmithLib/FileLocksmithLib.vcxproj.filters new file mode 100644 index 000000000000..8b223a619bc1 --- /dev/null +++ b/src/modules/FileLocksmith/FileLocksmithLib/FileLocksmithLib.vcxproj.filters @@ -0,0 +1,54 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/src/modules/FileLocksmith/FileLocksmithExt/IPC.cpp b/src/modules/FileLocksmith/FileLocksmithLib/IPC.cpp similarity index 100% rename from src/modules/FileLocksmith/FileLocksmithExt/IPC.cpp rename to src/modules/FileLocksmith/FileLocksmithLib/IPC.cpp diff --git a/src/modules/FileLocksmith/FileLocksmithExt/IPC.h b/src/modules/FileLocksmith/FileLocksmithLib/IPC.h similarity index 93% rename from src/modules/FileLocksmith/FileLocksmithExt/IPC.h rename to src/modules/FileLocksmith/FileLocksmithLib/IPC.h index 6013c0fa4d4f..44ae5f451c3e 100644 --- a/src/modules/FileLocksmith/FileLocksmithExt/IPC.h +++ b/src/modules/FileLocksmith/FileLocksmithLib/IPC.h @@ -2,6 +2,8 @@ #include "pch.h" +#include + namespace ipc { class Writer diff --git a/src/modules/FileLocksmith/FileLocksmithExt/Settings.cpp b/src/modules/FileLocksmith/FileLocksmithLib/Settings.cpp similarity index 100% rename from src/modules/FileLocksmith/FileLocksmithExt/Settings.cpp rename to src/modules/FileLocksmith/FileLocksmithLib/Settings.cpp diff --git a/src/modules/FileLocksmith/FileLocksmithExt/Settings.h b/src/modules/FileLocksmith/FileLocksmithLib/Settings.h similarity index 100% rename from src/modules/FileLocksmith/FileLocksmithExt/Settings.h rename to src/modules/FileLocksmith/FileLocksmithLib/Settings.h diff --git a/src/modules/FileLocksmith/FileLocksmithExt/Trace.cpp b/src/modules/FileLocksmith/FileLocksmithLib/Trace.cpp similarity index 100% rename from src/modules/FileLocksmith/FileLocksmithExt/Trace.cpp rename to src/modules/FileLocksmith/FileLocksmithLib/Trace.cpp diff --git a/src/modules/FileLocksmith/FileLocksmithExt/Trace.h b/src/modules/FileLocksmith/FileLocksmithLib/Trace.h similarity index 100% rename from src/modules/FileLocksmith/FileLocksmithExt/Trace.h rename to src/modules/FileLocksmith/FileLocksmithLib/Trace.h diff --git a/src/modules/FileLocksmith/FileLocksmithLib/framework.h b/src/modules/FileLocksmith/FileLocksmithLib/framework.h new file mode 100644 index 000000000000..71cd6b7eaa8b --- /dev/null +++ b/src/modules/FileLocksmith/FileLocksmithLib/framework.h @@ -0,0 +1,15 @@ +#pragma once + +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers + +#include +#include +#include +#include +#include + +// C++ Standard library +#include +#include +#include +#include diff --git a/src/modules/FileLocksmith/FileLocksmithLib/pch.cpp b/src/modules/FileLocksmith/FileLocksmithLib/pch.cpp new file mode 100644 index 000000000000..64b7eef6d6b9 --- /dev/null +++ b/src/modules/FileLocksmith/FileLocksmithLib/pch.cpp @@ -0,0 +1,5 @@ +// pch.cpp: source file corresponding to the pre-compiled header + +#include "pch.h" + +// When you are using pre-compiled headers, this source file is necessary for compilation to succeed. diff --git a/src/modules/FileLocksmith/FileLocksmithLib/pch.h b/src/modules/FileLocksmith/FileLocksmithLib/pch.h new file mode 100644 index 000000000000..885d5d62e48e --- /dev/null +++ b/src/modules/FileLocksmith/FileLocksmithLib/pch.h @@ -0,0 +1,13 @@ +// pch.h: This is a precompiled header file. +// Files listed below are compiled only once, improving build performance for future builds. +// This also affects IntelliSense performance, including code completion and many code browsing features. +// However, files listed here are ALL re-compiled if any one of them is updated between builds. +// Do not add files here that you will be updating frequently as this negates the performance advantage. + +#ifndef PCH_H +#define PCH_H + +// add headers that you want to pre-compile here +#include "framework.h" + +#endif //PCH_H diff --git a/src/modules/FileLocksmith/FileLocksmithLibInterop/interop.cpp b/src/modules/FileLocksmith/FileLocksmithLibInterop/interop.cpp index cc0fce4a792e..e208adafcf6f 100644 --- a/src/modules/FileLocksmith/FileLocksmithLibInterop/interop.cpp +++ b/src/modules/FileLocksmith/FileLocksmithLibInterop/interop.cpp @@ -2,7 +2,7 @@ #include "FileLocksmith.h" -#include "../FileLocksmithExt/Constants.h" +#include "../FileLocksmithLib/Constants.h" namespace FileLocksmith::Interop {