示例#1
0
文件: Serial.cpp 项目: Vort/VortOS
	CSerial()
	{
		dword PortBase = 0x3F8;
		KeLinkIrq(4);
		KeEnableNotification(NfKe_TerminateProcess);

		KeOutPortByte(PortBase + 1, 0x00); // Int Off
		KeOutPortByte(PortBase + 3, 0x80); // DLAB On
		KeOutPortByte(PortBase + 0, 0x60); // Divisor Latch Low  [1200]
		KeOutPortByte(PortBase + 1, 0x00); // Divisor Latch High [1200]
		KeOutPortByte(PortBase + 3, 0x02); // 7 Bits, No Parity, 1 Stop Bit, DLAB Off

		KeOutPortByte(PortBase + 1, 0x01); // Int On
		KeOutPortByte(PortBase + 4, 0x00); // DTR Off, RTS Off

		KeWaitTicks(5);
		KeOutPortByte(PortBase + 4 , 0x0B); // DTR On, RTS On, OUT2 On

		CNotification<4> N;
		for (;;)
		{
			KeWaitFor(1);
			N.Recv();
			
			if (N.GetID() == NfKe_Irq)
			{
				byte B = KeInPortByte(PortBase);
				KeNotify(NfCom_Data, &B, 1);
				KeEndOfInterrupt(4);
			}
			else if (N.GetID() == NfKe_TerminateProcess)
				return;
		}
	}
示例#2
0
//+====================================================================================
//
// Method:EnsureDispNode
//
// Synopsis: Creates a DispItemPlus suitable for 'Adornment'
//
//------------------------------------------------------------------------------------
void CAdorner::EnsureDispNode()
{
    Assert(_pElement);
    Assert(_pView);
    Assert(_pView->IsInState(CView::VS_OPEN));

    CTreeNode* pTreeNode = _pElement->GetFirstBranch();

	if(!_pDispNode && pTreeNode)
	{
		_pDispNode = (CDispNode*)CDispRoot::CreateDispItemPlus(this,
			TRUE,
			FALSE,
			FALSE,
			DISPNODEBORDER_NONE,
			FALSE);

        if(_pDispNode)
        {
            _pDispNode->SetExtraCookie(GetDispCookie());
            _pDispNode->SetLayerType(GetDispLayer());
            _pDispNode->SetOwned(TRUE);
        }
    }

    if(_pDispNode && !_pDispNode->GetParentNode())
    {
        CNotification nf;

        nf.ElementAddAdorner(_pElement);
        nf.SetData((void*)this);

        _pElement->SendNotification(&nf);
    }
}
示例#3
0
文件: Benchmark.cpp 项目: Vort/VortOS
	CBenchmark()
	{
		for (dword i = 0; i < 4; i++)
			m_PerfData[i] = 0;

		m_SurfID = CreateSurface(300, 200, 256, 256 + 16);
		FillSurface(m_SurfID, 0xFFFFFFFF);
		DrawFrameRect(m_SurfID, 0, 0, 256, 256 + 16, 0xFF808080);
		ShowSurface(m_SurfID);

		KeEnableNotification(Nf_VirtualKey);
		KeEnableNotification(NfKe_TerminateProcess);

		double T = 0.0;
		dword FPS = 0;
		dword T1 = KeGetTime();
		for (;;)
		{
			for (dword i = 0; i < 6; i++)
				DrawIter(T - 4.0 * (5 - i), 0xFFFFFFFF);

			T += 1.0;
			for (dword i = 0; i < 6; i++)
				DrawIter(T - 4.0 * (5 - i), 0x004070FF | (((i + 1) * 0x10) << 24));

			WaitRedraw();
			FPS++;

			dword T2 = KeGetTime();
			if (T2 - T1 >= 1000)
			{
				dword AvgFPS = AddPerfData(FPS);
				T1 = T2;
				FPS = 0;

				ShowStat(AvgFPS);
			}


			CNotification<4> Nf;
			dword NfCount = KeGetNotificationCount();
			for (dword i = 0; i < NfCount; i++)
			{
				Nf.Recv();
				if (Nf.GetID() == Nf_VirtualKey)
				{
					if (Nf.GetByte(0) == VK_Esc)
						return;
				}
				else if (Nf.GetID() == NfKe_TerminateProcess)
					return;
			}
		}
	}
