├── 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 |
--------------------------------------------------------------------------------