misc/taskmgr: fixed thread mem leaks (KB104641)

git-svn-id: svn://svn.code.sf.net/p/processhacker/code@4616 21ef857c-d57f-4fe0-8362-d861dc6d29cd
This commit is contained in:
dmex
2011-09-03 16:39:33 +00:00
parent a7f28a09ec
commit e6fd75dee0
7 changed files with 120 additions and 90 deletions
+24 -20
View File
@@ -23,15 +23,13 @@
#include "taskmgr.h"
static HANDLE hApplicationThread = NULL;
static DWORD dwApplicationThread;
static uintptr_t hApplicationThread = NULL;
static UINT dwApplicationThread = NULL;
static INT GetSystemColorDepth(VOID)
{
DEVMODE pDevMode;
INT ColorDepth;
DEVMODE pDevMode = { 0 };
INT ColorDepth = 0;
pDevMode.dmSize = sizeof(DEVMODE);
pDevMode.dmDriverExtra = 0;
@@ -41,12 +39,24 @@ static INT GetSystemColorDepth(VOID)
switch (pDevMode.dmBitsPerPel)
{
case 32: ColorDepth = ILC_COLOR32; break;
case 24: ColorDepth = ILC_COLOR24; break;
case 16: ColorDepth = ILC_COLOR16; break;
case 8: ColorDepth = ILC_COLOR8; break;
case 4: ColorDepth = ILC_COLOR4; break;
default: ColorDepth = ILC_COLOR; break;
case 32:
ColorDepth = ILC_COLOR32;
break;
case 24:
ColorDepth = ILC_COLOR24;
break;
case 16:
ColorDepth = ILC_COLOR16;
break;
case 8:
ColorDepth = ILC_COLOR8;
break;
case 4:
ColorDepth = ILC_COLOR4;
break;
default:
ColorDepth = ILC_COLOR;
break;
}
return ColorDepth;
@@ -110,14 +120,8 @@ INT_PTR CALLBACK ApplicationPageWndProc(HWND hDlg, UINT message, WPARAM wParam,
UpdateApplicationListControlViewSetting();
/* Start our refresh thread */
hApplicationThread = CreateThread(NULL, 0, ApplicationPageRefreshThread, NULL, 0, &dwApplicationThread);
hApplicationThread = _beginthreadex(NULL, 0, ApplicationPageRefreshThread, NULL, 0, &dwApplicationThread);
return TRUE;
case WM_DESTROY:
/* Close refresh thread */
EndLocalThread(&hApplicationThread, dwApplicationThread);
break;
case WM_COMMAND:
/* Handle the button clicks */
@@ -209,7 +213,7 @@ void UpdateApplicationListControlViewSetting(void)
RefreshApplicationPage();
}
DWORD WINAPI ApplicationPageRefreshThread(void *lpParameter)
UINT WINAPI ApplicationPageRefreshThread(void *lpParameter)
{
MSG msg;
INT i;
+1 -1
View File
@@ -61,7 +61,7 @@ HWND hApplicationPageNewTaskButton; /* Application New Task button *
static int nApplicationPageWidth;
static int nApplicationPageHeight;
static BOOL bSortAscending = TRUE;
DWORD WINAPI ApplicationPageRefreshThread(void *lpParameter);
UINT WINAPI ApplicationPageRefreshThread(void *lpParameter);
BOOL noApps;
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam);
void AddOrUpdateHwnd(HWND hWnd, WCHAR *szTitle, HICON hIcon, BOOL bHung);
+2 -2
View File
@@ -30,10 +30,12 @@
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <process.h>
#include <windows.h>
#include <aclapi.h>
#include <commctrl.h>
#include <shellapi.h>
#include <Uxtheme.h>
#include "resource.h"
@@ -54,7 +56,6 @@
#include "priority.h"
#include "run.h"
#include "trayicon.h"
#include <Uxtheme.h>
#include "ntwin.h"
#include "phnt.h"
@@ -128,6 +129,5 @@ void TaskManager_OnMenuSelect(HWND hWnd, UINT nItemID, UINT nFlags, HMENU hSysMe
void TaskManager_OnViewUpdateSpeed(DWORD);
void TaskManager_OnTabWndSelChange(void);
LPWSTR GetLastErrorText(LPWSTR lpszBuf, DWORD dwSize);
DWORD EndLocalThread(HANDLE *hThread, DWORD dwThread);
INT_PTR CALLBACK NetworkPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
+12 -9
View File
@@ -257,7 +257,7 @@ void PerfDataRefresh(void)
memcpy(&SystemHandleInfo, SysHandleInfoData, sizeof(SYSTEM_HANDLE_INFORMATION));
HeapFree(GetProcessHeap(), 0, SysHandleInfoData);
for (CurrentKernelTime=0, Idx=0; Idx<(ULONG)SystemBasicInfo.NumberOfProcessors; Idx++)
for (CurrentKernelTime = 0, Idx = 0; Idx < (ULONG)SystemBasicInfo.NumberOfProcessors; Idx++)
{
CurrentKernelTime += Li2Double(SystemProcessorTimeInfo[Idx].KernelTime);
CurrentKernelTime += Li2Double(SystemProcessorTimeInfo[Idx].DpcTime);
@@ -321,7 +321,7 @@ void PerfDataRefresh(void)
/* so that we can establish delta values */
pPDOld = NULL;
for (Idx2=0; Idx2<ProcessCountOld; Idx2++)
for (Idx2 = 0; Idx2 < ProcessCountOld; Idx2++)
{
if (pPerfDataOld[Idx2].ProcessId == pSPI->UniqueProcessId)
{
@@ -330,11 +330,14 @@ void PerfDataRefresh(void)
}
}
if (pSPI->ImageName.Buffer) {
/* Don't assume a UNICODE_STRING Buffer is zero terminated: */
if (pSPI->ImageName.Buffer)
{
// Don't assume a UNICODE_STRING Buffer is zero terminated:
int len = pSPI->ImageName.Length / 2;
/* Check against max size and allow for terminating zero (already zeroed): */
if(len >= MAX_PATH)len=MAX_PATH - 1;
// Check against max size and allow for terminating zero (already zeroed):
if(len >= MAX_PATH)
len=MAX_PATH - 1;
wcsncpy(pPerfData[Idx].ImageName, pSPI->ImageName.Buffer, len);
}
else
@@ -389,9 +392,9 @@ void PerfDataRefresh(void)
if (hProcess)
{
/* don't query the information of the system process. It's possible but
returns Administrators as the owner of the process instead of SYSTEM */
if (pSPI->UniqueProcessId != (HANDLE)0x4)
//TODO: don't query the information of the system process???
// It's possible but returns Administrators as the owner of the process instead of SYSTEM
//if (pSPI->UniqueProcessId != (HANDLE)0x4)
{
if (OpenProcessToken(hProcess, TOKEN_QUERY, &hProcessToken))
{
+16 -17
View File
@@ -51,15 +51,15 @@ HWND hPerformancePageTotalsHandleCountEdit; /* Total Handles Edit Con
HWND hPerformancePageTotalsProcessCountEdit; /* Total Processes Edit Control */
HWND hPerformancePageTotalsThreadCountEdit; /* Total Threads Edit Control */
static HANDLE hPerformanceThread = NULL;
static DWORD dwPerformanceThread;
static uintptr_t hPerformanceThread = NULL;
static UINT dwPerformanceThread = 0;
WNDPROC OldGraphWndProc;
static int nPerformancePageWidth;
static int nPerformancePageHeight;
static int lastX, lastY;
DWORD WINAPI PerformancePageRefreshThread(void *lpParameter);
static int nPerformancePageWidth = 0;
static int nPerformancePageHeight = 0;
static int lastX = 0, lastY = 0;
UINT WINAPI PerformancePageRefreshThread(void *lpParameter);
void AdjustFrameSize(HWND hCntrl, HWND hDlg, int nXDifference, int nYDifference, int pos)
{
@@ -128,8 +128,8 @@ INT_PTR CALLBACK PerformancePageWndProc(HWND hDlg, UINT message, WPARAM wParam,
case WM_DESTROY:
GraphCtrl_Dispose(&PerformancePageCpuUsageHistoryGraph);
GraphCtrl_Dispose(&PerformancePageMemUsageHistoryGraph);
EndLocalThread(&hPerformanceThread, dwPerformanceThread);
//EndLocalThread(&hPerformanceThread, dwPerformanceThread);
break;
case WM_INITDIALOG:
@@ -198,16 +198,14 @@ INT_PTR CALLBACK PerformancePageWndProc(HWND hDlg, UINT message, WPARAM wParam,
GraphCtrl_SetPlotColor(&PerformancePageMemUsageHistoryGraph, 0, RGB(255, 255, 0)) ;
/* Start our refresh thread */
hPerformanceThread = CreateThread(NULL, 0, PerformancePageRefreshThread, NULL, 0, &dwPerformanceThread);
hPerformanceThread = _beginthreadex(NULL, 0, PerformancePageRefreshThread, NULL, 0, &dwPerformanceThread);
/*
* Subclass graph buttons
*/
OldGraphWndProc = (WNDPROC)(LONG_PTR) SetWindowLongPtrW(hPerformancePageCpuUsageGraph, GWLP_WNDPROC, (LONG_PTR)Graph_WndProc);
OldGraphCtrlWndProc = (WNDPROC)(LONG_PTR) SetWindowLongPtrW(hPerformancePageMemUsageHistoryGraph, GWLP_WNDPROC, (LONG_PTR)GraphCtrl_WndProc);
// Subclass graph buttons.
OldGraphWndProc = (WNDPROC)(LONG_PTR)SetWindowLongPtr(hPerformancePageCpuUsageGraph, GWLP_WNDPROC, (LONG_PTR)Graph_WndProc);
OldGraphCtrlWndProc = (WNDPROC)(LONG_PTR)SetWindowLongPtr(hPerformancePageMemUsageHistoryGraph, GWLP_WNDPROC, (LONG_PTR)GraphCtrl_WndProc);
SetWindowLongPtrW(hPerformancePageMemUsageGraph, GWLP_WNDPROC, (LONG_PTR)Graph_WndProc);
SetWindowLongPtrW(hPerformancePageCpuUsageHistoryGraph, GWLP_WNDPROC, (LONG_PTR)GraphCtrl_WndProc);
SetWindowLongPtr(hPerformancePageMemUsageGraph, GWLP_WNDPROC, (LONG_PTR)Graph_WndProc);
SetWindowLongPtr(hPerformancePageCpuUsageHistoryGraph, GWLP_WNDPROC, (LONG_PTR)GraphCtrl_WndProc);
return TRUE;
case WM_SIZE:
@@ -287,6 +285,7 @@ INT_PTR CALLBACK PerformancePageWndProc(HWND hDlg, UINT message, WPARAM wParam,
lastY--;
}
}
AdjustFrameSize(hPerformancePageCpuUsageFrame, hDlg, nXDifference, nYDifference, 1);
AdjustFrameSize(hPerformancePageMemUsageFrame, hDlg, nXDifference, nYDifference, 2);
AdjustFrameSize(hPerformancePageCpuUsageHistoryFrame, hDlg, nXDifference, nYDifference, 3);
@@ -308,7 +307,7 @@ void RefreshPerformancePage(void)
PostThreadMessage(dwPerformanceThread, WM_TIMER, 0, 0);
}
DWORD WINAPI PerformancePageRefreshThread(void *lpParameter)
UINT WINAPI PerformancePageRefreshThread(void *lpParameter)
{
ULONG CommitChargeTotal;
ULONG CommitChargeLimit;
+64 -40
View File
@@ -38,13 +38,13 @@ HWND hProcessPageHeaderCtrl; /* Process Header Control */
HWND hProcessPageEndProcessButton; /* Process End Process button */
HWND hProcessPageShowAllProcessesButton;/* Process Show All Processes checkbox */
static int nProcessPageWidth;
static int nProcessPageHeight;
static int nProcessPageWidth = NULL;
static int nProcessPageHeight = NULL;
static HANDLE hProcessThread = NULL;
static DWORD dwProcessThread;
static uintptr_t hProcessThread = NULL;
static UINT dwProcessThread = NULL;
int CALLBACK ProcessPageCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
int CALLBACK ProcessPageCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
void AddProcess(ULONG Index);
void UpdateProcesses();
void gethmsfromlargeint(LARGE_INTEGER largeint, DWORD *dwHours, DWORD *dwMinutes, DWORD *dwSeconds);
@@ -52,7 +52,7 @@ void ProcessPageOnNotify(WPARAM wParam, LPARAM lParam);
void CommaSeparateNumberString(LPWSTR strNumber, int nMaxCount);
void ProcessPageShowContextMenu(DWORD dwProcessId);
BOOL PerfDataGetText(ULONG Index, ULONG ColumnIndex, LPTSTR lpText, int nMaxCount);
DWORD WINAPI ProcessPageRefreshThread(void *lpParameter);
UINT WINAPI ProcessPageRefreshThread(void *lpParameter);
int ProcessRunning(ULONG ProcessId);
int ProcGetIndexByProcessId(DWORD dwProcessId)
@@ -140,19 +140,14 @@ INT_PTR CALLBACK ProcessPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPAR
AddColumns();
/*
* Subclass the process list control so we can intercept WM_ERASEBKGND
*/
OldProcessListWndProc = (WNDPROC)(LONG_PTR) SetWindowLongPtr(hProcessPageListCtrl, GWLP_WNDPROC, (LONG_PTR)ProcessListWndProc);
// Subclass the process list control so we can intercept WM_ERASEBKGND
OldProcessListWndProc = (WNDPROC)(LONG_PTR)SetWindowLongPtr(hProcessPageListCtrl, GWLP_WNDPROC, (LONG_PTR)ProcessListWndProc);
/* Start our refresh thread */
hProcessThread = CreateThread(NULL, 0, ProcessPageRefreshThread, NULL, 0, &dwProcessThread);
// Start our refresh thread
hProcessThread = _beginthreadex(NULL, 0, ProcessPageRefreshThread, NULL, 0, &dwProcessThread);
break;
case WM_DESTROY:
SaveColumnSettings();
/* Close the event handle, this will make the */
/* refresh thread exit when the wait fails */
EndLocalThread(&hProcessThread, dwProcessThread);
break;
case WM_COMMAND:
@@ -285,13 +280,13 @@ void ProcessPageOnNotify(WPARAM wParam, LPARAM lParam)
void CommaSeparateNumberString(LPWSTR strNumber, int nMaxCount)
{
WCHAR temp[260];
UINT i, j, k;
WCHAR temp[260];
UINT i = 0, j = 0, k = 0;
for (i=0,j=0; i<(wcslen(strNumber) % 3); i++, j++)
for (i = 0, j = 0; i < (wcslen(strNumber) % 3); i++, j++)
temp[j] = strNumber[i];
for (k=0; i<wcslen(strNumber); i++,j++,k++)
for (k = 0; i < wcslen(strNumber); i++, j++, k++)
{
if ((k % 3 == 0) && (j > 0))
temp[j++] = L',';
@@ -387,7 +382,7 @@ void RefreshProcessPage(void)
PostThreadMessage(dwProcessThread, WM_TIMER, 0, 0);
}
DWORD WINAPI ProcessPageRefreshThread(void *lpParameter)
UINT WINAPI ProcessPageRefreshThread(void *lpParameter)
{
ULONG OldProcessorUsage = 0, OldProcessCount = 0;
WCHAR szCpuUsage[256], szProcesses[256];
@@ -499,21 +494,24 @@ BOOL ProcessRunning(ULONG processId)
void AddProcess(ULONG Index)
{
LPPROCESS_PAGE_LIST_ITEM pData;
int i;
LV_ITEM item;
BOOL bAlreadyInList = FALSE;
ULONG pid;
LPPROCESS_PAGE_LIST_ITEM pData = { 0 };
int i = 0;
LV_ITEM item;
BOOL bAlreadyInList = FALSE;
ULONG pid = 0;
pid = PerfDataGetProcessId(Index);
/* Check to see if it's already in our list */
for (i=0; i<ListView_GetItemCount(hProcessPageListCtrl); i++)
for (i = 0; i < ListView_GetItemCount(hProcessPageListCtrl); i++)
{
memset(&item, 0, sizeof(LV_ITEM));
item.mask = LVIF_PARAM;
item.iItem = i;
(void)ListView_GetItem(hProcessPageListCtrl, &item);
ListView_GetItem(hProcessPageListCtrl, &item);
pData = (LPPROCESS_PAGE_LIST_ITEM)item.lParam;
if (pData->ProcessId == pid)
{
@@ -528,29 +526,36 @@ void AddProcess(ULONG Index)
/* Add the item to the list */
memset(&item, 0, sizeof(LV_ITEM));
item.mask = LVIF_TEXT|LVIF_PARAM;
item.pszText = LPSTR_TEXTCALLBACK;
item.iItem = ListView_GetItemCount(hProcessPageListCtrl);
item.lParam = (LPARAM)pData;
(void)ListView_InsertItem(hProcessPageListCtrl, &item);
ListView_InsertItem(hProcessPageListCtrl, &item);
}
}
BOOL PerfDataGetText(ULONG Index, ULONG ColumnIndex, LPTSTR lpText, int nMaxCount)
{
IO_COUNTERS iocounters;
LARGE_INTEGER time;
IO_COUNTERS iocounters;
LARGE_INTEGER time;
if (ColumnDataHints[ColumnIndex] == COLUMN_IMAGENAME)
PerfDataGetImageName(Index, lpText, nMaxCount);
if (ColumnDataHints[ColumnIndex] == COLUMN_PID)
wsprintfW(lpText, L"%d", PerfDataGetProcessId(Index));
if (ColumnDataHints[ColumnIndex] == COLUMN_USERNAME)
PerfDataGetUserName(Index, lpText, nMaxCount);
if (ColumnDataHints[ColumnIndex] == COLUMN_SESSIONID)
wsprintfW(lpText, L"%d", PerfDataGetSessionId(Index));
if (ColumnDataHints[ColumnIndex] == COLUMN_CPUUSAGE)
wsprintfW(lpText, L"%02d", PerfDataGetCPUUsage(Index));
if (ColumnDataHints[ColumnIndex] == COLUMN_CPUTIME)
{
DWORD dwHours;
@@ -559,76 +564,90 @@ BOOL PerfDataGetText(ULONG Index, ULONG ColumnIndex, LPTSTR lpText, int nMaxCoun
time = PerfDataGetCPUTime(Index);
gethmsfromlargeint(time, &dwHours, &dwMinutes, &dwSeconds);
wsprintfW(lpText, L"%d:%02d:%02d", dwHours, dwMinutes, dwSeconds);
wsprintf(lpText, L"%d:%02d:%02d", dwHours, dwMinutes, dwSeconds);
}
if (ColumnDataHints[ColumnIndex] == COLUMN_MEMORYUSAGE)
{
wsprintfW(lpText, L"%d", PerfDataGetWorkingSetSizeBytes(Index) / 1024);
wsprintf(lpText, L"%d", PerfDataGetWorkingSetSizeBytes(Index) / 1024);
CommaSeparateNumberString(lpText, nMaxCount);
wcscat(lpText, L" K");
}
if (ColumnDataHints[ColumnIndex] == COLUMN_PEAKMEMORYUSAGE)
{
wsprintfW(lpText, L"%d", PerfDataGetPeakWorkingSetSizeBytes(Index) / 1024);
wsprintf(lpText, L"%d", PerfDataGetPeakWorkingSetSizeBytes(Index) / 1024);
CommaSeparateNumberString(lpText, nMaxCount);
wcscat(lpText, L" K");
}
if (ColumnDataHints[ColumnIndex] == COLUMN_MEMORYUSAGEDELTA)
{
wsprintfW(lpText, L"%d", PerfDataGetWorkingSetSizeDelta(Index) / 1024);
wsprintf(lpText, L"%d", PerfDataGetWorkingSetSizeDelta(Index) / 1024);
CommaSeparateNumberString(lpText, nMaxCount);
wcscat(lpText, L" K");
}
if (ColumnDataHints[ColumnIndex] == COLUMN_PAGEFAULTS)
{
wsprintfW(lpText, L"%d", PerfDataGetPageFaultCount(Index));
wsprintf(lpText, L"%d", PerfDataGetPageFaultCount(Index));
CommaSeparateNumberString(lpText, nMaxCount);
}
if (ColumnDataHints[ColumnIndex] == COLUMN_PAGEFAULTSDELTA)
{
wsprintfW(lpText, L"%d", PerfDataGetPageFaultCountDelta(Index));
wsprintf(lpText, L"%d", PerfDataGetPageFaultCountDelta(Index));
CommaSeparateNumberString(lpText, nMaxCount);
}
if (ColumnDataHints[ColumnIndex] == COLUMN_VIRTUALMEMORYSIZE)
{
wsprintfW(lpText, L"%d", PerfDataGetVirtualMemorySizeBytes(Index) / 1024);
wsprintf(lpText, L"%d", PerfDataGetVirtualMemorySizeBytes(Index) / 1024);
CommaSeparateNumberString(lpText, nMaxCount);
wcscat(lpText, L" K");
}
if (ColumnDataHints[ColumnIndex] == COLUMN_PAGEDPOOL)
{
wsprintfW(lpText, L"%d", PerfDataGetPagedPoolUsagePages(Index) / 1024);
CommaSeparateNumberString(lpText, nMaxCount);
wcscat(lpText, L" K");
}
if (ColumnDataHints[ColumnIndex] == COLUMN_NONPAGEDPOOL)
{
wsprintfW(lpText, L"%d", PerfDataGetNonPagedPoolUsagePages(Index) / 1024);
wsprintf(lpText, L"%d", PerfDataGetNonPagedPoolUsagePages(Index) / 1024);
CommaSeparateNumberString(lpText, nMaxCount);
wcscat(lpText, L" K");
}
if (ColumnDataHints[ColumnIndex] == COLUMN_BASEPRIORITY)
wsprintfW(lpText, L"%d", PerfDataGetBasePriority(Index));
wsprintf(lpText, L"%d", PerfDataGetBasePriority(Index));
if (ColumnDataHints[ColumnIndex] == COLUMN_HANDLECOUNT)
{
wsprintfW(lpText, L"%d", PerfDataGetHandleCount(Index));
wsprintf(lpText, L"%d", PerfDataGetHandleCount(Index));
CommaSeparateNumberString(lpText, nMaxCount);
}
if (ColumnDataHints[ColumnIndex] == COLUMN_THREADCOUNT)
{
wsprintfW(lpText, L"%d", PerfDataGetThreadCount(Index));
CommaSeparateNumberString(lpText, nMaxCount);
}
if (ColumnDataHints[ColumnIndex] == COLUMN_USEROBJECTS)
{
wsprintfW(lpText, L"%d", PerfDataGetUSERObjectCount(Index));
CommaSeparateNumberString(lpText, nMaxCount);
}
if (ColumnDataHints[ColumnIndex] == COLUMN_GDIOBJECTS)
{
wsprintfW(lpText, L"%d", PerfDataGetGDIObjectCount(Index));
CommaSeparateNumberString(lpText, nMaxCount);
}
if (ColumnDataHints[ColumnIndex] == COLUMN_IOREADS)
{
PerfDataGetIOCounters(Index, &iocounters);
@@ -636,6 +655,7 @@ BOOL PerfDataGetText(ULONG Index, ULONG ColumnIndex, LPTSTR lpText, int nMaxCoun
_ui64tow(iocounters.ReadOperationCount, lpText, 10);
CommaSeparateNumberString(lpText, nMaxCount);
}
if (ColumnDataHints[ColumnIndex] == COLUMN_IOWRITES)
{
PerfDataGetIOCounters(Index, &iocounters);
@@ -643,6 +663,7 @@ BOOL PerfDataGetText(ULONG Index, ULONG ColumnIndex, LPTSTR lpText, int nMaxCoun
_ui64tow(iocounters.WriteOperationCount, lpText, 10);
CommaSeparateNumberString(lpText, nMaxCount);
}
if (ColumnDataHints[ColumnIndex] == COLUMN_IOOTHER)
{
PerfDataGetIOCounters(Index, &iocounters);
@@ -650,6 +671,7 @@ BOOL PerfDataGetText(ULONG Index, ULONG ColumnIndex, LPTSTR lpText, int nMaxCoun
_ui64tow(iocounters.OtherOperationCount, lpText, 10);
CommaSeparateNumberString(lpText, nMaxCount);
}
if (ColumnDataHints[ColumnIndex] == COLUMN_IOREADBYTES)
{
PerfDataGetIOCounters(Index, &iocounters);
@@ -657,6 +679,7 @@ BOOL PerfDataGetText(ULONG Index, ULONG ColumnIndex, LPTSTR lpText, int nMaxCoun
_ui64tow(iocounters.ReadTransferCount, lpText, 10);
CommaSeparateNumberString(lpText, nMaxCount);
}
if (ColumnDataHints[ColumnIndex] == COLUMN_IOWRITEBYTES)
{
PerfDataGetIOCounters(Index, &iocounters);
@@ -664,6 +687,7 @@ BOOL PerfDataGetText(ULONG Index, ULONG ColumnIndex, LPTSTR lpText, int nMaxCoun
_ui64tow(iocounters.WriteTransferCount, lpText, 10);
CommaSeparateNumberString(lpText, nMaxCount);
}
if (ColumnDataHints[ColumnIndex] == COLUMN_IOOTHERBYTES)
{
PerfDataGetIOCounters(Index, &iocounters);
+1 -1
View File
@@ -1040,7 +1040,7 @@ LPWSTR GetLastErrorText(LPWSTR lpszBuf, DWORD dwSize)
}
else
{
lpszTemp[lstrlenW(lpszTemp)-2] = L'\0'; /*remove cr and newline character */
lpszTemp[wcslen(lpszTemp)-2] = L'\0'; /*remove cr and newline character */
wsprintf(lpszBuf, L"%s (0x%x)", lpszTemp, (int)GetLastError());
}