//유제 쓰레드 생성하는 함수 KERNELAPI BOOL PsCreateUserThread(OUT PHANDLE ThreadHandle, IN HANDLE ProcessHandle, IN PVOID StartContext) { #define USER_APP_ENTRY_POINT 0x00101000 //유저 프로그램의 진입점의 주소 #define USER_APP_STACK_PTR 0x001f0000 //유저 프로그램의 스택 주소 #define USER_APP_STACK_SIZE (1024*64) //유저 프로그램의 스택의 크디 PTHREAD_CONTROL_BLOCK pThread; pThread = MmAllocateNonCachedMemory(sizeof(THREAD_CONTROL_BLOCK)); if(pThread == NULL) return FALSE; pThread->parent_process_handle = ProcessHandle; pThread->thread_id = PspGetNextThreadID(ProcessHandle); pThread->thread_handle = (HANDLE)pThread; pThread->thread_status = THREAD_STATUS_STOP; pThread->auto_delete = FALSE; pThread->pt_next_thread = NULL; pThread->start_routine = (PKSTART_ROUTINE)USER_APP_ENTRY_POINT; pThread->start_context = StartContext; pThread->pt_stack_base_address = (int *)USER_APP_STACK_PTR; pThread->stack_size = USER_APP_STACK_SIZE; if(!PspAddNewThread(ProcessHandle, (HANDLE)pThread)) return FALSE; HalSetupTSS(&pThread->thread_tss32, TRUE, USER_APP_ENTRY_POINT, (int *)USER_APP_STACK_PTR, USER_APP_STACK_SIZE); *ThreadHandle = pThread; return TRUE; }
KERNELAPI BOOL PsCreateIntThread(OUT PHANDLE ThreadHandle, IN HANDLE ProcessHandle, IN PKSTART_ROUTINE StartRoutine, IN PVOID StartContext, IN DWORD StackSize) { PTHREAD_CONTROL_BLOCK pThread; int *pStack; pThread = MmAllocateNonCachedMemory(sizeof(THREAD_CONTROL_BLOCK)); if(pThread == NULL) return FALSE; pStack = MmAllocateNonCachedMemory(StackSize); if(pStack == NULL) return FALSE; pThread->parent_process_handle = ProcessHandle; pThread->thread_id = PspGetNextThreadID(ProcessHandle); pThread->thread_handle = (HANDLE)pThread; pThread->thread_status = THREAD_STATUS_STOP; pThread->auto_delete = FALSE; pThread->pt_next_thread = NULL; pThread->start_routine = StartRoutine; pThread->start_context = StartContext; pThread->pt_stack_base_address = pStack; pThread->stack_size = StackSize; if(!PspAddNewThread(ProcessHandle, (HANDLE)pThread)) return FALSE; HalSetupTSS(&pThread->thread_tss32, TRUE, (int)StartRoutine, pStack, StackSize); *ThreadHandle = pThread; return TRUE; }
//쓰레드 생성 함수 KERNELAPI BOOL PsCreateThread(OUT PHANDLE ThreadHandle, IN HANDLE ProcessHandle, IN PKSTART_ROUTINE StartRoutine, IN PVOID StartContext, IN DWORD StackSize, IN BOOL AutoDelete) { PTHREAD_CONTROL_BLOCK pThread; int *pStack; //메모리할당 pThread = MmAllocateNonCachedMemory(sizeof(THREAD_CONTROL_BLOCK)); if(pThread == NULL) return FALSE; //쓰레드에서 사용할 스택 할당 pStack = MmAllocateNonCachedMemory(StackSize); if(pStack == NULL) return FALSE; //부모 프로세스의 핸들 설정 pThread->parent_process_handle = ProcessHandle; //Thread id 및 handle 할당 pThread->thread_id = PspGetNextThreadID(ProcessHandle); pThread->thread_handle = (HANDLE)pThread; pThread->thread_status = THREAD_STATUS_STOP; //Thread 상태를 STOP으로 설정 pThread->auto_delete = AutoDelete; pThread->pt_next_thread = NULL; //쓰레드가 실행해야 하는 함수(StartRoutine), 함수에 넘어가는 인자(StartContext), 스택 사이즈 설정 pThread->start_routine = StartRoutine; pThread->start_context = StartContext; pThread->pt_stack_base_address = pStack; pThread->stack_size = StackSize; //PspAddNewThread 함수를 통해 Process에 생성된 쓰레드를 추가 if(!PspAddNewThread(ProcessHandle, (HANDLE)pThread)) return FALSE; HalSetupTSS(&pThread->thread_tss32, TRUE, (int)PspTaskEntryPoint, pStack, StackSize); *ThreadHandle = pThread; return TRUE; }