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

📄 pviewer.c

📁 <Win2k系统编程>源码.次数为国人自编,内容丰富,还是不错的.
💻 C
📖 第 1 页 / 共 3 页
字号:
//********************************************************
//
//  PviewDlgRefreshProcess --
//
//      Refresh the process list and data in pview dialog.
//
void    PviewDlgRefreshProcess (HWND hWnd)
{
	TCHAR   szProcessString[256];
	INT     nProcess;
	INT     nIndex;
	HWND    hProcessList;
	DWORD   dwProcessIndex;
    // refresh process list
    //
    hProcessList = GetDlgItem (hWnd, PVIEW_PROCESS_LIST);
    nProcess     = GetCurSelText (hProcessList, szProcessString);
    SendMessage (hProcessList, WM_SETREDRAW, FALSE, 0);
    SendMessage (hProcessList, LB_RESETCONTENT, 0, 0);
    SendMessage (hProcessList, LB_SETITEMDATA, 0, 0);
    RefreshProcessList (hProcessList, gpProcessObject);
    // refresh process data
    //
    if (nProcess != LB_ERR)
        nIndex = ReSelectText (hProcessList, nProcess, szProcessString);
    else
        nIndex = 0;

    dwProcessIndex = SendMessage (hProcessList, LB_GETITEMDATA, nIndex, 0);
    RefreshProcessData (hWnd, gpProcessObject, dwProcessIndex);
    SendMessage (hProcessList, WM_SETREDRAW, TRUE, 0);
}

//********************************************************
//
//  PviewDlgRefreshThread --
//
//      Refresh the thread list and data in pview dialog.
//
void    PviewDlgRefreshThread (HWND hWnd)
{
	TCHAR           szThreadString[256];
	INT             nThread;
	INT             nIndex;
	HWND            hThreadList;
	DWORD           dwThreadIndex;
	PPERF_INSTANCE  pProcessInstance;
	DWORD           dwProcessIndex;
    // get process info
    //
    dwProcessIndex = GetCurSelData (hWnd, PVIEW_PROCESS_LIST);
    pProcessInstance = FindInstanceN (gpProcessObject, dwProcessIndex);
    // refresh thread list
    //
    hThreadList  = GetDlgItem (hWnd, PVIEW_THREAD_LIST);
    nThread      = GetCurSelText (hThreadList, szThreadString);
    SendMessage (hThreadList, WM_SETREDRAW, FALSE, 0);
    SendMessage (hThreadList, LB_RESETCONTENT, 0, 0);
    SendMessage (hThreadList, LB_SETITEMDATA, 0, 0);
    RefreshThreadList (hThreadList, gpThreadObject, dwProcessIndex);
    // refresh thread data
    //
    if (nThread != LB_ERR)
        nIndex = ReSelectText (hThreadList, nThread, szThreadString);
    else
        nIndex = 0;
    dwThreadIndex    = SendMessage (hThreadList, LB_GETITEMDATA, nIndex, 0);
    RefreshThreadData (hWnd,
                       gpThreadObject,
                       dwThreadIndex,
                       gpProcessObject,
                       pProcessInstance);
    SendMessage (hThreadList, WM_SETREDRAW, TRUE, 0);
}

//********************************************************
//
//  PviewDlgGetCurSelPriority --
//
//      Get the process priority of currently selected process.
//
WORD    PviewDlgGetCurSelPriority (HWND hWnd)
{
	DWORD           dwIndex;
	PPERF_INSTANCE  pInst;
    dwIndex = GetCurSelData (hWnd, PVIEW_PROCESS_LIST);
    pInst = FindInstanceN (gpProcessObject, dwIndex);
    return ProcessPriority (gpProcessObject, pInst);
}

//********************************************************
//
//  PviewDlgRefreshCurSelProcess --
//
//      Refresh the data of currently selected process.
//
void    PviewDlgRefreshCurSelProcess (HWND hWnd)
{
	DWORD   dwIndex;
    dwIndex = GetCurSelData (hWnd, PVIEW_PROCESS_LIST);
    RefreshProcessData (hWnd, gpProcessObject, dwIndex);
    PviewDlgRefreshThread (hWnd);
}

