亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? portmonview.cpp

?? 關(guān)于遠(yuǎn)程網(wǎng)絡(luò)監(jiān)視程序的源碼
?? CPP
?? 第 1 頁(yè) / 共 3 頁(yè)
字號(hào):
// PortMonView.cpp : CPortMonView 類的實(shí)現(xiàn)
//

#include "stdafx.h"
#include "PortMon.h"

#include "PortMonDoc.h"
#include "prochelp.h"
#include "mainfrm.h"
#include "QueueContainer.h"
#include "applicationscope.h"
#include "netdlg.h"
#include ".\portmonview.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CPortMonView

IMPLEMENT_DYNCREATE(CPortMonView, CViewExt)

BEGIN_MESSAGE_MAP(CPortMonView, CViewExt)
	ON_COMMAND(ID_OPER_CLOSEPROC, OnOperCloseProc)
	ON_UPDATE_COMMAND_UI(ID_OPER_CLOSEPROC, OnUpdateOperCloseProc)
	ON_COMMAND(ID_OPER_PREV, OnOperPrev)
	ON_COMMAND(ID_OPER_NEXT, OnOperNext)
	ON_UPDATE_COMMAND_UI(ID_OPER_PREV, OnUpdateOperPrev)
	ON_UPDATE_COMMAND_UI(ID_OPER_NEXT, OnUpdateOperNext)
	ON_WM_CONTEXTMENU()
	ON_COMMAND(ID_TOOL_PING, OnToolPing)
	ON_COMMAND(ID_TOOL_TRACERT, OnToolTracert)
	ON_COMMAND(ID_TOOL_IPADDR, OnComboIpAddrEnter)
	ON_COMMAND(ID_OPER_OPENPATH, OnOperOpenPath)
	ON_UPDATE_COMMAND_UI(ID_OPER_OPENPATH, OnUpdateOperOpenPath)
	ON_MESSAGE(WM_PROCESSNOTIFY, OnProcNotify)
	ON_WM_DESTROY()
	ON_COMMAND(ID_TOOL_WHOIS, OnToolWhois)
END_MESSAGE_MAP()

// CPortMonView 構(gòu)造/析構(gòu)

CPortMonView::CPortMonView() : CViewExt(IDV_PROCESS)
	, m_obAppScope( CApplicationScope::GetInstance(&m_obCallbackHdler) )
{
	// TODO: 在此處添加構(gòu)造代碼
	m_hLibModule = NULL;
}

CPortMonView::~CPortMonView()
{
	if(m_hLibModule)
	{
		FreeLibrary(m_hLibModule);
	}
}

BOOL CPortMonView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: 在此處通過(guò)修改 CREATESTRUCT cs 來(lái)修改窗口類或
	// 樣式

	return CViewExt::PreCreateWindow(cs);
}

void CPortMonView::OnInitialUpdate()
{
	CViewExt::OnInitialUpdate();

	// 填充 ListView。
	m_wndListExt.SetExtendedStyle( m_wndListExt.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_ONECLICKACTIVATE | LVS_EX_GRIDLINES );

	if( !LoadExIpHelperProcedures() )
	{
		AfxMessageBox( "動(dòng)態(tài)鏈接庫(kù)Iphlpapi功能函數(shù)定位失敗\n無(wú)法顯示網(wǎng)絡(luò)端口", MB_ICONINFORMATION );

		// 僅僅顯示進(jìn)程信息
		((CPortMonApp *)AfxGetApp())->m_bShowNetProc = FALSE;
	}

	// add list item and start process monitor
	m_obViewParam.SetHwnd( GetSafeHwnd() );

	CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
	pFrame->OnViewRefresh();
}

