/*** Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: AuProcess.NT.hpp Date: 2022-1-29 Author: Reece ***/ #pragma once #include namespace Aurora::Processes { struct ProcessImpl : IProcess, IO::CompletionGroup::ICompletionGroupWorkItem { ProcessImpl(StartupParameters &¶ms); ~ProcessImpl(); bool TermWinEnumProcesses(); bool TryKill() override; bool HasExited() override; AuUInt GetProcessId() override; bool Terminate() override; AuSPtr AsWaitable() override; AuSPtr AsLoopSource() override; AuSInt GetExitCode() override; void ShutdownPipes(); bool Read(EStandardHandle stream, const AuMemoryViewStreamWrite &destination, bool nonblock) override; bool Write(const AuMemoryViewStreamRead &source) override; AuSPtr NewAsyncTransaction() override; AuSPtr NewErrorStreamAsyncTransaction() override; AuSPtr GetOutputAndInputHandles() override; AuSPtr GetErrorStreamHandle() override; AuSPtr ToStreamReader(EStandardHandle stream) override; AuSPtr ToStreamWriter() override; bool Start() override; bool TryAttachProcessExitToCompletionGroup(const AuSPtr &pCompletionGroup) override; IO::CompletionGroup::ICompletionGroupWorkHandle *ToCompletionGroupHandle() override; bool HasCompletedForGCWI() override; void CleanupForGCWI() override; bool Init(); void RestLeakyMem(); void RelOtherHandles(); private: PROCESS_INFORMATION processInfo_ {}; HANDLE process_ {INVALID_HANDLE_VALUE}; HANDLE pipeStdOutRead_ {INVALID_HANDLE_VALUE}; HANDLE pipeStdOutWrite_ {INVALID_HANDLE_VALUE}; HANDLE pipeStdErrRead_ {INVALID_HANDLE_VALUE}; HANDLE pipeStdErrWrite_ {INVALID_HANDLE_VALUE}; HANDLE pipeStdInRead_ {INVALID_HANDLE_VALUE}; HANDLE pipeStdInWrite_ {INVALID_HANDLE_VALUE}; bool bDontRelOut_ {}; bool bDontRelIn_ {}; bool bDontRelErr_ {}; AuSPtr loopSource_; AuSPtr fsHandle_; AuSPtr fsStream_; AuSPtr fsErrorHandle_; AuSPtr fsErrorStream_; StartupParameters startup_; ESpawnType type_; AuList cargs_; AuString windowsCli_; AuThreads::ThreadUnique_t thread_; HANDLE poke_ {INVALID_HANDLE_VALUE}; AuSInt exitCode_; bool bHasTerminated {}; AuSPtr pCompletionGroup_; }; }