#include <stdlib.h> // avoid BCC-5.0 brainmelt
#include <math.h> // avoid VC-5.0 brainmelt
#include "Process.hpp"
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#if defined(__cplusplus)
#include <stdlib.h>
extern
"C"
{
#endif
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.H"
#include "../ppport.h"
static
BOOL
Create(cProcess* &cP,
char
* szAppName,
char
* szCommLine,
DWORD
Inherit,
DWORD
CreateFlags,
char
* szCurrDir)
{
BOOL
bRetVal;
void
*env = NULL;
#ifdef PERL_IMPLICIT_SYS
env = PerlEnv_get_childenv();
#endif
cP = NULL;
try
{
cP = (cProcess*)
new
cProcess(szAppName,szCommLine,Inherit,CreateFlags,
env,szCurrDir);
bRetVal = cP->bRetVal;
}
catch
(...) {
bRetVal = FALSE;
}
#ifdef PERL_IMPLICIT_SYS
PerlEnv_free_childenv(env);
#endif
return
bRetVal;
}
static
BOOL
Open_(cProcess * &cP,
DWORD
pid,
DWORD
Inherit)
{
cP = NULL;
try
{
cP = (cProcess *)
new
cProcess(pid, Inherit);
}
catch
(...) {
return
(FALSE);
}
return
(cP->bRetVal);
}
static
double
constant(
char
* name)
{
errno
= 0;
switch
(*name) {
case
'A'
:
break
;
case
'B'
:
break
;
case
'C'
:
if
(strEQ(name,
"CREATE_DEFAULT_ERROR_MODE"
))
#ifdef CREATE_DEFAULT_ERROR_MODE
return
CREATE_DEFAULT_ERROR_MODE;
#else
goto
not_there;
#endif
if
(strEQ(name,
"CREATE_NEW_CONSOLE"
))
#ifdef CREATE_NEW_CONSOLE
return
CREATE_NEW_CONSOLE;
#else
goto
not_there;
#endif
if
(strEQ(name,
"CREATE_NEW_PROCESS_GROUP"
))
#ifdef CREATE_NEW_PROCESS_GROUP
return
CREATE_NEW_PROCESS_GROUP;
#else
goto
not_there;
#endif
if
(strEQ(name,
"CREATE_NO_WINDOW"
))
#ifdef CREATE_NO_WINDOW
return
CREATE_NO_WINDOW;
#else
goto
not_there;
#endif
if
(strEQ(name,
"CREATE_SEPARATE_WOW_VDM"
))
#ifdef CREATE_SEPARATE_WOW_VDM
return
CREATE_SEPARATE_WOW_VDM;
#else
goto
not_there;
#endif
if
(strEQ(name,
"CREATE_SUSPENDED"
))
#ifdef CREATE_SUSPENDED
return
CREATE_SUSPENDED;
#else
goto
not_there;
#endif
if
(strEQ(name,
"CREATE_UNICODE_ENVIRONMENT"
))
#ifdef CREATE_UNICODE_ENVIRONMENT
return
CREATE_UNICODE_ENVIRONMENT;
#else
goto
not_there;
#endif
break
;
case
'D'
:
if
(strEQ(name,
"DEBUG_ONLY_THIS_PROCESS"
))
#ifdef DEBUG_ONLY_THIS_PROCESS
return
DEBUG_ONLY_THIS_PROCESS;
#else
goto
not_there;
#endif
if
(strEQ(name,
"DEBUG_PROCESS"
))
#ifdef DEBUG_PROCESS
return
DEBUG_PROCESS;
#else
goto
not_there;
#endif
if
(strEQ(name,
"DETACHED_PROCESS"
))
#ifdef DETACHED_PROCESS
return
DETACHED_PROCESS;
#else
goto
not_there;
#endif
break
;
case
'E'
:
break
;
case
'F'
:
break
;
case
'G'
:
break
;
case
'H'
:
if
(strEQ(name,
"HIGH_PRIORITY_CLASS"
))
#ifdef HIGH_PRIORITY_CLASS
return
HIGH_PRIORITY_CLASS;
#else
goto
not_there;
#endif
break
;
case
'I'
:
if
(strEQ(name,
"IDLE_PRIORITY_CLASS"
))
#ifdef IDLE_PRIORITY_CLASS
return
IDLE_PRIORITY_CLASS;
#else
goto
not_there;
#endif
if
(strEQ(name,
"INFINITE"
))
#ifdef INFINITE
return
INFINITE;
#else
goto
not_there;
#endif
break
;
case
'J'
:
break
;
case
'K'
:
break
;
case
'L'
:
break
;
case
'M'
:
break
;
case
'N'
:
if
(strEQ(name,
"NORMAL_PRIORITY_CLASS"
))
#ifdef NORMAL_PRIORITY_CLASS
return
NORMAL_PRIORITY_CLASS;
#else
goto
not_there;
#endif
break
;
case
'O'
:
break
;
case
'P'
:
break
;
case
'Q'
:
break
;
case
'R'
:
if
(strEQ(name,
"REALTIME_PRIORITY_CLASS"
))
#ifdef REALTIME_PRIORITY_CLASS
return
REALTIME_PRIORITY_CLASS;
#else
goto
not_there;
#endif
break
;
case
'S'
:
if
(strEQ(name,
"STILL_ACTIVE"
))
#ifdef STILL_ACTIVE
return
STILL_ACTIVE;
#else
goto
not_there;
#endif
break
;
case
'T'
:
if
(strEQ(name,
"THREAD_PRIORITY_ABOVE_NORMAL"
))
#ifdef THREAD_PRIORITY_ABOVE_NORMAL
return
THREAD_PRIORITY_ABOVE_NORMAL;
#else
goto
not_there;
#endif
if
(strEQ(name,
"THREAD_PRIORITY_BELOW_NORMAL"
))
#ifdef THREAD_PRIORITY_BELOW_NORMAL
return
THREAD_PRIORITY_BELOW_NORMAL;
#else
goto
not_there;
#endif
if
(strEQ(name,
"THREAD_PRIORITY_ERROR_RETURN"
))
#ifdef THREAD_PRIORITY_ERROR_RETURN
return
THREAD_PRIORITY_ERROR_RETURN;
#else
goto
not_there;
#endif
if
(strEQ(name,
"THREAD_PRIORITY_HIGHEST"
))
#ifdef THREAD_PRIORITY_HIGHEST
return
THREAD_PRIORITY_HIGHEST;
#else
goto
not_there;
#endif
if
(strEQ(name,
"THREAD_PRIORITY_IDLE"
))
#ifdef THREAD_PRIORITY_IDLE
return
THREAD_PRIORITY_IDLE;
#else
goto
not_there;
#endif
if
(strEQ(name,
"THREAD_PRIORITY_LOWEST"
))
#ifdef THREAD_PRIORITY_LOWEST
return
THREAD_PRIORITY_LOWEST;
#else
goto
not_there;
#endif
if
(strEQ(name,
"THREAD_PRIORITY_NORMAL"
))
#ifdef THREAD_PRIORITY_NORMAL
return
THREAD_PRIORITY_NORMAL;
#else
goto
not_there;
#endif
if
(strEQ(name,
"THREAD_PRIORITY_TIME_CRITICAL"
))
#ifdef THREAD_PRIORITY_TIME_CRITICAL
return
THREAD_PRIORITY_TIME_CRITICAL;
#else
goto
not_there;
#endif
break
;
case
'U'
:
break
;
case
'V'
:
break
;
case
'W'
:
break
;
case
'X'
:
break
;
case
'Y'
:
break
;
case
'Z'
:
break
;
}
errno
= EINVAL;
return
0;
not_there:
errno
= ENOENT;
return
0;
}
#if defined(__cplusplus)
}
#endif
MODULE = Win32::Process PACKAGE = Win32::Process
PROTOTYPES: DISABLE
BOOL
Create(cP,appname,cmdline,inherit,flags,curdir)
cProcess *cP = NULL;
char
*appname
char
*cmdline
BOOL
inherit
DWORD
flags
char
*curdir
CODE:
RETVAL = Create(cP, appname, cmdline, inherit, flags, curdir);
OUTPUT:
cP
RETVAL
BOOL
Open(cP,pid,inherit)
cProcess *cP = NULL;
DWORD
pid
BOOL
inherit
CODE:
RETVAL = Open_(cP, pid, inherit);
OUTPUT:
cP
RETVAL
double
constant(name)
char
*name
BOOL
Kill(cP,exitcode)
cProcess *cP
unsigned
int
exitcode
CODE:
RETVAL = cP->Kill(exitcode);
OUTPUT:
RETVAL
BOOL
Suspend(cP)
cProcess *cP
CODE:
RETVAL = cP->Suspend();
OUTPUT:
RETVAL
BOOL
Resume(cP)
cProcess *cP
CODE:
RETVAL = cP->Resume();
OUTPUT:
RETVAL
BOOL
GetPriorityClass(cP,priorityclass)
cProcess *cP
DWORD
priorityclass = NO_INIT
CODE:
RETVAL = cP->GetPriorityClass(&priorityclass);
OUTPUT:
priorityclass
RETVAL
BOOL
SetPriorityClass(cP,priorityclass)
cProcess *cP
DWORD
priorityclass
CODE:
RETVAL = cP->SetPriorityClass(priorityclass);
OUTPUT:
RETVAL
BOOL
GetProcessAffinityMask(cP,processAffinityMask,systemAffinityMask)
cProcess *cP
DWORD_PTR
processAffinityMask = NO_INIT
DWORD_PTR
systemAffinityMask = NO_INIT
CODE:
RETVAL = cP->GetProcessAffinityMask(&processAffinityMask,&systemAffinityMask);
OUTPUT:
processAffinityMask
systemAffinityMask
RETVAL
BOOL
SetProcessAffinityMask(cP,processAffinityMask)
cProcess *cP
DWORD
processAffinityMask
CODE:
RETVAL = cP->SetProcessAffinityMask(processAffinityMask);
OUTPUT:
RETVAL
BOOL
GetExitCode(cP,exitcode)
cProcess *cP
DWORD
exitcode = NO_INIT
CODE:
RETVAL = cP->GetExitCode(&exitcode);
OUTPUT:
exitcode
RETVAL
void
DESTROY(cP)
cProcess *cP
CODE:
delete
cP;
BOOL
Wait(cP,timeout)
cProcess *cP
DWORD
timeout
CODE:
RETVAL = (cP->Wait(timeout) == WAIT_OBJECT_0);
OUTPUT:
RETVAL
IV
get_process_handle(cP)
cProcess *cP
CODE:
RETVAL =
reinterpret_cast
<IV>(cP->GetProcessHandle());
OUTPUT:
RETVAL
DWORD
GetProcessID(cP)
cProcess *cP
CODE:
RETVAL = cP->GetProcessID();
OUTPUT:
RETVAL
BOOL
KillProcess(pid, exitcode)
DWORD
pid
unsigned
int
exitcode
CODE:
{
HANDLE
ph = OpenProcess(PROCESS_ALL_ACCESS, 0, pid);
if
(ph) {
RETVAL = TerminateProcess(ph, exitcode);
if
(RETVAL)
CloseHandle(ph);
}
}
OUTPUT:
RETVAL
DWORD
GetCurrentProcessID()
CODE:
RETVAL = GetCurrentProcessId();
OUTPUT:
RETVAL