| 1537 | } |
| 1538 | |
| 1539 | BOOL WINAPI DetourCreateProcessWithDllExA(_In_opt_ LPCSTR lpApplicationName, |
| 1540 | _Inout_opt_ LPSTR lpCommandLine, |
| 1541 | _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes, |
| 1542 | _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes, |
| 1543 | _In_ BOOL bInheritHandles, |
| 1544 | _In_ DWORD dwCreationFlags, |
| 1545 | _In_opt_ LPVOID lpEnvironment, |
| 1546 | _In_opt_ LPCSTR lpCurrentDirectory, |
| 1547 | _In_ LPSTARTUPINFOA lpStartupInfo, |
| 1548 | _Out_ LPPROCESS_INFORMATION lpProcessInformation, |
| 1549 | _In_ LPCSTR lpDllName, |
| 1550 | _In_opt_ PDETOUR_CREATE_PROCESS_ROUTINEA pfCreateProcessA) |
| 1551 | { |
| 1552 | if (pfCreateProcessA == NULL) { |
| 1553 | pfCreateProcessA = CreateProcessA; |
| 1554 | } |
| 1555 | |
| 1556 | PROCESS_INFORMATION backup; |
| 1557 | if (lpProcessInformation == NULL) { |
| 1558 | lpProcessInformation = &backup; |
| 1559 | ZeroMemory(&backup, sizeof(backup)); |
| 1560 | } |
| 1561 | |
| 1562 | if (!pfCreateProcessA(lpApplicationName, |
| 1563 | lpCommandLine, |
| 1564 | lpProcessAttributes, |
| 1565 | lpThreadAttributes, |
| 1566 | bInheritHandles, |
| 1567 | dwCreationFlags | CREATE_SUSPENDED, |
| 1568 | lpEnvironment, |
| 1569 | lpCurrentDirectory, |
| 1570 | lpStartupInfo, |
| 1571 | lpProcessInformation)) { |
| 1572 | return FALSE; |
| 1573 | } |
| 1574 | |
| 1575 | LPCSTR szDll = lpDllName; |
| 1576 | |
| 1577 | if (!DetourUpdateProcessWithDll(lpProcessInformation->hProcess, &szDll, 1) && |
| 1578 | !DetourProcessViaHelperA(lpProcessInformation->dwProcessId, |
| 1579 | lpDllName, |
| 1580 | pfCreateProcessA)) { |
| 1581 | |
| 1582 | TerminateProcess(lpProcessInformation->hProcess, ~0u); |
| 1583 | CloseHandle(lpProcessInformation->hProcess); |
| 1584 | CloseHandle(lpProcessInformation->hThread); |
| 1585 | return FALSE; |
| 1586 | } |
| 1587 | |
| 1588 | if (!(dwCreationFlags & CREATE_SUSPENDED)) { |
| 1589 | ResumeThread(lpProcessInformation->hThread); |
| 1590 | } |
| 1591 | |
| 1592 | if (lpProcessInformation == &backup) { |
| 1593 | CloseHandle(lpProcessInformation->hProcess); |
| 1594 | CloseHandle(lpProcessInformation->hThread); |
| 1595 | } |
| 1596 |
nothing calls this directly
no test coverage detected
searching dependent graphs…