// //Entry point of the text mode shell. // DWORD ShellEntryPoint(LPVOID pData) { __KERNEL_THREAD_MESSAGE KernelThreadMessage; s_hHiscmdInoObj = His_CreateHisObj(HISCMD_MAX_COUNT); StrCpy(DEF_PROMPT_STR,&s_szPrompt[0]); CD_PrintString(VERSION_INFO,FALSE); CD_SetCursorPos(0,SHELL_INPUT_START_Y_FIRST); PrintPrompt(); while(TRUE) { if(GetMessage(&KernelThreadMessage)) { if(KERNEL_MESSAGE_TERMINAL == KernelThreadMessage.wCommand) { break; } DispatchMessage(&KernelThreadMessage,EventHandler); } } //When reach here,it means the shell thread will terminate.We will reboot //the system in current version's implementation,since there is no interact //mechanism between user and computer in case of no shell. //NOTE:System clean up operations should be put here if necessary. #ifdef __I386__ BIOSReboot(); #endif return 0; }
//Default handler if no proper handler is located. VOID DefaultHandler(LPSTR pstr) { CD_ChangeLine(); CD_PrintString(ERROR_STR,FALSE); return; }
//Handler for 'cpu' command. VOID CpuHandler(LPSTR pstr) { /*GotoHome(); ChangeLine(); PrintStr("Cpu Handler called.");*/ CD_PrintString("Cpu Handler called.",TRUE); }
//Handler for 'cpu' command. DWORD CpuHandler(__CMD_PARA_OBJ* pCmdParaObj) { /*GotoHome(); ChangeLine(); PrintStr("Cpu Handler called.");*/ CD_PrintString("Cpu Handler called.",TRUE); return SHELL_CMD_PARSER_SUCCESS; }
//Handler for 'runtime' command. DWORD RunTimeHandler(__CMD_PARA_OBJ* pCmdParaObj) { CHAR Buffer[190] = {0}; DWORD week = 0,day = 0,hour = 0,minute = 0,second = 0; DWORD* Array[5] = {0}; second = System.GetSysTick(NULL); //Get system tick counter. //Convert to second. second *= SYSTEM_TIME_SLICE; second /= 1000; if(second >= 60) //Use minute. { minute = second / 60; second = second % 60; } if(minute >= 60) //use hour. { hour = minute / 60; minute = minute % 60; } if(hour >= 24) //Use day. { day = hour / 24; hour = hour % 24; } if(day >= 7) //Use week. { week = day / 7; day = day % 7; } Array[0] = &week; Array[1] = &day; Array[2] = &hour; Array[3] = &minute; Array[4] = &second; FormString(Buffer,"System has running %d week(s), %d day(s), %d hour(s), %d minute(s), %d second(s).",(LPVOID*)Array); //Show out the result. /*sprintf(Buffer,"System has running %d week(s), %d day(s), %d hour(s), %d minute(s), %d second(s).", week,day,hour,minute,second);*/ //sprintf(Buffer,"System has running %d,%d",(INT)week,(INT)day);//(INT)hour,(INT)minute,(INT)second //PrintLine(Buffer); CD_PrintString(Buffer,TRUE); return SHELL_CMD_PARSER_SUCCESS; }
//Print out command prompt. static VOID PrintPrompt() { WORD CursorX = 0; WORD CursorY = 0; CD_GetCursorPos(&CursorX,&CursorY); if(CursorX != 0) { CD_ChangeLine(); CD_GetCursorPos(&CursorX,&CursorY); } CD_PrintString(s_szPrompt,FALSE); CursorX = strlen(s_szPrompt); CD_SetCursorPos(CursorX,CursorY); }
//load history cmd to current cmd line static void LoadHisCmd(BOOL bUp) { CHAR szHisCmd[CMD_MAX_LEN] = {0}; WORD CursorX = 0; WORD CursorY = 0; if(His_LoadHisCmd(s_hHiscmdInoObj,bUp,szHisCmd,sizeof(szHisCmd)) == FALSE) { return; } CD_GetCursorPos(&CursorX,&CursorY); CD_SetCursorPos(SHELL_INPUT_START_X,CursorY); CD_DelString(SHELL_INPUT_START_X,CursorY,CMD_MAX_LEN); CD_PrintString(szHisCmd,FALSE); }
//Entry point of the text mode shell. // DWORD ShellEntryPoint(LPVOID pData) { StrCpy(DEF_PROMPT_STR,&s_szPrompt[0]); CD_PrintString(VERSION_INFO,TRUE); CD_SetCursorPos(0,SHELL_INPUT_START_Y_FIRST); Shell_Msg_Loop(s_szPrompt,CommandParser,QueryCmdName); //When reach here,it means the shell thread will terminate.We will reboot //the system in current version's implementation,since there is no interact //mechanism between user and computer in case of no shell. //NOTE:System clean up operations should be put here if necessary. #ifdef __I386__ BIOSReboot(); #endif return 0; }
// //Print a string at a new line. // VOID PrintLine(LPSTR pszStr) { CD_PrintString(pszStr,TRUE); }
void PrintStr(const char* pszMsg) { CD_PrintString((LPSTR)pszMsg,FALSE); }
// //Print a string at a new line. // VOID PrintLine(LPSTR pszStr) { CD_PrintString(pszStr,FALSE); GotoHome(); ChangeLine(); }
//Command analyzing routine,it analyzes user's input and search //command array to find a proper handler,then call it. //Default handler will be called if no proper command handler is //located. static DWORD CommandParser(LPSTR pCmdBuf) { __KERNEL_THREAD_OBJECT* hKernelThread = NULL; __CMD_PARA_OBJ* lpCmdParamObj = NULL; DWORD dwResult = SHELL_CMD_PARSER_INVALID; //If find the correct command object,then DWORD dwIndex = 0; //Used for 'for' loop. lpCmdParamObj = FormParameterObj(pCmdBuf); if(NULL == lpCmdParamObj || lpCmdParamObj->byParameterNum < 1) //Can not form a valid command parameter object. { CD_PrintString(pCmdBuf,TRUE); goto __END; } dwIndex = 0; //is bat file? if(strstr(lpCmdParamObj->Parameter[0],"./")) { BatHandler(lpCmdParamObj); dwResult = SHELL_CMD_PARSER_SUCCESS; goto __END; } while(CmdObj[dwIndex].CmdStr) { if(StrCmp(CmdObj[dwIndex].CmdStr,lpCmdParamObj->Parameter[0])) { CmdObj[dwIndex].CmdHandler(lpCmdParamObj); //Call the command handler. dwResult = SHELL_CMD_PARSER_SUCCESS; break; } dwIndex ++; } if(dwResult == SHELL_CMD_PARSER_SUCCESS) { goto __END; } dwIndex = 0; //Now,should search external command array. while(ExtCmdArray[dwIndex].lpszCmdName) { if(StrCmp(ExtCmdArray[dwIndex].lpszCmdName,lpCmdParamObj->Parameter[0])) //Found. { hKernelThread = KernelThreadManager.CreateKernelThread( (__COMMON_OBJECT*)&KernelThreadManager, 0, KERNEL_THREAD_STATUS_READY, PRIORITY_LEVEL_NORMAL, ExtCmdArray[dwIndex].ExtCmdHandler, (LPVOID)lpCmdParamObj, //? NULL, NULL); if(!ExtCmdArray[dwIndex].bBackground) //Should wait. { DeviceInputManager.SetFocusThread((__COMMON_OBJECT*)&DeviceInputManager, (__COMMON_OBJECT*)hKernelThread); //Give the current input focus to this thread. hKernelThread->WaitForThisObject((__COMMON_OBJECT*)hKernelThread); DeviceInputManager.SetFocusThread((__COMMON_OBJECT*)&DeviceInputManager,NULL); KernelThreadManager.DestroyKernelThread( (__COMMON_OBJECT*)&KernelThreadManager, (__COMMON_OBJECT*)hKernelThread); //Destroy it. //Set focus thread to shell. } dwResult = SHELL_CMD_PARSER_SUCCESS; goto __END; } dwIndex ++; } //DefaultHandler(NULL); //Call the default command handler. __END: ReleaseParameterObj(lpCmdParamObj); return dwResult; }