#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <Psapi.h>
#ifndef DEBUG_WIN32API_PROCESSSTATUS
# define Debug(list) /*Nothing*/
#else
# define Debug(list) PrintLastError list
# include <stdarg.h>
static
void
PrintLastError(
const
char
* fmt, ...)
{
va_list
args;
static
char
* env =
getenv
(
"DEBUG_WIN32API_PROCESSSTATUS"
);
DWORD
err = GetLastError();
if
(env == 0 || *env == 0)
return
;
va_start
(args, fmt);
vfprintf
(stderr, smt, args);
va_end
(args);
SetLastError(err);
}
#endif /* DEBUG_WIN32API_PROCESSSTATUS */
#include "buffers.h" /* Include this after DEBUGGING setup finished */
static
DWORD
dwLastError = ERROR_SUCCESS;
static
void
AssignLastError(
DWORD
dwError)
{
dwLastError = dwError;
}
static
void
RememberLastError(
BOOL
bStatus)
{
if
(!bStatus)
dwLastError = GetLastError();
}
MODULE = Win32API::ProcessStatus PACKAGE = Win32API::ProcessStatus
DWORD
GetLastProcessStatusError()
CODE:
RETVAL = dwLastError;
OUTPUT:
RETVAL
BOOL
EnumProcesses(OUT lpidProcess, ...)
DWORD
* lpidProcess
INIT:
DWORD
cb = items > 1 ? (null_arg(ST(1)) ? 0 : (
DWORD
) SvUV(ST(1))) : 0;
DWORD
len_lpidProcess;
CODE:
if
(cb == 0) cb = 1024 *
sizeof
(
DWORD
);
lpidProcess = (
DWORD
*)
malloc
(cb *
sizeof
(*lpidProcess));
RETVAL = EnumProcesses(lpidProcess, cb, &len_lpidProcess);
if
(!RETVAL)
len_lpidProcess = 0;
RememberLastError(RETVAL);
if
(items > 2) {
if
(!null_arg(ST(2)) && !SvREADONLY(ST(2)))
sv_setuv(ST(2), (UV) len_lpidProcess);
SvSETMAGIC(ST(2));
}
OUTPUT:
lpidProcess
RETVAL
BOOL
EnumProcessModules(IN hProcess, OUT lphModule, ...)
HANDLE
hProcess
HMODULE
* lphModule
INIT:
DWORD
cb = items > 2 ? (null_arg(ST(2)) ? 0 : (
DWORD
) SvUV(ST(2))) : 0;
DWORD
len_lphModule;
CODE:
if
(cb == 0) cb = 1024 *
sizeof
(
HMODULE
);
lphModule = (
HMODULE
*)
malloc
(cb *
sizeof
(*lphModule));
RETVAL = EnumProcessModules(hProcess, lphModule, cb, &len_lphModule);
if
(!RETVAL)
len_lphModule = 0;
RememberLastError(RETVAL);
if
(items > 3) {
if
(!null_arg(ST(3)) && !SvREADONLY(ST(3)))
sv_setuv(ST(3), (UV) len_lphModule);
SvSETMAGIC(ST(3));
}
OUTPUT:
lphModule
RETVAL
DWORD
GetModuleBaseNameA(IN hProcess, IN hModule, OUT lpBaseName, ...)
HANDLE
hProcess
HMODULE
hModule
CHAR
* lpBaseName
INIT:
DWORD
nSize = items > 3 ? (null_arg(ST(3)) ? 0 : (
DWORD
) SvUV(ST(3))) : 0;
CODE:
if
(nSize == 0) nSize = MAX_PATH;
lpBaseName = (
CHAR
*)
malloc
(nSize);
RETVAL = GetModuleBaseNameA(hProcess, hModule, lpBaseName, nSize);
RememberLastError(RETVAL != 0);
OUTPUT:
lpBaseName
RETVAL
DWORD
GetModuleBaseNameW(IN hProcess, IN hModule, OUT lpBaseName, ...)
HANDLE
hProcess
HMODULE
hModule
WCHAR
* lpBaseName
INIT:
DWORD
nSize = items > 3 ? (null_arg(ST(3)) ? 0 : (
DWORD
) SvUV(ST(3))) : 0;
CODE:
if
(nSize == 0) nSize = MAX_PATH;
lpBaseName = (
WCHAR
*)
malloc
(nSize *
sizeof
(
WCHAR
));
RETVAL = GetModuleBaseNameW(hProcess, hModule, lpBaseName, nSize);
RememberLastError(RETVAL != 0);
OUTPUT:
lpBaseName
RETVAL
DWORD
GetModuleFileNameExA(IN hProcess, IN hModule, OUT lpFilename, ...)
HANDLE
hProcess
HMODULE
hModule
CHAR
* lpFilename
INIT:
DWORD
nSize = items > 3 ? (null_arg(ST(3)) ? 0 : (
DWORD
) SvUV(ST(3))) : 0;
CODE:
if
(nSize == 0) nSize = MAX_PATH;
lpFilename = (
CHAR
*)
malloc
(nSize);
RETVAL = GetModuleFileNameExA(hProcess, hModule, lpFilename, nSize);
RememberLastError(RETVAL != 0);
OUTPUT:
lpFilename
RETVAL
DWORD
GetModuleFileNameExW(IN hProcess, IN hModule, OUT lpFilename, ...)
HANDLE
hProcess
HMODULE
hModule
WCHAR
* lpFilename
INIT:
DWORD
nSize = items > 3 ? (null_arg(ST(3)) ? 0 : (
DWORD
) SvUV(ST(3))) : 0;
CODE:
if
(nSize == 0) nSize = MAX_PATH;
lpFilename = (
WCHAR
*)
malloc
(nSize *
sizeof
(
WCHAR
));
RETVAL = GetModuleFileNameExW(hProcess, hModule, lpFilename, nSize);
RememberLastError(RETVAL != 0);
OUTPUT:
lpFilename
RETVAL
BOOL
GetModuleInformation(IN hProcess, IN hModule, OUT lpmodinfo)
HANDLE
hProcess
HMODULE
hModule
MODULEINFO lpmodinfo
CODE:
RETVAL = GetModuleInformation(hProcess, hModule, &lpmodinfo,
sizeof
(lpmodinfo));
RememberLastError(RETVAL);
OUTPUT:
lpmodinfo
RETVAL
NO_OUTPUT
void
SetLastProcessStatusError(dwError)
DWORD
dwError
CODE:
AssignLastError(dwError);