1
0
mirror of https://github.com/bobranten/Ext4Fsd.git synced 2025-10-30 05:18:31 -05:00

Ext4Fsd master

This commit is contained in:
Bo Brantén
2020-01-19 19:08:53 +01:00
commit 7b368ccf09
272 changed files with 143529 additions and 0 deletions

267
Ext2Mgr/PerfStatDlg.cpp Normal file
View File

@@ -0,0 +1,267 @@
// PerfStatDlg.cpp : implementation file
//
#include "stdafx.h"
#include "ext2mgr.h"
#include "PerfStatDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CPerfStatDlg dialog
CPerfStatDlg::CPerfStatDlg(CWnd* pParent /*=NULL*/)
: CDialog(CPerfStatDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CPerfStatDlg)
m_Interval = 30;
m_Handle = 0;
//}}AFX_DATA_INIT
m_IrpList = NULL;
m_MemList = NULL;
}
void CPerfStatDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPerfStatDlg)
DDX_Text(pDX, IDC_PERFSTAT_INTERVAL, m_Interval);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CPerfStatDlg, CDialog)
//{{AFX_MSG_MAP(CPerfStatDlg)
ON_WM_TIMER()
ON_WM_DESTROY()
ON_COMMAND(ID_QUERYPERF, OnQueryPerf)
ON_EN_CHANGE(IDC_PERFSTAT_INTERVAL, OnChangePerfstatInterval)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPerfStatDlg message handlers
BOOL CPerfStatDlg::OnInitDialog()
{
LONG_PTR dwStyle = 0;
int i;
CString s;
CDialog::OnInitDialog();
m_IrpList = (CListCtrl *)GetDlgItem(IDC_IRP_LIST);
m_MemList = (CListCtrl *)GetDlgItem(IDC_MEMORY_LIST);;
if (m_IrpList == NULL || m_MemList == NULL) {
return FALSE;
}
/* initialize the memory list */
dwStyle=GetWindowLongPtr(m_MemList->GetSafeHwnd(), GWL_STYLE);
dwStyle&=~LVS_TYPEMASK;
dwStyle|= (LVS_REPORT | LVS_AUTOARRANGE);
SetWindowLongPtr(m_MemList->GetSafeHwnd(),GWL_STYLE,dwStyle);
m_MemList->SetExtendedStyle(LVS_EX_GRIDLINES);
ListView_SetExtendedListViewStyleEx (
m_MemList->GetSafeHwnd(),
LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT );
m_MemList->DeleteAllItems();
s.LoadString(IDS_PERFSTAT_NAME);
m_MemList->InsertColumn(0, (LPCSTR)s, LVCFMT_RIGHT, 100);
s.LoadString(IDS_PERFSTAT_UNIT);
m_MemList->InsertColumn(1, (LPCSTR)s, LVCFMT_RIGHT, 40);
s.LoadString(IDS_PERFSTAT_CURRENT);
m_MemList->InsertColumn(2, (LPCSTR)s, LVCFMT_RIGHT, 56);
s.LoadString(IDS_PERFSTAT_SIZE);
m_MemList->InsertColumn(3, (LPCSTR)s, LVCFMT_RIGHT, 80);
s.LoadString(IDS_PERFSTAT_TOTAL);
m_MemList->InsertColumn(4, (LPCSTR)s, LVCFMT_RIGHT, 120);
for (i = 0; PerfStatStrings[i] != NULL ; i++) {
m_MemList->InsertItem(i, PerfStatStrings[i]);
}
/* initialize the irp list */
dwStyle=GetWindowLongPtr(m_IrpList->GetSafeHwnd(), GWL_STYLE);
dwStyle&=~LVS_TYPEMASK;
dwStyle|= (LVS_REPORT | LVS_AUTOARRANGE);
SetWindowLongPtr(m_IrpList->GetSafeHwnd(),GWL_STYLE,dwStyle);
m_IrpList->SetExtendedStyle(LVS_EX_GRIDLINES);
ListView_SetExtendedListViewStyleEx (
m_IrpList->GetSafeHwnd(),
LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT );
m_IrpList->DeleteAllItems();
s.LoadString(IDS_PERFSTAT_NAME);
m_IrpList->InsertColumn(0, (LPCSTR)s, LVCFMT_RIGHT, 180);
s.LoadString(IDS_PERFSTAT_PROCESSING);
m_IrpList->InsertColumn(1, (LPCSTR)s, LVCFMT_RIGHT, 110);
s.LoadString(IDS_PERFSTAT_PROCESSED);
m_IrpList->InsertColumn(2, (LPCSTR)s, LVCFMT_RIGHT, 100);
for (i=0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++) {
m_IrpList->InsertItem(i, IrpMjStrings[i]);
}
RefreshPerfStat();
SetTimer('STAT', m_Interval * 1000, NULL);
UpdateData(FALSE);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CPerfStatDlg::RefreshPerfStat()
{
int i;
CString s;
PEXT2_PERF_STATISTICS_V1 PerfV1 = NULL;
PEXT2_PERF_STATISTICS_V2 PerfV2 = NULL;
NT::NTSTATUS status;
if (m_Handle == 0) {
status = Ext2Open("\\DosDevices\\Ext2Fsd", &m_Handle,
EXT2_DESIRED_ACCESS );
if (!NT_SUCCESS(status)) {
goto errorout;
}
}
if (Ext2QueryPerfStat(m_Handle, &m_PerfStat, &PerfV1, &PerfV2)) {
if (PerfV2) {
if (m_MemList) {
for (i = 0; i < PS_MAX_TYPE_V2; i++) {
if (PerfV2->Unit.Slot[i] == 0)
break;
else if (PerfV2->Unit.Slot[i] == 1)
s = "*";
else
s.Format("%u", PerfV2->Unit.Slot[i]);
m_MemList->SetItem(i, 1, LVIF_TEXT, (LPCSTR)s, 0, 0, 0, 0);
s.Format("%u", PerfV2->Current.Slot[i]);
m_MemList->SetItem(i, 2, LVIF_TEXT, (LPCSTR)s, 0, 0, 0, 0);
s.Format("%u", PerfV2->Size.Slot[i]);
m_MemList->SetItem(i, 3, LVIF_TEXT, (LPCSTR)s, 0, 0, 0, 0);
s.Format("%u", PerfV2->Total.Slot[i]);
m_MemList->SetItem(i, 4, LVIF_TEXT, (LPCSTR)s, 0, 0, 0, 0);
}
}
if (m_IrpList) {
for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++) {
s.Format("%u", PerfV2->Irps[i].Current);
m_IrpList->SetItem(i, 1, LVIF_TEXT, (LPCSTR)s, 0, 0, 0, 0);
s.Format("%u", PerfV2->Irps[i].Processed);
m_IrpList->SetItem(i, 2, LVIF_TEXT, (LPCSTR)s, 0, 0, 0, 0);
}
}
} else if (PerfV1) {
if (m_MemList) {
for (i = 0; i < PS_MAX_TYPE_V1; i++) {
if (PerfV1->Unit.Slot[i] == 0)
s = "*";
else
s.Format("%u", PerfV1->Unit.Slot[i]);
m_MemList->SetItem(i, 1, LVIF_TEXT, (LPCSTR)s, 0, 0, 0, 0);
s.Format("%u", PerfV1->Current.Slot[i]);
m_MemList->SetItem(i, 2, LVIF_TEXT, (LPCSTR)s, 0, 0, 0, 0);
s.Format("%u", PerfV1->Size.Slot[i]);
m_MemList->SetItem(i, 3, LVIF_TEXT, (LPCSTR)s, 0, 0, 0, 0);
s.Format("%u", PerfV1->Total.Slot[i]);
m_MemList->SetItem(i, 4, LVIF_TEXT, (LPCSTR)s, 0, 0, 0, 0);
}
}
if (m_IrpList) {
for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++) {
s.Format("%u", PerfV1->Irps[i].Current);
m_IrpList->SetItem(i, 1, LVIF_TEXT, (LPCSTR)s, 0, 0, 0, 0);
s.Format("%u", PerfV1->Irps[i].Processed);
m_IrpList->SetItem(i, 2, LVIF_TEXT, (LPCSTR)s, 0, 0, 0, 0);
}
}
}
} else {
Ext2Close(&m_Handle);
}
errorout:
return;
}
void CPerfStatDlg::OnTimer(UINT nIDEvent)
{
RefreshPerfStat();
CDialog::OnTimer(nIDEvent);
}
void CPerfStatDlg::OnDestroy()
{
KillTimer('STAT');
Ext2Close(&m_Handle);
CDialog::OnDestroy();
}
void CPerfStatDlg::OnChangePerfstatInterval()
{
UpdateData(TRUE);
if (m_Interval == 0) {
m_Interval = 1;
}
SetTimer('STAT', m_Interval * 1000, NULL);
}
void CPerfStatDlg::OnOK()
{
// TODO: Add extra validation here
KillTimer('STAT');
Ext2Close(&m_Handle);
GetParent()->PostMessage(WM_COMMAND, ID_PERFSTOP, 0);
CDialog::OnOK();
}
void CPerfStatDlg::OnCancel()
{
// TODO: Add extra validation here
KillTimer('STAT');
Ext2Close(&m_Handle);
GetParent()->PostMessage(WM_COMMAND, ID_PERFSTOP, 0);
CDialog::OnCancel();
}
void CPerfStatDlg::OnQueryPerf()
{
RefreshPerfStat();
}