├── dnface_opt ├── logo.ico ├── resource.h ├── kdriver.cpp ├── dnface_opt.cpp ├── dnface_opt.rc ├── win32utility.cpp ├── dnface_opt.vcxproj.user ├── dnface_opt.vcxproj.filters ├── kdriver.h ├── win32utility.h └── dnface_opt.vcxproj ├── README.md ├── LICENSE └── dnface_opt.sln /dnface_opt/logo.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/H3d9/dnface_opt/HEAD/dnface_opt/logo.ico -------------------------------------------------------------------------------- /dnface_opt/resource.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/H3d9/dnface_opt/HEAD/dnface_opt/resource.h -------------------------------------------------------------------------------- /dnface_opt/kdriver.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/H3d9/dnface_opt/HEAD/dnface_opt/kdriver.cpp -------------------------------------------------------------------------------- /dnface_opt/dnface_opt.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/H3d9/dnface_opt/HEAD/dnface_opt/dnface_opt.cpp -------------------------------------------------------------------------------- /dnface_opt/dnface_opt.rc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/H3d9/dnface_opt/HEAD/dnface_opt/dnface_opt.rc -------------------------------------------------------------------------------- /dnface_opt/win32utility.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/H3d9/dnface_opt/HEAD/dnface_opt/win32utility.cpp -------------------------------------------------------------------------------- /dnface_opt/dnface_opt.vcxproj.user: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 优化DNF内置ACE模块 2 | 论坛链接:https://bbs.colg.cn/thread-8518972-1-1.html 3 | ## 工作原理 4 | 修改ACE-GDPServer64.dll中的sub_180004340()函数:
5 | 将WaitForSingleObject等待结束后执行的Sleep的参数由0修改为100。

