| 1 | """Run through the old agent's detached spawn endpoint in a disposable clone.""" |
| 2 | import os |
| 3 | import ctypes |
| 4 | from ctypes import wintypes |
| 5 | import subprocess |
| 6 | import sys |
| 7 | import time |
| 8 | |
| 9 | if len(sys.argv) != 2 or not sys.argv[1].startswith('ONE-M6-') or os.environ.get('COMPUTERNAME') != sys.argv[1]: |
| 10 | raise SystemExit('The disposable clone hostname does not match.') |
| 11 | parent = os.getppid() |
| 12 | kernel = ctypes.WinDLL('kernel32', use_last_error=True) |
| 13 | kernel.OpenProcess.argtypes = (wintypes.DWORD, wintypes.BOOL, wintypes.DWORD) |
| 14 | kernel.OpenProcess.restype = wintypes.HANDLE |
| 15 | kernel.TerminateProcess.argtypes = (wintypes.HANDLE, wintypes.UINT) |
| 16 | kernel.TerminateProcess.restype = wintypes.BOOL |
| 17 | kernel.WaitForSingleObject.argtypes = (wintypes.HANDLE, wintypes.DWORD) |
| 18 | kernel.WaitForSingleObject.restype = wintypes.DWORD |
| 19 | kernel.CloseHandle.argtypes = (wintypes.HANDLE,) |
| 20 | kernel.CloseHandle.restype = wintypes.BOOL |
| 21 | handle = kernel.OpenProcess(0x100001, False, parent) |
| 22 | if not handle: |
| 23 | raise ctypes.WinError(ctypes.get_last_error()) |
| 24 | time.sleep(0.5) |
| 25 | try: |
| 26 | if not kernel.TerminateProcess(handle, 0): |
| 27 | raise ctypes.WinError(ctypes.get_last_error()) |
| 28 | if kernel.WaitForSingleObject(handle, 5000) != 0: |
| 29 | raise RuntimeError('The old agent did not terminate.') |
| 30 | finally: |
| 31 | kernel.CloseHandle(handle) |
| 32 | with open(r'C:\one-tests\agent-restart.log', 'ab') as log: |
| 33 | subprocess.Popen([sys.executable, r'C:\win7-agent\agent.py'], stdin=subprocess.DEVNULL, |
| 34 | stdout=log, stderr=log, close_fds=True, |
| 35 | creationflags=subprocess.DETACHED_PROCESS | subprocess.CREATE_NEW_PROCESS_GROUP) |