www.pudn.com > ComputerInformation.zip > HDiskInfoPage.cpp


// Disclaimer and Copyright Information 
// HDiskInfoPage.cpp : Implementation file 
// 
// All rights reserved. 
// 
// Written by Naveen K Kohli (naveenkohli@netzero.net) 
// Version 1.0 
// 
// Distribute freely, except: don't remove my name from the source or 
// documentation (don't take credit for my work), mark your changes (don't 
// get me blamed for your possible bugs), don't alter or remove this 
// notice. 
// No warrantee of any kind, express or implied, is included with this 
// software; use at your own risk, responsibility for damages (if any) to 
// anyone resulting from the use of this software rests entirely with the 
// user. 
// 
// Send bug reports, bug fixes, enhancements, requests, flames, etc. to 
// naveenkohli@netzero.net 
/////////////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "SystemApplication.h" 
#include "HDiskInfoPage.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// HDiskInfoPage property page 
 
IMPLEMENT_DYNCREATE(HDiskInfoPage, CPropertyPage) 
 
HDiskInfoPage::HDiskInfoPage() : CPropertyPage(HDiskInfoPage::IDD) 
{ 
	//{{AFX_DATA_INIT(HDiskInfoPage) 
	m_pbstrDriveLetterArr = NULL; 
	m_pbBootableArr = NULL; 
	m_pbstrTypeArr = NULL; 
	m_plPartitionNumberArr = NULL; 
	m_plLengthArr = NULL; 
	m_plHiddenSectorsArr = NULL; 
	//}}AFX_DATA_INIT 
} 
 
HDiskInfoPage::~HDiskInfoPage() 
{ 
	if (m_pbstrDriveLetterArr != NULL) { 
		SafeArrayDestroy (m_pbstrDriveLetterArr); 
		m_pbstrDriveLetterArr = NULL; 
	} 
 
	if (m_pbBootableArr != NULL) { 
		SafeArrayDestroy (m_pbBootableArr); 
		m_pbBootableArr = NULL; 
	} 
 
	if (m_pbstrTypeArr != NULL) { 
		SafeArrayDestroy (m_pbstrTypeArr); 
		m_pbstrTypeArr = NULL; 
	} 
 
	if (m_plPartitionNumberArr != NULL) { 
		SafeArrayDestroy (m_plPartitionNumberArr); 
		m_plPartitionNumberArr = NULL; 
	} 
 
	if (m_plLengthArr != NULL) { 
		SafeArrayDestroy (m_plLengthArr); 
		m_plLengthArr = NULL; 
	} 
 
	if (m_plHiddenSectorsArr != NULL) { 
		SafeArrayDestroy (m_plHiddenSectorsArr); 
		m_plHiddenSectorsArr = NULL; 
	} 
} 
 
void HDiskInfoPage::DoDataExchange(CDataExchange* pDX) 
{ 
	CPropertyPage::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(HDiskInfoPage) 
	DDX_Control(pDX, IDC_HDISK_INFO_LIST, m_ListCtrl); 
	//}}AFX_DATA_MAP 
} 
 
 
BEGIN_MESSAGE_MAP(HDiskInfoPage, CPropertyPage) 
	//{{AFX_MSG_MAP(HDiskInfoPage) 
	ON_WM_VSCROLL() 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// HDiskInfoPage message handlers 
 
BOOL HDiskInfoPage::OnInitDialog()  
{ 
	CPropertyPage::OnInitDialog(); 
	 
	if (FAILED (GetInformation ())) { 
		AfxMessageBox (_T ("Application Failed To Get Hardisk Information From Interface Pointer"), 
			MB_ICONSTOP); 
		return TRUE; 
	} 
 
	SetListData(); 
	 
	return TRUE;  // return TRUE unless you set the focus to a control 
	              // EXCEPTION: OCX Property Pages should return FALSE 
} 
 
HRESULT HDiskInfoPage::GetInformation () 
{ 
	VARIANT bstrDriveLetterArr; 
	VARIANT bBootableArr; 
	VARIANT bstrTypeArr; 
	VARIANT lPartitionNumberArr; 
	VARIANT lLengthArr; 
	VARIANT lHiddenSectorsArr; 
 
	if (FAILED (m_pSystemInfo->GetHDiskInformation (&m_lNumberOfPartitions, &bstrDriveLetterArr, 
		&bBootableArr, &bstrTypeArr, &lPartitionNumberArr, &lLengthArr, &lHiddenSectorsArr))) { 
		return E_FAIL; 
	} 
 
	if (!(bstrDriveLetterArr.vt & VT_BSTR)) { 
		return DISP_E_TYPEMISMATCH; 
	} 
 
	if (!(bstrDriveLetterArr.vt & VT_ARRAY)) { 
		return DISP_E_TYPEMISMATCH; 
	} 
 
	if (bstrDriveLetterArr.vt & VT_BYREF) { 
		m_pbstrDriveLetterArr = * (bstrDriveLetterArr.pparray); 
	} 
	else { 
		m_pbstrDriveLetterArr = bstrDriveLetterArr.parray; 
	} 
 
	if (!(bstrTypeArr.vt & VT_BSTR)) { 
		return DISP_E_TYPEMISMATCH; 
	} 
 
	if (!(bstrTypeArr.vt & VT_ARRAY)) { 
		return DISP_E_TYPEMISMATCH; 
	} 
 
	if (bstrDriveLetterArr.vt & VT_BYREF) { 
		m_pbstrTypeArr = * (bstrTypeArr.pparray); 
	} 
	else { 
		m_pbstrTypeArr = bstrTypeArr.parray; 
	} 
 
	if (!(bBootableArr.vt & VT_BOOL)) { 
		return DISP_E_TYPEMISMATCH; 
	} 
 
	if (!(bBootableArr.vt & VT_ARRAY)) { 
		return DISP_E_TYPEMISMATCH; 
	} 
 
	if (bBootableArr.vt & VT_BYREF) { 
		m_pbBootableArr = * (bBootableArr.pparray); 
	} 
	else { 
		m_pbBootableArr = bBootableArr.parray; 
	} 
 
	if (!(lPartitionNumberArr.vt & VT_I4)) { 
		return DISP_E_TYPEMISMATCH; 
	} 
 
	if (!(lPartitionNumberArr.vt & VT_ARRAY)) { 
		return DISP_E_TYPEMISMATCH; 
	} 
 
	if (bBootableArr.vt & VT_BYREF) { 
		m_plPartitionNumberArr = * (lPartitionNumberArr.pparray); 
	} 
	else { 
		m_plPartitionNumberArr = lPartitionNumberArr.parray; 
	} 
 
	if (!(lLengthArr.vt & VT_R8)) { 
		return DISP_E_TYPEMISMATCH; 
	} 
 
	if (!(lLengthArr.vt & VT_ARRAY)) { 
		return DISP_E_TYPEMISMATCH; 
	} 
 
	if (bBootableArr.vt & VT_BYREF) { 
		m_plLengthArr = * (lLengthArr.pparray); 
	} 
	else { 
		m_plLengthArr = lLengthArr.parray; 
	} 
 
	if (!(lHiddenSectorsArr.vt & VT_I4)) { 
		return DISP_E_TYPEMISMATCH; 
	} 
 
	if (!(lHiddenSectorsArr.vt & VT_ARRAY)) { 
		return DISP_E_TYPEMISMATCH; 
	} 
 
	if (bBootableArr.vt & VT_BYREF) { 
		m_plHiddenSectorsArr = * (lHiddenSectorsArr.pparray); 
	} 
	else { 
		m_plHiddenSectorsArr = lHiddenSectorsArr.parray; 
	} 
 
	return S_OK; 
} 
 
void HDiskInfoPage::SetListData() 
{ 
 
	CString tmpStr; 
	BSTR tmpBstr; 
	VARIANT_BOOL bBootable; 
	int i = 0; 
	long lLBound, lUBound ; 
	long tmpNum; 
	double length = 0.; 
	LV_ITEM item; 
	LV_COLUMN col1, col2, col3, col4, col5, col6; 
 
	col1.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH; 
	col1.fmt = LVCFMT_LEFT; 
	col1.iSubItem = 0; 
	col1.cx = 40; 
	col1.pszText = _T ("Drive"); 
 
	col2.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH; 
	col2.fmt = LVCFMT_LEFT; 
	col2.iSubItem = 1; 
	col2.cx = 50; 
	col2.pszText = _T ("Number"); 
 
	col3.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH; 
	col3.fmt = LVCFMT_LEFT; 
	col3.iSubItem = 2; 
	col3.cx = 55; 
	col3.pszText = _T ("Bootable"); 
 
	col4.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH; 
	col4.fmt = LVCFMT_LEFT; 
	col4.iSubItem = 3; 
	col4.cx = 155; 
	col4.pszText = _T ("Type"); 
 
	col5.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH; 
	col5.fmt = LVCFMT_LEFT; 
	col5.iSubItem = 4; 
	col5.cx = 85; 
	col5.pszText = _T ("Length"); 
 
	col6.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH; 
	col6.fmt = LVCFMT_LEFT; 
	col6.iSubItem = 5; 
	col6.cx = 95; 
	col6.pszText = _T ("Hidden Sectors"); 
 
	m_ListCtrl.InsertColumn (0, &col1); 
	m_ListCtrl.InsertColumn (1, &col2); 
	m_ListCtrl.InsertColumn (2, &col3); 
	m_ListCtrl.InsertColumn (3, &col4); 
	m_ListCtrl.InsertColumn (4, &col5); 
	m_ListCtrl.InsertColumn (5, &col6); 
 
	// Get the uprrer and lower bound of arrays. And assume it will be same for all arrays. 
 
	::SafeArrayGetLBound (m_pbstrDriveLetterArr, 1, &lLBound); 
	::SafeArrayGetUBound (m_pbstrDriveLetterArr, 1, &lUBound); 
 
	for (i = lLBound; i <= lUBound; i++) { 
		item.mask = LVIF_TEXT; 
		item.iItem = i; 
		item.iSubItem = 0; 
		item.pszText = _T (" "); 
		m_ListCtrl.InsertItem (&item); 
 
		::SafeArrayGetElement (m_pbstrDriveLetterArr, (long *) &i, &tmpBstr); 
		m_ListCtrl.SetItemText (i, 0, CString (tmpBstr)); 
 
		::SafeArrayGetElement (m_pbBootableArr, (long *) &i, &bBootable); 
		tmpStr = (bBootable) ? _T ("YES") : _T ("NO"); 
		m_ListCtrl.SetItemText (i, 2, tmpStr); 
 
		::SafeArrayGetElement (m_plPartitionNumberArr, (long *) &i, &tmpNum); 
		tmpStr.Format ("%d", tmpNum); 
		m_ListCtrl.SetItemText (i, 1, tmpStr); 
 
		::SafeArrayGetElement (m_pbstrTypeArr, (long *) &i, &tmpBstr); 
		m_ListCtrl.SetItemText (i, 3, CString (tmpBstr)); 
 
		::SafeArrayGetElement (m_plLengthArr, (long *) &i, &length); 
		tmpStr.Format ("%12.0lf", length); 
		tmpStr.TrimLeft (); 
		m_ListCtrl.SetItemText (i, 4, tmpStr); 
 
		::SafeArrayGetElement (m_plHiddenSectorsArr, (long *) &i, &tmpNum); 
		tmpStr.Format ("%d", tmpNum); 
		m_ListCtrl.SetItemText (i, 5, tmpStr); 
	} 
} 
 
void HDiskInfoPage::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)  
{ 
	// TODO: Add your message handler code here and/or call default 
	 
	CPropertyPage::OnVScroll(nSBCode, nPos, pScrollBar); 
}