292 lines
13 KiB
NASM
292 lines
13 KiB
NASM
; syscall_stubs.asm - user-mode INT 0x2F stubs for syscall.dll and syscall_s.lib (MASM64)
|
|
;
|
|
; Calling convention:
|
|
; RAX = syscall number.
|
|
; RCX = arg 0.
|
|
; RDX = arg 1.
|
|
; R8 = arg 2.
|
|
; R9 = arg 3.
|
|
;
|
|
; Syscalls never consume stack arguments. Operations that need more than four
|
|
; logical arguments use a request structure.
|
|
|
|
INCLUDE syscall_nr.inc
|
|
|
|
SYS_USER_APC_FRAME_Magic EQU 0
|
|
SYS_USER_APC_FRAME_ReturnToken EQU 8
|
|
SYS_USER_APC_FRAME_Routine EQU 16
|
|
SYS_USER_APC_FRAME_NormalContext EQU 24
|
|
SYS_USER_APC_FRAME_SystemArgument1 EQU 32
|
|
SYS_USER_APC_FRAME_SystemArgument2 EQU 40
|
|
|
|
.CODE
|
|
|
|
; ---------------------------------------------------------------------------
|
|
SYSCALL_STUB MACRO name, nr
|
|
PUBLIC Sys&name
|
|
IFDEF NTL_SYSCALL_STATIC
|
|
Sys&name PROC
|
|
ELSE
|
|
Sys&name PROC EXPORT
|
|
ENDIF
|
|
mov rax, nr
|
|
int 02Fh
|
|
ret
|
|
Sys&name ENDP
|
|
ENDM
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; Process & thread lifecycle
|
|
; ---------------------------------------------------------------------------
|
|
SYSCALL_STUB OpenPowerEvent, SYS_OPEN_POWER_EVENT
|
|
SYSCALL_STUB RequestSystemPower, SYS_REQUEST_SYSTEM_POWER
|
|
SYSCALL_STUB QuerySystemPower, SYS_QUERY_SYSTEM_POWER
|
|
SYSCALL_STUB CompleteSystemPower, SYS_COMPLETE_SYSTEM_POWER
|
|
SYSCALL_STUB ExitProcess, SYS_EXIT_PROCESS
|
|
SYSCALL_STUB ExitThread, SYS_EXIT_THREAD
|
|
SYSCALL_STUB CreateProcessObject, SYS_CREATE_PROCESS_OBJECT
|
|
SYSCALL_STUB AllocProcessVm, SYS_ALLOC_PROCESS_VM
|
|
SYSCALL_STUB ProtectProcessVm, SYS_PROTECT_PROCESS_VM
|
|
SYSCALL_STUB StartProcess, SYS_START_PROCESS
|
|
SYSCALL_STUB WaitSingle, SYS_WAIT_SINGLE
|
|
SYSCALL_STUB WaitMany, SYS_WAIT_MANY
|
|
SYSCALL_STUB GetProcessExitCode, SYS_GET_PROCESS_EXIT_CODE
|
|
SYSCALL_STUB OpenProcess, SYS_OPEN_PROCESS
|
|
SYSCALL_STUB KillProcess, SYS_KILL_PROCESS
|
|
SYSCALL_STUB GetProcessList, SYS_GET_PROCESS_LIST
|
|
SYSCALL_STUB GetProcessPid, SYS_GET_PROCESS_PID
|
|
SYSCALL_STUB GetThreadList, SYS_GET_THREAD_LIST
|
|
SYSCALL_STUB GetThreadTid, SYS_GET_THREAD_TID
|
|
|
|
SYSCALL_STUB CreateThread, SYS_CREATE_THREAD
|
|
SYSCALL_STUB OpenCurrentThread, SYS_OPEN_CURRENT_THREAD
|
|
SYSCALL_STUB ResumeThread, SYS_RESUME_THREAD
|
|
SYSCALL_STUB ResumeThreadAndWait, SYS_RESUME_THREAD_AND_WAIT
|
|
SYSCALL_STUB GetCurrentTid, SYS_GET_CURRENT_TID
|
|
SYSCALL_STUB GetCurrentPid, SYS_GET_CURRENT_PID
|
|
SYSCALL_STUB SetThreadPriority, SYS_SET_THREAD_PRIORITY
|
|
SYSCALL_STUB SetThreadName, SYS_SET_THREAD_NAME
|
|
SYSCALL_STUB QueryThreadName, SYS_QUERY_THREAD_NAME
|
|
SYSCALL_STUB Yield, SYS_YIELD
|
|
SYSCALL_STUB Sleep, SYS_SLEEP
|
|
SYSCALL_STUB SetUserApcDispatcher, SYS_SET_USER_APC_DISPATCHER
|
|
SYSCALL_STUB QueueUserApc, SYS_QUEUE_USER_APC
|
|
SYSCALL_STUB ApcReturn, SYS_APC_RETURN
|
|
SYSCALL_STUB SetExceptionDispatcher, SYS_SET_EXCEPTION_DISPATCHER
|
|
SYSCALL_STUB GetExceptionDispatcher, SYS_GET_EXCEPTION_DISPATCHER
|
|
SYSCALL_STUB ContinueException, SYS_CONTINUE_EXCEPTION
|
|
SYSCALL_STUB RaiseException, SYS_RAISE_EXCEPTION
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; User APC dispatcher
|
|
; ---------------------------------------------------------------------------
|
|
PUBLIC SysUserApcDispatcher
|
|
IFDEF NTL_SYSCALL_STATIC
|
|
SysUserApcDispatcher PROC
|
|
ELSE
|
|
SysUserApcDispatcher PROC EXPORT
|
|
ENDIF
|
|
; Kernel enters here with RSP pointing at SYS_USER_APC_FRAME. There is no
|
|
; return address because this is an IRET redirection. Preserve RBX because
|
|
; the original user context resumes after SysApcReturn.
|
|
push rbx
|
|
lea rbx, [rsp + 8] ; original injected RSP = frame pointer
|
|
|
|
sub rsp, 32 ; shadow space; RSP is already call-aligned
|
|
mov rcx, [rbx + SYS_USER_APC_FRAME_NormalContext]
|
|
mov rdx, [rbx + SYS_USER_APC_FRAME_SystemArgument1]
|
|
mov r8, [rbx + SYS_USER_APC_FRAME_SystemArgument2]
|
|
mov rax, [rbx + SYS_USER_APC_FRAME_Routine]
|
|
call rax
|
|
add rsp, 32
|
|
|
|
mov rcx, rbx ; SysApcReturn(frame)
|
|
mov rbx, [rsp] ; restore original user RBX
|
|
add rsp, 8
|
|
mov rax, SYS_APC_RETURN
|
|
int 02Fh
|
|
|
|
SysUserApcDispatcher_Failed:
|
|
jmp SysUserApcDispatcher_Failed
|
|
SysUserApcDispatcher ENDP
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; Virtual memory and handles
|
|
; ---------------------------------------------------------------------------
|
|
SYSCALL_STUB AllocVm, SYS_ALLOC_VM
|
|
SYSCALL_STUB FreeVm, SYS_FREE_VM
|
|
SYSCALL_STUB ProtectVm, SYS_PROTECT_VM
|
|
SYSCALL_STUB QueryVm, SYS_QUERY_VM
|
|
SYSCALL_STUB CloseHandle, SYS_CLOSE_HANDLE
|
|
SYSCALL_STUB DuplicateHandle, SYS_DUPLICATE_HANDLE
|
|
SYSCALL_STUB DeriveHandle, SYS_DERIVE_HANDLE
|
|
SYSCALL_STUB RevokeHandle, SYS_REVOKE_HANDLE
|
|
SYSCALL_STUB DeriveSecurityContext, SYS_DERIVE_SECURITY_CONTEXT
|
|
SYSCALL_STUB QuerySecurityContext, SYS_QUERY_SECURITY_CONTEXT
|
|
SYSCALL_STUB OpenProcessSecurityContext, SYS_OPEN_PROCESS_SECURITY_CONTEXT
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; Synchronization objects
|
|
; ---------------------------------------------------------------------------
|
|
SYSCALL_STUB CreateMutex, SYS_CREATE_MUTEX
|
|
SYSCALL_STUB TryAcquireMutex, SYS_TRY_ACQUIRE_MUTEX
|
|
SYSCALL_STUB ReleaseMutex, SYS_RELEASE_MUTEX
|
|
|
|
SYSCALL_STUB CreateSem, SYS_CREATE_SEM
|
|
SYSCALL_STUB TryWaitSem, SYS_TRY_WAIT_SEM
|
|
SYSCALL_STUB SignalSem, SYS_SIGNAL_SEM
|
|
|
|
SYSCALL_STUB CreateEvent, SYS_CREATE_EVENT
|
|
SYSCALL_STUB SignalEvent, SYS_SIGNAL_EVENT
|
|
SYSCALL_STUB ClearEvent, SYS_CLEAR_EVENT
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; Anonymous queues
|
|
; ---------------------------------------------------------------------------
|
|
SYSCALL_STUB CreateQueue, SYS_CREATE_QUEUE
|
|
SYSCALL_STUB SendQueue, SYS_SEND_QUEUE
|
|
SYSCALL_STUB RecvQueue, SYS_RECV_QUEUE
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; LPC-like Ports and well-known system services
|
|
; ---------------------------------------------------------------------------
|
|
SYSCALL_STUB CreatePort, SYS_CREATE_PORT
|
|
SYSCALL_STUB ConnectPort, SYS_CONNECT_PORT
|
|
SYSCALL_STUB AcceptPort, SYS_ACCEPT_PORT
|
|
SYSCALL_STUB SendPort, SYS_SEND_PORT
|
|
SYSCALL_STUB ReceivePort, SYS_RECEIVE_PORT
|
|
SYSCALL_STUB CallPort, SYS_CALL_PORT
|
|
SYSCALL_STUB ReplyPort, SYS_REPLY_PORT
|
|
SYSCALL_STUB DisconnectPort, SYS_DISCONNECT_PORT
|
|
SYSCALL_STUB OpenPortPeerProcess, SYS_OPEN_PORT_PEER_PROCESS
|
|
SYSCALL_STUB RegisterSystemService, SYS_REGISTER_SYSTEM_SERVICE
|
|
SYSCALL_STUB UnregisterSystemService, SYS_UNREGISTER_SYSTEM_SERVICE
|
|
SYSCALL_STUB ConnectSystemService, SYS_CONNECT_SYSTEM_SERVICE
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; Mounted-volume manager control plane
|
|
; ---------------------------------------------------------------------------
|
|
SYSCALL_STUB QueryVolumes, SYS_QUERY_VOLUMES
|
|
SYSCALL_STUB OpenVolume, SYS_OPEN_VOLUME
|
|
SYSCALL_STUB WaitVolumeChange, SYS_WAIT_VOLUME_CHANGE
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; Files and directories
|
|
; ---------------------------------------------------------------------------
|
|
SYSCALL_STUB OpenFileAt, SYS_OPEN_FILE_AT
|
|
SYSCALL_STUB OpenDirAt, SYS_OPEN_DIR_AT
|
|
SYSCALL_STUB StatAt, SYS_STAT_AT
|
|
SYSCALL_STUB DeleteAt, SYS_DELETE_AT
|
|
SYSCALL_STUB RenameAt, SYS_RENAME_AT
|
|
SYSCALL_STUB CreateDirAt, SYS_CREATE_DIR_AT
|
|
SYSCALL_STUB RemoveDirAt, SYS_REMOVE_DIR_AT
|
|
SYSCALL_STUB ReadFile, SYS_READ_FILE
|
|
SYSCALL_STUB WriteFile, SYS_WRITE_FILE
|
|
SYSCALL_STUB ReadFileAsync, SYS_READ_FILE_ASYNC
|
|
SYSCALL_STUB WriteFileAsync, SYS_WRITE_FILE_ASYNC
|
|
SYSCALL_STUB CancelIo, SYS_CANCEL_IO
|
|
SYSCALL_STUB SeekFile, SYS_SEEK_FILE
|
|
SYSCALL_STUB GetFilePos, SYS_GET_FILE_POS
|
|
SYSCALL_STUB GetFileSize, SYS_GET_FILE_SIZE
|
|
SYSCALL_STUB GetFileStat, SYS_GET_FILE_STAT
|
|
SYSCALL_STUB TruncateFile, SYS_TRUNCATE_FILE
|
|
SYSCALL_STUB FlushFile, SYS_FLUSH_FILE
|
|
SYSCALL_STUB LockFile, SYS_LOCK_FILE
|
|
SYSCALL_STUB UnlockFile, SYS_UNLOCK_FILE
|
|
SYSCALL_STUB QueryFileLock, SYS_QUERY_FILE_LOCK
|
|
SYSCALL_STUB SetFileStatus, SYS_SET_FILE_STATUS
|
|
SYSCALL_STUB CreatePipe, SYS_CREATE_PIPE
|
|
SYSCALL_STUB NotifyPipe, SYS_NOTIFY_PIPE
|
|
|
|
SYSCALL_STUB ReadDir, SYS_READ_DIR
|
|
; ---------------------------------------------------------------------------
|
|
; Console and graphics
|
|
; ---------------------------------------------------------------------------
|
|
SYSCALL_STUB WriteConsole, SYS_WRITE_CONSOLE
|
|
SYSCALL_STUB GetConsoleInfo, SYS_GET_CONSOLE_INFO
|
|
SYSCALL_STUB SetConsoleCursor, SYS_SET_CONSOLE_CURSOR
|
|
SYSCALL_STUB FillConsoleCharacter, SYS_FILL_CONSOLE_CHARACTER
|
|
SYSCALL_STUB FillConsoleAttribute, SYS_FILL_CONSOLE_ATTRIBUTE
|
|
SYSCALL_STUB PutScreenChar, SYS_PUT_SCREEN_CHAR
|
|
SYSCALL_STUB CreateSurface, SYS_CREATE_SURFACE
|
|
SYSCALL_STUB MapSurface, SYS_MAP_SURFACE
|
|
SYSCALL_STUB UnmapSurface, SYS_UNMAP_SURFACE
|
|
SYSCALL_STUB QuerySurface, SYS_QUERY_SURFACE
|
|
SYSCALL_STUB CommitSurface, SYS_COMMIT_SURFACE
|
|
SYSCALL_STUB ClearScreen, SYS_CLEAR_SCREEN
|
|
SYSCALL_STUB GetScreenSize, SYS_GET_SCREEN_SIZE
|
|
SYSCALL_STUB QueryDisplayInfo, SYS_QUERY_DISPLAY_INFO
|
|
SYSCALL_STUB QueryDisplayManagerInfo, SYS_QUERY_DISPLAY_MANAGER_INFO
|
|
SYSCALL_STUB PresentDisplayManagerSurface, SYS_PRESENT_DISPLAY_MANAGER_SURFACE
|
|
SYSCALL_STUB SetDisplayManagerCursor, SYS_SET_DISPLAY_MANAGER_CURSOR
|
|
SYSCALL_STUB WriteDisplayManagerConsole, SYS_WRITE_DISPLAY_MANAGER_CONSOLE
|
|
SYSCALL_STUB QueryDisplayManagerConsoleInfo, SYS_QUERY_DISPLAY_MANAGER_CONSOLE_INFO
|
|
SYSCALL_STUB SetDisplayManagerConsoleCursor, SYS_SET_DISPLAY_MANAGER_CONSOLE_CURSOR
|
|
SYSCALL_STUB FillDisplayManagerConsoleCharacter, SYS_FILL_DISPLAY_MANAGER_CONSOLE_CHARACTER
|
|
SYSCALL_STUB FillDisplayManagerConsoleAttribute, SYS_FILL_DISPLAY_MANAGER_CONSOLE_ATTRIBUTE
|
|
SYSCALL_STUB PutDisplayManagerConsoleCharacter, SYS_PUT_DISPLAY_MANAGER_CONSOLE_CHARACTER
|
|
SYSCALL_STUB ClearDisplayManagerConsole, SYS_CLEAR_DISPLAY_MANAGER_CONSOLE
|
|
SYSCALL_STUB OpenDisplayClock, SYS_OPEN_DISPLAY_CLOCK
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; Native render audio
|
|
; ---------------------------------------------------------------------------
|
|
SYSCALL_STUB AudioEnumerateEndpoints, SYS_AUDIO_ENUMERATE_ENDPOINTS
|
|
SYSCALL_STUB AudioOpenStream, SYS_AUDIO_OPEN_STREAM
|
|
SYSCALL_STUB AudioWrite, SYS_AUDIO_WRITE
|
|
SYSCALL_STUB AudioArmWait, SYS_AUDIO_ARM_WAIT
|
|
SYSCALL_STUB AudioQueryStream, SYS_AUDIO_QUERY_STREAM
|
|
SYSCALL_STUB AudioStart, SYS_AUDIO_START
|
|
SYSCALL_STUB AudioPause, SYS_AUDIO_PAUSE
|
|
SYSCALL_STUB AudioResume, SYS_AUDIO_RESUME
|
|
SYSCALL_STUB AudioDrain, SYS_AUDIO_DRAIN
|
|
SYSCALL_STUB AudioStop, SYS_AUDIO_STOP
|
|
SYSCALL_STUB AudioReset, SYS_AUDIO_RESET
|
|
SYSCALL_STUB AudioSetVolume, SYS_AUDIO_SET_VOLUME
|
|
SYSCALL_STUB AudioSetMasterVolume, SYS_AUDIO_SET_MASTER_VOLUME
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; Input
|
|
; ---------------------------------------------------------------------------
|
|
SYSCALL_STUB ReadInputManagerEvent, SYS_READ_INPUT_MANAGER_EVENT
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; Time and debug
|
|
; ---------------------------------------------------------------------------
|
|
SYSCALL_STUB CreateTimer, SYS_CREATE_TIMER
|
|
SYSCALL_STUB SetTimer, SYS_SET_TIMER
|
|
SYSCALL_STUB CancelTimer, SYS_CANCEL_TIMER
|
|
SYSCALL_STUB GetTick, SYS_GET_TICK
|
|
SYSCALL_STUB GetTickFrequency, SYS_GET_TICK_FREQUENCY
|
|
SYSCALL_STUB PrintDebug, SYS_PRINT_DEBUG
|
|
SYSCALL_STUB QueryTrapFrame, SYS_QUERY_TRAP_FRAME
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; Native sockets
|
|
; ---------------------------------------------------------------------------
|
|
SYSCALL_STUB CreateSocket, SYS_CREATE_SOCKET
|
|
SYSCALL_STUB SocketIoAsync, SYS_SOCKET_IO_ASYNC
|
|
SYSCALL_STUB BindSocket, SYS_BIND_SOCKET
|
|
SYSCALL_STUB ListenSocket, SYS_LISTEN_SOCKET
|
|
SYSCALL_STUB AcceptSocket, SYS_ACCEPT_SOCKET
|
|
SYSCALL_STUB ConnectSocket, SYS_CONNECT_SOCKET
|
|
SYSCALL_STUB SendSocket, SYS_SEND_SOCKET
|
|
SYSCALL_STUB RecvSocket, SYS_RECV_SOCKET
|
|
SYSCALL_STUB ShutdownSocket, SYS_SHUTDOWN_SOCKET
|
|
SYSCALL_STUB SendToSocket, SYS_SEND_TO_SOCKET
|
|
SYSCALL_STUB RecvFromSocket, SYS_RECV_FROM_SOCKET
|
|
SYSCALL_STUB ResolveHost, SYS_RESOLVE_HOST
|
|
SYSCALL_STUB SetSocketOption, SYS_SET_SOCKET_OPTION
|
|
SYSCALL_STUB GetSocketOption, SYS_GET_SOCKET_OPTION
|
|
SYSCALL_STUB Poll, SYS_POLL
|
|
|
|
SYSCALL_STUB GetMemoryStatus, SYS_GET_MEMORY_STATUS
|
|
SYSCALL_STUB QueryKernelStats, SYS_QUERY_KERNEL_STATS
|
|
SYSCALL_STUB GetSystemTime, SYS_GET_SYSTEM_TIME
|
|
SYSCALL_STUB CreateFileMapping, SYS_CREATE_FILE_MAPPING
|
|
SYSCALL_STUB MapFile, SYS_MAP_FILE
|
|
|
|
END
|