示例#4
0
void CUpdateWizard::OnEngineEvent(wxEvent& event)
{
	if (!m_pEngine)
		return;

	if (m_currentPage >= 3)
	{
		CNotification *pNotification = m_pEngine->GetNextNotification();
		while (pNotification)
		{
			delete pNotification;
			pNotification = m_pEngine->GetNextNotification();
		}
		return;
	}

	CNotification *pNotification = m_pEngine->GetNextNotification();
	while (pNotification)
	{
		switch (pNotification->GetID())
		{
		case nId_logmsg:
			{
				if (!m_loaded)
					break;

				CLogmsgNotification* pLogMsg = reinterpret_cast<CLogmsgNotification *>(pNotification);
				if (pLogMsg->msgType == Status || pLogMsg->msgType == Command)
				{
					if (!m_currentPage)
					{
						wxStaticText *pText = XRCCTRL(*this, "ID_CHECKINGTEXTPROGRESS", wxStaticText);
						wxString text = pLogMsg->msg;
						text.Replace(_T("&"), _T("&&"));
						WrapText(pText, text, m_pages[0]->GetClientSize().x);
						pText->SetLabel(text);

						m_pages[0]->GetSizer()->Layout();
						wxGauge* pProgress = XRCCTRL(*this, "ID_CHECKINGPROGRESS", wxGauge);
						int value = pProgress->GetValue();
#ifdef __WXDEBUG__
						wxASSERT(value < MAXCHECKPROGRESS);
#endif
						if (value < MAXCHECKPROGRESS)
							pProgress->SetValue(value + 1);
					}
					else if (m_currentPage == 2)
					{
						wxStaticText *pText = XRCCTRL(*this, "ID_DOWNLOADPROGRESSTEXT", wxStaticText);

						wxString text = pLogMsg->msg;
						text.Replace(_T("&"), _T("&&"));
						WrapText(pText, text, m_pages[2]->GetClientSize().x);
						pText->SetLabel(text);
						m_pages[2]->GetSizer()->Layout();
					}
				}

				wxString label;
				switch (pLogMsg->msgType)
				{
				case Error:
					label = _("Error:");
					break;
				case Status:
					label = _("Status:");
					break;
				case Command:
					label = _("Command:");
					break;
				case Response:
					label = _("Response:");
					break;
				default:
					break;
				}
				if (label != _T(""))
					m_update_log += label + _T(" ") + pLogMsg->msg + _T("\n");
			}
			break;
		case nId_operation:
			{
				COperationNotification* pOpMsg = reinterpret_cast<COperationNotification*>(pNotification);
				if (pOpMsg->nReplyCode != FZ_REPLY_OK)
				{
					while (pNotification)
					{
						delete pNotification;
						pNotification = m_pEngine->GetNextNotification();
					}
					FailedTransfer();
					return;
				}
				if (!m_inTransfer)
				{
					if (m_loaded && !m_currentPage)
					{
						wxGauge* pProgress = XRCCTRL(*this, "ID_CHECKINGPROGRESS", wxGauge);
						pProgress->SetValue(pProgress->GetValue() + 1);
					}

					int res = SendTransferCommand();
					if (res == FZ_REPLY_WOULDBLOCK)
						break;
					else if (res != FZ_REPLY_OK)
					{
						FailedTransfer();
						break;
					}
				}

				if (!m_loaded || !m_currentPage)
				{
					m_pEngine->Command(CDisconnectCommand());
					ParseData();
				}
				else if (m_currentPage == 2)
				{
					if (!VerifyChecksum())
						break;

					int pos = m_localFile.Find('.', true);
					wxASSERT(pos > 0);
					wxRenameFile(m_localFile, m_localFile.Left(pos));
					m_localFile = m_localFile.Left(pos);

					wxStaticText* pText = XRCCTRL(*this, "ID_DOWNLOADCOMPLETE", wxStaticText);
					wxASSERT(pText);

					wxButton* pNext = wxDynamicCast(FindWindow(wxID_FORWARD), wxButton);
					pNext->Enable();

					XRCCTRL(*this, "ID_DOWNLOADPROGRESS", wxGauge)->SetValue(100);
#ifdef __WXMSW__
					pText->SetLabel(_("The most recent version has been downloaded. Click on Finish to close FileZilla and to start the installation."));
#else
					pText->SetLabel(_("The most recent version has been downloaded. Please install it the same way you installed this version."));
#endif

					pText->Show();
					RewrapPage(2);

					m_successfully_downloaded = true;
				}
			}
			break;
		case nId_data:
			{
				if (!m_inTransfer)
					break;

				wxASSERT(!m_currentPage);
				CDataNotification* pOpMsg = reinterpret_cast<CDataNotification*>(pNotification);
				int len;
				char* data = pOpMsg->Detach(len);

				if (m_data.Len() + len > 131072)
				{
					delete [] data;
					m_pEngine->Command(CCancelCommand());
					FailedTransfer();
					break;
				}
				for (int i = 0; i < len; i++)
				{
					if (!data[i] || (unsigned char)data[i] > 127)
					{
						delete [] data;
						data = 0;
						m_pEngine->Command(CCancelCommand());
						FailedTransfer();
						break;
					}
				}

				if (data)
				{
					m_data += wxString(data, wxConvUTF8, len);
					delete [] data;
				}
				break;
			}
		case nId_asyncrequest:
			{
				CAsyncRequestNotification* pData = reinterpret_cast<CAsyncRequestNotification *>(pNotification);
				if (pData->GetRequestID() == reqId_fileexists)
				{
					reinterpret_cast<CFileExistsNotification *>(pData)->overwriteAction = CFileExistsNotification::overwrite;
				}
				else if (pData->GetRequestID() == reqId_certificate)
				{
					CCertificateNotification* pCertNotification = (CCertificateNotification*)pData;
					pCertNotification->m_trusted = true;
				}
				m_pEngine->SetAsyncRequestReply(pData);
			}
			break;
		case nId_transferstatus:
			if (!m_loaded)
				break;

			if (m_currentPage == 2)
			{
				CTransferStatusNotification *pTransferStatusNotification = reinterpret_cast<CTransferStatusNotification *>(pNotification);
				const CTransferStatus *pStatus = pTransferStatusNotification->GetStatus();
				SetTransferStatus(pStatus);
			}
			break;
		default:
			break;
		}
		delete pNotification;
		pNotification = m_pEngine->GetNextNotification();
	}
}
示例#5
0
文件: PS2Mouse.cpp 项目: Vort/VortOS
	CPS2Mouse()
	{
		buttonPressed[0] = false;
		buttonPressed[1] = false;

		m_Flags = 0;
		m_DeltaX = 0;
		m_DeltaY = 0;
		m_DataIndex = 0;

		KeEnableNotification(NfKe_TerminateProcess);
		KeEnableNotification(Nfi8043_MouseData);

		CNotification<1> N;
		for (;;)
		{
			KeWaitFor(1);
			N.Recv();
			if (N.GetID() == Nfi8043_MouseData)
			{
				byte Param = N.GetByte(0);

				if (m_DataIndex == 0)
				{
					byte Flags = Param;
					if (Flags & 0x8)
					{
						m_Flags = Flags;
						m_DataIndex++;
					}
				}
				else if (m_DataIndex == 1)
				{
					m_DeltaX = Param;
					m_DataIndex++;
				}
				else
				{
					m_DeltaY = Param;
					m_DataIndex = 0;

					int DeltaX = m_DeltaX;
					int DeltaY = m_DeltaY;

					DeltaX |= TestBit(m_Flags, 4) * 0xFFFFFF00;
					DeltaY |= TestBit(m_Flags, 5) * 0xFFFFFF00;
					DeltaY = -DeltaY;

					bool buttonPressedNew[2] =
					{
						TestBit(m_Flags, 0),
						TestBit(m_Flags, 1)
					};

					if ((DeltaX != 0) || (DeltaY != 0))
					{
						int moveData[2] = {DeltaX, DeltaY};
						KeNotify(Nf_MouseDeltaMove, (byte*)moveData, 8);
					}

					for (int i = 0; i < 2; i++)
					{
						if (buttonPressed[i] != buttonPressedNew[i])
						{
							if (buttonPressedNew[i])
								KeNotify(Nf_MouseButtonDown, (byte*)(&i), 1);
							else
								KeNotify(Nf_MouseButtonUp, (byte*)(&i), 1);
							buttonPressed[i] = buttonPressedNew[i];
						}
					}
				}
			}
			else if (N.GetID() == NfKe_TerminateProcess)
			{
				return;
			}
		}
	}