BOOL CPortMonView::LoadExIpHelperProcedures(void)
{
	m_hLibModule = LoadLibrary(_T("iphlpapi.dll"));
	if (m_hLibModule == NULL)
		return FALSE;

	// XP or later
	m_pfnAllocateAndGetTcpExTable = (PROCALLOCATEANDGETTCPEXTABLEFROMSTACK)GetProcAddress(m_hLibModule,"AllocateAndGetTcpExTableFromStack");
	if (m_pfnAllocateAndGetTcpExTable == NULL)
		return FALSE;

	// XP or later
	m_pfnAllocateAndGetUdpExTable = (PROCALLOCATEANDGETUDPEXTABLEFROMSTACK)GetProcAddress(m_hLibModule,"AllocateAndGetUdpExTableFromStack");
	if (m_pfnAllocateAndGetUdpExTable == NULL)
		return FALSE;

	return TRUE;
}

// CPortMonView 診斷

#ifdef _DEBUG
void CPortMonView::AssertValid() const
{
	CViewExt::AssertValid();
}

void CPortMonView::Dump(CDumpContext& dc) const
{
	CViewExt::Dump(dc);
}

CPortMonDoc* CPortMonView::GetDocument() const // 非調(diào)試版本是內(nèi)聯(lián)的
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CPortMonDoc)));
	return (CPortMonDoc*)m_pDocument;
}
#endif //_DEBUG


// CPortMonView 消息處理程序

