static BOOL PspCreateSystemProcess(void) { HANDLE process_handle; HANDLE init_thread_handle, idle_thread_handle, process_cutter_handle, thread_cutter_handle; HANDLE tmr_thread_handle, sw_task_sw_handle; if(!PsCreateProcess(&process_handle)) return FALSE; /* create init_thread. */ if(!PsCreateThread(&init_thread_handle, process_handle, NULL, NULL, DEFAULT_STACK_SIZE, FALSE)) return FALSE; HalSetupTaskLink(&PsGetThreadPtr(init_thread_handle)->thread_tss32, TASK_SW_SEG); HalWriteTssIntoGdt(&PsGetThreadPtr(init_thread_handle)->thread_tss32, sizeof(TSS_32), INIT_TSS_SEG, FALSE); _asm { push ax mov ax, INIT_TSS_SEG ltr ax pop ax } /* create tmr_int_handler_thread. */ if(!PsCreateIntThread(&tmr_thread_handle, process_handle, Psp_IRQ_SystemTimer, NULL, DEFAULT_STACK_SIZE)) return FALSE; HalWriteTssIntoGdt(&PsGetThreadPtr(tmr_thread_handle)->thread_tss32, sizeof(TSS_32), TMR_TSS_SEG, FALSE); /* create soft-task-switching thread */ if(!PsCreateIntThread(&sw_task_sw_handle, process_handle, PspSoftTaskSW, NULL, DEFAULT_STACK_SIZE)) return FALSE; HalWriteTssIntoGdt(&PsGetThreadPtr(sw_task_sw_handle)->thread_tss32, sizeof(TSS_32), SOFT_TS_TSS_SEG, FALSE); /* create idle_thread. */ if(!PsCreateThread(&idle_thread_handle, process_handle, PspIdleThread, NULL, DEFAULT_STACK_SIZE, FALSE)) return FALSE; PsSetThreadStatus(idle_thread_handle, THREAD_STATUS_RUNNING); HalWriteTssIntoGdt(&PsGetThreadPtr(idle_thread_handle)->thread_tss32, sizeof(TSS_32), TASK_SW_SEG, TRUE); /* LAST PARAMETER SHOULD BE SET WITH 'TRUE'. IMPORTANT!! */ m_ProcMgrBlk.pt_current_thread = idle_thread_handle; /* IMPORTANT!! */ /* process cutter & thread cutter */ if(!PsCreateThread(&process_cutter_handle, process_handle, PspProcessCutterThread, NULL, DEFAULT_STACK_SIZE, FALSE)) return FALSE; PsSetThreadStatus(process_cutter_handle, THREAD_STATUS_READY); if(!PsCreateThread(&thread_cutter_handle, process_handle, PspThreadCutterThread, NULL, DEFAULT_STACK_SIZE, FALSE)) return FALSE; PsSetThreadStatus(thread_cutter_handle, THREAD_STATUS_READY); return TRUE; }
//초기 프로세스와 쓰레드의 생성과 설정 static BOOL PspCreateSystemProcess(void) { HANDLE process_handle; HANDLE init_thread_handle, idle_thread_handle, process_cutter_handle, thread_cutter_handle; HANDLE tmr_thread_handle, sw_task_sw_handle; //메인 프로세스를 생성해주는 PSCreateProcess 함수 호출 if(!PsCreateProcess(&process_handle)) return FALSE; //프로세스를 생성하기 위해 베이스가 될 메인 쓰레드(init 쓰레드) 생성 if(!PsCreateThread(&init_thread_handle, process_handle, NULL, NULL, DEFAULT_STACK_SIZE, FALSE)) return FALSE; //초기 쓰레드의 백링크(Prev-Link) 설정 HalSetupTaskLink(&PsGetThreadPtr(init_thread_handle)->thread_tss32, TASK_SW_SEG); //초기 쓰레드의 TSS를 GDT내에 설정 HalWriteTssIntoGdt(&PsGetThreadPtr(init_thread_handle)->thread_tss32, sizeof(TSS_32), INIT_TSS_SEG, FALSE); _asm { push ax mov ax, INIT_TSS_SEG ltr ax pop ax } if(!PsCreateIntThread(&tmr_thread_handle, process_handle, Psp_IRQ_SystemTimer, NULL, DEFAULT_STACK_SIZE)) return FALSE; HalWriteTssIntoGdt(&PsGetThreadPtr(tmr_thread_handle)->thread_tss32, sizeof(TSS_32), TMR_TSS_SEG, FALSE); if(!PsCreateIntThread(&sw_task_sw_handle, process_handle, PspSoftTaskSW, NULL, DEFAULT_STACK_SIZE)) return FALSE; HalWriteTssIntoGdt(&PsGetThreadPtr(sw_task_sw_handle)->thread_tss32, sizeof(TSS_32), SOFT_TS_TSS_SEG, FALSE); if(!PsCreateThread(&idle_thread_handle, process_handle, PspIdleThread, NULL, DEFAULT_STACK_SIZE, FALSE)) return FALSE; PsSetThreadStatus(idle_thread_handle, THREAD_STATUS_RUNNING); HalWriteTssIntoGdt(&PsGetThreadPtr(idle_thread_handle)->thread_tss32, sizeof(TSS_32), TASK_SW_SEG, TRUE); m_ProcMgrBlk.pt_current_thread = idle_thread_handle; if(!PsCreateThread(&process_cutter_handle, process_handle, PspProcessCutterThread, NULL, DEFAULT_STACK_SIZE, FALSE)) return FALSE; PsSetThreadStatus(process_cutter_handle, THREAD_STATUS_READY); if(!PsCreateThread(&thread_cutter_handle, process_handle, PspThreadCutterThread, NULL, DEFAULT_STACK_SIZE, FALSE)) return FALSE; PsSetThreadStatus(thread_cutter_handle, THREAD_STATUS_READY); return TRUE; }
BOOL KbdInitializeDriver(VOID) { memset(&m_KbdData, 0, sizeof(m_KbdData)); m_KbdData.indicator_status = KBD_LED_NUMLOCK; KbdpResetIndicator(); if(!PsCreateProcess(&m_ProcessHandle)) return FALSE; if(!PsCreateThread(&m_TranslatorThreadHandle,m_ProcessHandle, KbdpTranslatorThread, NULL, DEFAULT_STACK_SIZE, FALSE)) return FALSE; PsSetThreadStatus(m_TranslatorThreadHandle, THREAD_STATUS_READY); $reset: return TRUE; }
/********************************************************************************************************** * GLOBAL FUNTIONS * **********************************************************************************************************/ BOOL FddInitializeDriver(VOID) { /* motor off */ if(!FddpTurnOffMotor()) { DbgPrint("FddpTurnOffMotor() returned an error.\r\n"); return FALSE; } /* create keyboard process */ if(!PsCreateProcess(&m_ProcessHandle)) return FALSE; /* create thread */ if(!PsCreateThread(&m_ThreadHandle, m_ProcessHandle, FddpJobProcessThread, NULL, DEFAULT_STACK_SIZE, FALSE)) return FALSE; PsSetThreadStatus(m_ThreadHandle, THREAD_STATUS_READY); /* i'm ready! */ return TRUE; }
/********************************************************************************************************** * GLOBAL FUNTIONS * **********************************************************************************************************/ BOOL KbdInitializeDriver(VOID) { memset(&m_KbdData, 0, sizeof(m_KbdData)); /* initial indicator LEDs */ m_KbdData.indicator_status = KBD_LED_NUMLOCK; KbdpResetIndicator(); /* create keyboard process */ if(!PsCreateProcess(&m_ProcessHandle)) return FALSE; /* create a thread doing translation of raw_key_data 2 user_key_data */ if(!PsCreateThread(&m_TranslatorThreadHandle, m_ProcessHandle, KbdpTranslatorThread, NULL, DEFAULT_STACK_SIZE, FALSE)) return FALSE; PsSetThreadStatus(m_TranslatorThreadHandle, THREAD_STATUS_READY); /* i'm ready! */ return TRUE; }