示例#6
0
文件: FileSys.cpp 项目: Vort/VortOS
	CFileSystem()
	{
		KeEnableNotification(NfKe_TerminateProcess);
		KeEnableNotification(NfFileSystem_AddDisk);
		KeEnableCallRequest(ClFileSystem_GetDiskCount);
		KeEnableCallRequest(ClFileSystem_ReadFile);
		KeEnableCallRequest(ClFileSystem_GetFileSize);
		KeEnableCallRequest(ClFileSystem_FindFirstFile);
		KeEnableCallRequest(ClFileSystem_FindNextFile);
		KeSetSymbol(SmFileSystem_Ready);

		CCallRequest<0x100> CR;
		CNotification<0x100> N;
		for (;;)
		{
			KeWaitFor(3);
			dword NfCount;
			dword CallCount;
			KeGetNfClCount(NfCount, CallCount);

			for (dword z = 0; z < NfCount; z++)
			{
				N.Recv();
				if (N.GetID() == NfFileSystem_AddDisk)
				{
					CFileSystemDeviceInfo FSDI;
					FSDI.m_DeviceID = N.GetDword(0);
					FSDI.m_ReadFileFunc = N.GetDword(1);
					FSDI.m_GetFileSizeFunc = N.GetDword(2);
					FSDI.m_FindFirstFileFunc = N.GetDword(3);
					FSDI.m_FindNextFileFunc = N.GetDword(4);
					m_FSDIs.PushBack(FSDI);

					KeSetSymbol(SmFileSystem_DiskReady);
				}
				else if (N.GetID() == NfKe_TerminateProcess)
					return;
			}

			for (dword z = 0; z < CallCount; z++)
			{
				CR.Recv();
				if (CR.GetTypeID() == ClFileSystem_GetDiskCount)
				{
					CR.Respond(m_FSDIs.Size());
				}
				else if (CR.GetTypeID() == ClFileSystem_ReadFile)
				{
					dword SMID = CR.GetDword(0);

					CStringA FSPath;
					CStringA Path = CStringA(PC(CR.GetBuf() + 4));
					dword FSDevID = ParsePath(Path, FSPath);

					byte Buf[256];
					(PD(Buf))[0] = SMID;
					(PD(Buf))[1] = m_FSDIs[FSDevID].m_DeviceID;
					for (dword i = 0; i < FSPath.Len(); i++)
						Buf[i + 8] = FSPath.GetCh(i);
					Buf[FSPath.Len() + 8] = 0;

					KeRequestCall(m_FSDIs[FSDevID].m_ReadFileFunc,
						Buf, FSPath.Len() + 8 + 1, null, 0);
					CR.Respond();
				}
				else if (CR.GetTypeID() == ClFileSystem_GetFileSize)
				{
					dword FileSize = 0;
					CStringA FSPath;
					CStringA Path = CStringA(PC(CR.GetBuf()));
					dword FSDevID = ParsePath(Path, FSPath);

					byte Buf[256];
					(PD(Buf))[0] = m_FSDIs[FSDevID].m_DeviceID;
					for (dword i = 0; i < FSPath.Len(); i++)
						Buf[i + 4] = FSPath.GetCh(i);
					Buf[FSPath.Len() + 4] = 0;

					KeRequestCall(m_FSDIs[FSDevID].m_GetFileSizeFunc,
						Buf, FSPath.Len() + 4 + 1, PB(&FileSize), 4);
					CR.Respond(FileSize);
				}
				else if (CR.GetTypeID() == ClFileSystem_FindFirstFile)
				{
					byte OutBuf[64];
					dword BufSize = 4;
					dword DeviceIndex = CR.GetDword(0);
					KeRequestCall(m_FSDIs[DeviceIndex].m_FindFirstFileFunc,
						PB(&m_FSDIs[DeviceIndex].m_DeviceID), 4, OutBuf, 64);
					for (; OutBuf[BufSize]; BufSize++);
					BufSize++;
					CR.Respond(PB(&OutBuf), BufSize);
				}
				else if (CR.GetTypeID() == ClFileSystem_FindNextFile)
				{
					byte OutBuf[64];
					dword BufSize = 4;
					dword PrevPosition = CR.GetDword(0);
					dword DeviceIndex = CR.GetDword(1);
					dword FindBuf[2];
					FindBuf[0] = PrevPosition;
					FindBuf[1] = m_FSDIs[DeviceIndex].m_DeviceID;
					KeRequestCall(m_FSDIs[DeviceIndex].m_FindNextFileFunc,
						PB(&FindBuf), 8, OutBuf, 64);
					for (; OutBuf[BufSize]; BufSize++);
					BufSize++;
					CR.Respond(PB(&OutBuf), BufSize);
				}
			}
		}
	}