void CPortMonView::AddAllNetProc(void)
{
	m_obAppScope.StopMonitoring();

	//m_mutexList.Lock();

	// clear all items existed
	m_wndListExt.SetRedraw(FALSE); // shut off redraw

	m_wndListExt.DeleteAllItems();
	int nCol = m_wndListExt.GetHeaderCtrl().GetItemCount()-1;
	while ( nCol >= 0 )
	{
		m_wndListExt.DeleteColumn(nCol--);
	}

	// add new header
	m_wndListExt.InsertColumn(COL_NETPID, "PID", LVCFMT_LEFT, 80);
	m_wndListExt.InsertColumn(COL_PROTOCOL, "協(xié)議", LVCFMT_LEFT, 80);
	m_wndListExt.InsertColumn(COL_LOCALIP, "本機(jī)IP", LVCFMT_LEFT, 120);
	m_wndListExt.InsertColumn(COL_LOCALPORT, "本機(jī)端口", LVCFMT_LEFT, 80);
	m_wndListExt.InsertColumn(COL_REMOTEIP, "遠(yuǎn)端IP", LVCFMT_LEFT,120);
	m_wndListExt.InsertColumn(COL_REMOTEPORT, "遠(yuǎn)端端口", LVCFMT_LEFT, 80);
	m_wndListExt.InsertColumn(COL_STATE, "狀態(tài)", LVCFMT_LEFT,120);
	m_wndListExt.InsertColumn(COL_NETPATH, "進(jìn)程", LVCFMT_LEFT, 300);

	//first just get the TCP table
	CString temp;
	NETPROC_S *pstNetProc;
	PMIB_TCPTABLE_EX pTcpTable = NULL;
	CPortMonDoc *pDoc = GetDocument();

	m_pfnAllocateAndGetTcpExTable(&pTcpTable, TRUE, GetProcessHeap(), 0, 2);
	for (UINT i = 0; i < pTcpTable->dwNumEntries; i++)
	{
		pstNetProc = new NETPROC_S;
		ZeroMemory( pstNetProc, sizeof(NETPROC_S) );

		// fill network process informations
		pstNetProc->stProcessKey.dwPid = pTcpTable->table[i].dwProcessId;
		pstNetProc->stProcessKey.cProtocol = (char)enTCP;
		pstNetProc->stProcessKey.dwLocalIP = pTcpTable->table[i].dwLocalAddr;
		pstNetProc->stProcessKey.wLocalPort = htons((USHORT)(pTcpTable->table[i].dwLocalPort));
		pstNetProc->stProcessKey.dwRemoteIP = pTcpTable->table[i].dwRemoteAddr;
		pstNetProc->stProcessKey.wRemotePort = htons((USHORT)(pTcpTable->table[i].dwRemotePort));

		// process state
		switch (pTcpTable->table[i].dwState)
		{
			case MIB_TCP_STATE_CLOSED:
				temp = "關(guān)閉";
				break;
			case MIB_TCP_STATE_LISTEN:
				temp = "偵聽(tīng)";
				break;
			case MIB_TCP_STATE_SYN_SENT:
				temp = "發(fā)送SYN";
				break;
			case MIB_TCP_STATE_SYN_RCVD:
				temp = "收到SYN";
				break;
			case MIB_TCP_STATE_ESTAB:
				temp = "連接建立";
				break;
			case MIB_TCP_STATE_FIN_WAIT1:
				temp = "等待FIN_1";
				break;
			case MIB_TCP_STATE_FIN_WAIT2:
				temp = "等待FIN_2";
				break;
			case MIB_TCP_STATE_CLOSE_WAIT:
				temp = "等待關(guān)閉";
				break;
			case MIB_TCP_STATE_CLOSING:
				temp = "關(guān)閉中";
				break;
			case MIB_TCP_STATE_LAST_ACK:
				temp = "最后確認(rèn)";
				break;
			case MIB_TCP_STATE_TIME_WAIT:
				temp = "等待";
				break;
			case MIB_TCP_STATE_DELETE_TCB:
				temp = "刪除";
				break;
			default:
				temp = "未知";
				break;
		}
		//StringCbCopy(pstNetProc->szState, sizeof(pstNetProc->szState), temp);
		_tcscpy( pstNetProc->szState, (LPCTSTR)temp );

		// process path name
		temp = pDoc->GetProcessNameByID(pTcpTable->table[i].dwProcessId);
		if( temp.IsEmpty() )
		{
			temp.Format( "PID = %u", pTcpTable->table[i].dwProcessId );
		}
		//StringCbCopy(pstNetProc->szPath, MAX_PATH*sizeof(TCHAR), temp);
		_tcscpy( pstNetProc->szPath, (LPCTSTR)temp );

		// insert item into list
		InsertRow( (LPARAM)pstNetProc, COL_NETMAX );
	}

	//now get the UDP table
	PMIB_UDPTABLE_EX pUdpTable = NULL;
	m_pfnAllocateAndGetUdpExTable(&pUdpTable, TRUE, GetProcessHeap(), 0, 2);
	for (UINT j = 0; j < pUdpTable->dwNumEntries; j++)
	{
		pstNetProc = new NETPROC_S;
		ZeroMemory( pstNetProc, sizeof(NETPROC_S) );

		// fill network process informations
		pstNetProc->stProcessKey.dwPid = pUdpTable->table[j].dwProcessId;
		pstNetProc->stProcessKey.cProtocol = (char)enUDP;
		pstNetProc->stProcessKey.dwLocalIP = pUdpTable->table[j].dwLocalAddr;
		pstNetProc->stProcessKey.wLocalPort = htons((USHORT)pUdpTable->table[j].dwLocalPort);

		// process name
		temp = pDoc->GetProcessNameByID(pUdpTable->table[j].dwProcessId);
		if( temp.IsEmpty() )
		{
			temp.Format( "PID = %u", pUdpTable->table[j].dwProcessId );
		}
		//StringCbCopy(pstNetProc->szPath, MAX_PATH*sizeof(TCHAR), temp);
		_tcscpy( pstNetProc->szPath, (LPCTSTR)temp );

		// insert item into list
		InsertRow( (LPARAM)pstNetProc, COL_NETMAX );
	}
	m_wndListExt.Sort(COL_NETPID);
	m_wndListExt.SetRedraw(TRUE);

	// this function will redraw the list
	m_wndListExt.AutoSizeColumns();

	// free heap allocated
	if (pTcpTable)
		HeapFree(GetProcessHeap(), 0, pTcpTable);
	if (pUdpTable)
		HeapFree(GetProcessHeap(), 0, pUdpTable);

	//m_mutexList.Unlock();
}

