| 1720 | } |
| 1721 | |
| 1722 | BOOL WINAPI DetourCreateProcessWithDllsW(_In_opt_ LPCWSTR lpApplicationName, |
| 1723 | _Inout_opt_ LPWSTR lpCommandLine, |
| 1724 | _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes, |
| 1725 | _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes, |
| 1726 | _In_ BOOL bInheritHandles, |
| 1727 | _In_ DWORD dwCreationFlags, |
| 1728 | _In_opt_ LPVOID lpEnvironment, |
| 1729 | _In_opt_ LPCWSTR lpCurrentDirectory, |
| 1730 | _In_ LPSTARTUPINFOW lpStartupInfo, |
| 1731 | _Out_ LPPROCESS_INFORMATION lpProcessInformation, |
| 1732 | _In_ DWORD nDlls, |
| 1733 | _In_reads_(nDlls) LPCSTR *rlpDlls, |
| 1734 | _In_opt_ PDETOUR_CREATE_PROCESS_ROUTINEW pfCreateProcessW) |
| 1735 | { |
| 1736 | if (pfCreateProcessW == NULL) { |
| 1737 | pfCreateProcessW = CreateProcessW; |
| 1738 | } |
| 1739 | |
| 1740 | PROCESS_INFORMATION backup; |
| 1741 | if (lpProcessInformation == NULL) { |
| 1742 | lpProcessInformation = &backup; |
| 1743 | ZeroMemory(&backup, sizeof(backup)); |
| 1744 | } |
| 1745 | |
| 1746 | if (!pfCreateProcessW(lpApplicationName, |
| 1747 | lpCommandLine, |
| 1748 | lpProcessAttributes, |
| 1749 | lpThreadAttributes, |
| 1750 | bInheritHandles, |
| 1751 | dwCreationFlags | CREATE_SUSPENDED, |
| 1752 | lpEnvironment, |
| 1753 | lpCurrentDirectory, |
| 1754 | lpStartupInfo, |
| 1755 | lpProcessInformation)) { |
| 1756 | return FALSE; |
| 1757 | } |
| 1758 | |
| 1759 | |
| 1760 | if (!DetourUpdateProcessWithDll(lpProcessInformation->hProcess, rlpDlls, nDlls) && |
| 1761 | !DetourProcessViaHelperDllsW(lpProcessInformation->dwProcessId, |
| 1762 | nDlls, |
| 1763 | rlpDlls, |
| 1764 | pfCreateProcessW)) { |
| 1765 | |
| 1766 | TerminateProcess(lpProcessInformation->hProcess, ~0u); |
| 1767 | CloseHandle(lpProcessInformation->hProcess); |
| 1768 | CloseHandle(lpProcessInformation->hThread); |
| 1769 | return FALSE; |
| 1770 | } |
| 1771 | |
| 1772 | if (!(dwCreationFlags & CREATE_SUSPENDED)) { |
| 1773 | ResumeThread(lpProcessInformation->hThread); |
| 1774 | } |
| 1775 | |
| 1776 | if (lpProcessInformation == &backup) { |
| 1777 | CloseHandle(lpProcessInformation->hProcess); |
| 1778 | CloseHandle(lpProcessInformation->hThread); |
| 1779 | } |
nothing calls this directly
no test coverage detected
searching dependent graphs…