示例#7
0
文件: i8042.cpp 项目: Vort/VortOS
	Ci8042()
	{
		m_IsScrollActive = false;
		m_IsNumActive = false;
		m_IsCapsActive = false;

		KeLinkIrq(1);
		KeLinkIrq(12);
		KeEnableNotification(NfKe_Irq);
		KeEnableNotification(NfKe_TimerTick);
		KeEnableNotification(NfKe_TerminateProcess);
		KeEnableNotification(NfKeyboard_SwitchLEDStatus);

		InitDevices();

		CNotification<16> N;
		for (;;)
		{
			KeWaitFor(1);
			dword NfCount = KeGetNotificationCount();

			for (dword z = 0; z < NfCount; z++)
			{
				N.Recv();
				if (N.GetID() == NfKe_TimerTick)
				{
					m_TimeoutTimer++;
					if (m_TimeoutTimer >= 20)
					{
						KeDisableNotification(NfKe_TimerTick);
						//DebugOut("[MouseInitTimeout]", 18);
						KeInPortByte(0x60);
						m_IsInitFinished = true;
					}
				}
				else if (N.GetID() == NfKe_Irq)
				{
					if (N.GetByte(0) == 1)
					{
						byte D = KeInPortByte(0x60);

						//DebugOut("[fK:", 4);
						//DebugOut(D);
						//DebugOut("]", 1);

						OnKeybByte(D);
						KeEndOfInterrupt(1);
					}
					else if (N.GetByte(0) == 12)
					{
						bool M = false;
						if (KeInPortByte(0x64) & 0x20)
							M = true;
						byte D = KeInPortByte(0x60);

						//if (M)
						//	DebugOut("[fM:", 4);
						//else
						//	DebugOut("[fm:", 4);
						//DebugOut(D);
						//DebugOut("]", 1);

						if (M)
							OnMouseByte(D);
						KeEndOfInterrupt(12);
					}
				}
				else if (N.GetID() == NfKeyboard_SwitchLEDStatus)
				{
					SwitchLEDStatus(N.GetByte(0));
				}
				else if (N.GetID() == NfKe_TerminateProcess)
					return;
			}

			if (KeGetNotificationCount() == 0)
			{
				if (m_LEDSwitchState == 1)
				{
					SendKeyboardData(0xED);
					m_LEDSwitchState = 2;
				}
				else if (m_LEDSwitchState == 3)
				{
					SendKeyboardData(m_LEDStatus);
					m_LEDSwitchState = 4;
				}
			}
		}
	}
