From 2c24fc0bcaa737c93d34d62f183b6c098d324255 Mon Sep 17 00:00:00 2001 From: Krxk <1246924370@qq.com> Date: Fri, 26 Apr 2024 05:24:30 +0800 Subject: [PATCH] version 1.0.0 --- .gitattributes | 63 ++ .gitignore | 363 ++++++++++ HelpUploadFiles.sln | 51 ++ HelpUploadFiles/CAboutDlg.cpp | 23 + HelpUploadFiles/CAboutDlg.h | 9 + HelpUploadFiles/CContext.cpp | 68 ++ HelpUploadFiles/CContext.h | 24 + HelpUploadFiles/CIgnoreFileManager.cpp | 30 + HelpUploadFiles/CIgnoreFileManager.h | 17 + HelpUploadFiles/CInjectDll.cpp | 55 ++ HelpUploadFiles/CInjectDll.h | 11 + HelpUploadFiles/CMainDlg.cpp | 210 ++++++ HelpUploadFiles/CMainDlg.h | 46 ++ HelpUploadFiles/CSkin.cpp | 38 + HelpUploadFiles/CSkin.h | 12 + HelpUploadFiles/HelpUploadFiles.cpp | 25 + HelpUploadFiles/HelpUploadFiles.h | 4 + HelpUploadFiles/HelpUploadFiles.ico | Bin 0 -> 91680 bytes HelpUploadFiles/HelpUploadFiles.rc | Bin 0 -> 9840 bytes HelpUploadFiles/HelpUploadFiles.vcxproj | 179 +++++ .../HelpUploadFiles.vcxproj.filters | 97 +++ HelpUploadFiles/Resource.h | 40 ++ HelpUploadFiles/cpp.hint | 3 + HelpUploadFiles/cursor.cur | Bin 0 -> 326 bytes HelpUploadFiles/framework.h | 21 + HelpUploadFiles/helpuplo.ico | Bin 0 -> 96238 bytes HelpUploadFiles/small.ico | Bin 0 -> 46227 bytes HelpUploadFiles/targetver.h | 6 + IgnoreInfoFormat/CIgnoreInfo.cpp | 19 + IgnoreInfoFormat/CIgnoreInfo.h | 17 + IgnoreInfoFormat/IgnoreInfoFormat.vcxitems | 24 + IgnoreInfoFormat/pch.cpp | 5 + IgnoreInfoFormat/pch.h | 14 + LICENSE.txt | 674 ++++++++++++++++++ WorkDll/APIHook.cpp | 431 +++++++++++ WorkDll/APIHook.h | 81 +++ WorkDll/CAdvice.cpp | 102 +++ WorkDll/CAdvice.h | 25 + WorkDll/WorkDll.vcxproj | 171 +++++ WorkDll/WorkDll.vcxproj.filters | 45 ++ WorkDll/cpp.hint | 2 + WorkDll/framework.h | 18 + WorkDll/work.cpp | 63 ++ WorkDll/work.h | 5 + 44 files changed, 3091 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 HelpUploadFiles.sln create mode 100644 HelpUploadFiles/CAboutDlg.cpp create mode 100644 HelpUploadFiles/CAboutDlg.h create mode 100644 HelpUploadFiles/CContext.cpp create mode 100644 HelpUploadFiles/CContext.h create mode 100644 HelpUploadFiles/CIgnoreFileManager.cpp create mode 100644 HelpUploadFiles/CIgnoreFileManager.h create mode 100644 HelpUploadFiles/CInjectDll.cpp create mode 100644 HelpUploadFiles/CInjectDll.h create mode 100644 HelpUploadFiles/CMainDlg.cpp create mode 100644 HelpUploadFiles/CMainDlg.h create mode 100644 HelpUploadFiles/CSkin.cpp create mode 100644 HelpUploadFiles/CSkin.h create mode 100644 HelpUploadFiles/HelpUploadFiles.cpp create mode 100644 HelpUploadFiles/HelpUploadFiles.h create mode 100644 HelpUploadFiles/HelpUploadFiles.ico create mode 100644 HelpUploadFiles/HelpUploadFiles.rc create mode 100644 HelpUploadFiles/HelpUploadFiles.vcxproj create mode 100644 HelpUploadFiles/HelpUploadFiles.vcxproj.filters create mode 100644 HelpUploadFiles/Resource.h create mode 100644 HelpUploadFiles/cpp.hint create mode 100644 HelpUploadFiles/cursor.cur create mode 100644 HelpUploadFiles/framework.h create mode 100644 HelpUploadFiles/helpuplo.ico create mode 100644 HelpUploadFiles/small.ico create mode 100644 HelpUploadFiles/targetver.h create mode 100644 IgnoreInfoFormat/CIgnoreInfo.cpp create mode 100644 IgnoreInfoFormat/CIgnoreInfo.h create mode 100644 IgnoreInfoFormat/IgnoreInfoFormat.vcxitems create mode 100644 IgnoreInfoFormat/pch.cpp create mode 100644 IgnoreInfoFormat/pch.h create mode 100644 LICENSE.txt create mode 100644 WorkDll/APIHook.cpp create mode 100644 WorkDll/APIHook.h create mode 100644 WorkDll/CAdvice.cpp create mode 100644 WorkDll/CAdvice.h create mode 100644 WorkDll/WorkDll.vcxproj create mode 100644 WorkDll/WorkDll.vcxproj.filters create mode 100644 WorkDll/cpp.hint create mode 100644 WorkDll/framework.h create mode 100644 WorkDll/work.cpp create mode 100644 WorkDll/work.h diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1ff0c42 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9491a2f --- /dev/null +++ b/.gitignore @@ -0,0 +1,363 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Oo]ut/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd \ No newline at end of file diff --git a/HelpUploadFiles.sln b/HelpUploadFiles.sln new file mode 100644 index 0000000..72a84e3 --- /dev/null +++ b/HelpUploadFiles.sln @@ -0,0 +1,51 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.7.34221.43 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "HelpUploadFiles", "HelpUploadFiles\HelpUploadFiles.vcxproj", "{1E4ECE2F-3748-47BE-BCDA-D2C2F671D695}" + ProjectSection(ProjectDependencies) = postProject + {9366E397-8E3A-4B62-8520-8412F8AF6182} = {9366E397-8E3A-4B62-8520-8412F8AF6182} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WorkDll", "WorkDll\WorkDll.vcxproj", "{9366E397-8E3A-4B62-8520-8412F8AF6182}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "IgnoreInfoFormat", "IgnoreInfoFormat\IgnoreInfoFormat.vcxitems", "{E904B7EC-60EF-4BCA-AEF5-2F7983E8FB9D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {1E4ECE2F-3748-47BE-BCDA-D2C2F671D695}.Debug|x64.ActiveCfg = Debug|x64 + {1E4ECE2F-3748-47BE-BCDA-D2C2F671D695}.Debug|x64.Build.0 = Debug|x64 + {1E4ECE2F-3748-47BE-BCDA-D2C2F671D695}.Debug|x86.ActiveCfg = Debug|Win32 + {1E4ECE2F-3748-47BE-BCDA-D2C2F671D695}.Debug|x86.Build.0 = Debug|Win32 + {1E4ECE2F-3748-47BE-BCDA-D2C2F671D695}.Release|x64.ActiveCfg = Release|x64 + {1E4ECE2F-3748-47BE-BCDA-D2C2F671D695}.Release|x64.Build.0 = Release|x64 + {1E4ECE2F-3748-47BE-BCDA-D2C2F671D695}.Release|x86.ActiveCfg = Release|Win32 + {1E4ECE2F-3748-47BE-BCDA-D2C2F671D695}.Release|x86.Build.0 = Release|Win32 + {9366E397-8E3A-4B62-8520-8412F8AF6182}.Debug|x64.ActiveCfg = Debug|x64 + {9366E397-8E3A-4B62-8520-8412F8AF6182}.Debug|x64.Build.0 = Debug|x64 + {9366E397-8E3A-4B62-8520-8412F8AF6182}.Debug|x86.ActiveCfg = Debug|Win32 + {9366E397-8E3A-4B62-8520-8412F8AF6182}.Debug|x86.Build.0 = Debug|Win32 + {9366E397-8E3A-4B62-8520-8412F8AF6182}.Release|x64.ActiveCfg = Release|x64 + {9366E397-8E3A-4B62-8520-8412F8AF6182}.Release|x64.Build.0 = Release|x64 + {9366E397-8E3A-4B62-8520-8412F8AF6182}.Release|x86.ActiveCfg = Release|Win32 + {9366E397-8E3A-4B62-8520-8412F8AF6182}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {BA92BFCC-67C9-4E0F-870C-CFFC47155977} + EndGlobalSection + GlobalSection(SharedMSBuildProjectFiles) = preSolution + IgnoreInfoFormat\IgnoreInfoFormat.vcxitems*{1e4ece2f-3748-47be-bcda-d2c2f671d695}*SharedItemsImports = 4 + IgnoreInfoFormat\IgnoreInfoFormat.vcxitems*{9366e397-8e3a-4b62-8520-8412f8af6182}*SharedItemsImports = 4 + IgnoreInfoFormat\IgnoreInfoFormat.vcxitems*{e904b7ec-60ef-4bca-aef5-2f7983e8fb9d}*SharedItemsImports = 9 + EndGlobalSection +EndGlobal diff --git a/HelpUploadFiles/CAboutDlg.cpp b/HelpUploadFiles/CAboutDlg.cpp new file mode 100644 index 0000000..563aeb2 --- /dev/null +++ b/HelpUploadFiles/CAboutDlg.cpp @@ -0,0 +1,23 @@ +#include "pch.h" +#include "CAboutDlg.h" + +CAboutDlg* CAboutDlg::singleton = new CAboutDlg; + +INT_PTR CALLBACK CAboutDlg::About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + UNREFERENCED_PARAMETER(lParam); + switch (message) + { + case WM_INITDIALOG: + return (INT_PTR)TRUE; + + case WM_COMMAND: + if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) + { + EndDialog(hDlg, LOWORD(wParam)); + return (INT_PTR)TRUE; + } + break; + } + return (INT_PTR)FALSE; +} \ No newline at end of file diff --git a/HelpUploadFiles/CAboutDlg.h b/HelpUploadFiles/CAboutDlg.h new file mode 100644 index 0000000..f2e2801 --- /dev/null +++ b/HelpUploadFiles/CAboutDlg.h @@ -0,0 +1,9 @@ +#pragma once +class CAboutDlg +{ +private: + static CAboutDlg* singleton; +public: + static INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); +}; + diff --git a/HelpUploadFiles/CContext.cpp b/HelpUploadFiles/CContext.cpp new file mode 100644 index 0000000..cb96b11 --- /dev/null +++ b/HelpUploadFiles/CContext.cpp @@ -0,0 +1,68 @@ +#include "CContext.h" + +CContext* CContext::singleton = new CContext; +LPCTSTR SharedMemoryName = _T("HelpUploadFileSharedMemory"); +LPCTSTR EventName = _T("HelpUploadEvent"); + +CContext::CContext() +{ + // ӳע DLL + //InjectWorkDll(); + this->hEvent = CreateEvent(0, FALSE, FALSE, EventName); + if (hEvent == INVALID_HANDLE_VALUE) { + wchar_t buffer[100]; + std::swprintf(buffer, _countof(buffer), _T("CreateEvent failed with %d"), GetLastError()); + throw buffer; + } + + this->hSharedMem = CreateFileMapping(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 0, 4096, SharedMemoryName); + if (this->hSharedMem == INVALID_HANDLE_VALUE) { + wchar_t buffer[100]; + std::swprintf(buffer, _countof(buffer), _T("CreateFileMapping failed with %d"), GetLastError()); + throw buffer; + } +} + +CContext::~CContext() +{ + CloseHandle(this->hSharedMem); + CloseHandle(this->hEvent); +} + +VOID CContext::InjectWorkDll(HWND hWnd) +{ + CInjectDll::DoInject(hWnd); +} + +VOID CContext::DoOperation(CIgnoreInfo* pIgnoreInfo, std::wstring fileName, CIgnoreInfo::TYPE type) +{ + // ׼ݽṹ + pIgnoreInfo->type = type; + size_t cbWrite = _countof(pIgnoreInfo->fileName); + + _tcscpy_s(pIgnoreInfo->fileName, cbWrite, fileName.c_str()); + + // д빲ڴ + LPVOID sharedMemory = MapViewOfFile(this->hSharedMem, FILE_MAP_WRITE, 0, 0, sizeof(CIgnoreInfo)); + if (sharedMemory != NULL) { + pIgnoreInfo->Serialize(sharedMemory); + UnmapViewOfFile(sharedMemory); + } + + // + SetEvent(this->hEvent); +} + + +VOID CContext::AddInnoreFile(std::wstring fileName) +{ + CIgnoreInfo ignoreInfo; + DoOperation(&ignoreInfo, fileName, CIgnoreInfo::ADD); +} + +VOID CContext::RemoveInnoreFile(std::wstring fileName) +{ + CIgnoreInfo ignoreInfo; + DoOperation(&ignoreInfo, fileName, CIgnoreInfo::REMOVE); + +} \ No newline at end of file diff --git a/HelpUploadFiles/CContext.h b/HelpUploadFiles/CContext.h new file mode 100644 index 0000000..45399c4 --- /dev/null +++ b/HelpUploadFiles/CContext.h @@ -0,0 +1,24 @@ +#pragma once +#include "pch.h" +#include "framework.h" +#include "CInjectDll.h" +#include "CIgnoreInfo.h" + + +class CContext +{ +private: + HANDLE hSharedMem; + HANDLE hEvent; +public: + static CContext* singleton; + CContext(); + ~CContext(); +public: + VOID InjectWorkDll(HWND hWnd); + VOID AddInnoreFile(std::wstring fileName); + VOID RemoveInnoreFile(std::wstring fileName); +protected: + VOID DoOperation(CIgnoreInfo* pIgnoreInfo, std::wstring fileName, CIgnoreInfo::TYPE type); +}; + diff --git a/HelpUploadFiles/CIgnoreFileManager.cpp b/HelpUploadFiles/CIgnoreFileManager.cpp new file mode 100644 index 0000000..878ece6 --- /dev/null +++ b/HelpUploadFiles/CIgnoreFileManager.cpp @@ -0,0 +1,30 @@ +#include "CIgnoreFileManager.h" + + +// ҪӺȡ޷֪ +CIgnoreFileManager* CIgnoreFileManager::singleton = NULL; + +CIgnoreFileManager* CIgnoreFileManager::getSingleton() +{ + if (CIgnoreFileManager::singleton == NULL) { + CIgnoreFileManager::singleton = new CIgnoreFileManager; + } + + return CIgnoreFileManager::singleton; +} + +CIgnoreFileManager::CIgnoreFileManager() +{ + // ĸ֪ + this->context = CContext::singleton; +} + +void CIgnoreFileManager::addIgnoreFile(std::wstring fileName) +{ + this->context->AddInnoreFile(fileName); +} + +void CIgnoreFileManager::removeIgnoreFile(std::wstring fileName) +{ + this->context->RemoveInnoreFile(fileName); +} \ No newline at end of file diff --git a/HelpUploadFiles/CIgnoreFileManager.h b/HelpUploadFiles/CIgnoreFileManager.h new file mode 100644 index 0000000..8387dc1 --- /dev/null +++ b/HelpUploadFiles/CIgnoreFileManager.h @@ -0,0 +1,17 @@ +#pragma once +#include +#include "CContext.h" + +class CIgnoreFileManager +{ +private: + CContext* context; + static CIgnoreFileManager* singleton; +public: + static CIgnoreFileManager* getSingleton(); +public: + CIgnoreFileManager(); + void addIgnoreFile(std::wstring fileName); + void removeIgnoreFile(std::wstring fileName); +}; + diff --git a/HelpUploadFiles/CInjectDll.cpp b/HelpUploadFiles/CInjectDll.cpp new file mode 100644 index 0000000..2c51726 --- /dev/null +++ b/HelpUploadFiles/CInjectDll.cpp @@ -0,0 +1,55 @@ +#include "framework.h" +#include "CInjectDll.h" + +/* +* ̬Աʼ +*/ +DWORD CInjectDll::dwProcessId = 0; +LPCWSTR CInjectDll::dllName = _T("WorkDll.dll"); + +UINT CALLBACK CInjectDll::MyCreateRemoteThread(LPVOID pParam) +{ + try { + HWND hDlg = (HWND)pParam; + HANDLE hProcess = OpenProcess(PROCESS_VM_WRITE | PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_QUERY_INFORMATION, + FALSE, CInjectDll::dwProcessId); + if (hProcess == NULL) { + //AddText(GetDlgItem(hDlg, IDC_LIST1), _T(": %u"), GetLastError()); + throw _T("򿪽ʧ"); + return FALSE; + } + LPTHREAD_START_ROUTINE pfn = (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(_T("kernel32")), "LoadLibraryW"); + /*ȡDLL·*/ + TCHAR sz[MAX_PATH] = _T(""); + GetModuleFileName(NULL, sz, _countof(sz)); + int cbSize = _countof(sz); + for (LPTSTR p = &sz[cbSize]; *p != TEXT('\\'); p--, cbSize--); + sz[cbSize + 1] = '\0';//ض + StringCchPrintf(sz, _countof(sz), _T("%s%s"), sz, CInjectDll::dllName); + /*ȡDLL·*/ + PVOID pData = VirtualAllocEx(hProcess, NULL, _countof(sz) * sizeof(TCHAR), MEM_COMMIT, PAGE_READWRITE); + WriteProcessMemory(hProcess, pData, sz, _countof(sz) * sizeof(TCHAR), NULL); + HANDLE newThread = CreateRemoteThread(hProcess, NULL, 0, pfn, pData, 0, NULL); + if (newThread == NULL) { + //AddText(GetDlgItem(hDlg, IDC_LIST1), _T(": %u"), GetLastError()); + throw _T("ע븳ģʧ"); + } + WaitForSingleObject(newThread, INFINITE);//ȴ + VirtualFreeEx(hProcess, pData, 0, MEM_RELEASE); + return TRUE; + } + catch (LPCTSTR p) { + MessageBox(NULL, p, _T("쳣"), MB_ICONERROR); + return FALSE; + } +} + +VOID CInjectDll::DoInject(HWND hWnd) +{ + // Ұٶ ȡ id + //HWND hBaiduWnd = FindWindow(_T("DuiHostWnd"), NULL); + GetWindowThreadProcessId(hWnd, &CInjectDll::dwProcessId); + + // ߳ע dll + _beginthreadex(0, 0, CInjectDll::MyCreateRemoteThread, 0, 0, 0); +} \ No newline at end of file diff --git a/HelpUploadFiles/CInjectDll.h b/HelpUploadFiles/CInjectDll.h new file mode 100644 index 0000000..490a808 --- /dev/null +++ b/HelpUploadFiles/CInjectDll.h @@ -0,0 +1,11 @@ +#pragma once +class CInjectDll +{ +private: + static LPCWSTR dllName; + static DWORD dwProcessId; + static UINT CALLBACK MyCreateRemoteThread(LPVOID pParam); +public: + static VOID DoInject(HWND hWnd); +}; + diff --git a/HelpUploadFiles/CMainDlg.cpp b/HelpUploadFiles/CMainDlg.cpp new file mode 100644 index 0000000..3c88bf3 --- /dev/null +++ b/HelpUploadFiles/CMainDlg.cpp @@ -0,0 +1,210 @@ +#include "pch.h" +#include "CMainDlg.h" + +CMainDlg* CMainDlg::singleton = new CMainDlg; + +INT_PTR CALLBACK CMainDlg::MainDlg(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + CMainDlg::singleton->SaveParameters(hDlg, message, wParam, lParam); + switch (message) + { + case WM_INITDIALOG: + CMainDlg::singleton->OnDlgInit(); + break; + + case WM_COMMAND: + CMainDlg::singleton->OnCommand(); + break; + case WM_DROPFILES: + CMainDlg::singleton->OnDropFile(); + break; + case WM_LBUTTONDOWN: + CMainDlg::singleton->OnLButtonDown(); + break; + case WM_LBUTTONUP: + CMainDlg::singleton->OnLButtonUp(); + break; + case WM_MOUSEMOVE: + CMainDlg::singleton->OnMouseMove(); + break; + } + return (INT_PTR)FALSE; +} + +VOID CMainDlg::OnDlgInit() +{ + this->hInjectWnd = NULL; + SetDlgItemText(this->hDlg, IDC_CAPTUREWND, _T("꿪")); + + this->hListBox = GetDlgItem(this->hDlg, IDC_LIST1); + this->hIcon = LoadIcon(this->hInst, MAKEINTRESOURCE(IDI_HELPUPLOADFILES)); + SendMessage(this->hDlg, WM_SETICON, FALSE, (LPARAM)this->hIcon); + + this->hCaptureCur = LoadCursor(this->hInst, MAKEINTRESOURCE(IDC_CURSOR1)); + + DragAcceptFiles(this->hDlg, TRUE); +} + + + +void CMainDlg::OnCommand() +{ + // TODO: ڴ˴ʵִ. + switch (LOWORD(this->wParam)) + { + case IDCANCEL: + EndDialog(hDlg, LOWORD(wParam)); + break; + case IDADD: + OnAdd(); + break; + case IDREMOVE: + OnRemove(); + break; + case IDM_INJECT: + OnInject(); + break; + case IDM_ABOUT: + OnOpenAbout(); + } +} + + +void CMainDlg::SaveParameters(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + this->hDlg = hDlg; + this->message = message; + this->wParam = wParam; + this->lParam = lParam; +} + + +void CMainDlg::OnAdd() +{ + GetInputString(); + DoAdd(); +} + +void CMainDlg::DoAdd() +{ + CIgnoreFileManager::getSingleton()->addIgnoreFile(this->szInput); + ListBox_AddString(this->hListBox, this->szInput); +} + + +void CMainDlg::OnRemove() +{ + int curSel = ListBox_GetCurSel(this->hListBox); + ListBox_GetText(this->hListBox, curSel, this->szInput); + CIgnoreFileManager::getSingleton()->removeIgnoreFile(this->szInput); + ListBox_DeleteString(this->hListBox, curSel); + + // һѡеλ + if (curSel > 0) { + curSel--; + } + ListBox_SetCurSel(this->hListBox, curSel); +} + + +int CMainDlg::GetInputString() +{ + return GetDlgItemText(this->hDlg, IDC_EDIT1, this->szInput, _countof(this->szInput)); +} + + +void CMainDlg::OnInject() +{ + if (this->hInjectWnd == NULL) { + return; + } + CContext::singleton->InjectWorkDll(this->hInjectWnd); + this->hInjectWnd = NULL; +} + + +void CMainDlg::OnOpenAbout() +{ + DialogBox(this->hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), this->hDlg, CAboutDlg::About); +} + + +void CMainDlg::OnDropFile() +{ + HDROP hDrop = (HDROP)this->wParam; + + if (IDCANCEL == MessageBox(this->hDlg, _T("⵽קļǷӵб"), _T("ʾ"), MB_ICONQUESTION | MB_OKCANCEL | MB_DEFBUTTON1)) { + DragFinish(hDrop); // ˴ק + return; + } + + UINT numFiles = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0); + + // ˹ܴ C++ 17 ʼ֧ + namespace fs = std::filesystem; + + for (UINT i = 0; i < numFiles; i++) + { + //TCHAR szFileName[MAX_PATH]; + DragQueryFile(hDrop, i, this->szInput, MAX_PATH); + + // ﴦϷŵļʾļ + fs::path path = this->szInput; + _tcscpy_s(this->szInput, _countof(this->szInput), path.filename().c_str()); + + DoAdd(); + } + + DragFinish(hDrop); +} + + + +void CMainDlg::OnMouseMove() +{ + if (GetCapture() == NULL) { + return; + } + POINT pt; + GetCursorPos(&pt); + HWND hWnd = WindowFromPoint(pt); + if (hWnd == this->hInjectWnd) { + // δͱ仯 + return; + } + this->hInjectWnd = hWnd; + + TCHAR szClass[100]; + szTitle[0] = '\0'; + szClass[0] = '\0'; + + HWND hCaptureTextWnd = GetDlgItem(this->hDlg, IDC_CAPTUREWND); + GetWindowText(hWnd, szTitle, _countof(szTitle)); + if (szTitle[0] == '\0') { + GetClassName(hWnd, szClass, _countof(szClass)); + + std::swprintf(szTitle, _countof(szTitle), _T("%s - %s"), szClass, szTitle); + } + SetWindowText(hCaptureTextWnd, szTitle); +} + + +void CMainDlg::OnLButtonDown() +{ + SetCapture(this->hDlg); + this->hOldCur = SetCursor(this->hCaptureCur); +} + + +void CMainDlg::OnLButtonUp() +{ + ReleaseCapture(); + SetCursor(this->hOldCur); + + TCHAR sz[MAX_PATH]; + std::swprintf(sz, _countof(sz), _T("ǷΪ %s ظģ"), this->szTitle); + + if (IDOK == MessageBox(this->hDlg, sz, _T("ظģ"), MB_ICONQUESTION | MB_OKCANCEL)) { + OnInject(); + } +} diff --git a/HelpUploadFiles/CMainDlg.h b/HelpUploadFiles/CMainDlg.h new file mode 100644 index 0000000..7f4e247 --- /dev/null +++ b/HelpUploadFiles/CMainDlg.h @@ -0,0 +1,46 @@ +#pragma once + +#include "pch.h" +#include "resource.h" +#include "CIgnoreFileManager.h" +#include "CAboutDlg.h" + +class CMainDlg +{ +public: + static CMainDlg* singleton; + HINSTANCE hInst; +private: + HWND hDlg; + UINT message; + WPARAM wParam; + LPARAM lParam; + + HICON hIcon; + HCURSOR hOldCur; + HCURSOR hCaptureCur; + HWND hListBox; + TCHAR szInput[MAX_PATH]; + + HWND hInjectWnd; + TCHAR szTitle[MAX_PATH]; // עĴڱ / +public: + static INT_PTR CALLBACK MainDlg(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); +protected: + VOID OnDlgInit(); + void OnCommand(); + void SaveParameters(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); + void OnAdd(); + void OnRemove(); + int GetInputString(); +public: + void OnInject(); + void OnOpenAbout(); +protected: + void OnDropFile(); + void DoAdd(); + void OnMouseMove(); + void OnLButtonDown(); + void OnLButtonUp(); +}; + diff --git a/HelpUploadFiles/CSkin.cpp b/HelpUploadFiles/CSkin.cpp new file mode 100644 index 0000000..cc9af74 --- /dev/null +++ b/HelpUploadFiles/CSkin.cpp @@ -0,0 +1,38 @@ +#include "pch.h" +#include "CSkin.h" + +CSkin::CSkin() +{ + typedef bool (*LOADSKINPROC)(const char* szSkinFile, BOOL bFromIni); + + this->hSkinMod = LoadLibrary(_T("SkinPPWTL")); + if (hSkinMod != NULL) { + LOADSKINPROC pfn = (LOADSKINPROC)GetProcAddress(this->hSkinMod, "skinppLoadSkin"); + + char szSkinPath[MAX_PATH]; + FindSkinFile(szSkinPath); + pfn(szSkinPath, FALSE); + } +} + +CSkin::~CSkin() +{ + FARPROC pfn = GetProcAddress(this->hSkinMod, "skinppExitSkin"); + pfn(); +} + + + +void CSkin::FindSkinFile(char* skinPath) +{ + namespace fs = std::filesystem; + + std::string path = "."; // ǰĿ¼ + std::string extension = ".ssk"; + + for (const auto& entry : fs::directory_iterator(path)) { + if (entry.is_regular_file() && entry.path().extension() == extension) { + sprintf_s(skinPath, MAX_PATH, "%s", entry.path().string().c_str()); + } + } +} diff --git a/HelpUploadFiles/CSkin.h b/HelpUploadFiles/CSkin.h new file mode 100644 index 0000000..b86c397 --- /dev/null +++ b/HelpUploadFiles/CSkin.h @@ -0,0 +1,12 @@ +#pragma once +class CSkin +{ +private: + HMODULE hSkinMod; +public: + CSkin(); + ~CSkin(); +protected: + void FindSkinFile(char* skinPath); +}; + diff --git a/HelpUploadFiles/HelpUploadFiles.cpp b/HelpUploadFiles/HelpUploadFiles.cpp new file mode 100644 index 0000000..4d4c8cc --- /dev/null +++ b/HelpUploadFiles/HelpUploadFiles.cpp @@ -0,0 +1,25 @@ +// HelpUploadFiles.cpp : 定义应用程序的入口点。 +// + +#include "framework.h" +#include "HelpUploadFiles.h" +#include "CSkin.h" + +int APIENTRY wWinMain(_In_ HINSTANCE hInstance, + _In_opt_ HINSTANCE hPrevInstance, + _In_ LPWSTR lpCmdLine, + _In_ int nCmdShow) +{ + UNREFERENCED_PARAMETER(hPrevInstance); + UNREFERENCED_PARAMETER(lpCmdLine); + + CSkin skin; // 加载皮肤 + + CMainDlg::singleton->hInst = hInstance; + DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAINDIALOG), NULL, CMainDlg::MainDlg); + + return GetLastError(); +} + + + diff --git a/HelpUploadFiles/HelpUploadFiles.h b/HelpUploadFiles/HelpUploadFiles.h new file mode 100644 index 0000000..03d02c0 --- /dev/null +++ b/HelpUploadFiles/HelpUploadFiles.h @@ -0,0 +1,4 @@ +#pragma once + +#include "CIgnoreFileManager.h" +#include "CMainDlg.h" \ No newline at end of file diff --git a/HelpUploadFiles/HelpUploadFiles.ico b/HelpUploadFiles/HelpUploadFiles.ico new file mode 100644 index 0000000000000000000000000000000000000000..08f33c74cf19340a6a3472326c9c2a7d1c274701 GIT binary patch literal 91680 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 F{|j;u2m1g3 literal 0 HcmV?d00001 diff --git a/HelpUploadFiles/HelpUploadFiles.rc b/HelpUploadFiles/HelpUploadFiles.rc new file mode 100644 index 0000000000000000000000000000000000000000..3cfb0f95425996ae2a13d80b5ba948321d893790 GIT binary patch literal 9840 zcmdT~OLH4V5N?hnaE0q;T}3&CUy_|TIe{(tAtK3&BtKH5;)*TVG3D4UJxBr^atjv- zRa9}{#1Vc1e}vz_FW>-W!uR#4vny$LWyMY**Ot7yvorme?*6)G#;^XJmTB>%AP2H5 z4LO!3etXhF+XmX2(w2vEh_{Sc%nb!LlT95Gc5WQ>K*Y6uYC6C0{-W)lm{q}SmX)j1gDpHko$x2SvWLwIzgw`yc zi;|anXsO_DK^D=H$FuRL45N3MbawY-1@qE7$9tHiV|fhyTbLcrLls(Y;cpIFXP_tN zV+rkP{CX|YZ-YH>;Qa5QcmIr%<_2c(4k%`0?bd=1G}I$n@+D|BU~9A7nCei2)%H5$ z9XDD(+KQ{tB&#|UBP|%^IZxCpYM7ZP@VPMecA|cRc$qCm&s!)Fr5i*1Bw6q*F){jD zQd>_Zi!bWq^8D+{+Iz1ii>DjcBRssRv*KokKIh4`F5IZeIQ)DW5##Wp0`Fc2a%AA) z+wi(PF4Fx5mlr#-3L0g^=QhTz0$Hvr*F0K_XkEvBMPtxfTt7zB5_&Jm1ZY>#ZxP(w znBE@5t{kwdgdRD_o5LsNKn$j>IHsx98>toyx$|rirCv)gyhO}Jl&Ia2s9y%N`RHP) zd8b30f?B-Y=eL~8%o(g(fR&4|5cOWf^9p>TsBdQ960GjL!$X~O^{bZ;#^oc}@p`A~ zv3}8`?W^(0X(dpA4So6ZuzvT>cc;&-x!aO;X4*jfm_uNfA_^nL7s~0eL&AZqMp_crOW>kbD!lY!KxU1+(v~l(SG4A%=G&*aXEWpE>0GdyQA@>Eg@5i}^j)1L=dFcawGav?3k z$R*tgaGrbpH;uOm*lk9oG2~=?xmByRbl(S6IE?4j#>Bn{>QkW2*o>BC4!i@2oMgAq zQc(*RVZ##qVoB?=tzl(sWcEMZd3S#tXvkbaEz{6_kThwzsWO=~^c2&dYxiZX3M%lD zMbr;fTtRi{%hA)HKQ|6snNz!z%;G+$bA3aj#nE;iy8;cl$|;Syq{07&Qh)og>EfChgR#z>5styP5wpqFwu@GadbeH~Tp!ZrL4?yIS+^xe z_#7-dOq37yrPJ+t+kAt7tF#>6 zR?!;vqz#P7XykBDApC_`M|zA)7gHt`^9XC#ICL|qt)Ih2C+Y2u1(dyDfCH1WDM)o?PDgP%}`WD^Z(D% zETVU=OAC|xqGl-#MCe5w+dTm)ZO+)_{?3? z=$@Y1IXe2HPdo3!J6t^(Sc*J&miHz+97ZLb4^g+^gzrA~aqeTE+sR;l;Vahlp4R%< z4Uaze^Fbqy4tLSrX<&Sx^PCXIQ|&)*_Vvtx@`TR~lcY~RYfCy!jFT(Q;f|qGc{BX`RVc6~{!+?V$al zZagFP!7KED6R9Vi + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 17.0 + Win32Proj + {1e4ece2f-3748-47be-bcda-d2c2f671d695} + HelpUploadFiles + 10.0 + + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + + + Level3 + true + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + pch.h + $(TargetName).pch + stdcpp17 + + + Windows + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + pch.h + $(TargetName).pch + stdcpp17 + + + Windows + true + true + true + + + + + Level3 + true + _DEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + pch.h + $(TargetName).pch + stdcpp17 + + + Windows + true + + + + + Level3 + true + true + true + NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + pch.h + $(TargetName).pch + stdcpp17 + + + Windows + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/HelpUploadFiles/HelpUploadFiles.vcxproj.filters b/HelpUploadFiles/HelpUploadFiles.vcxproj.filters new file mode 100644 index 0000000..965047f --- /dev/null +++ b/HelpUploadFiles/HelpUploadFiles.vcxproj.filters @@ -0,0 +1,97 @@ + + + + + {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 + + + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + + + 资源文件 + + + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + + + + 资源文件 + + + 资源文件 + + + \ No newline at end of file diff --git a/HelpUploadFiles/Resource.h b/HelpUploadFiles/Resource.h new file mode 100644 index 0000000..23303ea --- /dev/null +++ b/HelpUploadFiles/Resource.h @@ -0,0 +1,40 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ 生成的包含文件。 +// 供 HelpUploadFiles.rc 使用 +// +#define IDC_MYICON 2 +#define IDD_HELPUPLOADFILES_DIALOG 102 +#define IDS_APP_TITLE 103 +#define IDD_ABOUTBOX 103 +#define IDM_ABOUT 104 +#define IDM_EXIT 105 +#define IDI_HELPUPLOADFILES 107 +#define IDI_HELPUPLOADFILES1 108 +#define IDC_HELPUPLOADFILES 109 +#define IDR_MAINFRAME 128 +#define IDD_MAINDIALOG 129 +#define IDC_CURSOR1 131 +#define IDC_LIST1 1000 +#define IDC_EDIT1 1001 +#define IDREMOVE 1002 +#define IDADD 1003 +#define IDC_CAPTUREWND 1004 +#define IDC_EDIT2 1005 +#define ID_32771 32771 +#define ID_32772 32772 +#define ID_32773 32773 +#define IDM_INJURE 32774 +#define IDM_INJECT 32775 +#define IDC_STATIC -1 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NO_MFC 1 +#define _APS_NEXT_RESOURCE_VALUE 132 +#define _APS_NEXT_COMMAND_VALUE 32776 +#define _APS_NEXT_CONTROL_VALUE 1006 +#define _APS_NEXT_SYMED_VALUE 110 +#endif +#endif diff --git a/HelpUploadFiles/cpp.hint b/HelpUploadFiles/cpp.hint new file mode 100644 index 0000000..e7929b3 --- /dev/null +++ b/HelpUploadFiles/cpp.hint @@ -0,0 +1,3 @@ +// 提示文件帮助 Visual Studio IDE 解释 Visual C++ 标识符, +// 如函数和宏的名称。 +// 有关详细信息,请参见 https://go.microsoft.com/fwlink/?linkid=865984 diff --git a/HelpUploadFiles/cursor.cur b/HelpUploadFiles/cursor.cur new file mode 100644 index 0000000000000000000000000000000000000000..2224fc2c5a932b811fee6c0599f89ca4ffd0222d GIT binary patch literal 326 zcmc&tI~IaK44lQv&dQq7(i4C;*_#L_a|_?YTbLV|j))5z6YvfuZzhvJP$8hMfdlq9 z2jB?cWUvx0hG6d2ue?!Z!QrN=oA@Jls!MvenTCgOGx1moO+{Nnbj{a=`Id#ABJ^UR pktBUmPIH%gVCT_uudjWZ^LgL<-HLWAnU35nOv7FLpZ`_W@&yt~aGd}E literal 0 HcmV?d00001 diff --git a/HelpUploadFiles/framework.h b/HelpUploadFiles/framework.h new file mode 100644 index 0000000..e1b141e --- /dev/null +++ b/HelpUploadFiles/framework.h @@ -0,0 +1,21 @@ +// header.h: 标准系统包含文件的包含文件, +// 或特定于项目的包含文件 +// + +#pragma once + +#include "targetver.h" +#define WIN32_LEAN_AND_MEAN // 从 Windows 头文件中排除极少使用的内容 +// Windows 头文件 +#include +#include +#include +#include +// C 运行时头文件 +#include +#include +#include +#include +//C++ 标准库 +#include +#include \ No newline at end of file diff --git a/HelpUploadFiles/helpuplo.ico b/HelpUploadFiles/helpuplo.ico new file mode 100644 index 0000000000000000000000000000000000000000..14f7905b2ff5671288e47f10ea05a06fc6ee922b GIT binary patch literal 96238 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 diff --git a/IgnoreInfoFormat/CIgnoreInfo.cpp b/IgnoreInfoFormat/CIgnoreInfo.cpp new file mode 100644 index 0000000..e65cc9c --- /dev/null +++ b/IgnoreInfoFormat/CIgnoreInfo.cpp @@ -0,0 +1,19 @@ +#include "CIgnoreInfo.h" + +VOID CIgnoreInfo::Serialize(LPVOID lpData) +{ + size_t endPos = lstrlen(this->fileName) + 1; + this->fileName[endPos] = '\0'; // ֹ + + CopyMemory(lpData, this, sizeof(CIgnoreInfo)); +} + +VOID CIgnoreInfo::Deserialize(LPVOID lpData) +{ + CopyMemory(this, lpData, sizeof(CIgnoreInfo)); +} + +CIgnoreInfo* CIgnoreInfo::GetInstance() +{ + return new CIgnoreInfo; +} \ No newline at end of file diff --git a/IgnoreInfoFormat/CIgnoreInfo.h b/IgnoreInfoFormat/CIgnoreInfo.h new file mode 100644 index 0000000..fff3dac --- /dev/null +++ b/IgnoreInfoFormat/CIgnoreInfo.h @@ -0,0 +1,17 @@ +#pragma once +#include "pch.h" + +class CIgnoreInfo +{ +public: + enum TYPE { + ADD, + REMOVE + } type; + wchar_t fileName[MAX_PATH]; +public: + VOID Serialize(LPVOID lpData); + VOID Deserialize(LPVOID lpData); + static CIgnoreInfo* GetInstance(); +}; + diff --git a/IgnoreInfoFormat/IgnoreInfoFormat.vcxitems b/IgnoreInfoFormat/IgnoreInfoFormat.vcxitems new file mode 100644 index 0000000..a89cbf5 --- /dev/null +++ b/IgnoreInfoFormat/IgnoreInfoFormat.vcxitems @@ -0,0 +1,24 @@ + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + true + {e904b7ec-60ef-4bca-aef5-2f7983e8fb9d} + + + + %(AdditionalIncludeDirectories);$(MSBuildThisFileDirectory) + + + + + + + + + + + + + + \ No newline at end of file diff --git a/IgnoreInfoFormat/pch.cpp b/IgnoreInfoFormat/pch.cpp new file mode 100644 index 0000000..cf72c2c --- /dev/null +++ b/IgnoreInfoFormat/pch.cpp @@ -0,0 +1,5 @@ +// pch.cpp: ԤͷӦԴļ + +#include "pch.h" + +// ʹԤͷʱҪʹôԴļܳɹ diff --git a/IgnoreInfoFormat/pch.h b/IgnoreInfoFormat/pch.h new file mode 100644 index 0000000..ef015e4 --- /dev/null +++ b/IgnoreInfoFormat/pch.h @@ -0,0 +1,14 @@ +// pch.h: Ԥͷļ +// ·гļһΣ˽ɵܡ +// ⻹Ӱ IntelliSense ܣɺܡ +// ǣ˴гļеκһ֮и£ȫ±롣 +// ڴ˴ҪƵµļ⽫ʹЧ + +#ifndef PCH_H +#define PCH_H + +// Ҫڴ˴Ԥıͷ +#include "../HelpUploadFiles/framework.h" +#include "../WorkDll/framework.h" + +#endif //PCH_H diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/WorkDll/APIHook.cpp b/WorkDll/APIHook.cpp new file mode 100644 index 0000000..e90ef6a --- /dev/null +++ b/WorkDll/APIHook.cpp @@ -0,0 +1,431 @@ +/****************************************************************************** +Module: APIHook.cpp +Notices: Copyright (c) 2008 Jeffrey Richter & Christophe Nasarre +******************************************************************************/ + + +#include"pch.h" +#include "APIHook.h" + + +///////////////////////////////////////////////////////////////////////////////// + + +// The head of the linked-list of CAPIHook objects +CAPIHook* CAPIHook::sm_pHead = NULL; + +// By default, the module containing the CAPIHook() is not hooked +BOOL CAPIHook::ExcludeAPIHookMod = TRUE; + + +/////////////////////////////////////////////////////////////////////////////// + + +CAPIHook::CAPIHook(PCSTR pszCalleeModName, PCSTR pszFuncName, PROC pfnHook) { + + // Note: the function can be hooked only if the exporting module + // is already loaded. A solution could be to store the function + // name as a member; then, in the hooked LoadLibrary* handlers, parse + // the list of CAPIHook instances, check if pszCalleeModName + // is the name of the loaded module to hook its export table and + // re-hook the import tables of all loaded modules. + + m_pNext = sm_pHead; // The next node was at the head + sm_pHead = this; // This node is now at the head + + // Save information about this hooked function + m_pszCalleeModName = pszCalleeModName; + m_pszFuncName = pszFuncName; + m_pfnHook = pfnHook; + m_pfnOrig = + GetProcAddressRaw(GetModuleHandleA(pszCalleeModName), m_pszFuncName); + + // If function does not exit,... bye bye + // This happens when the module is not already loaded + if (m_pfnOrig == NULL) + { + wchar_t szPathname[MAX_PATH]; + GetModuleFileNameW(NULL, szPathname, _countof(szPathname)); + wchar_t sz[1024]; + StringCchPrintfW(sz, _countof(sz), + TEXT("[%4u - %s] impossible to find %S\r\n"), + GetCurrentProcessId(), szPathname, pszFuncName); + OutputDebugString(sz); + return; + } + +#ifdef _DEBUG + // This section was used for debugging sessions when Explorer died as + // a folder content was requested + // + //static BOOL s_bFirstTime = TRUE; + //if (s_bFirstTime) + //{ + // s_bFirstTime = FALSE; + + // wchar_t szPathname[MAX_PATH]; + // GetModuleFileNameW(NULL, szPathname, _countof(szPathname)); + // wchar_t* pszExeFile = wcsrchr(szPathname, L'\\') + 1; + // OutputDebugStringW(L"Injected in "); + // OutputDebugStringW(pszExeFile); + // if (_wcsicmp(pszExeFile, L"Explorer.EXE") == 0) + // { + // DebugBreak(); + // } + // OutputDebugStringW(L"\n --> "); + // StringCchPrintfW(szPathname, _countof(szPathname), L"%S", pszFuncName); + // OutputDebugStringW(szPathname); + // OutputDebugStringW(L"\n"); + //} +#endif + + // Hook this function in all currently loaded modules + ReplaceIATEntryInAllMods(m_pszCalleeModName, m_pfnOrig, m_pfnHook); +} + + +/////////////////////////////////////////////////////////////////////////////// + + +CAPIHook::~CAPIHook() { + + // Unhook this function from all modules + ReplaceIATEntryInAllMods(m_pszCalleeModName, m_pfnHook, m_pfnOrig); + + // Remove this object from the linked list + CAPIHook* p = sm_pHead; + if (p == this) { // Removing the head node + sm_pHead = p->m_pNext; + } + else { + + BOOL bFound = FALSE; + + // Walk list from head and fix pointers + for (; !bFound && (p->m_pNext != NULL); p = p->m_pNext) { + if (p->m_pNext == this) { + // Make the node that points to us point to our next node + p->m_pNext = p->m_pNext->m_pNext; + bFound = TRUE; + } + } + } +} + + +/////////////////////////////////////////////////////////////////////////////// + + +// NOTE: This function must NOT be inlined +FARPROC CAPIHook::GetProcAddressRaw(HMODULE hmod, PCSTR pszProcName) { + + return(::GetProcAddress(hmod, pszProcName)); +} + + +/////////////////////////////////////////////////////////////////////////////// + + +// Returns the HMODULE that contains the specified memory address +static HMODULE ModuleFromAddress(PVOID pv) { + + MEMORY_BASIC_INFORMATION mbi; + return((VirtualQuery(pv, &mbi, sizeof(mbi)) != 0) + ? (HMODULE)mbi.AllocationBase : NULL); +} + + +/////////////////////////////////////////////////////////////////////////////// + + +void CAPIHook::ReplaceIATEntryInAllMods(PCSTR pszCalleeModName, + PROC pfnCurrent, PROC pfnNew) { + + HMODULE hmodThisMod = ExcludeAPIHookMod + ? ModuleFromAddress(ReplaceIATEntryInAllMods) : NULL; + + // Get the list of modules in this process + HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetCurrentProcessId()); + + MODULEENTRY32 me = { sizeof(me) }; + for (BOOL bOk = Module32First(hSnapshot, &me); bOk; bOk = Module32Next(hSnapshot, &me)) { + + // NOTE: We don't hook functions in our own module + if (me.hModule != hmodThisMod) { + + // Hook this function in this module + ReplaceIATEntryInOneMod( + pszCalleeModName, pfnCurrent, pfnNew, me.hModule); + } + } +} + + +/////////////////////////////////////////////////////////////////////////////// + + +// Handle unexpected exceptions if the module is unloaded +LONG WINAPI InvalidReadExceptionFilter(PEXCEPTION_POINTERS pep) { + + // handle all unexpected exceptions because we simply don't patch + // any module in that case + LONG lDisposition = EXCEPTION_EXECUTE_HANDLER; + + // Note: pep->ExceptionRecord->ExceptionCode has 0xc0000005 as a value + + return(lDisposition); +} + + +void CAPIHook::ReplaceIATEntryInOneMod(PCSTR pszCalleeModName, + PROC pfnCurrent, PROC pfnNew, HMODULE hmodCaller) { + + // Get the address of the module's import section + ULONG ulSize; + + // An exception was triggered by Explorer (when browsing the content of + // a folder) into imagehlp.dll. It looks like one module was unloaded... + // Maybe some threading problem: the list of modules from Toolhelp might + // not be accurate if FreeLibrary is called during the enumeration. + PIMAGE_IMPORT_DESCRIPTOR pImportDesc = NULL; + __try { + pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)ImageDirectoryEntryToData( + hmodCaller, TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, &ulSize); + } + __except (InvalidReadExceptionFilter(GetExceptionInformation())) { + // Nothing to do in here, thread continues to run normally + // with NULL for pImportDesc + } + + if (pImportDesc == NULL) + return; // This module has no import section or is no longer loaded + + + // Find the import descriptor containing references to callee's functions + for (; pImportDesc->Name; pImportDesc++) { + PSTR pszModName = (PSTR)((PBYTE)hmodCaller + pImportDesc->Name); + if (lstrcmpiA(pszModName, pszCalleeModName) == 0) { + + // Get caller's import address table (IAT) for the callee's functions + PIMAGE_THUNK_DATA pThunk = (PIMAGE_THUNK_DATA) + ((PBYTE)hmodCaller + pImportDesc->FirstThunk); + + // Replace current function address with new function address + for (; pThunk->u1.Function; pThunk++) { + + // Get the address of the function address + PROC* ppfn = (PROC*)&pThunk->u1.Function; + + // Is this the function we're looking for? + BOOL bFound = (*ppfn == pfnCurrent); + if (bFound) { + if (!WriteProcessMemory(GetCurrentProcess(), ppfn, &pfnNew, + sizeof(pfnNew), NULL) && (ERROR_NOACCESS == GetLastError())) { + DWORD dwOldProtect; + if (VirtualProtect(ppfn, sizeof(pfnNew), PAGE_WRITECOPY, + &dwOldProtect)) { + + WriteProcessMemory(GetCurrentProcess(), ppfn, &pfnNew, + sizeof(pfnNew), NULL); + VirtualProtect(ppfn, sizeof(pfnNew), dwOldProtect, + &dwOldProtect); + } + } + return; // We did it, get out + } + } + } // Each import section is parsed until the right entry is found and patched + } +} + + +/////////////////////////////////////////////////////////////////////////////// + + +void CAPIHook::ReplaceEATEntryInOneMod(HMODULE hmod, PCSTR pszFunctionName, + PROC pfnNew) { + + // Get the address of the module's export section + ULONG ulSize; + + PIMAGE_EXPORT_DIRECTORY pExportDir = NULL; + __try { + pExportDir = (PIMAGE_EXPORT_DIRECTORY)ImageDirectoryEntryToData( + hmod, TRUE, IMAGE_DIRECTORY_ENTRY_EXPORT, &ulSize); + } + __except (InvalidReadExceptionFilter(GetExceptionInformation())) { + // Nothing to do in here, thread continues to run normally + // with NULL for pExportDir + } + + if (pExportDir == NULL) + return; // This module has no export section or is unloaded + + PDWORD pdwNamesRvas = (PDWORD)((PBYTE)hmod + pExportDir->AddressOfNames); + PWORD pdwNameOrdinals = (PWORD) + ((PBYTE)hmod + pExportDir->AddressOfNameOrdinals); + PDWORD pdwFunctionAddresses = (PDWORD) + ((PBYTE)hmod + pExportDir->AddressOfFunctions); + + // Walk the array of this module's function names + for (DWORD n = 0; n < pExportDir->NumberOfNames; n++) { + // Get the function name + PSTR pszFuncName = (PSTR)((PBYTE)hmod + pdwNamesRvas[n]); + + // If not the specified function, try the next function + if (lstrcmpiA(pszFuncName, pszFunctionName) != 0) continue; + + // We found the specified function + // --> Get this function's ordinal value + WORD ordinal = pdwNameOrdinals[n]; + + // Get the address of this function's address + PROC* ppfn = (PROC*)&pdwFunctionAddresses[ordinal]; + + // Turn the new address into an RVA + pfnNew = (PROC)((PBYTE)pfnNew - (PBYTE)hmod); + + // Replace current function address with new function address + if (!WriteProcessMemory(GetCurrentProcess(), ppfn, &pfnNew, + sizeof(pfnNew), NULL) && (ERROR_NOACCESS == GetLastError())) { + DWORD dwOldProtect; + if (VirtualProtect(ppfn, sizeof(pfnNew), PAGE_WRITECOPY, + &dwOldProtect)) { + + WriteProcessMemory(GetCurrentProcess(), ppfn, &pfnNew, + sizeof(pfnNew), NULL); + VirtualProtect(ppfn, sizeof(pfnNew), dwOldProtect, &dwOldProtect); + } + } + break; // We did it, get out + } +} + + +/////////////////////////////////////////////////////////////////////////////// +// Hook LoadLibrary functions and GetProcAddress so that hooked functions +// are handled correctly if these functions are called. + +CAPIHook CAPIHook::sm_LoadLibraryA("Kernel32.dll", "LoadLibraryA", + (PROC)CAPIHook::LoadLibraryA); + +CAPIHook CAPIHook::sm_LoadLibraryW("Kernel32.dll", "LoadLibraryW", + (PROC)CAPIHook::LoadLibraryW); + +CAPIHook CAPIHook::sm_LoadLibraryExA("Kernel32.dll", "LoadLibraryExA", + (PROC)CAPIHook::LoadLibraryExA); + +CAPIHook CAPIHook::sm_LoadLibraryExW("Kernel32.dll", "LoadLibraryExW", + (PROC)CAPIHook::LoadLibraryExW); + +CAPIHook CAPIHook::sm_GetProcAddress("Kernel32.dll", "GetProcAddress", + (PROC)CAPIHook::GetProcAddress); + + +/////////////////////////////////////////////////////////////////////////////// + + +void CAPIHook::FixupNewlyLoadedModule(HMODULE hmod, DWORD dwFlags) { + + // If a new module is loaded, hook the hooked functions + if ((hmod != NULL) && // Do not hook our own module + (hmod != ModuleFromAddress(FixupNewlyLoadedModule)) && + ((dwFlags & LOAD_LIBRARY_AS_DATAFILE) == 0) && + ((dwFlags & LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE) == 0) && + ((dwFlags & LOAD_LIBRARY_AS_IMAGE_RESOURCE) == 0) + ) { + + for (CAPIHook* p = sm_pHead; p != NULL; p = p->m_pNext) { + if (p->m_pfnOrig != NULL) { + ReplaceIATEntryInAllMods(p->m_pszCalleeModName, + p->m_pfnOrig, p->m_pfnHook); + } + else { +#ifdef _DEBUG + // We should never end up here + wchar_t szPathname[MAX_PATH]; + GetModuleFileNameW(NULL, szPathname, _countof(szPathname)); + wchar_t sz[1024]; + StringCchPrintfW(sz, _countof(sz), + TEXT("[%4u - %s] Ҳ %S\r\n"), + GetCurrentProcessId(), szPathname, p->m_pszCalleeModName); + OutputDebugString(sz); +#endif + } + } + } +} + + +/////////////////////////////////////////////////////////////////////////////// + + +HMODULE WINAPI CAPIHook::LoadLibraryA(PCSTR pszModulePath) { + + HMODULE hmod = ::LoadLibraryA(pszModulePath); + FixupNewlyLoadedModule(hmod, 0); + return(hmod); +} + + +/////////////////////////////////////////////////////////////////////////////// + + +HMODULE WINAPI CAPIHook::LoadLibraryW(PCWSTR pszModulePath) { + + HMODULE hmod = ::LoadLibraryW(pszModulePath); + FixupNewlyLoadedModule(hmod, 0); + return(hmod); +} + + +/////////////////////////////////////////////////////////////////////////////// + + +HMODULE WINAPI CAPIHook::LoadLibraryExA(PCSTR pszModulePath, + HANDLE hFile, DWORD dwFlags) { + + HMODULE hmod = ::LoadLibraryExA(pszModulePath, hFile, dwFlags); + FixupNewlyLoadedModule(hmod, dwFlags); + return(hmod); +} + + +/////////////////////////////////////////////////////////////////////////////// + + +HMODULE WINAPI CAPIHook::LoadLibraryExW(PCWSTR pszModulePath, + HANDLE hFile, DWORD dwFlags) { + + HMODULE hmod = ::LoadLibraryExW(pszModulePath, hFile, dwFlags); + FixupNewlyLoadedModule(hmod, dwFlags); + return(hmod); +} + + +/////////////////////////////////////////////////////////////////////////////// + + +FARPROC WINAPI CAPIHook::GetProcAddress(HMODULE hmod, PCSTR pszProcName) { + + // Get the true address of the function + FARPROC pfn = GetProcAddressRaw(hmod, pszProcName); + + // Is it one of the functions that we want hooked? + CAPIHook* p = sm_pHead; + for (; (pfn != NULL) && (p != NULL); p = p->m_pNext) { + + if (pfn == p->m_pfnOrig) { + + // The address to return matches an address we want to hook + // Return the hook function address instead + pfn = p->m_pfnHook; + break; + } + } + + return(pfn); +} + + +//////////////////////////////// End of File ////////////////////////////////// diff --git a/WorkDll/APIHook.h b/WorkDll/APIHook.h new file mode 100644 index 0000000..0019642 --- /dev/null +++ b/WorkDll/APIHook.h @@ -0,0 +1,81 @@ +/****************************************************************************** +Module: APIHook.h +Notices: Copyright (c) 2008 Jeffrey Richter & Christophe Nasarre +******************************************************************************/ + + +#pragma once + + +/////////////////////////////////////////////////////////////////////////////// + + +class CAPIHook { +public: + // Hook a function in all modules + CAPIHook(PCSTR pszCalleeModName, PCSTR pszFuncName, PROC pfnHook); + + // Unhook a function from all modules + ~CAPIHook(); + + // Returns the original address of the hooked function + operator PROC() { return(m_pfnOrig); } + + // Hook module w/CAPIHook implementation? + // I have to make it static because I need to use it + // in ReplaceIATEntryInAllMods + static BOOL ExcludeAPIHookMod; + + +public: + // Calls the real GetProcAddress + static FARPROC WINAPI GetProcAddressRaw(HMODULE hmod, PCSTR pszProcName); + +private: + static PVOID sm_pvMaxAppAddr; // Maximum private memory address + static CAPIHook* sm_pHead; // Address of first object + CAPIHook* m_pNext; // Address of next object + + PCSTR m_pszCalleeModName; // Module containing the function (ANSI) + PCSTR m_pszFuncName; // Function name in callee (ANSI) + PROC m_pfnOrig; // Original function address in callee + PROC m_pfnHook; // Hook function address + +private: + // Replaces a symbol's address in a module's import section + static void WINAPI ReplaceIATEntryInAllMods(PCSTR pszCalleeModName, + PROC pfnOrig, PROC pfnHook); + + // Replaces a symbol's address in all modules' import sections + static void WINAPI ReplaceIATEntryInOneMod(PCSTR pszCalleeModName, + PROC pfnOrig, PROC pfnHook, HMODULE hmodCaller); + + // Replaces a symbol's address in a module's export sections + static void ReplaceEATEntryInOneMod(HMODULE hmod, PCSTR pszFunctionName, PROC pfnNew); + +private: + // Used when a DLL is newly loaded after hooking a function + static void WINAPI FixupNewlyLoadedModule(HMODULE hmod, DWORD dwFlags); + + // Used to trap when DLLs are newly loaded + static HMODULE WINAPI LoadLibraryA(PCSTR pszModulePath); + static HMODULE WINAPI LoadLibraryW(PCWSTR pszModulePath); + static HMODULE WINAPI LoadLibraryExA(PCSTR pszModulePath, + HANDLE hFile, DWORD dwFlags); + static HMODULE WINAPI LoadLibraryExW(PCWSTR pszModulePath, + HANDLE hFile, DWORD dwFlags); + + // Returns address of replacement function if hooked function is requested + static FARPROC WINAPI GetProcAddress(HMODULE hmod, PCSTR pszProcName); + +private: + // Instantiates hooks on these functions + static CAPIHook sm_LoadLibraryA; + static CAPIHook sm_LoadLibraryW; + static CAPIHook sm_LoadLibraryExA; + static CAPIHook sm_LoadLibraryExW; + static CAPIHook sm_GetProcAddress; +}; + + +//////////////////////////////// End of File ////////////////////////////////// diff --git a/WorkDll/CAdvice.cpp b/WorkDll/CAdvice.cpp new file mode 100644 index 0000000..195794d --- /dev/null +++ b/WorkDll/CAdvice.cpp @@ -0,0 +1,102 @@ +#include "pch.h" +#include "CAdvice.h" +#include "CIgnoreInfo.h" + +// ܵ & дṹ +LPCTSTR SharedMemoryName = _T("HelpUploadFileSharedMemory"); +LPCTSTR EventName = _T("HelpUploadEvent"); + +// ʼ +CAdvice* CAdvice::singleton = new CAdvice; + +bool CAdvice::isMatch(LPWIN32_FIND_DATA lpFindFileData) +{ + bool bMatch = false; + std::wstring fileNameStr = lpFindFileData->cFileName; + + for (std::list::iterator iter = this->interceptTable.begin(); iter != this->interceptTable.end(); iter++) { + std::wstring subStr = *iter; + if (fileNameStr.find(subStr) != std::wstring::npos) + { + bMatch = true; + break; + } + } + return bMatch; +} + +/** + * @brief ӺԵļ + * @param ignoreFileName +*/ +void CAdvice::addIgnoreFile(std::wstring ignoreFileName) +{ + this->interceptTable.push_back(ignoreFileName); +} + +/** + * @brief ƳԵļ + * @param ignoreFileName +*/ +void CAdvice::removeIgnoreFile(std::wstring ignoreFileName) +{ + this->interceptTable.remove(ignoreFileName); +} + +/** + * @brief б¼仯߳ + * @param pParam + * @return +*/ +UINT CALLBACK CAdvice::ListenThread(LPVOID pParam) +{ + CAdvice* pAdvice = CAdvice::singleton; + CIgnoreInfo* pIgnoreInfo = CIgnoreInfo::GetInstance(); + + while (true) { + WaitForSingleObject(pAdvice->hEvent, INFINITE); + + + LPVOID sharedMemory = MapViewOfFile(pAdvice->hSharedMem, FILE_MAP_READ, 0, 0, sizeof(CIgnoreInfo)); + if (sharedMemory != NULL) { + pIgnoreInfo->Deserialize(sharedMemory); + + if (pIgnoreInfo->type == CIgnoreInfo::ADD) { + pAdvice->addIgnoreFile(pIgnoreInfo->fileName); + } + else if (pIgnoreInfo->type == CIgnoreInfo::REMOVE) { + pAdvice->removeIgnoreFile(pIgnoreInfo->fileName); + } + + UnmapViewOfFile(sharedMemory); + } + } +} + +void CAdvice::startListenThread() +{ + _beginthreadex(0, 0, CAdvice::ListenThread, 0, 0, 0); +} + +CAdvice::CAdvice() +{ + this->hEvent = CreateEvent(0, FALSE, FALSE, EventName); + if (this->hEvent == INVALID_HANDLE_VALUE) { + wchar_t sz[100]; + std::swprintf(sz, _countof(sz), _T("ʧ : %d"), GetLastError()); + MessageBox(NULL, sz, _T("ʼ¼"), MB_ICONINFORMATION); + } + + this->hSharedMem = OpenFileMapping(FILE_MAP_READ, FALSE, SharedMemoryName); + if (this->hSharedMem == INVALID_HANDLE_VALUE) { + wchar_t sz[100]; + std::swprintf(sz, _countof(sz), _T("ʧ : %d"), GetLastError()); + MessageBox(NULL, sz, _T("ʼڴ"), MB_ICONINFORMATION); + } +} + +CAdvice::~CAdvice() +{ + CloseHandle(this->hSharedMem); + CloseHandle(this->hEvent); +} \ No newline at end of file diff --git a/WorkDll/CAdvice.h b/WorkDll/CAdvice.h new file mode 100644 index 0000000..58096e7 --- /dev/null +++ b/WorkDll/CAdvice.h @@ -0,0 +1,25 @@ +#pragma once +#include + +/** + * @brief ļ +*/ +class CAdvice +{ +public: + static CAdvice* singleton; // õģʽ +private: + HANDLE hSharedMem; + HANDLE hEvent; + std::list interceptTable; +public: + static UINT CALLBACK ListenThread(LPVOID pParam); +public: + CAdvice(); + ~CAdvice(); + bool isMatch(LPWIN32_FIND_DATA); + void addIgnoreFile(std::wstring ignoreFileName); + void removeIgnoreFile(std::wstring ignoreFileName); + void startListenThread(); +}; + diff --git a/WorkDll/WorkDll.vcxproj b/WorkDll/WorkDll.vcxproj new file mode 100644 index 0000000..2cc7dfc --- /dev/null +++ b/WorkDll/WorkDll.vcxproj @@ -0,0 +1,171 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 17.0 + Win32Proj + {9366e397-8e3a-4b62-8520-8412f8af6182} + WorkDll + 10.0 + + + + DynamicLibrary + true + v143 + Unicode + + + DynamicLibrary + false + v143 + true + Unicode + + + DynamicLibrary + true + v143 + Unicode + + + DynamicLibrary + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + + WorkDll + + + WorkDll + + + WorkDll + + + WorkDll + + + + Level3 + true + WIN32;_DEBUG;WORKDLL_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + pch.h + $(TargetName).pch + + + Windows + true + false + + + + + Level3 + true + true + true + WIN32;NDEBUG;WORKDLL_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + pch.h + $(TargetName).pch + + + Windows + true + true + true + false + + + + + Level3 + true + _DEBUG;WORKDLL_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + pch.h + $(TargetName).pch + + + Windows + true + false + + + + + Level3 + true + true + true + NDEBUG;WORKDLL_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + pch.h + $(TargetName).pch + + + Windows + true + true + true + false + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WorkDll/WorkDll.vcxproj.filters b/WorkDll/WorkDll.vcxproj.filters new file mode 100644 index 0000000..85f621c --- /dev/null +++ b/WorkDll/WorkDll.vcxproj.filters @@ -0,0 +1,45 @@ + + + + + {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 + + + + + + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + + + 源文件 + + + 源文件 + + + 源文件 + + + \ No newline at end of file diff --git a/WorkDll/cpp.hint b/WorkDll/cpp.hint new file mode 100644 index 0000000..b1f3029 --- /dev/null +++ b/WorkDll/cpp.hint @@ -0,0 +1,2 @@ +#define WORKDLL_API __declspec(dllexport) +#define WORKDLL_API __declspec(dllimport) diff --git a/WorkDll/framework.h b/WorkDll/framework.h new file mode 100644 index 0000000..3ca24b2 --- /dev/null +++ b/WorkDll/framework.h @@ -0,0 +1,18 @@ +#pragma once + +#define WIN32_LEAN_AND_MEAN // 从 Windows 头文件中排除极少使用的内容 +// Windows 头文件 +#include + +#include +#include +#include +#pragma comment(lib,"ImageHlp.lib") +#include +#include +#include + + +// C++ 标准库 +#include +#include \ No newline at end of file diff --git a/WorkDll/work.cpp b/WorkDll/work.cpp new file mode 100644 index 0000000..54531e0 --- /dev/null +++ b/WorkDll/work.cpp @@ -0,0 +1,63 @@ +#include "pch.h" +#include "work.h" + +HMODULE hInstDll = NULL; +HHOOK g_Hook = NULL; + +BOOL APIENTRY DllMain( HMODULE hModule, + DWORD ul_reason_for_call, + LPVOID lpReserved + ) +{ + switch (ul_reason_for_call) + { + case DLL_PROCESS_ATTACH: + ::hInstDll = hModule; + DllInit();//初始化DLL + break; + case DLL_THREAD_ATTACH: + break; + case DLL_THREAD_DETACH: + break; + case DLL_PROCESS_DETACH: + break; + } + return(TRUE); +} + +VOID DllInit() +{ + //CreateThread(0, 0, FreeDllThread, 0, 0, 0);//等待卸载Dll + //hCurrentProcessId = GetCurrentProcessId(); + //GetModuleFileName(NULL, szPath, _countof(szPath)); + //hWnd = FindWindow(_T("DebugView"), NULL); + //TCHAR sz[MAX_PATH * 2]; + //StringCchPrintf(sz, _countof(sz), _T("DLL被加载!\t应用程序路径:%s"), szPath); + //MyOutputDebugStringW(sz); + + CAdvice::singleton->startListenThread(); + MessageBox(NULL, _T("赋能模块注入成功"), _T("HelpUploadFiles"), MB_ICONINFORMATION); +} + +// API 拦截 + + +/** + * @brief 用于拦截百度网盘 上传文件,排除指定文件 + * @param hFindFile + * @param lpFindFileData + * @return 默认状态返回原始值,遇到忽略状态跳过且自动查找下一个文件 +*/ +BOOL WINAPI MyFindNextFileW(HANDLE hFindFile, LPWIN32_FIND_DATAW lpFindFileData) +{ + BOOL res = FindNextFileW(hFindFile, lpFindFileData); + + CAdvice* pAdvice = CAdvice::singleton; + for (bool b = pAdvice->isMatch(lpFindFileData); b; b = pAdvice->isMatch(lpFindFileData)) { + res = FindNextFileW(hFindFile, lpFindFileData); // 直接跳到下一个文件 + } + return res; +} +// API 拦截 + +CAPIHook g_MyFindNextFile("Kernel32.dll", "FindNextFileW" , (PROC)MyFindNextFileW); \ No newline at end of file diff --git a/WorkDll/work.h b/WorkDll/work.h new file mode 100644 index 0000000..1787afe --- /dev/null +++ b/WorkDll/work.h @@ -0,0 +1,5 @@ +#include "pch.h" +#include "APIHook.h" +#include "CAdvice.h" + +VOID DllInit();