diff --git a/src/DllMain.c b/src/DllMain.c index 826b8d6..1fbfe39 100644 --- a/src/DllMain.c +++ b/src/DllMain.c @@ -15,7 +15,7 @@ HRESULT(*__put_PointerCursor__) (__x_ABI_CWindows_CUI_CCore_CICoreWindow *, __x_ABI_CWindows_CUI_CCore_CICoreCursor *) = {}; HRESULT(*__CreateSwapChainForCoreWindow__) -(IDXGIFactory2 *, IUnknown *, __x_ABI_CWindows_CUI_CCore_CICoreWindow *, DXGI_SWAP_CHAIN_DESC1 *, IDXGIOutput *, +(IDXGIFactory2 *, LPUNKNOWN, __x_ABI_CWindows_CUI_CCore_CICoreWindow *, DXGI_SWAP_CHAIN_DESC1 *, IDXGIOutput *, IDXGISwapChain1 **) = {}; HWND (*__CreateWindowExW__)(DWORD, LPCWSTR, LPCWSTR, DWORD, INT, INT, INT, INT, HWND, HMENU, HINSTANCE, LPVOID) = {}; @@ -54,7 +54,7 @@ HRESULT _put_PointerCursor_(__x_ABI_CWindows_CUI_CCore_CICoreWindow *This, return __put_PointerCursor__(This, value); } -HRESULT _CreateSwapChainForCoreWindow_(IDXGIFactory2 *This, IUnknown *pDevice, +HRESULT _CreateSwapChainForCoreWindow_(IDXGIFactory2 *This, LPUNKNOWN pDevice, __x_ABI_CWindows_CUI_CCore_CICoreWindow *pWindow, DXGI_SWAP_CHAIN_DESC1 *pDesc, IDXGIOutput *pRestrictToOutput, IDXGISwapChain1 **ppSwapChain) { @@ -125,13 +125,6 @@ BOOL DllMainCRTStartup(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) CSTR_EQUAL) return FALSE; - HANDLE hMutex = CreateMutexW(NULL, FALSE, L"Stonecutter"); - if (!hMutex || GetLastError()) - { - CloseHandle(hMutex); - return FALSE; - } - WCHAR szFileName[MAX_PATH] = {}; ExpandEnvironmentStringsW(L"%LOCALAPPDATA%\\..\\RoamingState\\Stonecutter.ini", szFileName, MAX_PATH); fForce = GetPrivateProfileIntW(L"", L"", FALSE, szFileName) == TRUE; diff --git a/src/Resources/DllMain.rc b/src/Resources/DllMain.rc index f1eb5cf..428157f 100644 --- a/src/Resources/DllMain.rc +++ b/src/Resources/DllMain.rc @@ -1,6 +1,6 @@ #include VS_VERSION_INFO VERSIONINFO -FILEVERSION 1, 5, 3, 1 +FILEVERSION 1, 5, 3, 2 BEGIN BLOCK "StringFileInfo" BEGIN @@ -8,7 +8,7 @@ BLOCK "040904b0" BEGIN VALUE "FileDescription", "Stonecutter" VALUE "ProductName", "Stonecutter" -VALUE "ProductVersion", "1.5.3.1" +VALUE "ProductVersion", "1.5.3.2" VALUE "LegalCopyright", "Copyright (C) 2024 - 25" END END diff --git a/src/WinMain.c b/src/WinMain.c index 15acfe1..c05dfa5 100644 --- a/src/WinMain.c +++ b/src/WinMain.c @@ -10,14 +10,13 @@ VOID WinMainCRTStartup() WCHAR szPath[MAX_PATH] = {}; QueryFullProcessImageNameW(GetCurrentProcess(), (DWORD){}, szPath, &((DWORD){MAX_PATH})); - HANDLE hObject = CreateMutexW(NULL, FALSE, L"Stonecutter"); - if (!hObject) + HANDLE hMutex = CreateMutexW(NULL, FALSE, L"Stonecutter"); + if (!hMutex) ExitProcess(EXIT_SUCCESS); else if (GetLastError()) { - PathRemoveFileSpecW(szPath); - PACL pAcl = {}; + PathRemoveFileSpecW(szPath); GetNamedSecurityInfoW(lstrcatW(szPath, L"\\Stonecutter.dll"), SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, &pAcl, NULL, NULL); SetEntriesInAclW(PACKAGE_GRAPH_MIN_SIZE, @@ -31,14 +30,15 @@ VOID WinMainCRTStartup() SetNamedSecurityInfoW(szPath, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, pAcl, NULL); PWSTR *pArgs = CommandLineToArgvW(GetCommandLineW(), &((INT){})); - HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, StrToIntW(pArgs[2])); + LPVOID lpBaseAddress = VirtualAllocEx(hProcess, NULL, sizeof(szPath), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); WriteProcessMemory(hProcess, lpBaseAddress, szPath, sizeof(szPath), NULL); + HANDLE hThread = CreateRemoteThread(hProcess, NULL, (SIZE_T){}, (LPTHREAD_START_ROUTINE)LoadLibraryW, lpBaseAddress, 0, NULL); - WaitForSingleObject(hThread, INFINITE); + VirtualFreeEx(hProcess, lpBaseAddress, (SIZE_T){}, MEM_RELEASE); CloseHandle(hThread); CloseHandle(hProcess); @@ -47,7 +47,7 @@ VOID WinMainCRTStartup() ResumeThread(hThread); CloseHandle(hThread); - CloseHandle(hObject); + CloseHandle(hMutex); ExitProcess(EXIT_SUCCESS); } @@ -74,6 +74,6 @@ VOID WinMainCRTStartup() pSettings->lpVtbl->DisableDebugging(pSettings, szPackageFullName); pSettings->lpVtbl->EnableDebugging(pSettings, szPackageFullName, NULL, NULL); - CloseHandle(hObject); + CloseHandle(hMutex); ExitProcess(EXIT_SUCCESS); } \ No newline at end of file