示例#8
0
文件: ProcInfo.cpp 项目: Vort/VortOS
	CProcInfo()
	{
		KeWaitForSymbol(Sm_InitStage2);

		m_TickCount = 0;
		m_KernelTime = 0;
		m_VisualProgressIndex = 6;
		m_SurfaceActivated = true;

		m_X = 20;
		m_Y = 20;

		m_Width = 236;
		m_Height = m_Margin * 4 + (m_VisibleProcCount + 4) * m_FontH;

		char Digit = '0';
		KeRequestCall(ClFont_GetTextWidth, PB(&Digit), 1, PB(&m_DigitW), 4);

		m_SurfaceID = CreateSurface(m_X, m_Y, m_Width, m_Height);
		DrawActiveBorder();
		DrawRect(m_SurfaceID, 1, 1, m_Width - 2, m_Margin * 3 + m_FontH * 4 - 1, m_BGColor);
		OutText(m_SurfaceID, m_Margin, m_Margin + m_FontH * 0, 0xFFA020A0, "Page Usage:");
		OutText(m_SurfaceID, m_Margin, m_Margin + m_FontH * 1, 0xFFA020A0, "Heap Usage:");
		OutText(m_SurfaceID, m_Margin, m_Margin + m_FontH * 2, 0xFFA020A0, "Kernel Time:");

		OutText(m_SurfaceID, m_Margin+4, m_Margin*2 + m_FontH * 3, 0xFF2020A0, "ID");
		OutText(m_SurfaceID, m_Margin+18, m_Margin*2 + m_FontH * 3, 0xFF20A020, "Mem");
		OutText(m_SurfaceID, m_Margin+52, m_Margin*2 + m_FontH * 3, 0xFFA0A020, "Nf");
		OutText(m_SurfaceID, m_Margin+74, m_Margin*2 + m_FontH * 3, 0xFF20A0A0, "Usr");
		OutText(m_SurfaceID, m_Margin+104, m_Margin*2 + m_FontH * 3, 0xFF20A0A0, "Krn");
		OutText(m_SurfaceID, m_Margin+128, m_Margin*2 + m_FontH * 3, 0xFFA02020, "Name");

		KeEnableNotification(NfKe_TimerTick);
		KeEnableNotification(Nf_SurfaceActivated);
		KeEnableNotification(NfKe_TerminateProcess);

		CNotification<4> N;
		for (;;)
		{
			KeWaitFor(1);
			N.Recv();

			if (N.GetID() == Nf_SurfaceActivated)
			{
				dword activatedSurfaceID = N.GetDword(0);

				if (activatedSurfaceID == m_SurfaceID)
				{
					if (!m_SurfaceActivated)
					{
						m_SurfaceActivated = true;
						DrawActiveBorder();
					}
				}
				else
				{
					if (m_SurfaceActivated)
					{
						m_SurfaceActivated = false;
						DrawActiveBorder();
					}
				}
			}
			else if (N.GetID() == NfKe_TimerTick)
			{
				if (m_TickCount % 144 == 0)
				{
					m_ProcList.Clear();

					CProcData PD;
					char Name[128];
					dword PrevPID = 0;
					for (;;)
					{
						dword PID = KeGetNextProcessInfo(PrevPID,
							PD.m_UsedPageCount, PD.m_NotificationCount,
							PD.m_UserPerfData, PD.m_KernelPerfData, Name);
						if (PID == 0xFFFFFFFF)
							break;
						PD.m_PID = PID;
						PD.m_Name = CStringA(Name);
						m_ProcList.PushBack(PD);
						PrevPID = PID;
					}

					qword UserTotalG = 0;
					qword KernelTotalG = 0;
					for (dword i = 0; i < m_ProcList.Size(); i++)
					{
						qword UserTotalL = 0;
						qword KernelTotalL = 0;
						for (dword j = 0; j < 128; j++)
						{
							UserTotalL += m_ProcList[i].m_UserPerfData[j];
							KernelTotalL += m_ProcList[i].m_KernelPerfData[j];
						}
						m_ProcList[i].m_UserTotal = UserTotalL;
						m_ProcList[i].m_KernelTotal = KernelTotalL;

						UserTotalG += UserTotalL;
						KernelTotalG += KernelTotalL;
					}

					for (dword i = 0; i < m_ProcList.Size(); i++)
					{
						m_ProcList[i].m_UserPercent = (m_ProcList[i].m_UserTotal << 16) / UserTotalG;
						m_ProcList[i].m_KernelPercent = (m_ProcList[i].m_KernelTotal << 16) / KernelTotalG;
					}

					m_KernelTime = (KernelTotalG << 16) / (KernelTotalG + UserTotalG);


					DrawRect(m_SurfaceID, 1, m_Margin * 3 + m_FontH * 4,
						m_Width - 2, m_Height - (m_Margin * 3 + m_FontH * 4) - 1, m_BGColor);

					dword VisibleProcCount = m_ProcList.Size();
					if (VisibleProcCount > m_VisibleProcCount)
						VisibleProcCount = m_VisibleProcCount;

					for (dword i = 0; i < VisibleProcCount; i++)
					{
						char CharBuf[5] = {0};
						dword XOffset = m_Margin + 14;
						dword YOffset = m_Margin * 3 + m_FontH * (4 + i);

						OutDecimal(XOffset, YOffset, m_ProcList[i].m_PID, 0xFF2020A0);
						XOffset += 24;

						OutDecimal(XOffset, YOffset, m_ProcList[i].m_UsedPageCount, 0xFF20A020);
						XOffset += 22;

						OutDecimal(XOffset, YOffset, m_ProcList[i].m_NotificationCount, 0xFFA0A020);
						XOffset += 0;

						OutPercent(XOffset, YOffset, m_ProcList[i].m_UserPercent, 0xFF20A0A0);
						XOffset += 32;

						OutPercent(XOffset, YOffset, m_ProcList[i].m_KernelPercent, 0xFF20A0A0);
						XOffset += 36;

						OutText(m_SurfaceID, XOffset, YOffset, 0xFFA02020, m_ProcList[i].m_Name._ptr());
					}
				}

				if (m_TickCount % 24 == 0)
				{
					dword HeapUsed;
					dword HeapTotal;
					dword PageUsed;
					dword PageTotal;
					KeGetMemInfo(HeapUsed, HeapTotal, PageUsed, PageTotal);

					dword PageUsage = dword((qword(PageUsed) * 0x10000) / PageTotal);
					dword HeapUsage = dword((qword(HeapUsed) * 0x10000) / HeapTotal);

					dword KernelTime = 0;
					dword HeapColor = 0xFF20A0A0;

					if (HeapUsage > 0x9999)
						HeapColor = 0xFFF8BF16;
					if (HeapUsage > 0xB333)
						HeapColor = 0xFFFA5914;

					DrawRect(m_SurfaceID, m_Margin + 74, m_Margin, 48, m_FontH * 3, m_BGColor);
					OutPercent(m_Margin + 74, m_Margin + m_FontH * 0, PageUsage, 0xFF20A0A0, true);
					OutPercent(m_Margin + 74, m_Margin + m_FontH * 1, HeapUsage, HeapColor, true);
					OutPercent(m_Margin + 74, m_Margin + m_FontH * 2, m_KernelTime, 0xFF20A0A0, true);

					dword PrevVP = m_VisualProgressIndex;

					m_VisualProgressIndex++;
					if (m_VisualProgressIndex >= 6)
						m_VisualProgressIndex = 0;

					dword C1 = 0xFFB0B8FF;
					dword C2 = 0xFFD0D4FF;
					if (m_VisualProgressIndex == 0)
					{
						C1 = 0xFFFFA393;
						C2 = 0xFFFFCCC4;
					}
					DrawRect(m_SurfaceID, 140 + PrevVP * 12,
						m_FontH + m_Margin + 4, 8, 8, m_BGColor);
					DrawRect(m_SurfaceID, 140 + m_VisualProgressIndex * 12,
						m_FontH + m_Margin + 4, 8, 8, C1);
					DrawRect(m_SurfaceID, 140 + m_VisualProgressIndex * 12 + 1,
						m_FontH + m_Margin + 4 + 1, 6, 6, C2);
				}

				if (m_TickCount == 0)
				{
					ShowSurface(m_SurfaceID);
				}

				m_TickCount++;
			}
			else if (N.GetID() == NfKe_TerminateProcess)
			{
				return;
			}
		}
	}