//********************************************************
//
//  PviewDlgRefreshCurSelThread --
//
//      Refresh the data of currently selected thread.
//
void    PviewDlgRefreshCurSelThread (HWND hWnd)
{
	PPERF_INSTANCE  pProcessInstance;
	DWORD           dwIndex;
    dwIndex = GetCurSelData (hWnd, PVIEW_PROCESS_LIST);
    pProcessInstance = FindInstanceN (gpProcessObject, dwIndex);
    dwIndex = GetCurSelData (hWnd, PVIEW_THREAD_LIST);
    RefreshThreadData (hWnd,
                       gpThreadObject,
                       dwIndex,
                       gpProcessObject,
                       pProcessInstance);
}
//********************************************************
//
//  PviewDlgChangePriority --
//
//      Change process priority.
//
BOOL    PviewDlgChangePriority (HWND hWnd, DWORD wParam, WORD wItem)
{
	DWORD           dwIndex;
	PPERF_INSTANCE  pInst;
	PPERF_COUNTER   pCountID;
	DWORD           *pProcessID;
	DWORD           ProcessID;
	HANDLE          hProcess;
	BOOL            bStat;

    dwIndex = GetCurSelData (hWnd, PVIEW_PROCESS_LIST);
    pInst = FindInstanceN (gpProcessObject, dwIndex);
    if (pCountID = FindCounter (gpProcessObject, PX_PROCESS_ID))
	{
        pProcessID = (DWORD *) CounterData (pInst, pCountID);
        ProcessID = *pProcessID;
	}
    else
	{
        SendDlgItemMessage (hWnd, wItem, BM_SETCHECK, 1, 0);
        SetFocus (GetDlgItem (hWnd, wItem));
        MessageBox (hWnd,
                    TEXT("Cannot find ID for this process"),
                    TEXT("Set priority"),
                    MB_ICONEXCLAMATION|MB_OK);
        return FALSE;
	}

    hProcess = OpenProcess (PROCESS_SET_INFORMATION, FALSE, ProcessID);
    if (!hProcess)
	{
        SendDlgItemMessage (hWnd, wItem, BM_SETCHECK, 1, 0);
        SetFocus (GetDlgItem (hWnd, wItem));
        MessageBox (hWnd,
                    TEXT("Unable to open the process; Priority not changed"),
                    TEXT("Set priority"),
                    MB_ICONEXCLAMATION|MB_OK);
        return FALSE;
	}
    switch (wParam)
	{
        case PVIEW_PRIORITY_HIGH:
            bStat = SetPriorityClass (hProcess, HIGH_PRIORITY_CLASS);
            break;
        case PVIEW_PRIORITY_NORMAL:
            bStat = SetPriorityClass (hProcess, NORMAL_PRIORITY_CLASS);
            break;
        case PVIEW_PRIORITY_IDL:
            bStat = SetPriorityClass (hProcess, IDLE_PRIORITY_CLASS);
            break;
	default:
	    break;
	}
    CloseHandle (hProcess);
    if (!bStat)
	{
        SendDlgItemMessage (hWnd, wItem, BM_SETCHECK, 1, 0);
        SetFocus (GetDlgItem (hWnd, wItem));
        MessageBox (hWnd,
                    TEXT("Unable to change priority"),
                    TEXT("Set priority"),
                    MB_ICONEXCLAMATION|MB_OK);
        return FALSE;
	}
   return TRUE;
}

