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

📄 processmanage.cpp

📁 计算机操作系统中的重要实验
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		//为控件listview添加表头
//---------------------------------------------------------------------
		InitListViewColumns(hListView, 0, 50, "ID");	
		InitListViewColumns(hListView, 1, 100, "进程映像名");
		InitListViewColumns(hListView, 2, 60, "父进程ID");	
		InitListViewColumns(hListView, 3, 50, "线程数");
		InitListViewColumns(hListView, 4, 50, "优先级");
	//	InitListViewColumns(hListView, 5, 180 , "模块ID");
		InitListViewColumns(hListView, 5, 180 , "路径");
//---------------------------------------------------------------------
		InitListViewColumns(hDllListView, 0, 180, " 模块信息 ");	
		InitListViewColumns(hDllListView, 1, 80, " 基地址");
//----------------------------------------------------------------------
		InitListViewColumns(hThreadListView, 0, 60, "序号");
		InitListViewColumns(hThreadListView, 1, 50, "线程ID");	
		InitListViewColumns(hThreadListView, 2, 55, "优先级");
//----------------------------------------------------------------------	
		ListView_SetExtendedListViewStyle(hListView,LVS_EX_FULLROWSELECT);
		ListView_SetExtendedListViewStyle(hDllListView,LVS_EX_FULLROWSELECT);
		ListView_SetExtendedListViewStyle(hThreadListView,LVS_EX_FULLROWSELECT);
    	ShowProcess(Head);
		break;
	case WM_COMMAND:		
		switch(LOWORD(wParam))
		{
		case  IDOK:
			 ShowProcess(Head);
			break;			
		case  IDKILL:
			if( IDYES == MessageBox(hMainWindow, "确认删除该进程", "ListProcess", MB_YESNO))	
			{
				KillProcess();
	    	    ShowProcess(Head);
			}
			break;
        case  IDCANCEL:
		    DelList(Head);//彻底解除链表
			DestroyWindow(hwnd);
			break;
		}//end switch
        break;
	case WM_NOTIFY:
			switch(	((LPNMHDR) lParam)->code)
			{
			case NM_CLICK:
				ShowThreadList();
				ShowDll();
				break;
			}
			break;

		
    case WM_DESTROY:
		DelList(Head);//彻底解除链表
		PostQuitMessage (0) ;
		return 0 ;
			
	}
	return DefWindowProc (hwnd, message, wParam, lParam) ;
}
//----------------------------------------------------------------------------
//以下部分是功能的具体实现
//-----------------------------------------------------------------------------
//显示进程信息
//参数head是系统所有的进程组成的链表(见文件"ProcessInformation.h")的头指针
BOOL ShowProcess(LinkList &head)
{
	int i = 0;
	LinkList L;
	ListView_DeleteAllItems(hListView); //清空列表
	EnumProcessesInfo(L,head);
	//由提供的链条头节点,构造进程信息(id,父进程,名字,优先级,路径)链表,该函数在
	//"ProcessInformation.h"中,链表的实现也在该头文件中

	L = head->next ;
	ListView_DeleteAllItems(hListView); //清空主列表
	ListView_DeleteAllItems(hThreadListView); //清空线程列表
	ListView_DeleteAllItems(hDllListView); //清空dll模块列表
	while( NULL !=  L)
	{
		ltoa(L->dwProcessId, Buffer, 10); 
		AddItem(hListView, i, 0 ,Buffer);//添加进程id
		
		AddItem(hListView, i, 1, L->szProcessName); //进程名
		
		ltoa(L->dwParentProcessID, Buffer, 10);
		AddItem(hListView, i, 2,Buffer ); //进程的父进程id
		
		ltoa(L->dwCountOFThread, Buffer, 10);
		AddItem(hListView, i, 3,Buffer ); // 线程数
		
		ltoa(L->lPRIProcess, Buffer, 10);
		AddItem(hListView, i, 4, Buffer );//进程的优先级
		
		AddItem(hListView, i, 5, Buffer);
		AddItem(hListView, i, 5, L->szPrcessPatch);//进程路径
		i++;
		L = L->next;
	}   
	CleanList(head);
	return TRUE;
	
}
//-------------------------------------
//杀死进程
BOOL KillProcess()
{	
	DWORD dwProcessId;
	HANDLE hProcessHandle = NULL;
	int  success = 1;
	if( GetSelectItem(hListView,dwProcessId))//获得要杀死的进程的ID保存在dwProcessId中
	{
		UpdateProcessPrivilege( GetCurrentProcess(), SE_DEBUG_NAME );
       //危险动作,提高进程到特权模式,可以杀死很多运行在内核模式下的进程,该函数在"ProcessInformation.h"中  
	    hProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, TRUE, dwProcessId);
	    if (hProcessHandle != NULL)
		{
			success =TerminateProcess(hProcessHandle, 0); //结束选中进程,若成功返回0
	    	Sleep(500);
		    return TRUE;
		}
	}
	if( 1== success)
		MessageBox(hMainWindow,"不能结束该进程" ,"ListProcess",16);
	CloseHandle(hProcessHandle);
	return FALSE;
}

