| 1598 | } |
| 1599 | |
| 1600 | BOOL WINAPI DetourCreateProcessWithDllExW(_In_opt_ LPCWSTR lpApplicationName, |
| 1601 | _Inout_opt_ LPWSTR lpCommandLine, |
| 1602 | _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes, |
| 1603 | _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes, |
| 1604 | _In_ BOOL bInheritHandles, |
| 1605 | _In_ DWORD dwCreationFlags, |
| 1606 | _In_opt_ LPVOID lpEnvironment, |
| 1607 | _In_opt_ LPCWSTR lpCurrentDirectory, |
| 1608 | _In_ LPSTARTUPINFOW lpStartupInfo, |
| 1609 | _Out_ LPPROCESS_INFORMATION lpProcessInformation, |
| 1610 | _In_ LPCSTR lpDllName, |
| 1611 | _In_opt_ PDETOUR_CREATE_PROCESS_ROUTINEW pfCreateProcessW) |
| 1612 | { |
| 1613 | if (pfCreateProcessW == NULL) { |
| 1614 | pfCreateProcessW = CreateProcessW; |
| 1615 | } |
| 1616 | |
| 1617 | PROCESS_INFORMATION backup; |
| 1618 | if (lpProcessInformation == NULL) { |
| 1619 | lpProcessInformation = &backup; |
| 1620 | ZeroMemory(&backup, sizeof(backup)); |
| 1621 | } |
| 1622 | |
| 1623 | if (!pfCreateProcessW(lpApplicationName, |
| 1624 | lpCommandLine, |
| 1625 | lpProcessAttributes, |
| 1626 | lpThreadAttributes, |
| 1627 | bInheritHandles, |
| 1628 | dwCreationFlags | CREATE_SUSPENDED, |
| 1629 | lpEnvironment, |
| 1630 | lpCurrentDirectory, |
| 1631 | lpStartupInfo, |
| 1632 | lpProcessInformation)) { |
| 1633 | return FALSE; |
| 1634 | } |
| 1635 | |
| 1636 | |
| 1637 | LPCSTR sz = lpDllName; |
| 1638 | |
| 1639 | if (!DetourUpdateProcessWithDll(lpProcessInformation->hProcess, &sz, 1) && |
| 1640 | !DetourProcessViaHelperW(lpProcessInformation->dwProcessId, |
| 1641 | lpDllName, |
| 1642 | pfCreateProcessW)) { |
| 1643 | |
| 1644 | TerminateProcess(lpProcessInformation->hProcess, ~0u); |
| 1645 | CloseHandle(lpProcessInformation->hProcess); |
| 1646 | CloseHandle(lpProcessInformation->hThread); |
| 1647 | return FALSE; |
| 1648 | } |
| 1649 | |
| 1650 | if (!(dwCreationFlags & CREATE_SUSPENDED)) { |
| 1651 | ResumeThread(lpProcessInformation->hThread); |
| 1652 | } |
| 1653 | |
| 1654 | if (lpProcessInformation == &backup) { |
| 1655 | CloseHandle(lpProcessInformation->hProcess); |
| 1656 | CloseHandle(lpProcessInformation->hThread); |
| 1657 | } |
nothing calls this directly
no test coverage detected
searching dependent graphs…