void CPortMonView::AddAllProc(void)
{
	//m_mutexList.Lock();

	// clear all items existed
	m_wndListExt.SetRedraw(FALSE); // shut off redraw

	m_wndListExt.DeleteAllItems();
	int nCol = m_wndListExt.GetHeaderCtrl().GetItemCount()-1;
	while ( nCol >= 0 )
	{
		m_wndListExt.DeleteColumn(nCol--);
	}

	// add new header
	m_wndListExt.InsertColumn(COL_PID, "PID", LVCFMT_LEFT, 80);
	m_wndListExt.InsertColumn(COL_PRIORITY, "優(yōu)先級(jí)", LVCFMT_LEFT, 80);
	m_wndListExt.InsertColumn(COL_THREADS, "線程數(shù)", LVCFMT_LEFT, 80);
	m_wndListExt.InsertColumn(COL_MEMUSAGE, "內(nèi)存使用", LVCFMT_LEFT, 80);
	m_wndListExt.InsertColumn(COL_PATH, "進(jìn)程", LVCFMT_LEFT, 300);

	// enumerate all process of system
	// turn on debug privilege
	CProcessHelp::EnableDebugPrivilege(TRUE);

	// using toolhelp snapshot
	SYSPROC_S *pstSysProc;
	CProcessHelp procHelp( TH32CS_SNAPPROCESS );
	PROCESSENTRY32 pe32 = {0};
	pe32.dwSize = sizeof(PROCESSENTRY32);

	BOOL bOK = procHelp.ProcessFirst(&pe32);
	while( bOK )
	{
		pstSysProc = new SYSPROC_S;
		ZeroMemory( pstSysProc, sizeof(SYSPROC_S) );

		// process ID
		pstSysProc->dwPid = pe32.th32ProcessID;
		// process priority
		pstSysProc->wPriority = (WORD)pe32.pcPriClassBase;
		// threads
		pstSysProc->wThreads = (WORD)pe32.cntThreads;

		// using toolhelp snapshot
		CProcessHelp modHelp( TH32CS_SNAPMODULE, pe32.th32ProcessID );
		MODULEENTRY32 me32 = {0};
		me32.dwSize = sizeof(MODULEENTRY32);

		BOOL bSucc = modHelp.ModuleFirst(&me32);
		if( bSucc && ( me32.th32ProcessID == pe32.th32ProcessID ) )
		{
			// process size
			pstSysProc->dwMemUsage = me32.modBaseSize;

			// process full name
			//StringCbCopy( pstSysProc->szPath, MAX_PATH*sizeof(TCHAR), me32.szExePath );
			_tcscpy( pstSysProc->szPath, me32.szExePath );
		}
		else
		{
			CString sTemp = pe32.szExeFile;
			if( sTemp.IsEmpty() )
			{
				sTemp.Format( "PID = %u", pe32.th32ProcessID );
			}
			//StringCbCopy( pstSysProc->szPath, MAX_PATH*sizeof(TCHAR), sTemp );
			_tcscpy( pstSysProc->szPath, (LPCTSTR)sTemp );
		}

		InsertRow( (LPARAM)pstSysProc, COL_SYSMAX );
		bOK = procHelp.ProcessNext(&pe32);
	}

	// turn off debug privilege
	CProcessHelp::EnableDebugPrivilege(FALSE);

	m_wndListExt.Sort(COL_PID);
	m_wndListExt.SetRedraw(TRUE); // turn on redraw

	// this function will redraw the list
	m_wndListExt.AutoSizeColumns();

	//m_mutexList.Unlock();

	// start process monitor
	m_obAppScope.StartMonitoring(&m_obViewParam);
}

void CPortMonView::OnOperCloseProc()
{
	int nItem;
	DWORD dwPID;
	CString sPID, sService;
	HANDLE hProcess;

	CPortMonDoc *pDoc = GetDocument();

	//m_mutexList.Lock();
	// get the PID of the selected items and kill them
	POSITION pos = m_wndListExt.GetFirstSelectedItemPosition();
	if(pos)
	{
		nItem = m_wndListExt.GetNextSelectedItem(pos);
		sPID = m_wndListExt.GetItemText(nItem, COL_PID);
		_stscanf( sPID.GetBuffer(), "%u", &dwPID );
		sPID.ReleaseBuffer();

		// force to close the process
		hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, dwPID );
		if (hProcess)
		{
			TerminateProcess( hProcess, 1 );
			CloseHandle( hProcess );

			RemoveProcByID(dwPID);
		}
		else
		{
			if( pDoc->KillService() )
			{
				RemoveProcByID(dwPID);
			}
		}
	}

	//m_mutexList.Unlock();
}