6 | 【注】使用0调用Sleep仅仅意味着线程放弃当前时间片,并不意味着节省系统资源。 7 | 事实上此时资源已经几乎全部消耗在上下文转换(以及用户-内核态切换)中。 -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 H3d9 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /dnface_opt.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.32428.217 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dnface_opt", "dnface_opt\dnface_opt.vcxproj", "{AFEBB4F6-F8D2-417D-B0DE-F59015343F73}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|x64 = Debug|x64 11 | Release|x64 = Release|x64 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {AFEBB4F6-F8D2-417D-B0DE-F59015343F73}.Debug|x64.ActiveCfg = Debug|x64 15 | {AFEBB4F6-F8D2-417D-B0DE-F59015343F73}.Debug|x64.Build.0 = Debug|x64 16 | {AFEBB4F6-F8D2-417D-B0DE-F59015343F73}.Release|x64.ActiveCfg = Release|x64 17 | {AFEBB4F6-F8D2-417D-B0DE-F59015343F73}.Release|x64.Build.0 = Release|x64 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {7CA03A4C-4726-4CB5-A1E6-13B2F300F7A5} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /dnface_opt/dnface_opt.vcxproj.filters: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 6 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 资源文件 22 | 23 | 24 | 25 | 26 | 资源文件 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /dnface_opt/kdriver.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | 8 | // driver io module (sington) 9 | class KernelDriver { 10 | 11 | private: 12 | static KernelDriver kernelDriver; 13 | 14 | private: 15 | KernelDriver(); 16 | ~KernelDriver(); 17 | KernelDriver(const KernelDriver&) = delete; 18 | KernelDriver(KernelDriver&&) = delete; 19 | KernelDriver& operator= (const KernelDriver&) = delete; 20 | KernelDriver& operator= (KernelDriver&&) = delete; 21 | 22 | public: 23 | static KernelDriver& getInstance(); 24 | 25 | public: 26 | bool init(); 27 | bool load(); 28 | void unload(); 29 | bool readVM(DWORD pid, PVOID out, PVOID targetAddress); 30 | bool writeVM(DWORD pid, PVOID in, PVOID targetAddress); 31 | bool searchVad(DWORD pid, std::vector& out, const wchar_t* moduleName); 32 | 33 | private: 34 | bool _startService(); 35 | void _endService(); 36 | 37 | private: 38 | struct VMIO_REQUEST { 39 | HANDLE pid; 40 | 41 | PVOID address = NULL; 42 | CHAR data [0x1000] = {}; 43 | 44 | ULONG errorCode = 0; 45 | CHAR errorFunc [128] = {}; 46 | 47 | VMIO_REQUEST(DWORD pid) : pid(reinterpret_cast(static_cast(pid))) {} 48 | }; 49 | 50 | static constexpr DWORD VMIO_VERSION = CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0700, METHOD_BUFFERED, FILE_SPECIAL_ACCESS); 51 | static constexpr DWORD VMIO_READ = CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0701, METHOD_BUFFERED, FILE_SPECIAL_ACCESS); 52 | static constexpr DWORD VMIO_WRITE = CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0702, METHOD_BUFFERED, FILE_SPECIAL_ACCESS); 53 | static constexpr DWORD VM_VADSEARCH = CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0706, METHOD_BUFFERED, FILE_SPECIAL_ACCESS); 54 | 55 | std::string sysfile; 56 | SC_HANDLE hSCManager; 57 | SC_HANDLE hService; 58 | HANDLE hDriver; 59 | 60 | 61 | public: 62 | volatile DWORD errorCode; // module's errors recorded here (if method returns false). 63 | const CHAR* errorMessage; // caller can decide to log, panic, or ignore. 64 | 65 | private: 66 | void _resetError(); 67 | void _recordError(DWORD errorCode, const CHAR* msg, ...); 68 | 69 | private: 70 | std::unique_ptr errorMessage_ptr; 71 | }; -------------------------------------------------------------------------------- /dnface_opt/win32utility.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | #include 4 | #include 5 | 6 | // thread module wrapper (raii, see: std::shared_ptr) 7 | struct win32Thread { 8 | 9 | // general properties 10 | DWORD tid; 11 | HANDLE handle; 12 | 13 | // time properties 14 | ULONG64 cycles; 15 | ULONG64 cycleDelta; 16 | ULONG64 cycleDeltaAvg; 17 | 18 | // ctors 19 | win32Thread(DWORD tid, DWORD desiredAccess = THREAD_ALL_ACCESS); 20 | ~win32Thread(); 21 | win32Thread(const win32Thread& t); 22 | win32Thread(win32Thread&& t) noexcept; 23 | win32Thread& operator= (win32Thread t) noexcept; 24 | // win32Thread& operator= (win32Thread&&); >> no need; overload resolution is before '=delete' 25 | 26 | private: 27 | DWORD* _refCount; 28 | 29 | private: 30 | static void _mySwap(win32Thread& t1, win32Thread& t2); // friend ADL? no way, i don't need inline 31 | }; 32 | 33 | 34 | // general thread toolkit 35 | class win32ThreadManager { 36 | 37 | public: 38 | win32ThreadManager(); 39 | ~win32ThreadManager() = default; 40 | win32ThreadManager(const win32ThreadManager&) = delete; 41 | win32ThreadManager(win32ThreadManager&&) = delete; 42 | win32ThreadManager& operator= (const win32ThreadManager&) = delete; 43 | win32ThreadManager& operator= (win32ThreadManager&&) = delete; 44 | 45 | std::vector getTargetPid(const char* procName = "DNF.exe"); 46 | 47 | public: 48 | DWORD pid; 49 | DWORD threadCount; 50 | std::vector threadList; 51 | }; 52 | 53 | 54 | // general system toolkit (sington) 55 | class win32SystemManager { 56 | 57 | private: 58 | static win32SystemManager systemManager; 59 | 60 | private: 61 | win32SystemManager(); 62 | ~win32SystemManager(); 63 | win32SystemManager(const win32SystemManager&) = delete; 64 | win32SystemManager(win32SystemManager&&) = delete; 65 | win32SystemManager& operator= (const win32SystemManager&) = delete; 66 | win32SystemManager& operator= (win32SystemManager&&) = delete; 67 | 68 | public: 69 | static win32SystemManager& getInstance(); 70 | 71 | public: 72 | bool enableDebugPrivilege(); 73 | 74 | public: 75 | void panic(const char* format, ...); 76 | void panic(DWORD errorCode, const char* format, ...); 77 | 78 | private: 79 | void _panic(DWORD code, const char* showbuf); 80 | }; -------------------------------------------------------------------------------- /dnface_opt/dnface_opt.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | Debug 14 | x64 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | 16.0 23 | Win32Proj 24 | {afebb4f6-f8d2-417d-b0de-f59015343f73} 25 | dnfaceopt 26 | 10.0 27 | 28 | 29 | 30 | Application 31 | true 32 | v142 33 | Unicode 34 | 35 | 36 | Application 37 | false 38 | v142 39 | true 40 | Unicode 41 | 42 | 43 | Application 44 | true 45 | v142 46 | MultiByte 47 | 48 | 49 | Application 50 | false 51 | v142 52 | true 53 | MultiByte 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | true 75 | 76 | 77 | false 78 | 79 | 80 | true 81 | 82 | 83 | false 84 | 85 | 86 | 87 | Level3 88 | true 89 | WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) 90 | true 91 | 92 | 93 | Console 94 | true 95 | 96 | 97 | 98 | 99 | Level3 100 | true 101 | true 102 | true 103 | WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 104 | true 105 | 106 | 107 | Console 108 | true 109 | true 110 | true 111 | 112 | 113 | 114 | 115 | Level3 116 | false 117 | _DEBUG;_CONSOLE;%(PreprocessorDefinitions) 118 | true 119 | 120 | 121 | Console 122 | true 123 | 124 | 125 | 126 | 127 | Level3 128 | true 129 | true 130 | false 131 | NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 132 | true 133 | MultiThreaded 134 | 135 | 136 | Console 137 | true 138 | true 139 | true 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | --------------------------------------------------------------------------------