static void DDKAPI timer_thread(LPVOID arg) { while (1) { KeWaitForMultipleObjects(2, timer_wait_objs, WaitAny, Executive, KernelMode, FALSE, NULL, NULL); if (timer_done) break; lkl_trigger_irq(TIMER_IRQ); } PsTerminateSystemThread(STATUS_SUCCESS); }
long lkl_syscall(long no, long *params) { struct syscall_thread_data *data = &syscall_thread_data; struct syscall s; s.no = no; s.params = params; s.sem = data->completion; lkl_ops->sem_down(data->mutex); data->s = &s; lkl_trigger_irq(syscall_irq, NULL); lkl_ops->sem_down(data->completion); lkl_ops->sem_up(data->mutex); return s.ret; }