void CPortMonView::OnContextMenu(CWnd* pWnd, CPoint point)
{
	// TODO: 在此處添加消息處理程序代碼
    CMenu popMenu;
	popMenu.LoadMenu(IDR_POPMENU);

	CMenu *pPopMenu = popMenu.GetSubMenu(0);
	ASSERT(pPopMenu != NULL);

	CBCGPPopupMenu* pPopupMenu = new CBCGPPopupMenu;
	pPopupMenu->Create (this, point.x, point.y, pPopMenu->Detach ());
}

void CPortMonView::OnUpdateOperCloseProc(CCmdUI *pCmdUI)
{
	CPortMonDoc *pDoc = GetDocument();
	pCmdUI->Enable((m_wndListExt.GetSelectedCount() > 0) && !pDoc->IsKernService() );
}

void CPortMonView::OnItemChanged(int nItem)
{
	DWORD dwPID;
	CString sPID;
	CPortMonDoc *pDoc = GetDocument();

	if( nItem != -1 )
	{
		sPID = m_wndListExt.GetItemText( nItem, COL_PID );
		_stscanf( sPID.GetBuffer(), "%u", &dwPID );
		sPID.ReleaseBuffer();

		pDoc->SetCurProcess(dwPID);
	}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本伊人午夜精品| 亚洲高清视频在线| 免费亚洲电影在线| 色哟哟一区二区三区| 国产午夜精品久久久久久久| 天堂在线一区二区| 91麻豆精品秘密| 日本一区二区不卡视频| 精品亚洲aⅴ乱码一区二区三区| 91成人在线精品| 欧美国产激情一区二区三区蜜月| 麻豆成人免费电影| 欧美男人的天堂一二区| 亚洲美女区一区| 成人影视亚洲图片在线| 久久久亚洲精品一区二区三区| 五月天激情综合网| 在线观看日韩高清av| 成人免费一区二区三区在线观看| 国产成人免费在线视频| 精品入口麻豆88视频| 日韩一区精品视频| 欧美视频在线一区| 亚洲精品福利视频网站| 91视频免费播放| 国产精品久久久久久久裸模| 国产成人精品一区二| 国产日韩亚洲欧美综合| 国产一区二区成人久久免费影院| 91精品国产高清一区二区三区| 一区二区三区**美女毛片| 91一区二区在线| 综合欧美亚洲日本| 97超碰欧美中文字幕| 国产欧美一区二区三区在线老狼| 国产九色sp调教91| 久久蜜桃av一区二区天堂| 韩国女主播成人在线观看| 欧美成人aa大片| 久久精品国产999大香线蕉| 欧美一区二区大片| 免费的成人av| 精品国产成人在线影院| 免费高清在线一区| 亚洲精品一区在线观看| 国内精品久久久久影院色| 久久午夜免费电影| 国产激情一区二区三区| 国产亚洲美州欧州综合国| 国产麻豆精品在线| 国产精品久久久久久久久免费相片| 懂色av一区二区三区免费看| 亚洲国产经典视频| 91一区二区三区在线播放| 一区二区三区四区在线免费观看 | 亚洲电影一区二区| 欧美色视频一区| 免费av成人在线| 久久综合九色综合欧美98| 国产激情精品久久久第一区二区| 国产精品久久久久aaaa| 色欧美日韩亚洲| 午夜久久久影院| 欧美va亚洲va香蕉在线| 国产精品一卡二卡在线观看| 成人免费在线视频观看| 精品视频一区三区九区| 久久国产乱子精品免费女| 日本一区二区综合亚洲| 91蜜桃在线观看| 视频一区二区不卡| 久久久久综合网| 99九九99九九九视频精品| 亚洲国产乱码最新视频| 精品欧美久久久| jlzzjlzz亚洲女人18| 午夜精品久久久久久久久| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 91在线视频免费91| 亚洲国产欧美日韩另类综合 | 成人小视频在线观看| 亚洲激情av在线| 欧美大白屁股肥臀xxxxxx| 丁香另类激情小说| 亚洲国产精品久久一线不卡| 日韩欧美一级二级三级| 成人黄色网址在线观看| 天天色天天爱天天射综合| 国产日韩精品一区二区三区在线| 国产美女视频一区| 亚洲色图欧洲色图婷婷| 欧美精品v国产精品v日韩精品 | 国产亚洲精品资源在线26u| 色一情一乱一乱一91av| 蜜桃一区二区三区四区| 国产精品嫩草久久久久| 欧美一区二区三区成人| 91免费在线视频观看| 蜜臀av一区二区在线观看| 1000部国产精品成人观看| 91麻豆精品国产91久久久久久 | 色8久久人人97超碰香蕉987| 精品一区二区综合| 亚洲久草在线视频| 久久久国产午夜精品| 欧美日韩国产综合草草| 成人久久18免费网站麻豆| 青青草视频一区| 亚洲精品成人a在线观看| 久久伊99综合婷婷久久伊| 欧美群妇大交群中文字幕| 成人av在线播放网址| 久久国产精品99精品国产| 亚洲一二三区不卡| 一区二区中文字幕在线| 久久网这里都是精品| 91超碰这里只有精品国产| 色婷婷久久一区二区三区麻豆| 国产精品亚洲一区二区三区在线| 午夜精品久久一牛影视| 国产精品传媒视频| 国产日韩欧美高清在线| 欧美一区二区三区人| 91豆麻精品91久久久久久| 99国产精品久| 丁香一区二区三区| 国产一区欧美日韩| 麻豆国产一区二区| 日韩不卡在线观看日韩不卡视频| 又紧又大又爽精品一区二区| 国产精品久久久久久久久免费相片 | 欧美中文字幕不卡| 波多野结衣亚洲一区| 国产乱人伦精品一区二区在线观看| 日韩vs国产vs欧美| 午夜国产不卡在线观看视频| 曰韩精品一区二区| 亚洲免费伊人电影| 国产精品乱人伦| 亚洲国产精品黑人久久久| 久久久久久99精品| 日韩美女视频在线| 日韩一级完整毛片| 制服丝袜亚洲精品中文字幕| 欧美日韩国产精选| 欧美日韩在线亚洲一区蜜芽| 欧亚洲嫩模精品一区三区| 色菇凉天天综合网| 在线亚洲人成电影网站色www| 99re这里只有精品6| 99久久久国产精品免费蜜臀| 成人免费高清在线| 成人免费av网站| 99久久伊人久久99| 99精品国产99久久久久久白柏| 粉嫩av一区二区三区在线播放| 国产成人av影院| 不卡欧美aaaaa| 91丨九色丨尤物| 欧美中文字幕一二三区视频| 欧美色区777第一页| 欧美久久久影院| 日韩欧美高清dvd碟片| 日韩精品一区二区三区在线观看| 精品国精品自拍自在线| 久久奇米777| 欧美国产亚洲另类动漫| 中文字幕日韩一区| 亚洲欧美激情插 | 久久精品一区二区三区四区| 国产亚洲欧美激情| 国产精品成人免费| 亚洲情趣在线观看| 一区二区成人在线观看| 香蕉乱码成人久久天堂爱免费| 欧美aⅴ一区二区三区视频| 激情五月婷婷综合网| 国产不卡在线视频| 一本一道波多野结衣一区二区| 在线看日本不卡| 91精品国产91久久综合桃花| 精品免费国产二区三区| 国产精品欧美久久久久无广告| 亚洲视频图片小说| 天天操天天干天天综合网| 精品一区在线看| 不卡视频一二三| 欧美美女直播网站| 久久久www成人免费无遮挡大片| 国产精品久久久久久久久动漫 | 久久国产麻豆精品| 丁香婷婷综合激情五月色| 色综合久久中文综合久久97| 欧美区视频在线观看| 久久你懂得1024| 一区二区三区不卡在线观看| 老汉av免费一区二区三区| 成人精品视频网站| 在线播放/欧美激情| 国产女人18毛片水真多成人如厕|