mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-08 11:38:21 +02:00
BfpProcess_WaitFor, BeefCon shutdown fix
This commit is contained in:
parent
6a14bb55b5
commit
c8dda5d1d9
5 changed files with 79 additions and 6 deletions
|
@ -211,7 +211,9 @@ namespace System
|
||||||
public enum BfpProcessResult : int32
|
public enum BfpProcessResult : int32
|
||||||
{
|
{
|
||||||
Ok = (int)Result.Ok,
|
Ok = (int)Result.Ok,
|
||||||
InsufficientBuffer = (int)Result.InsufficientBuffer
|
NotFound = (int)Result.NotFound,
|
||||||
|
InsufficientBuffer = (int)Result.InsufficientBuffer,
|
||||||
|
UnknownError = (int)Result.UnknownError,
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !BF_RUNTIME_DISABLE
|
#if !BF_RUNTIME_DISABLE
|
||||||
|
@ -229,6 +231,9 @@ namespace System
|
||||||
public static extern void BfpProcess_GetProcessName(BfpProcess* process, char8* outName, int32* inOutNameSize, BfpProcessResult* outResult);
|
public static extern void BfpProcess_GetProcessName(BfpProcess* process, char8* outName, int32* inOutNameSize, BfpProcessResult* outResult);
|
||||||
[CallingConvention(.Stdcall), CLink]
|
[CallingConvention(.Stdcall), CLink]
|
||||||
public static extern int32 BfpProcess_GetProcessId(BfpProcess* process);
|
public static extern int32 BfpProcess_GetProcessId(BfpProcess* process);
|
||||||
|
[CallingConvention(.Stdcall), CLink]
|
||||||
|
public static extern bool BfpProcess_WaitFor(BfpProcess* process, int waitMS, int* outExitCode, BfpProcessResult* outResult);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
public static bool BfpProcess_IsRemoteMachine(char8* machineName) => Runtime.NotImplemented();
|
public static bool BfpProcess_IsRemoteMachine(char8* machineName) => Runtime.NotImplemented();
|
||||||
|
|
|
@ -19,6 +19,17 @@ class Program
|
||||||
String mExecStr = new .() ~ delete _;
|
String mExecStr = new .() ~ delete _;
|
||||||
SpawnedProcess mSpawnedProcess ~ delete _;
|
SpawnedProcess mSpawnedProcess ~ delete _;
|
||||||
|
|
||||||
|
[CLink, CallingConvention(.Stdcall)]
|
||||||
|
public static extern Windows.IntBool AttachConsole(int processId);
|
||||||
|
|
||||||
|
[CallingConvention(.Stdcall)]
|
||||||
|
function Windows.IntBool ConsoleCtrlHandler(int32 ctrlType);
|
||||||
|
[CLink, CallingConvention(.Stdcall)]
|
||||||
|
static extern Windows.IntBool SetConsoleCtrlHandler(ConsoleCtrlHandler handler, Windows.IntBool addHandler);
|
||||||
|
|
||||||
|
[CLink, CallingConvention(.Stdcall)]
|
||||||
|
static extern Windows.IntBool GenerateConsoleCtrlEvent(uint32 dwCtrlEvent, uint32 dwProcessGroupId);
|
||||||
|
|
||||||
public ~this()
|
public ~this()
|
||||||
{
|
{
|
||||||
if (mSpawnedProcess != null)
|
if (mSpawnedProcess != null)
|
||||||
|
@ -165,13 +176,21 @@ class Program
|
||||||
// Check BeefIDE process
|
// Check BeefIDE process
|
||||||
if ((mPid != 123) || (!Debug.IsDebuggerPresent))
|
if ((mPid != 123) || (!Debug.IsDebuggerPresent))
|
||||||
{
|
{
|
||||||
|
bool isProcessOpen = false;
|
||||||
|
|
||||||
var process = Platform.BfpProcess_GetById(null, mPid, null);
|
var process = Platform.BfpProcess_GetById(null, mPid, null);
|
||||||
if (process == null)
|
if (process != null)
|
||||||
|
{
|
||||||
|
if (!Platform.BfpProcess_WaitFor(process, 0, null, null))
|
||||||
|
isProcessOpen = true;
|
||||||
|
Platform.BfpProcess_Release(process);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isProcessOpen)
|
||||||
{
|
{
|
||||||
Console.Error.WriteLine("Process closed");
|
Console.Error.WriteLine("Process closed");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Platform.BfpProcess_Release(process);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MessageLoop();
|
MessageLoop();
|
||||||
|
@ -267,6 +286,16 @@ class Program
|
||||||
pg.mExecStr.Set(args[2]);
|
pg.mExecStr.Set(args[2]);
|
||||||
pg.Run();
|
pg.Run();
|
||||||
}
|
}
|
||||||
|
else if (args.Count >= 2)
|
||||||
|
{
|
||||||
|
pg.mPid = int32.Parse(args[0]);
|
||||||
|
if (args[1] == "kill")
|
||||||
|
{
|
||||||
|
AttachConsole(pg.mPid);
|
||||||
|
SetConsoleCtrlHandler(default, true);
|
||||||
|
GenerateConsoleCtrlEvent(/*CTRL_C_EVENT*/0, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pg.mPid = int32.Parse(args[0]);
|
pg.mPid = int32.Parse(args[0]);
|
||||||
|
|
|
@ -180,6 +180,7 @@ BFP_EXPORT bool BFP_CALLTYPE BfpProcess_IsRemoteMachine(const char* machineName)
|
||||||
BFP_EXPORT BfpProcess* BFP_CALLTYPE BfpProcess_GetById(const char* machineName, int processId, BfpProcessResult* outResult);
|
BFP_EXPORT BfpProcess* BFP_CALLTYPE BfpProcess_GetById(const char* machineName, int processId, BfpProcessResult* outResult);
|
||||||
BFP_EXPORT void BFP_CALLTYPE BfpProcess_Enumerate(const char* machineName, BfpProcess** outProcesses, int* inOutProcessesSize, BfpProcessResult* outResult);
|
BFP_EXPORT void BFP_CALLTYPE BfpProcess_Enumerate(const char* machineName, BfpProcess** outProcesses, int* inOutProcessesSize, BfpProcessResult* outResult);
|
||||||
BFP_EXPORT void BFP_CALLTYPE BfpProcess_Release(BfpProcess* process);
|
BFP_EXPORT void BFP_CALLTYPE BfpProcess_Release(BfpProcess* process);
|
||||||
|
BFP_EXPORT int BFP_CALLTYPE BfpProcess_GetExitCode(BfpProcess* process, BfpProcessResult* outResult);
|
||||||
BFP_EXPORT void BFP_CALLTYPE BfpProcess_GetMainWindowTitle(BfpProcess* process, char* outTitle, int* inOutTitleSize, BfpProcessResult* outResult);
|
BFP_EXPORT void BFP_CALLTYPE BfpProcess_GetMainWindowTitle(BfpProcess* process, char* outTitle, int* inOutTitleSize, BfpProcessResult* outResult);
|
||||||
BFP_EXPORT void BFP_CALLTYPE BfpProcess_GetProcessName(BfpProcess* process, char* outName, int* inOutNameSize, BfpProcessResult* outResult);
|
BFP_EXPORT void BFP_CALLTYPE BfpProcess_GetProcessName(BfpProcess* process, char* outName, int* inOutNameSize, BfpProcessResult* outResult);
|
||||||
BFP_EXPORT int BFP_CALLTYPE BfpProcess_GetProcessId(BfpProcess* process);
|
BFP_EXPORT int BFP_CALLTYPE BfpProcess_GetProcessId(BfpProcess* process);
|
||||||
|
|
|
@ -858,6 +858,11 @@ BFP_EXPORT void BFP_CALLTYPE BfpProcess_Release(BfpProcess* process)
|
||||||
NOT_IMPL;
|
NOT_IMPL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BFP_EXPORT bool BFP_CALLTYPE BfpProcess_WaitFor(BfpProcess* process, int waitMS, int* outExitCode, BfpProcessResult* outResult)
|
||||||
|
{
|
||||||
|
NOT_IMPL;
|
||||||
|
}
|
||||||
|
|
||||||
BFP_EXPORT void BFP_CALLTYPE BfpProcess_GetMainWindowTitle(BfpProcess* process, char* outTitle, int* inOutTitleSize, BfpProcessResult* outResult)
|
BFP_EXPORT void BFP_CALLTYPE BfpProcess_GetMainWindowTitle(BfpProcess* process, char* outTitle, int* inOutTitleSize, BfpProcessResult* outResult)
|
||||||
{
|
{
|
||||||
NOT_IMPL;
|
NOT_IMPL;
|
||||||
|
|
|
@ -1285,7 +1285,15 @@ struct BfpProcess
|
||||||
{
|
{
|
||||||
int mProcessId;
|
int mProcessId;
|
||||||
SYSTEM_PROCESS_INFORMATION* mInfo;
|
SYSTEM_PROCESS_INFORMATION* mInfo;
|
||||||
|
HANDLE mProcess;
|
||||||
String mImageName;
|
String mImageName;
|
||||||
|
|
||||||
|
BfpProcess()
|
||||||
|
{
|
||||||
|
mProcessId = -1;
|
||||||
|
mInfo = NULL;
|
||||||
|
mProcess = 0;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
BFP_EXPORT bool BFP_CALLTYPE BfpProcess_IsRemoteMachine(const char* machineName)
|
BFP_EXPORT bool BFP_CALLTYPE BfpProcess_IsRemoteMachine(const char* machineName)
|
||||||
|
@ -1295,16 +1303,16 @@ BFP_EXPORT bool BFP_CALLTYPE BfpProcess_IsRemoteMachine(const char* machineName)
|
||||||
|
|
||||||
BFP_EXPORT BfpProcess* BFP_CALLTYPE BfpProcess_GetById(const char* machineName, int processId, BfpProcessResult* outResult)
|
BFP_EXPORT BfpProcess* BFP_CALLTYPE BfpProcess_GetById(const char* machineName, int processId, BfpProcessResult* outResult)
|
||||||
{
|
{
|
||||||
HANDLE hProc = ::OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, processId);
|
HANDLE hProc = ::OpenProcess(PROCESS_QUERY_INFORMATION | SYNCHRONIZE, FALSE, processId);
|
||||||
if (hProc == NULL)
|
if (hProc == NULL)
|
||||||
{
|
{
|
||||||
OUTRESULT(BfpProcessResult_NotFound);
|
OUTRESULT(BfpProcessResult_NotFound);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
::CloseHandle(hProc);
|
|
||||||
|
|
||||||
BfpProcess* process = new BfpProcess();
|
BfpProcess* process = new BfpProcess();
|
||||||
process->mProcessId = processId;
|
process->mProcessId = processId;
|
||||||
|
process->mProcess = hProc;
|
||||||
process->mInfo = NULL;
|
process->mInfo = NULL;
|
||||||
return process;
|
return process;
|
||||||
}
|
}
|
||||||
|
@ -1395,9 +1403,34 @@ BFP_EXPORT void BFP_CALLTYPE BfpProcess_Release(BfpProcess* process)
|
||||||
{
|
{
|
||||||
if (process->mInfo != NULL)
|
if (process->mInfo != NULL)
|
||||||
free(process->mInfo);
|
free(process->mInfo);
|
||||||
|
if (process->mProcess != NULL)
|
||||||
|
::CloseHandle(process->mProcess);
|
||||||
delete process;
|
delete process;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BFP_EXPORT bool BFP_CALLTYPE BfpProcess_WaitFor(BfpProcess* process, int waitMS, int* outExitCode, BfpProcessResult* outResult)
|
||||||
|
{
|
||||||
|
if (process->mProcess == NULL)
|
||||||
|
{
|
||||||
|
OUTRESULT(BfpProcessResult_NotFound);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (::WaitForSingleObject(process->mProcess, waitMS) != WAIT_OBJECT_0)
|
||||||
|
{
|
||||||
|
OUTRESULT(BfpProcessResult_NotFound);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD errorCode = 0;
|
||||||
|
GetExitCodeProcess(process->mProcess, &errorCode);
|
||||||
|
if (outExitCode != NULL)
|
||||||
|
*outExitCode = (int)errorCode;
|
||||||
|
|
||||||
|
OUTRESULT(BfpProcessResult_Ok);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
//struct EnumWndData
|
//struct EnumWndData
|
||||||
//{
|
//{
|
||||||
// HWND mBestHandle;
|
// HWND mBestHandle;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue