258 lines
5.2 KiB
Plaintext
258 lines
5.2 KiB
Plaintext
////**************************PROCEDURE*************************
|
|
ALIGN 8,0x90
|
|
SAVE_CONTEXT::
|
|
PUSHFD
|
|
POP U4 FS:[TSS_EFLAGS]
|
|
MOV U4 FS:[TSS_EAX],EAX
|
|
MOV U4 FS:[TSS_EBX],EBX
|
|
MOV U4 FS:[TSS_ECX],ECX
|
|
MOV U4 FS:[TSS_EDX],EDX
|
|
MOV U4 FS:[TSS_ESI],ESI
|
|
MOV U4 FS:[TSS_EDI],EDI
|
|
MOV U4 FS:[TSS_EBP],EBP
|
|
|
|
MOV ESI,U4 FS:[TSS_ABSOLUTE_ADDRESS]
|
|
FSAVE U4 TSS_FPU[ESI]
|
|
|
|
BT U4 [SYS_FLAGS],SYSf_PREEMPTIVE
|
|
JC @@1
|
|
BTR U4 FS:[TSS_TASK_FLAGS],TSSf_PREEMPT
|
|
JMP @@2
|
|
@@1: BTS U4 FS:[TSS_TASK_FLAGS],TSSf_PREEMPT
|
|
|
|
@@2: PUSH EAX
|
|
PUSH ESI
|
|
PUSH EDI
|
|
MOV ESI,U4 FS:[TSS_BPT_LIST]
|
|
@@3: OR ESI,ESI
|
|
JZ @@4
|
|
MOV EDI,U4 BPT_ADDRESS[ESI]
|
|
MOV AL,U1 BPT_U1[ESI]
|
|
MOV U1 [EDI],AL
|
|
MOV ESI,U4 BPT_NEXT[ESI]
|
|
JMP @@3
|
|
|
|
@@4: POP EDI
|
|
POP ESI
|
|
POP EAX
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,0x90
|
|
RESTORE_CONTEXT::
|
|
INC U4 [SYS_SWAPS_CNTER]
|
|
MOV ESI,U4 FS:[TSS_BPT_LIST]
|
|
@@3: OR ESI,ESI
|
|
JZ @@4
|
|
MOV EDI,U4 BPT_ADDRESS[ESI]
|
|
CMP EDI,U4 FS:[TSS_EIP]
|
|
JNE @@5
|
|
BTR U4 BPT_FLAGS[ESI],SBPTf_DISABLE
|
|
JC @@6
|
|
@@5: MOV AL,U1 [EDI]
|
|
MOV U1 BPT_U1[ESI],AL
|
|
MOV AL,0xCC
|
|
MOV U1 [EDI],AL
|
|
@@6: MOV ESI,U4 BPT_NEXT[ESI]
|
|
JMP @@3
|
|
|
|
@@4:
|
|
MOV ESI,U4 FS:[TSS_ABSOLUTE_ADDRESS]
|
|
FRSTOR U4 TSS_FPU[ESI]
|
|
|
|
MOV EBX,U4 FS:[TSS_EBX]
|
|
MOV ECX,U4 FS:[TSS_ECX]
|
|
MOV EDX,U4 FS:[TSS_EDX]
|
|
MOV ESI,U4 FS:[TSS_ESI]
|
|
MOV EDI,U4 FS:[TSS_EDI]
|
|
MOV EBP,U4 FS:[TSS_EBP]
|
|
|
|
MOV ESP,U4 FS:[TSS_ESP]
|
|
MOV EAX,U4 FS:[TSS_EAX]
|
|
BT U4 FS:[TSS_TASK_FLAGS],TSSf_PREEMPT
|
|
JC @@1
|
|
BTR U4 [SYS_FLAGS],SYSf_PREEMPTIVE
|
|
JMP @@2
|
|
@@1: BTS U4 [SYS_FLAGS],SYSf_PREEMPTIVE
|
|
@@2: PUSH U4 FS:[TSS_EFLAGS]
|
|
PUSH U4 FS:[TSS_CS]
|
|
PUSH U4 FS:[TSS_EIP]
|
|
IRET
|
|
////**************************PROCEDURE*************************
|
|
//IN EDI=TASK
|
|
ALIGN 8,0x90
|
|
REMQUE_TASK:
|
|
PUSH ESI
|
|
PUSHFD
|
|
CLI
|
|
|
|
PUSH EDI
|
|
MOV ESI,U4 TSS_NEXT_TSS[EDI]
|
|
MOV EDI,U4 TSS_LAST_TSS[EDI]
|
|
MOV U4 TSS_NEXT_TSS[EDI],ESI
|
|
MOV U4 TSS_LAST_TSS[ESI],EDI
|
|
BTS U4 [SYS_FLAGS],SYSf_TASK_LINKS_ALTERED
|
|
POP EDI
|
|
|
|
POPFD
|
|
POP ESI
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,0x90
|
|
SWAP_IN_NEXT::
|
|
PUSHFD
|
|
CLI
|
|
CALL SAVE_CONTEXT
|
|
MOV EAX,SIN_RET
|
|
MOV U4 FS:[TSS_EIP],EAX
|
|
POP U4 FS:[TSS_EFLAGS]
|
|
MOV U4 FS:[TSS_ESP],ESP
|
|
SIN_NEXT:
|
|
MOV ESI,U4 FS:[TSS_NEXT_TSS]
|
|
MOV AX,U2 TSS_FS[ESI]
|
|
MOV FS,AX
|
|
SWAP_IN_NEXT_PART2::
|
|
BTR U4 [SYS_FLAGS],SYSf_CTRL_ALT_DEL
|
|
JC U4 CP_REBOOT
|
|
|
|
BTR U4 [SYS_FLAGS],SYSf_CTRL_ALT_ESC
|
|
JNC @@2
|
|
CALL SPAWN_USER_AND_ACTIVATE
|
|
JMP SWAP_IN_NEXT_PART3
|
|
|
|
@@2: BTR U4 [SYS_FLAGS],SYSf_CTRL_ALT_TAB
|
|
JNC @@3
|
|
CALL CP_ACTIVATE_NEXT_USER
|
|
JMP SWAP_IN_NEXT_PART3
|
|
|
|
@@3: BTR U4 [SYS_FLAGS],SYSf_CTRL_ALT_X
|
|
JC END_ACTIVE_USER
|
|
BTR U4 [SYS_FLAGS],SYSf_CTRL_ALT_C
|
|
JC BREAK_ACTIVE_USER
|
|
|
|
SWAP_IN_NEXT_PART3::
|
|
BT U4 FS:[TSS_TASK_FLAGS],TSSf_KILL_TASK
|
|
JNC @@1
|
|
CALL END_TASK+4
|
|
MOV FS,AX
|
|
JMP SWAP_IN_NEXT_PART2
|
|
@@1: BT U4 FS:[TSS_TASK_FLAGS],TSSf_SUSPENDED
|
|
JC SIN_NEXT
|
|
JMP U4 RESTORE_CONTEXT
|
|
SIN_RET: RET
|
|
|
|
BREAK_ACTIVE_USER::
|
|
MOV ESI,U4 [SYS_CUR_FOCUS_TASK]
|
|
OR ESI,ESI
|
|
JZ SWAP_IN_NEXT_PART3
|
|
BT U4 TSS_TASK_FLAGS[ESI],TSSf_LOCAL_USER
|
|
JNC SWAP_IN_NEXT_PART3
|
|
MOV EAX,CP_BREAK+4
|
|
MOV U4 TSS_EIP[ESI],EAX
|
|
JMP SWAP_IN_NEXT_PART3
|
|
|
|
END_ACTIVE_USER::
|
|
CALL DEACTIVATE_USER
|
|
PUSH ESI
|
|
CALL ACTIVATE_NEXT_USER
|
|
POP ESI
|
|
OR ESI,ESI
|
|
JZ SWAP_IN_NEXT_PART3
|
|
BT U4 TSS_TASK_FLAGS[ESI],TSSf_LOCAL_USER
|
|
JNC SWAP_IN_NEXT_PART3
|
|
BTS U4 TSS_TASK_FLAGS[ESI],TSSf_KILL_TASK
|
|
JMP SWAP_IN_NEXT_PART3
|
|
////**************************PROCEDURE*************************
|
|
MSG_USER_CMD_DESC: DU1 "USER CMD",0;
|
|
ALIGN 8,0x90
|
|
SPAWN_USER_AND_ACTIVATE::
|
|
PUSHFD
|
|
CLI
|
|
PUSHAD
|
|
MOV U4 [SYS_CUR_FOCUS_TASK],0
|
|
|
|
PUSH 0
|
|
PUSH U4 DEFAULT_STACK
|
|
PUSH 0
|
|
PUSH 0 ///use adam account
|
|
PUSH 0
|
|
PUSH 0 //ADAM is parent
|
|
PUSH 0
|
|
PUSH U4 MSG_USER_CMD_DESC
|
|
PUSH 0
|
|
PUSH U4 CP_USER_CMD_LINE+4
|
|
CALL CP_SPAWN_TASK+4
|
|
ADD ESP,40
|
|
|
|
PUSH EDX
|
|
PUSH EAX
|
|
MOV EAX,U4 [SYS_EXTERN_TABLE]
|
|
MOV EAX,U4 EXT_WINDOW_TO_TOP*4[EAX]
|
|
OR EAX,EAX
|
|
JZ @@1
|
|
CALL EAX
|
|
@@1: ADD ESP,8
|
|
|
|
POPAD
|
|
POPFD
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
//IN: ESI=CUR USER TSS
|
|
ALIGN 8,0x90
|
|
ACTIVATE_NEXT_USER:
|
|
PUSHFD
|
|
CLI
|
|
PUSH EDI
|
|
OR ESI,ESI
|
|
JNZ @@11
|
|
MOV ESI,ADAM_TSS
|
|
@@11: MOV EDI,ESI
|
|
MOV ESI,U4 TSS_NEXT_TSS[ESI]
|
|
@@14: BT U4 TSS_TASK_FLAGS[ESI],TSSf_LOCAL_USER
|
|
JNC @@19
|
|
CMP U4 [SYS_CUR_FOCUS_TASK],ESI
|
|
JE @@19
|
|
MOV U4 [SYS_CUR_FOCUS_TASK],ESI
|
|
MOV EAX,U4 [SYS_EXTERN_TABLE]
|
|
MOV EAX,U4 EXT_WINDOW_TO_TOP*4[EAX]
|
|
OR EAX,EAX
|
|
JZ @@19B
|
|
PUSHAD
|
|
PUSH 0
|
|
PUSH ESI
|
|
CALL EAX
|
|
ADD ESP,8
|
|
POPAD
|
|
JMP @@19B
|
|
@@19: MOV ESI,U4 TSS_NEXT_TSS[ESI]
|
|
CMP ESI,EDI
|
|
JNE @@14
|
|
@@19B: POP EDI
|
|
POPFD
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
//OUT: ESI=TSS OF USER
|
|
ALIGN 8,0x90
|
|
DEACTIVATE_USER:
|
|
MOV ESI,U4 [SYS_CUR_FOCUS_TASK]
|
|
MOV U4 [SYS_CUR_FOCUS_TASK],0
|
|
RET
|
|
|
|
////**************************PROCEDURE*************************
|
|
//IN: ESI=CUR USER TSS
|
|
ALIGN 8,0x90
|
|
CP_ACTIVATE_NEXT_USER::
|
|
PUSH ESI
|
|
CALL DEACTIVATE_USER
|
|
CALL ACTIVATE_NEXT_USER
|
|
POP ESI
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,0x90
|
|
CP_DEACTIVATE_USER::
|
|
PUSH ESI
|
|
CALL DEACTIVATE_USER
|
|
MOV EAX,ESI
|
|
XOR EDX,EDX
|
|
POP ESI
|
|
RET
|
|
|