//********************************************************
//
//  PviewDlgTerminateProcess --
//
//      Terminate the current selected process.
//
BOOL    PviewDlgTerminateProcess (HWND hPviewDlg)
{
	DWORD           dwIndex;
	PPERF_INSTANCE  pInst;
	PPERF_COUNTER   pCountID;
	DWORD           *pProcessID;
	DWORD           ProcessID;
	HANDLE          hProcess;
	TCHAR           szTemp[50];
    dwIndex = GetCurSelData (hPviewDlg, PVIEW_PROCESS_LIST);
    pInst = FindInstanceN (gpProcessObject, dwIndex);
    if (pCountID = FindCounter (gpProcessObject, PX_PROCESS_ID))
	{
        pProcessID = (DWORD *) CounterData (pInst, pCountID);
        ProcessID = *pProcessID;
	}
    else
	{
        MessageBox (hPviewDlg,
                    TEXT("Cannot find ID for this process"),
                    TEXT("Terminate Process"),
                    MB_ICONEXCLAMATION|MB_OK);
        return FALSE;
	}
    wsprintf (szTemp, TEXT("Terminate process %s (ID %#x)?"),
              InstanceName (pInst), ProcessID);
    if (MessageBox (hPviewDlg, szTemp, TEXT("Terminate Process"), MB_ICONSTOP|MB_OKCANCEL) != IDOK)
        return FALSE;
    hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, ProcessID);
    if (!hProcess)
	{
        MessageBox (hPviewDlg,
                    TEXT("Unable to open the process; Process not terminated"),
                    TEXT("Terminate Process"),
                    MB_ICONEXCLAMATION|MB_OK);
        return FALSE;
	}
    if (!TerminateProcess (hProcess, 99))
	{
        MessageBox (hPviewDlg,
                    TEXT("Unable to terminate the process."),
                    TEXT("Terminate Process"),
                    MB_ICONEXCLAMATION|MB_OK);
        CloseHandle (hProcess);
        return FALSE;
	}
    CloseHandle (hProcess);
    return TRUE;
}
/***************
MemDlg functions
***************/
//********************************************************
//
//  MemDlgProc --
//
//      MemoryDlg procedure
//
BOOL CALLBACK   MemDlgProc (HWND    hWnd,
                            UINT    wMsg,
                            WPARAM  wParam,
                            LPARAM  lParam)
{
	static HWND hPviewDlg;
    switch (wMsg)
	{
        case WM_INITDIALOG:
            hPviewDlg = (HWND)lParam;
            PostMessage (hWnd, WM_COMMAND, MEMORY_REFRESH, 0);
            break;
        case WM_QUIT:
        case WM_CLOSE:
            EndDialog (hWnd, TRUE);
            break;
        case WM_COMMAND:
            switch (LOWORD (wParam))
			{
                // get the memory statistics for the currently selected
                //  process/thread
                //
                case MEMORY_IMAGE:
                    if (HIWORD(wParam) == CBN_DBLCLK || HIWORD(wParam) == CBN_SELCHANGE)
					{
                        if (WaitForSingleObject (ghMemUpdateMutex, 0))
                            return FALSE;

                        MemDlgRefreshCurSelImage (hWnd, hPviewDlg);
                        ReleaseMutex (ghMemUpdateMutex);
					}
                    else
                        return FALSE;
                    break;
                // refresh the current memory statistics,
                //  retry if we can't get the mutex
                //
                case MEMORY_REFRESH:
                    if (WaitForSingleObject (ghMemUpdateMutex, 1000))
					{
                        // can't get the mutex, retry...
                        //
                        PostMessage (hWnd, WM_COMMAND, MEMORY_REFRESH, 0);
                        return FALSE;
					}
                    MemDlgRefresh (hWnd, hPviewDlg);
                    ReleaseMutex (ghMemUpdateMutex);
                    break;
                case IDCANCEL:
                case IDOK:
                    EndDialog (hWnd, TRUE);
                    break;
                default:
                    return FALSE;
			}
        default:
            return FALSE;
	}
    return TRUE;
}

//********************************************************
//
//  MemDlgUpdateThread --
//
//      This function runs in a separate thread to collect memory data.
//
void MemDlgUpdateThread (HWND hPviewDlg)
{
    ghMemUpdateMutex = CreateMutex (NULL, TRUE, NULL);
    ghMemUpdateEvent = CreateEvent (NULL, FALSE, FALSE, NULL);
    while (TRUE)
	{
        EnableWindow (GetDlgItem (hPviewDlg, PVIEW_MEMORY_DETAIL), FALSE);
        gpCostlyData = RefreshPerfData (ghPerfKey,
                                        INDEX_COSTLY_OBJ,
                                        gpCostlyData,
                                        &gCostlyDataSize);
        gpAddressSpaceObject  = FindObject (gpCostlyData, PX_PROCESS_ADDRESS_SPACE);
        gpThreadDetailsObject = FindObject (gpCostlyData, PX_THREAD_DETAILS);
        gpImageObject         = FindObject (gpCostlyData, PX_IMAGE);
        EnableWindow (GetDlgItem (hPviewDlg, PVIEW_MEMORY_DETAIL), TRUE);
        ReleaseMutex (ghMemUpdateMutex);
        PostMessage (hPviewDlg, WM_COMMAND, PVIEW_REFRESH_COSTLY_DATA, 0);
        WaitForSingleObject (ghMemUpdateEvent, INFINITE);
        WaitForSingleObject (ghMemUpdateMutex, INFINITE);
	}
}

//********************************************************
//
//  MemDlgRefresh --
//
//      Refresh the memory dialog.
//
void MemDlgRefresh (HWND hMemDlg, HWND hPviewDlg)
{
	HWND            hImageList;
	DWORD           dwIndex;
	BOOL            bStat;
	PPERF_INSTANCE  pInstance;
    hImageList = GetDlgItem (hMemDlg, MEMORY_IMAGE);
    SendMessage (hImageList, WM_SETREDRAW, FALSE, 0);
    SendMessage (hImageList, CB_RESETCONTENT, 0, 0);
    SendMessage (hImageList, CB_SETITEMDATA, 0, 0);
    dwIndex = GetCurSelData (hPviewDlg, PVIEW_PROCESS_LIST);

⌨️ 快捷键说明

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