////**************************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