⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shell.c

📁 ReactOS是一些高手根据Windows XP的内核编写出的类XP。内核实现机理和API函数调用几乎相同。甚至可以兼容XP的程序。喜欢研究系统内核的人可以看一看。
💻 C
📖 第 1 页 / 共 5 页
字号:
                                        UnassembleOneLineUp();
                                    }
                                }
                                // command line history
                                else if(!bShift && !bControl && !bAlt)
                                {
                                    LPSTR pCurrentCmd;
                                    ULONG len;

                                    DPRINT((0,"DebuggerShell(): command line up\n"));

                                    // only if anything in history
                                    if(GetLinesInCommandHistory())
                                    {
                                        // go to next entry in history
                                        if(ulCommandCurrentPos)
                                            ulCommandCurrentPos = (ulCommandCurrentPos-1)%GetLinesInCommandHistory();
                                        else
                                            ulCommandCurrentPos = GetLinesInCommandHistory()-1;
                                        DPRINT((0,"DebuggerShell(): current history pos = %u\n",ulCommandCurrentPos));
                                        // get this entry
                                        pCurrentCmd = GetFromCommandLineHistory(ulCommandCurrentPos);
                                        // if it has a string attached
                                        if((len = PICE_strlen(pCurrentCmd)))
                                        {
                                            // replace the current command line
                                            PICE_sprintf(tempShell,":");
                                            ReplaceRingBufferCurrent(tempShell);
                        					PICE_memset(&ucCommandBuffer,0,sizeof(ucCommandBuffer));
                                            PICE_strcpy(ucCommandBuffer,pCurrentCmd);
            							    usCurrentPosInInputBuffer=len;
                                            Print(OUTPUT_WINDOW,pCurrentCmd);
                                        }
                                    }
                                }
                                break;
                            case SCANCODE_DOWN: // down
                                DPRINT((0,"DebuggerShell(): DOWN\n"));
                                // memory window
                                if(bAlt)
                                {
                                    DPRINT((0,"DebuggerShell(): data window down\n"));
                                    OldOffset+=0x10;
	                                // display data window
	                                Args.Value[0]=OldSelector;
	                                Args.Value[1]=OldOffset;
	                                Args.Count=2;
	                                DisplayMemory(&Args);
                                }
                                // output window
                                else if(bShift)
                                {
                                    DPRINT((0,"DebuggerShell(): output window down ulLastLineDisplayedOffset = %u\n",ulLastLineDisplayedOffset));
                                    if(ulLastLineDisplayedOffset)
                                    {
                                        ulLastLineDisplayedOffset -= 1;

                                        if(!PrintRingBufferOffset(wWindow[OUTPUT_WINDOW].cy-1,ulLastLineDisplayedOffset))
                                        {
                                            ulLastLineDisplayedOffset = 0;
                                            PrintRingBuffer(wWindow[OUTPUT_WINDOW].cy-1);
                                        }
                                    }
                                }
                                // source window down
                                else if(bControl)
                                {
                                    if(ulCurrentlyDisplayedLineNumber>0 && PICE_strlen(szCurrentFile))
                                    {
                                        PICE_SYMBOLFILE_SOURCE* pSrc;

                                        if(ConvertTokenToSrcFile(szCurrentFile,(PULONG)&pSrc) )
                                        {
                                            ulCurrentlyDisplayedLineNumber++;
                                            DisplaySourceFile((LPSTR)pSrc+sizeof(PICE_SYMBOLFILE_SOURCE),
                                                              (LPSTR)pSrc+pSrc->ulOffsetToNext,
                                                              ulCurrentlyDisplayedLineNumber,-1);
                                        }
                                    }
                                    else
                                    {
                                        UnassembleOneLineDown();
                                    }
                                }
                                // command line history
                                else if(!bShift && !bControl && !bAlt)
                                {
                                    LPSTR pCurrentCmd;
                                    ULONG len;

                                    DPRINT((0,"DebuggerShell(): command line down\n"));

                                    // only if anything in history
                                    if(GetLinesInCommandHistory())
                                    {
                                        // go to next entry in history
                                        ulCommandCurrentPos = (ulCommandCurrentPos+1)%(GetLinesInCommandHistory());
                                        DPRINT((0,"DebuggerShell(): current history pos = %u\n",ulCommandCurrentPos));
                                        // get this entry
                                        pCurrentCmd = GetFromCommandLineHistory(ulCommandCurrentPos);
                                        // if it has a string attached
                                        if((len = PICE_strlen(pCurrentCmd)))
                                        {
                                            // replace the current command line
                                            PICE_sprintf(tempShell,":");
                                            ReplaceRingBufferCurrent(tempShell);
                             				PICE_memset(&ucCommandBuffer,0,sizeof(ucCommandBuffer));
                                            PICE_strcpy(ucCommandBuffer,pCurrentCmd);
            							    usCurrentPosInInputBuffer=len;
                                            Print(OUTPUT_WINDOW,pCurrentCmd);
                                        }
                                    }
                                }
                                break;
                            case SCANCODE_LEFT: // left
                                DPRINT((0,"DebuggerShell(): LEFT\n"));
                                // memory window
                                if(bAlt)
                                {
                                    DPRINT((0,"DebuggerShell(): data window left\n"));

                                    OldOffset-=0x1;
	                                // display data window
	                                Args.Value[0]=OldSelector;
	                                Args.Value[1]=OldOffset;
	                                Args.Count=2;
	                                DisplayMemory(&Args);
                                }
                                else if(!bShift && !bControl && !bAlt)
                                {
                                }
                                else if(bControl)
                                {
                                    if(ulWindowOffset > 0)
                                        ulWindowOffset--;
                                    PICE_memset(&Args,0,sizeof(ARGS));
	                                Args.Count=0;
	                                Unassemble(&Args);
                                }
                                break;
                            case SCANCODE_RIGHT: // right
                                // memory window
                                if(bAlt)
                                {
                                    DPRINT((0,"DebuggerShell(): data window right\n"));

                                    OldOffset+=0x1;
	                                // display data window
	                                Args.Value[0]=OldSelector;
	                                Args.Value[1]=OldOffset;
	                                Args.Count=2;
	                                DisplayMemory(&Args);
                                }
                                else if(!bShift && !bControl && !bAlt)
                                {
                                }
                                else if(bControl)
                                {
                                    if(ulWindowOffset < 80)
                                        ulWindowOffset++;
                                    PICE_memset(&Args,0,sizeof(ARGS));
	                                Args.Count=0;
	                                Unassemble(&Args);
                                }
                                break;
                            case SCANCODE_PGUP: // page up
                                DPRINT((0,"DebuggerShell(): PAGEUP\n"));
                                // memory window
                                if(bAlt)
                                {
                                    OldOffset-=wWindow[DATA_WINDOW].cy*0x10;
	                                // display data window
	                                Args.Value[0]=OldSelector;
	                                Args.Value[1]=OldOffset;
	                                Args.Count=2;
	                                DisplayMemory(&Args);
                                }
                                // output window
                                else if(bShift)
                                {
                                    if(ulLastLineDisplayedOffset+2*(wWindow[OUTPUT_WINDOW].cy) < LinesInRingBuffer())
                                    {
                                        ulLastLineDisplayedOffset += (wWindow[OUTPUT_WINDOW].cy);

                                        PrintRingBufferOffset(wWindow[OUTPUT_WINDOW].cy-1,ulLastLineDisplayedOffset);
                                    }
                                    else
                                    {
                                        if(ulLastLineDisplayedOffset != LinesInRingBuffer()-wWindow[OUTPUT_WINDOW].cy)
                                        {
                                            ulLastLineDisplayedOffset = LinesInRingBuffer()-wWindow[OUTPUT_WINDOW].cy;
                                            PrintRingBufferOffset(wWindow[OUTPUT_WINDOW].cy-1,ulLastLineDisplayedOffset);
                                        }
                                    }
                                }
                                // source window page up
                                else if(bControl)
                                {
                                    if(PICE_strlen(szCurrentFile))
                                    {
                                        if((ulCurrentlyDisplayedLineNumber-wWindow[SOURCE_WINDOW].cy)>0)
                                        {
                                            PICE_SYMBOLFILE_SOURCE* pSrc;

                                            if(ConvertTokenToSrcFile(szCurrentFile,(PULONG)&pSrc) )
                                            {
                                                ulCurrentlyDisplayedLineNumber -= wWindow[SOURCE_WINDOW].cy;

                                                DisplaySourceFile((LPSTR)pSrc+sizeof(PICE_SYMBOLFILE_SOURCE),
                                                                  (LPSTR)pSrc+pSrc->ulOffsetToNext,
                                                                  ulCurrentlyDisplayedLineNumber ,-1);
                                            }
                                        }
                                        else
                                        {
                                            PICE_SYMBOLFILE_SOURCE* pSrc;

                                            if(ConvertTokenToSrcFile(szCurrentFile,(PULONG)&pSrc) )
                                            {
                                                ulCurrentlyDisplayedLineNumber = 1;

                                                DisplaySourceFile((LPSTR)pSrc+sizeof(PICE_SYMBOLFILE_SOURCE),
                                                                  (LPSTR)pSrc+pSrc->ulOffsetToNext,
                                                                  ulCurrentlyDisplayedLineNumber ,-1);
                                            }
                                        }
                                    }
                                    else
                                    {
                                        UnassembleOnePageUp(wWindow[SOURCE_WINDOW].cy);
                                    }

                                }
                                else if(!bShift && !bControl && !bAlt)
                                {
                                }
                                break;
                            case SCANCODE_PGDN: // page down
                                DPRINT((0,"DebuggerShell(): PAGEDOWN\n"));
                                // memory window
                                if(bAlt)
                                {
                                    OldOffset+=wWindow[DATA_WINDOW].cy*0x10;
	                                // display data window
	                                Args.Value[0]=OldSelector;
	                                Args.Value[1]=OldOffset;
	                                Args.Count=2;
	                                DisplayMemory(&Args);
                                }
                                else if(bShift)
                                {
                                    if(ulLastLineDisplayedOffset>wWindow[OUTPUT_WINDOW].cy)
                                    {
                                        ulLastLineDisplayedOffset -= (wWindow[OUTPUT_WINDOW].cy);

                                        PrintRingBufferOffset(wWindow[OUTPUT_WINDOW].cy-1,ulLastLineDisplayedOffset);
                                    }
                                    else
                                    {
                                        if(ulLastLineDisplayedOffset)
                                        {
                                            ulLastLineDisplayedOffset = 0;
                                            PrintRingBufferOffset(wWindow[OUTPUT_WINDOW].cy-1,ulLastLineDisplayedOffset);
                                        }
                                    }
                                }
                                else if(bControl)
                                {
                                    if(PICE_strlen(szCurrentFile) )
                                    {
                                        if((ulCurrentlyDisplayedLineNumber+wWindow[SOURCE_WINDOW].cy)>0)
                                        {
                                            PICE_SYMBOLFILE_SOURCE* pSrc;

                                            if(ConvertTokenToSrcFile(szCurrentFile,(PULONG)&pSrc) )
                                            {
                                                ulCurrentlyDisplayedLineNumber += wWindow[SOURCE_WINDOW].cy;

                                                DisplaySourceFile((LPSTR)pSrc+sizeof(PICE_SYMBOLFILE_SOURCE),
                                                                  (LPSTR)pSrc+pSrc->ulOffsetToNext,
                                                                  ulCurrentlyDisplayedLineNumber ,-1);
                                            }
                                        }
                                        else
                                        {
                                            PICE_SYMBOLFILE_SOURCE* pSrc;

                                            if(ConvertTokenToSrcFile(szCurrentFile,(PULONG)&pSrc) )
                                            {
                                                ulCurrentlyDisplayedLineNumber = 1;

                                                DisplaySourceFile((LPSTR)pSrc+sizeof(PICE_SYMBOLFILE_SOURCE),
                                                                  (LPSTR)pSrc+pSrc->ulOffsetToNext,
                                                                  ulCurrentlyDisplayedLineNumber ,-1);
                                            }
                                        }
                                    }
                                    else
                                    {
                                        UnassembleOnePageDown(wWindow[SOURCE_WINDOW].cy);
                                    }
                                }
                                else if(!bShift && !bControl && !bAlt)
                                {
                                }
                                break;
                        }
                    }
				}
			}
			ucKeyPressedWhileIdle=0;
		}
	}

    SaveOldRegs();

    PrintLogo(TRUE);

    ShowRunningMsg();

    if(bRev)
		PrintCursor(TRUE);

	// hide the cursor
	HideCursor();

    FlushKeyboardQueue();

    RestoreGraphicsState();

	LEAVE_FUNC();
}

//*************************************************************************
// RealIsr()
//
//*************************************************************************
void RealIsr(ULONG dwReasonForBreak)
{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -