396 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			396 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // ListPerf.cpp : implementation file
 | |
| //
 | |
| 
 | |
| #include "stdafx.h"
 | |
| #include "ShowPerfLib.h"
 | |
| #include "ListPerf.h"
 | |
| #include "ntreg.h"
 | |
| #include "Showperflibdlg.h"
 | |
| 
 | |
| #ifdef _DEBUG
 | |
| #define new DEBUG_NEW
 | |
| #undef THIS_FILE
 | |
| static char THIS_FILE[] = __FILE__;
 | |
| #endif
 | |
| 
 | |
| /////////////////////////////////////////////////////////////////////////////
 | |
| // CListPerfDlg dialog
 | |
| 
 | |
| 
 | |
| CListPerfDlg::CListPerfDlg(CWnd* pParent /*=NULL*/)
 | |
| 	: CDialog(CListPerfDlg::IDD, pParent)
 | |
| {
 | |
| 	//{{AFX_DATA_INIT(CListPerfDlg)
 | |
| 	m_bCheckRef = FALSE;
 | |
| 	//}}AFX_DATA_INIT
 | |
| }
 | |
| 
 | |
| 
 | |
| void CListPerfDlg::DoDataExchange(CDataExchange* pDX)
 | |
| {
 | |
| 	CDialog::DoDataExchange(pDX);
 | |
| 	//{{AFX_DATA_MAP(CListPerfDlg)
 | |
| 	DDX_Control(pDX, IDOK, m_wndOK);
 | |
| 	DDX_Control(pDX, IDC_PERFLIBS, m_wndPerfLibs);
 | |
| 	DDX_Check(pDX, IDC_CHECKREF, m_bCheckRef);
 | |
| 	//}}AFX_DATA_MAP
 | |
| }
 | |
| 
 | |
| 
 | |
| BEGIN_MESSAGE_MAP(CListPerfDlg, CDialog)
 | |
| 	//{{AFX_MSG_MAP(CListPerfDlg)
 | |
| 	ON_BN_CLICKED(IDC_RESETSTATUS, OnResetstatus)
 | |
| 	ON_NOTIFY(NM_DBLCLK, IDC_PERFLIBS, OnDblclkPerflibs)
 | |
| 	ON_BN_CLICKED(IDC_REFRESH, OnRefresh)
 | |
| 	ON_BN_CLICKED(IDC_HIDEPERFS, OnHideperfs)
 | |
| 	ON_BN_CLICKED(IDC_UNHIDEPERFS, OnUnhideperfs)
 | |
| 	ON_NOTIFY(NM_CLICK, IDC_PERFLIBS, OnClickPerflibs)
 | |
| 	ON_BN_CLICKED(IDC_CHECKREF, OnCheckref)
 | |
| 	//}}AFX_MSG_MAP
 | |
| END_MESSAGE_MAP()
 | |
| 
 | |
| /////////////////////////////////////////////////////////////////////////////
 | |
| // CListPerfDlg message handlers
 | |
| 
 | |
| BOOL CListPerfDlg::OnInitDialog() 
 | |
| {
 | |
| 	CDialog::OnInitDialog();
 | |
| 	
 | |
| 	// TODO: Add extra initialization here
 | |
| 
 | |
| 	m_wndPerfLibs.InsertColumn( 0, "PerfLib", LVCFMT_LEFT, 100 );
 | |
| 	m_wndPerfLibs.InsertColumn( 1, "Status", LVCFMT_LEFT, 100 );	
 | |
| 	m_wndPerfLibs.InsertColumn( 2, "Active", LVCFMT_LEFT, 100 );	
 | |
| 
 | |
| 	AddPerfLibs();
 | |
| 
 | |
| 	return TRUE;  // return TRUE unless you set the focus to a control
 | |
| 	              // EXCEPTION: OCX Property Pages should return FALSE
 | |
| }
 | |
| 
 | |
| void CListPerfDlg::GetCurrentSelection()
 | |
| {
 | |
| 	POSITION pos = m_wndPerfLibs.GetFirstSelectedItemPosition();
 | |
| 
 | |
| 	if ( NULL != pos )
 | |
| 	{
 | |
| 		int nItem = m_wndPerfLibs.GetNextSelectedItem( pos );
 | |
| 		m_strPerfName = m_wndPerfLibs.GetItemText( nItem, 0 );
 | |
| 	}
 | |
| }
 | |
| 
 | |
| BOOL CListPerfDlg::AddPerfLibs()
 | |
| {
 | |
| 	BOOL bRet = TRUE;
 | |
| 
 | |
| 	CNTRegistry	reg;
 | |
| 	long lError;
 | |
| 	
 | |
| 	lError = reg.Open( HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services" );
 | |
| 
 | |
| 	DWORD	dwIndex = 0;
 | |
| 	DWORD	dwBuffSize = 0;
 | |
| 	WCHAR*	wszServiceName = NULL;
 | |
| 	WCHAR	wszServiceKey[512];
 | |
| 	WCHAR	wszPerformanceKey[512];
 | |
| 
 | |
| 	while ( CNTRegistry::no_error == lError )
 | |
| 	{
 | |
| 
 | |
| 		// For each service name, we will check for a performance 
 | |
| 		// key and if it exists, we will process the library
 | |
| 		// ======================================================
 | |
| 
 | |
| 		lError = reg.Enum( dwIndex, &wszServiceName , dwBuffSize );
 | |
| 
 | |
| 		if ( CNTRegistry::no_error == lError )
 | |
| 		{
 | |
| 			// Create the perfomance key path
 | |
| 			// ==============================
 | |
| 			wcscpy( wszServiceKey, L"SYSTEM\\CurrentControlSet\\Services\\" );
 | |
| 			wcscat( wszServiceKey, wszServiceName );
 | |
| 
 | |
| 			wcscpy( wszPerformanceKey, wszServiceKey );
 | |
| 			wcscat( wszPerformanceKey, L"\\Performance" );
 | |
| 
 | |
| 			CNTRegistry	subreg;
 | |
| 
 | |
| 			// Atempt to open the performance registry key for the service
 | |
| 			// ===========================================================
 | |
| 
 | |
| 			if ( CNTRegistry::no_error == subreg.Open( HKEY_LOCAL_MACHINE, wszPerformanceKey ) )
 | |
| 			{
 | |
| 				DWORD dwVal = 0;
 | |
| 				subreg.GetDWORD(L"WbemAdapStatus", &dwVal );
 | |
| 				CHAR szStatus[64];
 | |
| 				sprintf(szStatus, "0x%0.4x", dwVal );
 | |
| 
 | |
| 				int nNumItems = m_wndPerfLibs.GetItemCount();
 | |
| 
 | |
| 				CHAR szServiceName[512];
 | |
| 				wcstombs( szServiceName, wszServiceName, 512 );
 | |
| 
 | |
| 				m_wndPerfLibs.InsertItem( nNumItems, szServiceName );
 | |
| 				m_wndPerfLibs.SetItemText( nNumItems, 1, szStatus );
 | |
| 				m_wndPerfLibs.SetItemText( nNumItems, 2, "active" );
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				// Check the xPerfomance key path
 | |
| 				// ==============================
 | |
| 
 | |
| 				wcscpy( wszPerformanceKey, wszServiceKey );
 | |
| 				wcscat( wszPerformanceKey, L"\\xPerformance" );
 | |
| 
 | |
| 				CNTRegistry	subreg;
 | |
| 
 | |
| 				// Atempt to open the performance registry key for the service
 | |
| 				// ===========================================================
 | |
| 
 | |
| 				if ( CNTRegistry::no_error == subreg.Open( HKEY_LOCAL_MACHINE, wszPerformanceKey ) )
 | |
| 				{
 | |
| 					DWORD dwVal = 0;
 | |
| 					subreg.GetDWORD(L"WbemAdapStatus", &dwVal );
 | |
| 					CHAR szStatus[64];
 | |
| 					sprintf(szStatus, "0x%0.4x", dwVal );
 | |
| 
 | |
| 					int nNumItems = m_wndPerfLibs.GetItemCount();
 | |
| 
 | |
| 					CHAR szServiceName[512];
 | |
| 					wcstombs( szServiceName, wszServiceName, 512 );
 | |
| 
 | |
| 					m_wndPerfLibs.InsertItem( nNumItems, szServiceName );
 | |
| 					m_wndPerfLibs.SetItemText( nNumItems, 1, szStatus );
 | |
| 					m_wndPerfLibs.SetItemText( nNumItems, 2, "inactive" );
 | |
| 				}
 | |
| 			}	
 | |
| 		}	
 | |
| 		dwIndex++;
 | |
| 	}
 | |
| 
 | |
| 	return bRet;
 | |
| }
 | |
| 
 | |
| void CListPerfDlg::OnResetstatus() 
 | |
| {
 | |
| 	CNTRegistry	reg;
 | |
| 	long lError;
 | |
| 	
 | |
| 	lError = reg.Open( HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services" );
 | |
| 
 | |
| 	DWORD	dwIndex = 0;
 | |
| 	DWORD	dwBuffSize = 0;
 | |
| 	WCHAR*	wszServiceName = NULL;
 | |
| 	WCHAR	wszServiceKey[512];
 | |
| 	WCHAR	wszPerformanceKey[512];
 | |
| 
 | |
| 	while ( CNTRegistry::no_error == lError )
 | |
| 	{
 | |
| 
 | |
| 		// For each service name, we will check for a performance 
 | |
| 		// key and if it exists, we will process the library
 | |
| 		// ======================================================
 | |
| 
 | |
| 		lError = reg.Enum( dwIndex, &wszServiceName , dwBuffSize );
 | |
| 
 | |
| 		if ( CNTRegistry::no_error == lError )
 | |
| 		{
 | |
| 			// Create the perfomance key path
 | |
| 			// ==============================
 | |
| 			wcscpy( wszServiceKey, L"SYSTEM\\CurrentControlSet\\Services\\" );
 | |
| 			wcscat( wszServiceKey, wszServiceName );
 | |
| 
 | |
| 			wcscpy( wszPerformanceKey, wszServiceKey );
 | |
| 			wcscat( wszPerformanceKey, L"\\Performance" );
 | |
| 
 | |
| 			CNTRegistry	subreg;
 | |
| 
 | |
| 			// Atempt to open the performance registry key for the service
 | |
| 			// ===========================================================
 | |
| 
 | |
| 			if ( CNTRegistry::no_error == subreg.Open( HKEY_LOCAL_MACHINE, wszPerformanceKey ) )
 | |
| 			{
 | |
| 				subreg.SetDWORD( L"WbemAdapStatus", 0 );
 | |
| 			}
 | |
| 		}	
 | |
| 		dwIndex++;
 | |
| 	}
 | |
| 
 | |
| 	OnRefresh();
 | |
| }
 | |
| 
 | |
| void CListPerfDlg::OnClickPerflibs(NMHDR* pNMHDR, LRESULT* pResult) 
 | |
| {
 | |
| 	m_wndOK.EnableWindow();	
 | |
| 
 | |
| 	*pResult = 0;
 | |
| }
 | |
| 
 | |
| void CListPerfDlg::SelectPerfLib()
 | |
| {
 | |
| 	GetCurrentSelection();
 | |
| 
 | |
| 	CShowPerfLibDlg	dlg(m_strPerfName, m_bCheckRef);
 | |
| 
 | |
| 	dlg.DoModal();
 | |
| }
 | |
| 
 | |
| void CListPerfDlg::OnDblclkPerflibs(NMHDR* pNMHDR, LRESULT* pResult) 
 | |
| {
 | |
| 	SelectPerfLib();
 | |
| 	*pResult = 0;
 | |
| }
 | |
| 
 | |
| void CListPerfDlg::OnOK() 
 | |
| {
 | |
| 	SelectPerfLib();
 | |
| 	//CDialog::OnOK();
 | |
| }
 | |
| 
 | |
| 
 | |
| void CListPerfDlg::OnRefresh() 
 | |
| {
 | |
| 	m_wndPerfLibs.DeleteAllItems();
 | |
| 	AddPerfLibs();	
 | |
| }
 | |
| 
 | |
| void CListPerfDlg::OnHideperfs() 
 | |
| {
 | |
| 	WCHAR	wszServiceName[512];
 | |
| 	char	szServiceName[512];
 | |
| 	WCHAR	wszServiceKey[512];
 | |
| 	WCHAR	wszPerformanceKey[512];
 | |
| 
 | |
| 	UINT	uIndex = 0,
 | |
| 			uSelectedCount = m_wndPerfLibs.GetSelectedCount();
 | |
| 
 | |
| 	int		nItem = -1;
 | |
| 
 | |
| 	for ( uIndex = 0; uIndex < uSelectedCount; uIndex++ )
 | |
| 	{
 | |
| 		nItem = m_wndPerfLibs.GetNextItem( nItem, LVNI_SELECTED );
 | |
| 		m_wndPerfLibs.GetItemText( nItem, 0, szServiceName, 256 );
 | |
| 		mbstowcs( wszServiceName, szServiceName, 512 );
 | |
| 
 | |
| 		// Create the perfomance key path
 | |
| 		// ==============================
 | |
| 		wcscpy( wszServiceKey, L"SYSTEM\\CurrentControlSet\\Services\\" );
 | |
| 		wcscat( wszServiceKey, wszServiceName );
 | |
| 
 | |
| 		wcscpy( wszPerformanceKey, wszServiceKey );
 | |
| 		wcscat( wszPerformanceKey, L"\\Performance" );
 | |
| 
 | |
| 		CNTRegistry	subreg;
 | |
| 
 | |
| 		// Atempt to open the performance registry key for the service
 | |
| 		// ===========================================================
 | |
| 
 | |
| 		if ( CNTRegistry::no_error == subreg.Open( HKEY_LOCAL_MACHINE, wszPerformanceKey ) )
 | |
| 		{
 | |
| 			Swap( wszServiceName, L"Performance", L"xPerformance" );
 | |
| 		}
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	OnRefresh();
 | |
| }
 | |
| 
 | |
| void CListPerfDlg::OnUnhideperfs() 
 | |
| {
 | |
| 	WCHAR	wszServiceName[512];
 | |
| 	char	szServiceName[512];
 | |
| 	WCHAR	wszServiceKey[512];
 | |
| 	WCHAR	wszPerformanceKey[512];
 | |
| 
 | |
| 	UINT	uIndex = 0,
 | |
| 			uSelectedCount = m_wndPerfLibs.GetSelectedCount();
 | |
| 
 | |
| 	int		nItem = -1;
 | |
| 
 | |
| 	for ( uIndex = 0; uIndex < uSelectedCount; uIndex++ )
 | |
| 	{
 | |
| 		nItem = m_wndPerfLibs.GetNextItem( nItem, LVNI_SELECTED );
 | |
| 		m_wndPerfLibs.GetItemText( nItem, 0, szServiceName, 256 );
 | |
| 		mbstowcs( wszServiceName, szServiceName, 512 );
 | |
| 
 | |
| 		// Create the perfomance key path
 | |
| 		// ==============================
 | |
| 		wcscpy( wszServiceKey, L"SYSTEM\\CurrentControlSet\\Services\\" );
 | |
| 		wcscat( wszServiceKey, wszServiceName );
 | |
| 
 | |
| 		wcscpy( wszPerformanceKey, wszServiceKey );
 | |
| 		wcscat( wszPerformanceKey, L"\\xPerformance" );
 | |
| 
 | |
| 		CNTRegistry	subreg;
 | |
| 
 | |
| 		// Atempt to open the performance registry key for the service
 | |
| 		// ===========================================================
 | |
| 
 | |
| 		if ( CNTRegistry::no_error == subreg.Open( HKEY_LOCAL_MACHINE, wszPerformanceKey ) )
 | |
| 		{
 | |
| 			Swap( wszServiceName, L"xPerformance", L"Performance" );
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	OnRefresh();
 | |
| }
 | |
| 
 | |
| void CListPerfDlg::Swap( WCHAR* wszPerformanceKey, WCHAR* wszFrom, WCHAR* wszTo )
 | |
| {
 | |
| 	long	lRet = ERROR_SUCCESS;
 | |
| 
 | |
| 	WCHAR	wszPath[512];
 | |
| 	DWORD	dwDisp = 0;
 | |
| 	HKEY	hSvcKey = NULL;
 | |
| 	HKEY	hFromKey = NULL;
 | |
| 	HKEY	hToKey = NULL;
 | |
| 
 | |
| 	swprintf( wszPath, L"SYSTEM\\CurrentControlSet\\Services\\%s", wszPerformanceKey );
 | |
| 	lRet = RegOpenKeyExW( HKEY_LOCAL_MACHINE, wszPath, 0, KEY_ALL_ACCESS, &hSvcKey );
 | |
| 
 | |
| 	if ( ERROR_SUCCESS == lRet )
 | |
| 	{
 | |
| 		lRet = RegOpenKeyExW( hSvcKey, wszFrom, 0, KEY_ALL_ACCESS, &hFromKey );
 | |
| 	}
 | |
| 
 | |
| 	if ( ERROR_SUCCESS == lRet )
 | |
| 	{
 | |
| 		lRet = RegCreateKeyExW( hSvcKey, wszTo, 0, NULL, NULL, KEY_ALL_ACCESS, NULL, &hToKey, &dwDisp );
 | |
| 	}
 | |
| 
 | |
| 	// Enumerate and copy
 | |
| 	
 | |
| 	DWORD	dwIndex = 0;
 | |
| 	WCHAR	wszName[256];
 | |
| 	DWORD	dwNameSize = 256;
 | |
| 	DWORD	dwType = 0;
 | |
| 	BYTE	pBuffer[2048];
 | |
| 	DWORD	dwBufferSize = 2048;
 | |
| 
 | |
| 	while ( ERROR_SUCCESS == lRet )
 | |
| 	{
 | |
| 		dwBufferSize = 2048;
 | |
| 		dwNameSize = 256;
 | |
| 
 | |
| 		lRet = RegEnumValueW( hFromKey, dwIndex, wszName, &dwNameSize, 0, &dwType, pBuffer, &dwBufferSize );
 | |
| 		if ( ERROR_SUCCESS == lRet )
 | |
| 		{
 | |
| 			RegSetValueExW( hToKey, wszName, 0, dwType, pBuffer, dwBufferSize );
 | |
| 		}
 | |
| 
 | |
| 		dwIndex++;
 | |
| 	}
 | |
| 
 | |
| 	lRet = RegCloseKey( hFromKey );
 | |
| 	lRet = RegCloseKey( hToKey );
 | |
| 
 | |
| 	lRet = RegDeleteKeyW( hSvcKey, wszFrom );
 | |
| 	lRet = RegCloseKey( hSvcKey );
 | |
| }
 | |
| 
 | |
| void CListPerfDlg::OnCheckref() 
 | |
| {
 | |
| 	UpdateData();	
 | |
| }
 | |
| 
 |