上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
第3章 Hello China的Shell
3.1 Shell的启动和初始化
在Hello China初始化过程中,完成全局对象的初始化后,会创建一个Shell线程,用于完成用户交互功能,代码如下。
lpShellThread=KernelThreadManager.CreateKernelThread( //Create shell thread. (__COMMON_OBJECT*)&KernelThreadManager, 0L, KERNEL_THREAD_STATUS_READY, PRIORITY_LEVEL_NORMAL, SystemShell, NULL, NULL);
其中,CreateKernelThread函数是由KernelThreadManager提供的一个接口,用于完成核心线程的创建功能,在第4章中,会进行详细描述。该函数创建一个用户界面(Shell)线程,线程的入口点,即线程的功能函数是SystemShell。该函数是一个封装函数,直接调用EntryPoint例程。在EntryPoint例程中,事先定义了线程的消息处理功能,代码如下。
DWORD EntryPoint() { //__KTHREAD_MSG Msg; __KERNEL_THREAD_MESSAGE KernelThreadMessage; PrintPrompt(); while(TRUE) { if(GetMessage(&KernelThreadMessage)) { if(KTMSG_THREAD_TERMINAL==KernelThreadMessage.wCommand) goto __TERMINAL; DispatchMessage(&KernelThreadMessage,EventHandler); } } __TERMINAL: //Terminal code here. return 0L; }
其中,KernelThreadMessage是一个核心线程消息数据结构,线程之间的消息交互都是通过该数据结构进行的。该结构的定义如下。
struct __KERNEL_THREAD_MESSAGE{ WORD wCommand; //Message type,such as Keyboard,Mouse,etc. WORD wParam; DWORD dwParam; };