//======================================================
//显示选中的进程的线程情况
BOOL ShowThreadList () 
{ 
	DWORD dwProcessId;
	if(GetSelectItem(hListView, dwProcessId))//获得选中的进程的ID保存在dwProcessId中
		GetThreadInfo(dwProcessId);
	else FALSE;
	return TRUE;
}
//由某进程dwProcessId获得该进程的线程的具体情况
BOOL GetThreadInfo(DWORD dwProcessId)
{
    HANDLE        hThreadSnap = NULL; 
    BOOL          bRet        = FALSE; 
    THREADENTRY32 te32        = {0}; 	
    hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); 
    if (hThreadSnap == INVALID_HANDLE_VALUE) 
        return (FALSE); 	
    te32.dwSize = sizeof(THREADENTRY32); 
	int i = 0 ;
    if (Thread32First(hThreadSnap, &te32)) 
    { 
		ListView_DeleteAllItems(hThreadListView); //清空列表
        do 
        { 
            if (te32.th32OwnerProcessID == dwProcessId) 
            { 
				itoa (i, Buffer,10);
				AddItem(hThreadListView, i, 0, Buffer );
				
				ltoa(te32.th32ThreadID,Buffer,10);
				AddItem(hThreadListView, i, 1,Buffer );

				ltoa(te32.tpBasePri,Buffer,10);
				AddItem(hThreadListView, i, 2, Buffer );
			    i++;
            } 			
        } 
        while (Thread32Next(hThreadSnap, &te32)); 
        bRet = TRUE; 
    } 
    else 
        bRet = FALSE;         	
    CloseHandle (hThreadSnap); 	
    return (bRet); 
} 

//===================================================================
//显示选中进程调用的Dll的具体情况
BOOL ShowDll()
{
	DWORD dwProcessId = 0;
	DWORD dwModuleId = 0;
	DWORD cbMe32 = 0;
	if(GetSelectItem(hListView, dwProcessId))
	{   
        GetDllInfo(dwProcessId);       
		return TRUE;
	}
	return FALSE;
}
//由某进程dwProcessId获得该进程调用的dll
BOOL GetDllInfo (DWORD dwPID) 
{ 
	
	HMODULE hMods[1024];
    HANDLE hProcess;
    DWORD cbNeeded;
    unsigned int i;
	char szModName[MAX_PATH];
	ListView_DeleteAllItems(hDllListView); //清空列表
    hProcess = OpenProcess(  PROCESS_QUERY_INFORMATION |PROCESS_VM_READ,FALSE, dwPID);
    if( hProcess &&  EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded))
    {
        for ( i = 0; i <=(cbNeeded / sizeof(HMODULE)); i++ )
        {        			
            if ( GetModuleFileNameEx( hProcess, hMods[i], szModName,
				sizeof(szModName)))
            {
				AddItem(hDllListView, i,0, szModName);
				wsprintf(Buffer,"0x%08x",hMods[i]);
				AddItem(hDllListView, i,1, Buffer);
				if( 0 == i)
				{
					AddItem(hDllListView, ++i, 0, "=====================");
				    AddItem(hDllListView, i, 1, "========");
				}
            }
        }
		CloseHandle( hProcess );
		return TRUE;
    }
	else  
	{
		CloseHandle( hProcess );
		return FALSE;
    }
}


⌨️ 快捷键说明

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