├── Injector ├── Injector.cpp ├── Injector.vcxproj ├── Injector.vcxproj.filters └── Injector.vcxproj.user ├── Mod ├── Mod.cpp ├── Mod.h ├── Mod.vcxproj ├── Mod.vcxproj.filters ├── dllmain.cpp ├── packages.config ├── pch.cpp ├── pch.h └── targetver.h └── W10TestMod.sln /Injector/Injector.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | DWORD FindMinecraftPID() { 8 | HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 9 | if (hProcessSnap == INVALID_HANDLE_VALUE) 10 | throw std::runtime_error("CreateToolhelp32Snapshot failed"); 11 | PROCESSENTRY32 pe; 12 | pe.dwSize = sizeof(PROCESSENTRY32); 13 | if (!Process32First(hProcessSnap, &pe)) 14 | throw std::runtime_error("Process32First failed"); 15 | DWORD ret = 0; 16 | do { 17 | if (lstrcmp(pe.szExeFile, L"Minecraft.Windows.exe") == 0) 18 | ret = pe.th32ProcessID; 19 | } while (Process32Next(hProcessSnap, &pe)); 20 | CloseHandle(hProcessSnap); 21 | return ret; 22 | } 23 | 24 | HMODULE FindRemoteModuleAddress(DWORD pid, const wchar_t *path) { 25 | HANDLE hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid); 26 | if (hModuleSnap == INVALID_HANDLE_VALUE) 27 | throw std::runtime_error("CreateToolhelp32Snapshot failed"); 28 | MODULEENTRY32 me; 29 | me.dwSize = sizeof(MODULEENTRY32); 30 | if (!Module32First(hModuleSnap, &me)) 31 | throw std::runtime_error("Module32First failed"); 32 | DWORD ret = 0; 33 | do { 34 | if (!wcscmp(path, me.szExePath)) 35 | return me.hModule; 36 | } while (Module32Next(hModuleSnap, &me)); 37 | CloseHandle(hModuleSnap); 38 | return NULL; 39 | } 40 | 41 | 42 | void CallUsingRemoteThread(HANDLE hProcess, LPVOID lpFunction, LPVOID lpParameter) { 43 | HANDLE hThread = CreateRemoteThread(hProcess, NULL, NULL, (LPTHREAD_START_ROUTINE)lpFunction, lpParameter, 0, NULL); 44 | WaitForSingleObject(hThread, INFINITE); 45 | CloseHandle(hThread); 46 | } 47 | 48 | void CallUsingRemoteThreadWithData(HANDLE hProcess, LPVOID lpFunction, LPCVOID lpData, SIZE_T nDataSize) { 49 | LPVOID lpRemoteData = VirtualAllocEx(hProcess, NULL, nDataSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); 50 | WriteProcessMemory(hProcess, lpRemoteData, lpData, nDataSize, NULL); 51 | CallUsingRemoteThread(hProcess, lpFunction, lpRemoteData); 52 | VirtualFreeEx(hProcess, lpRemoteData, nDataSize, MEM_RELEASE); 53 | } 54 | 55 | 56 | void GrantAllApplicationPackagesPermission(LPCWSTR lpStr) { 57 | PACL pAcl, pNewAcl; 58 | EXPLICIT_ACCESS explicitAccess; 59 | PSECURITY_DESCRIPTOR ppSecurityDescriptor; 60 | 61 | uint8_t pSid_backing[SECURITY_MAX_SID_SIZE]; 62 | PSID pSid = pSid_backing; 63 | DWORD cbSid = sizeof(pSid_backing); 64 | 65 | if (!CreateWellKnownSid(WinBuiltinAnyPackageSid, NULL, pSid, &cbSid)) 66 | throw std::runtime_error("CreateWellKnownSid failed"); 67 | 68 | if (GetNamedSecurityInfo(lpStr, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, &pAcl, NULL, &ppSecurityDescriptor) != ERROR_SUCCESS) 69 | throw std::runtime_error("GetNamedSecurityInfo failed"); 70 | ZeroMemory(&explicitAccess, sizeof(EXPLICIT_ACCESS)); 71 | explicitAccess.grfAccessMode = SET_ACCESS; 72 | explicitAccess.grfAccessPermissions = GENERIC_READ | GENERIC_EXECUTE; 73 | explicitAccess.grfInheritance = 0;; 74 | explicitAccess.Trustee.MultipleTrusteeOperation = NO_MULTIPLE_TRUSTEE; 75 | explicitAccess.Trustee.pMultipleTrustee = NULL; 76 | explicitAccess.Trustee.ptstrName = (LPTSTR)pSid; 77 | explicitAccess.Trustee.TrusteeForm = TRUSTEE_IS_SID; 78 | explicitAccess.Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP; 79 | 80 | if (SetEntriesInAcl(1, &explicitAccess, pAcl, &pNewAcl) != ERROR_SUCCESS) 81 | throw std::runtime_error("SetEntriesInAcl failed"); 82 | if (SetNamedSecurityInfo((LPWSTR) lpStr, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, pNewAcl, NULL) != ERROR_SUCCESS) { 83 | LocalFree(pNewAcl); 84 | throw std::runtime_error("SetNamedSecurityInfo failed"); 85 | } 86 | LocalFree(pNewAcl); 87 | } 88 | 89 | int main() { 90 | try { 91 | auto pid = FindMinecraftPID(); 92 | if (pid == 0) { 93 | printf("Minecraft is not running."); 94 | return 1; 95 | } 96 | HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pid); 97 | if (hProcess == NULL) 98 | throw std::runtime_error("OpenProcess failed"); 99 | 100 | std::wstring cwd; 101 | cwd.resize(MAX_PATH + 1); 102 | auto cwdLen = GetCurrentDirectory(2 * cwd.size(), &cwd[0]); 103 | if (cwdLen == 0) 104 | throw std::runtime_error("GetCurrentDirectory failed"); 105 | cwd.resize(cwdLen); 106 | 107 | // wprintf(L"CWD: %s\n", cwd.data()); 108 | 109 | std::wstring libPath = cwd + L"\\Mod.dll"; 110 | std::wstring copyToLibPath = cwd + L"\\Mod_Injected.dll"; 111 | 112 | 113 | auto hLib = FindRemoteModuleAddress(pid, copyToLibPath.c_str()); 114 | if (hLib != NULL) { 115 | wprintf(L"Unloading previous version of the mod. (handle = %p)\n", hLib); 116 | 117 | LPVOID lpFreeLibrary = (LPVOID)GetProcAddress(GetModuleHandleA("kernel32.dll"), "FreeLibrary"); 118 | CallUsingRemoteThread(hProcess, lpFreeLibrary, hLib); 119 | } 120 | 121 | if (!CopyFile(libPath.c_str(), copyToLibPath.c_str(), FALSE)) 122 | throw std::runtime_error("CopyFile failed"); 123 | 124 | GrantAllApplicationPackagesPermission(copyToLibPath.c_str()); 125 | 126 | wprintf(L"Loading mod file: %s\n", copyToLibPath.data()); 127 | LPVOID lpLoadLibraryW = (LPVOID)GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryW"); 128 | CallUsingRemoteThreadWithData(hProcess, lpLoadLibraryW, copyToLibPath.data(), 2 * copyToLibPath.size() + 2); // size()はnull terminatorを含まないから2を足します 129 | 130 | } catch (std::runtime_error& err) { 131 | printf("Error: %s\n", err.what()); 132 | return 1; 133 | } 134 | 135 | return 0; 136 | } 137 | -------------------------------------------------------------------------------- /Injector/Injector.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 | {507cba1c-29c0-4399-b030-76254be4aee7} 25 | Injector 26 | 10.0 27 | 28 | 29 | 30 | Application 31 | true 32 | v143 33 | Unicode 34 | 35 | 36 | Application 37 | false 38 | v143 39 | true 40 | Unicode 41 | 42 | 43 | Application 44 | true 45 | v143 46 | Unicode 47 | 48 | 49 | Application 50 | false 51 | v143 52 | true 53 | Unicode 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 | true 117 | _DEBUG;_CONSOLE;%(PreprocessorDefinitions) 118 | true 119 | 120 | 121 | Console 122 | true 123 | 124 | 125 | 126 | 127 | Level3 128 | true 129 | true 130 | true 131 | NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 132 | true 133 | 134 | 135 | Console 136 | true 137 | true 138 | true 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | -------------------------------------------------------------------------------- /Injector/Injector.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | Source Files 20 | 21 | 22 | -------------------------------------------------------------------------------- /Injector/Injector.vcxproj.user: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | $(TargetDir)\Mod 5 | WindowsLocalDebugger 6 | 7 | -------------------------------------------------------------------------------- /Mod/Mod.cpp: -------------------------------------------------------------------------------- 1 | #include "pch.h" 2 | #include "Mod.h" 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | #pragma comment(lib, "kernel32.lib") 9 | #pragma comment(lib, "shell32.lib") 10 | 11 | std::wstring acFolderPath; 12 | std::wofstream modLog; 13 | 14 | std::string(*Common$getGameVersionStringNet)(); 15 | std::string _Common$getGameVersionStringNet() { 16 | return Common$getGameVersionStringNet() + "mod"; 17 | } 18 | 19 | void ModAttach() { 20 | PWSTR pAppDataPath; 21 | SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, NULL, &pAppDataPath); 22 | acFolderPath = pAppDataPath; 23 | CoTaskMemFree(pAppDataPath); 24 | 25 | modLog.open(acFolderPath + L"\\ModLog.txt"); 26 | UINT_PTR offset = (UINT_PTR)GetModuleHandle(L"Minecraft.Windows.exe"); 27 | modLog << "offset = " << std::hex << offset << std::endl; 28 | 29 | (void*&)Common$getGameVersionStringNet = (void*) (offset - 0x140000000 + 0x14162C220); 30 | 31 | DetourTransactionBegin(); 32 | DetourUpdateThread(GetCurrentThread()); 33 | DetourAttach(&(PVOID&)Common$getGameVersionStringNet, _Common$getGameVersionStringNet); 34 | DetourTransactionCommit(); 35 | } 36 | 37 | void ModDetach() { 38 | DetourTransactionBegin(); 39 | DetourUpdateThread(GetCurrentThread()); 40 | DetourDetach(&(PVOID&)Common$getGameVersionStringNet, _Common$getGameVersionStringNet); 41 | DetourTransactionCommit(); 42 | } -------------------------------------------------------------------------------- /Mod/Mod.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | void ModAttach(); 4 | void ModDetach(); -------------------------------------------------------------------------------- /Mod/Mod.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | ARM 7 | 8 | 9 | Debug 10 | ARM64 11 | 12 | 13 | Debug 14 | Win32 15 | 16 | 17 | Debug 18 | x64 19 | 20 | 21 | Release 22 | ARM 23 | 24 | 25 | Release 26 | ARM64 27 | 28 | 29 | Release 30 | Win32 31 | 32 | 33 | Release 34 | x64 35 | 36 | 37 | 38 | {33b964ab-aa9f-4c52-8dd1-65cfd0ef5a26} 39 | DynamicLibrary 40 | Mod 41 | en-US 42 | 14.0 43 | true 44 | Windows Store 45 | 10.0.19041.0 46 | 10.0.17763.0 47 | 10.0 48 | 49 | 50 | 51 | DynamicLibrary 52 | true 53 | v143 54 | 55 | 56 | DynamicLibrary 57 | true 58 | v143 59 | 60 | 61 | DynamicLibrary 62 | true 63 | v143 64 | 65 | 66 | DynamicLibrary 67 | true 68 | v143 69 | 70 | 71 | DynamicLibrary 72 | false 73 | true 74 | v143 75 | 76 | 77 | DynamicLibrary 78 | false 79 | true 80 | v143 81 | 82 | 83 | DynamicLibrary 84 | false 85 | true 86 | v143 87 | 88 | 89 | DynamicLibrary 90 | false 91 | true 92 | v143 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | false 127 | false 128 | 129 | 130 | false 131 | false 132 | 133 | 134 | false 135 | false 136 | 137 | 138 | false 139 | false 140 | 141 | 142 | false 143 | false 144 | 145 | 146 | false 147 | false 148 | 149 | 150 | false 151 | false 152 | 153 | 154 | false 155 | false 156 | 157 | 158 | 159 | Use 160 | false 161 | 162 | 163 | Console 164 | false 165 | false 166 | 167 | 168 | 169 | 170 | Use 171 | false 172 | 173 | 174 | Console 175 | false 176 | false 177 | 178 | 179 | 180 | 181 | Use 182 | false 183 | 184 | 185 | Console 186 | false 187 | false 188 | 189 | 190 | 191 | 192 | Use 193 | false 194 | 195 | 196 | Console 197 | false 198 | false 199 | 200 | 201 | 202 | 203 | Use 204 | false 205 | 206 | 207 | Console 208 | false 209 | false 210 | 211 | 212 | 213 | 214 | Use 215 | false 216 | 217 | 218 | Console 219 | false 220 | false 221 | 222 | 223 | 224 | 225 | Use 226 | false 227 | 228 | 229 | Console 230 | false 231 | false 232 | 233 | 234 | 235 | 236 | Use 237 | false 238 | 239 | 240 | Console 241 | false 242 | false 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | Create 255 | Create 256 | Create 257 | Create 258 | Create 259 | Create 260 | Create 261 | Create 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. 274 | 275 | 276 | 277 | -------------------------------------------------------------------------------- /Mod/Mod.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;tga;tiff;tif;png;wav;mfcribbon-ms 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /Mod/dllmain.cpp: -------------------------------------------------------------------------------- 1 | #include "pch.h" 2 | #include 3 | #include "Mod.h" 4 | 5 | BOOL APIENTRY DllMain(HMODULE /* hModule */, DWORD dwReason, LPVOID /* lpReserved */) 6 | { 7 | if (DetourIsHelperProcess()) { 8 | return TRUE; 9 | } 10 | 11 | if (dwReason == DLL_PROCESS_ATTACH) { 12 | DetourRestoreAfterWith(); 13 | 14 | ModAttach(); 15 | } else if (dwReason == DLL_PROCESS_DETACH) { 16 | ModDetach(); 17 | } 18 | return TRUE; 19 | } 20 | -------------------------------------------------------------------------------- /Mod/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | -------------------------------------------------------------------------------- /Mod/pch.cpp: -------------------------------------------------------------------------------- 1 | #include "pch.h" 2 | -------------------------------------------------------------------------------- /Mod/pch.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "targetver.h" 4 | 5 | #define WINAPI_PARTITION_DESKTOP 1 6 | 7 | #ifndef WIN32_LEAN_AND_MEAN 8 | #define WIN32_LEAN_AND_MEAN 9 | #endif 10 | 11 | #include 12 | -------------------------------------------------------------------------------- /Mod/targetver.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | // Including SDKDDKVer.h defines the highest available Windows platform. 4 | 5 | // If you wish to build your application for a previous Windows platform, include WinSDKVer.h and 6 | // set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /W10TestMod.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.0.31919.166 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Injector", "Injector\Injector.vcxproj", "{507CBA1C-29C0-4399-B030-76254BE4AEE7}" 7 | ProjectSection(ProjectDependencies) = postProject 8 | {33B964AB-AA9F-4C52-8DD1-65CFD0EF5A26} = {33B964AB-AA9F-4C52-8DD1-65CFD0EF5A26} 9 | EndProjectSection 10 | EndProject 11 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Mod", "Mod\Mod.vcxproj", "{33B964AB-AA9F-4C52-8DD1-65CFD0EF5A26}" 12 | EndProject 13 | Global 14 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 15 | Debug|ARM = Debug|ARM 16 | Debug|ARM64 = Debug|ARM64 17 | Debug|x64 = Debug|x64 18 | Debug|x86 = Debug|x86 19 | Release|ARM = Release|ARM 20 | Release|ARM64 = Release|ARM64 21 | Release|x64 = Release|x64 22 | Release|x86 = Release|x86 23 | EndGlobalSection 24 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 25 | {507CBA1C-29C0-4399-B030-76254BE4AEE7}.Debug|ARM.ActiveCfg = Debug|x64 26 | {507CBA1C-29C0-4399-B030-76254BE4AEE7}.Debug|ARM.Build.0 = Debug|x64 27 | {507CBA1C-29C0-4399-B030-76254BE4AEE7}.Debug|ARM64.ActiveCfg = Debug|x64 28 | {507CBA1C-29C0-4399-B030-76254BE4AEE7}.Debug|ARM64.Build.0 = Debug|x64 29 | {507CBA1C-29C0-4399-B030-76254BE4AEE7}.Debug|x64.ActiveCfg = Debug|x64 30 | {507CBA1C-29C0-4399-B030-76254BE4AEE7}.Debug|x64.Build.0 = Debug|x64 31 | {507CBA1C-29C0-4399-B030-76254BE4AEE7}.Debug|x86.ActiveCfg = Debug|Win32 32 | {507CBA1C-29C0-4399-B030-76254BE4AEE7}.Debug|x86.Build.0 = Debug|Win32 33 | {507CBA1C-29C0-4399-B030-76254BE4AEE7}.Release|ARM.ActiveCfg = Release|x64 34 | {507CBA1C-29C0-4399-B030-76254BE4AEE7}.Release|ARM.Build.0 = Release|x64 35 | {507CBA1C-29C0-4399-B030-76254BE4AEE7}.Release|ARM64.ActiveCfg = Release|x64 36 | {507CBA1C-29C0-4399-B030-76254BE4AEE7}.Release|ARM64.Build.0 = Release|x64 37 | {507CBA1C-29C0-4399-B030-76254BE4AEE7}.Release|x64.ActiveCfg = Release|x64 38 | {507CBA1C-29C0-4399-B030-76254BE4AEE7}.Release|x64.Build.0 = Release|x64 39 | {507CBA1C-29C0-4399-B030-76254BE4AEE7}.Release|x86.ActiveCfg = Release|Win32 40 | {507CBA1C-29C0-4399-B030-76254BE4AEE7}.Release|x86.Build.0 = Release|Win32 41 | {33B964AB-AA9F-4C52-8DD1-65CFD0EF5A26}.Debug|ARM.ActiveCfg = Debug|ARM 42 | {33B964AB-AA9F-4C52-8DD1-65CFD0EF5A26}.Debug|ARM.Build.0 = Debug|ARM 43 | {33B964AB-AA9F-4C52-8DD1-65CFD0EF5A26}.Debug|ARM64.ActiveCfg = Debug|ARM64 44 | {33B964AB-AA9F-4C52-8DD1-65CFD0EF5A26}.Debug|ARM64.Build.0 = Debug|ARM64 45 | {33B964AB-AA9F-4C52-8DD1-65CFD0EF5A26}.Debug|x64.ActiveCfg = Debug|x64 46 | {33B964AB-AA9F-4C52-8DD1-65CFD0EF5A26}.Debug|x64.Build.0 = Debug|x64 47 | {33B964AB-AA9F-4C52-8DD1-65CFD0EF5A26}.Debug|x86.ActiveCfg = Debug|Win32 48 | {33B964AB-AA9F-4C52-8DD1-65CFD0EF5A26}.Debug|x86.Build.0 = Debug|Win32 49 | {33B964AB-AA9F-4C52-8DD1-65CFD0EF5A26}.Release|ARM.ActiveCfg = Release|ARM 50 | {33B964AB-AA9F-4C52-8DD1-65CFD0EF5A26}.Release|ARM.Build.0 = Release|ARM 51 | {33B964AB-AA9F-4C52-8DD1-65CFD0EF5A26}.Release|ARM64.ActiveCfg = Release|ARM64 52 | {33B964AB-AA9F-4C52-8DD1-65CFD0EF5A26}.Release|ARM64.Build.0 = Release|ARM64 53 | {33B964AB-AA9F-4C52-8DD1-65CFD0EF5A26}.Release|x64.ActiveCfg = Release|x64 54 | {33B964AB-AA9F-4C52-8DD1-65CFD0EF5A26}.Release|x64.Build.0 = Release|x64 55 | {33B964AB-AA9F-4C52-8DD1-65CFD0EF5A26}.Release|x86.ActiveCfg = Release|Win32 56 | {33B964AB-AA9F-4C52-8DD1-65CFD0EF5A26}.Release|x86.Build.0 = Release|Win32 57 | EndGlobalSection 58 | GlobalSection(SolutionProperties) = preSolution 59 | HideSolutionNode = FALSE 60 | EndGlobalSection 61 | GlobalSection(ExtensibilityGlobals) = postSolution 62 | SolutionGuid = {465C7356-A2B9-4002-B40D-2694FC43DE98} 63 | EndGlobalSection 64 | EndGlobal 65 | --------------------------------------------------------------------------------