Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 28 additions & 3 deletions src/creatwth.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1338,11 +1338,19 @@ BOOL WINAPI DetourProcessViaHelperA(_In_ DWORD dwTargetPid,
return DetourProcessViaHelperDllsA(dwTargetPid, 1, &lpDllName, pfCreateProcessA);
}


BOOL WINAPI DetourProcessViaHelperDllsA(_In_ DWORD dwTargetPid,
_In_ DWORD nDlls,
_In_reads_(nDlls) LPCSTR *rlpDlls,
_In_ PDETOUR_CREATE_PROCESS_ROUTINEA pfCreateProcessA)
{
return DetourProcessViaHelperDllsExA(dwTargetPid, NULL, nDlls, rlpDlls, pfCreateProcessA);
}

BOOL WINAPI DetourProcessViaHelperDllsExA(_In_ DWORD dwTargetPid,
_In_ LPCSTR runDll,
_In_ DWORD nDlls,
_In_reads_(nDlls) LPCSTR *rlpDlls,
_In_ PDETOUR_CREATE_PROCESS_ROUTINEA pfCreateProcessA)
{
BOOL Result = FALSE;
PROCESS_INFORMATION pi;
Expand Down Expand Up @@ -1381,8 +1389,12 @@ BOOL WINAPI DetourProcessViaHelperDllsA(_In_ DWORD dwTargetPid,

//for East Asia languages and so on, like Chinese, print format with "%hs" can not work fine before user call _tsetlocale(LC_ALL,_T(".ACP"));
//so we can't use "%hs" in format string, because the dll that contain this code would inject to any process, even not call _tsetlocale(LC_ALL,_T(".ACP")) before
if (!runDll)
{
runDll = &helper->rDlls[0];
}
hr = StringCchPrintfA(szCommand, ARRAYSIZE(szCommand),
"rundll32.exe \"%s\",#1", &helper->rDlls[0]);
"rundll32.exe \"%s\",#1", runDll);
if (!SUCCEEDED(hr)) {
goto Cleanup;
}
Expand Down Expand Up @@ -1441,6 +1453,15 @@ BOOL WINAPI DetourProcessViaHelperDllsW(_In_ DWORD dwTargetPid,
_In_ DWORD nDlls,
_In_reads_(nDlls) LPCSTR *rlpDlls,
_In_ PDETOUR_CREATE_PROCESS_ROUTINEW pfCreateProcessW)
{
return DetourProcessViaHelperDllsExW(dwTargetPid, NULL, nDlls, rlpDlls, pfCreateProcessW);
}

BOOL WINAPI DetourProcessViaHelperDllsExW(_In_ DWORD dwTargetPid,
_In_ LPCSTR runDll,
_In_ DWORD nDlls,
_In_reads_(nDlls) LPCSTR *rlpDlls,
_In_ PDETOUR_CREATE_PROCESS_ROUTINEW pfCreateProcessW)
{
BOOL Result = FALSE;
PROCESS_INFORMATION pi;
Expand Down Expand Up @@ -1482,7 +1503,11 @@ BOOL WINAPI DetourProcessViaHelperDllsW(_In_ DWORD dwTargetPid,
//for East Asia languages and so on, like Chinese, print format with "%hs" can not work fine before user call _tsetlocale(LC_ALL,_T(".ACP"));
//so we can't use "%hs" in format string, because the dll that contain this code would inject to any process, even not call _tsetlocale(LC_ALL,_T(".ACP")) before

cchWrittenWideChar = MultiByteToWideChar(CP_ACP, 0, &helper->rDlls[0], -1, szDllName, ARRAYSIZE(szDllName));
if (!runDll)
{
runDll = &helper->rDlls[0];
}
cchWrittenWideChar = MultiByteToWideChar(CP_ACP, 0, runDll, -1, szDllName, ARRAYSIZE(szDllName));
if (cchWrittenWideChar >= ARRAYSIZE(szDllName) || cchWrittenWideChar <= 0) {
goto Cleanup;
}
Expand Down
18 changes: 18 additions & 0 deletions src/detours.h
Original file line number Diff line number Diff line change
Expand Up @@ -834,6 +834,24 @@ BOOL WINAPI DetourProcessViaHelperDllsW(_In_ DWORD dwTargetPid,
#define DetourProcessViaHelperDlls DetourProcessViaHelperDllsA
#endif // !UNICODE

BOOL WINAPI DetourProcessViaHelperDllsExA(_In_ DWORD dwTargetPid,
_In_ LPCSTR runDll,
_In_ DWORD nDlls,
_In_reads_(nDlls) LPCSTR *rlpDlls,
_In_ PDETOUR_CREATE_PROCESS_ROUTINEA pfCreateProcessA);

BOOL WINAPI DetourProcessViaHelperDllsExW(_In_ DWORD dwTargetPid,
_In_ LPCSTR runDll,
_In_ DWORD nDlls,
_In_reads_(nDlls) LPCSTR *rlpDlls,
_In_ PDETOUR_CREATE_PROCESS_ROUTINEW pfCreateProcessW);

#ifdef UNICODE
#define DetourProcessViaHelperDllsEx DetourProcessViaHelperDllsExW
#else
#define DetourProcessViaHelperDllsEx DetourProcessViaHelperDllsExA
#endif // !UNICODE

BOOL WINAPI DetourUpdateProcessWithDll(_In_ HANDLE hProcess,
_In_reads_(nDlls) LPCSTR *rlpDlls,
_In_ DWORD nDlls);
Expand Down