macro symbol64 str, value, size, index  { ;nocona's macro modified by me...
	dd str
	db 1 shl 4 + 2, 0
	dw index+0
	dq value+0, size + 0
}
;=============================================================================================================================================================================
struc relae64 offset{ ;Rela entry...
	dq $ ;Many advise against this, but i really don't see the harm, so long as you watch your segment permissions...
	dq offset shl 32 + 1
	dq 0
}
;=============================================================================================================================================================================
macro includes [name]{
	common
		segment interpreter readable
			db "/lib/ld-linux-x86-64.so.2", 0
		segment dynamic readable writable
	forward
		local strtempname
		if name eqtype ""
			dq 1, strtempname - strtab
		end if
	common
		dq 5, strtab
		dq 6, symtab
		dq 7, rela
		dq 8, endrela-rela ;needed
		dq 9, 24
		dq 10, symtab-strtab
		dq 0, 0
		strtab:
	forward
		strtempname db `name, 0
	common
		symtab:
	forward
		if ~ name eqtype ""
			symbol64 strtempname - strtab
		end if
	common
		rela:
	forward
		if ~ name eqtype ""
			name relae64 (($ - rela + 8)/24)
		end if
	common
		endrela:
}
;=============================================================================================================================================================================
macro invoke func, [params] {
	macro _subinvoke type, param2 \{
			if type in <QWORD, qword, dq, Qword, Q, q>
				if _invokecurrentreg = 0
					if param2 eqtype [0]
						mov rdi, param2
					else
						lea rdi, [param2]
					end if
				else if _invokecurrentreg = 1
					if param2 eqtype [0]
						mov rsi, QWORD param2
					else
						lea rsi, [param2]
					end if
				else if _invokecurrentreg = 2
					if param2 eqtype [0]
						mov rdx, QWORD param2
					else
						lea rdx, [param2]
					end if
				else if _invokecurrentreg = 3
					if param2 eqtype [0]
						mov rcx, QWORD param2
					else
						lea rcx, [param2]
					end if
				else if _invokecurrentreg = 4
					if param2 eqtype [0]
						mov r9, QWORD param2
					else
						lea r9, [param2]
					end if
				else if _invokecurrentreg = 5
					if param2 eqtype [0]
						mov r8, QWORD param2
					else
						lea r8, [param2]
					end if
				end if
				_invokecurrentreg = _invokecurrentreg + 1
				_parsedvar = 1
			else if type in <DWORD, dword, dd, Dword, Dw>
				if _invokecurrentreg = 0
					mov edi, param2
				else if _invokecurrentreg = 1
					mov esi, param2
				else if _invokecurrentreg = 2
					mov edx, param2
				else if _invokecurrentreg = 3
					mov ecx, param2
				else if _invokecurrentreg = 4
					mov r9d, param2
				else if _invokecurrentreg = 5
					mov r8d, param2
				end if
				_invokecurrentreg = _invokecurrentreg + 1
				_parsedvar = 1
			else if type in <float, FLOAT, F, f>
				if _invokefloatnums = 0
					movss xmm0, param2
					cvtps2pd xmm0, xmm0
				else if _invokefloatnums = 1
					movss xmm1, param2
					cvtps2pd xmm1, xmm1
				else if _invokefloatnums = 2
					movss xmm2, param2
					cvtps2pd xmm2, xmm2
				else if _invokefloatnums = 3
					movss xmm3, param2
					cvtps2pd xmm3, xmm3
				else if _invokefloatnums = 4
					movss xmm4, param2
					cvtps2pd xmm4, xmm4
				else if _invokefloatnums = 5
					movss xmm5, param2
					cvtps2pd xmm5, xmm5
				else if _invokefloatnums = 6
					movss xmm6, param2
					cvtps2pd xmm6, xmm6
				else if _invokefloatnums = 7
					movss xmm7, param2
					cvtps2pd xmm7, xmm7
				end if
				_invokefloatnums = _invokefloatnums + 1
				_parsedvar = 1
			else if type in <double, DOUBLE, d, D>
				if _invokefloatnums = 0
					movlpd xmm0, param2
				else if _invokefloatnums = 1
					movlpd xmm1, param2
				else if _invokefloatnums = 2
					movlpd xmm2, param2
				else if _invokefloatnums = 3
					movlpd xmm3, param2
				else if _invokefloatnums = 4
					movlpd xmm4, param2
				else if _invokefloatnums = 5
					movlpd xmm5, param2
				else if _invokefloatnums = 6
					movlpd xmm6, param2
				else if _invokefloatnums = 7
					movlpd xmm7, param2
				end if
				_invokefloatnums = _invokefloatnums + 1
				_parsedvar = 1
			end if
	\}
	common
	_invokefloatnums = 0
	_invokecurrentreg = 0
	forward
	_parsedvar = 0
		match type value, params \{
			_subinvoke type, value
		\}
	if params eq
		_invokecurrentreg = _invokecurrentreg + 1
	else if _parsedvar = 0
		if _invokecurrentreg = 0
			if params in <rax, rbx, rcx, rdx, rsi, rsp, rbp, r8, r9, r10, r11, r12, r13, r14, r15> 
				lea rdi, [params]
			else if params in <eax, ebx, ecx, edx, esi, esp, ebp, r8d, r9d, r10d, r11d, r12d, r13d, r14d, r15d>
				mov edi, params
			else if params > 0xFFFFFFFF
				lea rdi, [params]
			else if params = 0
				xor edi, edi
			else
				mov edi, params
			end if
		else if _invokecurrentreg = 1
			if params in <rax, rbx, rcx, rdx, rsp, rbp, r8, r9, r10, r11, r12, r13, r14, r15> 
				lea rsi, [params]
			else if params in <eax, ebx, ecx, edx, esp, ebp, r8d, r9d, r10d, r11d, r12d, r13d, r14d, r15d>
				mov esi, params
			else if params > 0xFFFFFFFF
				lea rsi, [params]
			else if params = 0
				xor esi, esi
			else
				mov esi, params
			end if
		else if _invokecurrentreg = 2
			if params in <rax, rbx, rcx, rsp, rbp, r8, r9, r10, r11, r12, r13, r14, r15> 
				lea rdx, [params]
			else if params in <eax, ebx, ecx, esp, ebp, r8d, r9d, r10d, r11d, r12d, r13d, r14d, r15d>
				mov edx, params
			else if params > 0xFFFFFFFF
				lea rdx, [params]
			else if params = 0
				xor edx, edx
			else
				mov edx, params
			end if
		else if _invokecurrentreg = 3
			if params in <rax, rbx, rsp, rbp, r8, r9, r10, r11, r12, r13, r14, r15> 
				lea rcx, [params]
			else if params in <eax, ebx, esp, ebp, r8d, r9d, r10d, r11d, r12d, r13d, r14d, r15d>
				mov ecx, params
			else if params > 0xFFFFFFFF
				lea rcx, [params]
			else if params = 0
				xor ecx, ecx
			else
				mov ecx, params
			end if
		else if _invokecurrentreg = 4
			if params in <rax, rbx, r9, r11, r10, r12, r13, r14, r15>
				lea r8, [params]
			else if params in <eax, ebx, r9d, r10d, r11d, r12d, r13d, r14d, r15d>
				mov r8d, params
			else if params > 0xFFFFFFFF
				lea r8, [params]
			else if params = 0
				xor r8d, r8d
			else
				mov r8d, params
			end if
		else if _invokecurrentreg = 5
			if params in <rax, rbx, r10, r11, r12, r13, r14, r15>
				lea r9, [params]
			else if params in <eax, ebx, r10d, r11d, r12d, r13d, r14d, r15d>
				mov r9d, params
			else if params > 0xFFFFFFFF
				lea r9, [params]
			else if params = 0
				xor r9d, r9d
			else
				mov r9d, params
			end if
		end if
		_invokecurrentreg = _invokecurrentreg + 1
	end if
	common
	if _invokefloatnums = 0
		xor eax, eax
	else
		mov eax, _invokefloatnums
	end if
	call QWORD [func]
}
;=============================================================================================================================================================================
macro syscalls syscallnum, [params] {
	macro _subsyscalls type, param2 \{
			if type in <QWORD, qword, dq, Qword, Q, q>
				if _syscallscurrentreg = 0
					if param2 eqtype [0]
						mov rdi, param2
					else
						lea rdi, [param2]
					end if
				else if _syscallscurrentreg = 1
					if param2 eqtype [0]
						mov rsi, QWORD param2
					else
						lea rsi, [param2]
					end if
				else if _syscallscurrentreg = 2
					if param2 eqtype [0]
						mov rdx, QWORD param2
					else
						lea rdx, [param2]
					end if
				else if _syscallscurrentreg = 3
					if param2 eqtype [0]
						mov r10, QWORD param2
					else
						lea r10, [param2]
					end if
				else if _syscallscurrentreg = 4
					if param2 eqtype [0]
						mov r9, QWORD param2
					else
						lea r9, [param2]
					end if
				else if _syscallscurrentreg = 5
					if param2 eqtype [0]
						mov r8, QWORD param2
					else
						lea r8, [param2]
					end if
				end if
				_syscallscurrentreg = _syscallscurrentreg + 1
				_parsedvar = 1
			else if type in <DWORD, dword, dd, Dword, Dw>
				if _syscallscurrentreg = 0
					mov edi, param2
				else if _syscallscurrentreg = 1
					mov esi, param2
				else if _syscallscurrentreg = 2
					mov edx, param2
				else if _syscallscurrentreg = 3
					mov r10d, param2
				else if _syscallscurrentreg = 4
					mov r9d, param2
				else if _syscallscurrentreg = 5
					mov r8d, param2
				end if
				_syscallscurrentreg = _syscallscurrentreg + 1
				_parsedvar = 1
			end if
	\}
	common
	_syscallscurrentreg = 0
	forward
	_parsedvar = 0
		match type value, params \{
			_subsyscalls type, value
		\}
	if params eq ;Register already filled accordingly
		_syscallscurrentreg = _syscallscurrentreg + 1
	else if _parsedvar = 0
		if _syscallscurrentreg = 0
			if params in <rax, rbx, rcx, rdx, rsi, rsp, rbp, r8, r9, r10, r11, r12, r13, r14, r15> 
				lea rdi, [params]
			else if params in <eax, ebx, ecx, edx, esi, esp, ebp, r8d, r9d, r10d, r11d, r12d, r13d, r14d, r15d>
				mov edi, params
			else if params > 0xFFFFFFFF
				lea rdi, [params]
			else if params = 0
				xor edi, edi
			else
				mov edi, params
			end if
		else if _syscallscurrentreg = 1
			if params in <rax, rbx, rcx, rdx, rsp, rbp, r8, r9, r10, r11, r12, r13, r14, r15> 
				lea rsi, [params]
			else if params in <eax, ebx, ecx, edx, esp, ebp, r8d, r9d, r10d, r11d, r12d, r13d, r14d, r15d>
				mov esi, params
			else if params > 0xFFFFFFFF
				lea rsi, [params]
			else if params = 0
				xor esi, esi
			else
				mov esi, params
			end if
		else if _syscallscurrentreg = 2
			if params in <rax, rbx, rcx, rsp, rbp, r8, r9, r10, r11, r12, r13, r14, r15> 
				lea rdx, [params]
			else if params in <eax, ebx, ecx, esp, ebp, r8d, r9d, r10d, r11d, r12d, r13d, r14d, r15d>
				mov edx, params
			else if params > 0xFFFFFFFF
				lea rdx, [params]
			else if params = 0
				xor edx, edx
			else
				mov edx, params
			end if
		else if _syscallscurrentreg = 3
			if params in <rax, rbx, rcx, rsp, rbp, r8, r9, r11, r12, r13, r14, r15> 
				lea r10, [params]
			else if params in <eax, ebx, ecx, esp, ebp, r8d, r9d, r11d, r12d, r13d, r14d, r15d>
				mov r10d, params
			else if params > 0xFFFFFFFF
				lea r10, [params]
			else if params = 0
				xor r10d, r10d
			else
				mov r10d, params
			end if
		else if _syscallscurrentreg = 4
			if params in <rax, rbx, rcx, r9, r11, r12, r13, r14, r15>
				lea r8, [params]
			else if params in <eax, ebx, ecx, r9d, r11d, r12d, r13d, r14d, r15d>
				mov r8d, params
			else if params > 0xFFFFFFFF
				lea r8, [params]
			else if params = 0
				xor r8d, r8d
			else
				mov r8d, params
			end if
		else if _syscallscurrentreg = 5
			if params in <rax, rbx, rcx, r11, r12, r13, r14, r15>
				lea r9, [params]
			else if params in <eax, ebx, ecx, r11d, r12d, r13d, r14d, r15d>
				mov r9d, params
			else if params > 0xFFFFFFFF
				lea r9, [params]
			else if params = 0
				xor r9d, r9d
			else
				mov r9d, params
			end if
		end if
		_syscallscurrentreg = _syscallscurrentreg + 1
	end if
	common
	if syscallnum = 0
		xor eax, eax
	else
		mov eax, syscallnum
	end if
	syscall
}
;=============================================================================================================================================================================
null equ
NULL equ
passed equ
PASSED equ
PASS equ
pass equ
;=============================================================================================================================================================================
sys_read			=	0
sys_write			=	1
sys_open			=	2
sys_close			=	3
sys_stat			=	4
sys_fstat			=	5
sys_lstat			=	6
sys_poll			=	7
sys_lseek			=	8
sys_mmap			=	9
sys_mprotect			=	10
sys_munmap			=	11
sys_brk				=	12
sys_rt_sigaction		=	13
sys_rt_sigprocmask		=	14
sys_rt_sigreturn		=	15
sys_ioctl			=	16
sys_pread64			=	17
sys_pwrite64			=	18
sys_readv			=	19
sys_writev			=	20
sys_access			=	21
sys_pipe			=	22
sys_select			=	23
sys_sched_yield			=	24
sys_mremap			=	25
sys_msync			=	26
sys_mincore			=	27
sys_madvise			=	28
sys_shmget			=	29
sys_shmat			=	30
sys_shmctl			=	31
sys_dup				=	32
sys_dup2			=	33
sys_pause			=	34
sys_nanosleep			=	35
sys_getitimer			=	36
sys_alarm			=	37
sys_setitimer			=	38
sys_getpid			=	39
sys_sendfile			=	40
sys_socket			=	41
sys_connect			=	42
sys_accept			=	43
sys_sendto			=	44
sys_recvfrom			=	45
sys_sendmsg			=	46
sys_recvmsg			=	47
sys_shutdown			=	48
sys_bind			=	49
sys_listen			=	50
sys_getsockname			=	51
sys_getpeername			=	52
sys_socketpair			=	53
sys_setsockopt			=	54
sys_getsockopt			=	55
sys_clone			=	56
sys_fork			=	57
sys_vfork			=	58
sys_execve			=	59
sys_exit			=	60
sys_wait4			=	61
sys_kill			=	62
sys_uname			=	63
sys_semget			=	64
sys_semop			=	65
sys_semctl			=	66
sys_shmdt			=	67
sys_msgget			=	68
sys_msgsnd			=	69
sys_msgrcv			=	70
sys_msgctl			=	71
sys_fcntl			=	72
sys_flock			=	73
sys_fsync			=	74
sys_fdatasync			=	75
sys_truncate			=	76
sys_ftruncate			=	77
sys_getdents			=	78
sys_getcwd			=	79
sys_chdir			=	80
sys_fchdir			=	81
sys_rename			=	82
sys_mkdir			=	83
sys_rmdir			=	84
sys_creat			=	85
sys_link			=	86
sys_unlink			=	87
sys_symlink			=	88
sys_readlink			=	89
sys_chmod			=	90
sys_fchmod			=	91
sys_chown			=	92
sys_fchown			=	93
sys_lchown			=	94
sys_umask			=	95
sys_gettimeofday		=	96
sys_getrlimit			=	97
sys_getrusage			=	98
sys_sysinfo			=	99
sys_times			=	100
sys_ptrace			=	101
sys_getuid			=	102
sys_syslog			=	103
sys_getgid			=	104
sys_setuid			=	105
sys_setgid			=	106
sys_geteuid			=	107
sys_getegid			=	108
sys_setpgid			=	109
sys_getppid			=	110
sys_getpgrp			=	111
sys_setsid			=	112
sys_setreuid			=	113
sys_setregid			=	114
sys_getgroups			=	115
sys_setgroups			=	116
sys_setresuid			=	117
sys_getresuid			=	118
sys_setresgid			=	119
sys_getresgid			=	120
sys_getpgid			=	121
sys_setfsuid			=	122
sys_setfsgid			=	123
sys_getsid			=	124
sys_capget			=	125
sys_capset			=	126
sys_rt_sigpending		=	127
sys_rt_sigtimedwait		=	128
sys_rt_sigqueueinfo		=	129
sys_rt_sigsuspend		=	130
sys_sigaltstack			=	131
sys_utime			=	132
sys_mknod			=	133
sys_uselib			=	134
sys_personality			=	135
sys_ustat			=	136
sys_statfs			=	137
sys_fstatfs			=	138
sys_sysfs			=	139
sys_getpriority			=	140
sys_setpriority			=	141
sys_sched_setparam		=	142
sys_sched_getparam		=	143
sys_sched_setscheduler		=	144
sys_sched_getscheduler		=	145
sys_sched_get_priority_max	=	146
sys_sched_get_priority_min	=	147
sys_sched_rr_get_interval	=	148
sys_mlock			=	149
sys_munlock			=	150
sys_mlockall			=	151
sys_munlockall			=	152
sys_vhangup			=	153
sys_modify_ldt			=	154
sys_pivot_root			=	155
sys__sysctl			=	156
sys_prctl			=	157
sys_arch_prctl			=	158
sys_adjtimex			=	159
sys_setrlimit			=	160
sys_chroot			=	161
sys_sync			=	162
sys_acct			=	163
sys_settimeofday		=	164
sys_mount			=	165
sys_umount2			=	166
sys_swapon			=	167
sys_swapoff			=	168
sys_reboot			=	169
sys_sethostname			=	170
sys_setdomainname		=	171
sys_iopl			=	172
sys_ioperm			=	173
sys_create_module		=	174
sys_init_module			=	175
sys_delete_module		=	176
sys_get_kernel_syms		=	177
sys_query_module		=	178
sys_quotactl			=	179
sys_nfsservctl			=	180
sys_getpmsg			=	181
sys_putpmsg			=	182
sys_afs_syscall			=	183
sys_tuxcall			=	184
sys_security			=	185
sys_gettid			=	186
sys_readahead			=	187
sys_setxattr			=	188
sys_lsetxattr			=	189
sys_fsetxattr			=	190
sys_getxattr			=	191
sys_lgetxattr			=	192
sys_fgetxattr			=	193
sys_listxattr			=	194
sys_llistxattr			=	195
sys_flistxattr			=	196
sys_removexattr			=	197
sys_lremovexattr		=	198
sys_fremovexattr		=	199
sys_tkill			=	200
sys_time			=	201
sys_futex			=	202
sys_sched_setaffinity		=	203
sys_sched_getaffinity		=	204
sys_set_thread_area		=	205
sys_io_setup			=	206
sys_io_destroy			=	207
sys_io_getevents		=	208
sys_io_submit			=	209
sys_io_cancel			=	210
sys_get_thread_area		=	211
sys_lookup_dcookie		=	212
sys_epoll_create		=	213
sys_epoll_ctl_old		=	214
sys_epoll_wait_old		=	215
sys_remap_file_pages		=	216
sys_getdents64			=	217
sys_set_tid_address		=	218
sys_restart_syscall		=	219
sys_semtimedop			=	220
sys_fadvise64			=	221
sys_timer_create		=	222
sys_timer_settime		=	223
sys_timer_gettime		=	224
sys_timer_getoverrun		=	225
sys_timer_delete		=	226
sys_clock_settime		=	227
sys_clock_gettime		=	228
sys_clock_getres		=	229
sys_clock_nanosleep		=	230
sys_exit_group			=	231
sys_epoll_wait			=	232
sys_epoll_ctl			=	233
sys_tgkill			=	234
sys_utimes			=	235
sys_vserver			=	236
sys_vserver			=	236
sys_mbind			=	237
sys_set_mempolicy		=	238
sys_get_mempolicy		=	239
sys_mq_open			=	240
sys_mq_unlink			=	241
sys_mq_timedsend		=	242
sys_mq_timedreceive		=	243
sys_mq_notify			=	244
sys_mq_getsetattr		=	245
sys_kexec_load			=	246
sys_waitid			=	247
sys_add_key			=	248
sys_request_key			=	249
sys_keyctl			=	250
sys_syscall_max			=	sys_keyctl
;=============================================================================================================================================================================
STDIN = 0
STDOUT = 1
STDERR = 2
O_RDONLY = 0
O_WRONLY = 1
O_RDWR = 2
O_CREAT = 64
SEEK_SET = 0
SEEK_CUR = 1
SEEK_END = 2
