windows-nt/Source/XPSP1/NT/shell/osshell/snapins/devmgr/snapin/hwprof.cpp
2020-09-26 16:20:57 +08:00

174 lines
3.4 KiB
C++

/*++
Copyright (C) 1997-1999 Microsoft Corporation
Module Name:
hwprof.cpp
Abstract:
This module implements CHwProfileList and CHwProfile classes.
Author:
William Hsieh (williamh) created
Revision History:
--*/
#include "devmgr.h"
#include "hwprof.h"
BOOL
CHwProfileList::Create(
CDevice* pDevice,
DWORD ConfigFlags
)
{
// first get the current profile index.
HWPROFILEINFO HwProfileInfo;
ASSERT(pDevice);
m_pDevice = pDevice;
// get the current profile index.
if (!m_pDevice->m_pMachine->CmGetCurrentHwProfile(&m_CurHwProfile))
return FALSE;
// go through each profile and create a CHwProfile for it
int Index = 0;
CHwProfile* phwpf;
while (m_pDevice->m_pMachine->CmGetHwProfileInfo(Index, &HwProfileInfo))
{
DWORD hwpfFlags;
// get the hwprofile flags for this device
// if failed, use the given ConfigFlags
if (m_pDevice->m_pMachine->CmGetHwProfileFlags((
LPTSTR)m_pDevice->GetDeviceID(),
HwProfileInfo.HWPI_ulHWProfile,
&hwpfFlags))
{
if (hwpfFlags & CSCONFIGFLAG_DO_NOT_CREATE)
{
// skip this profile
Index++;
continue;
}
}
else
{
// flags have not been set for this profile yet.
hwpfFlags = ConfigFlags;
}
ASSERT(CONFIGFLAG_DISABLED == CSCONFIGFLAG_DISABLED);
hwpfFlags |= ConfigFlags;
// rememeber current hw profile index
if (m_CurHwProfile == HwProfileInfo.HWPI_ulHWProfile)
m_CurHwProfileIndex = Index;
phwpf = new CHwProfile(Index, &HwProfileInfo, pDevice, hwpfFlags);
m_listProfile.AddTail(phwpf);
Index++;
}
return TRUE;
}
CHwProfileList::~CHwProfileList()
{
if (!m_listProfile.IsEmpty())
{
POSITION pos = m_listProfile.GetHeadPosition();
while (NULL != pos)
{
CHwProfile* pProfile = m_listProfile.GetNext(pos);
delete pProfile;
}
m_listProfile.RemoveAll();
}
}
BOOL
CHwProfileList::GetFirst(
CHwProfile** pphwpf,
PVOID& Context
)
{
ASSERT(pphwpf);
if (!m_listProfile.IsEmpty())
{
POSITION pos = m_listProfile.GetHeadPosition();
*pphwpf = m_listProfile.GetNext(pos);
Context = pos;
return TRUE;
}
Context = NULL;
*pphwpf = NULL;
return FALSE;
}
BOOL
CHwProfileList::GetNext(
CHwProfile** pphwpf,
PVOID& Context
)
{
ASSERT(pphwpf);
POSITION pos = (POSITION)Context;
if (NULL != pos)
{
*pphwpf = m_listProfile.GetNext(pos);
Context = pos;
return TRUE;
}
*pphwpf = NULL;
return FALSE;
}
BOOL
CHwProfileList::GetCurrentHwProfile(
CHwProfile** pphwpf
)
{
ASSERT(pphwpf);
POSITION pos = m_listProfile.FindIndex(m_CurHwProfileIndex);
*pphwpf = m_listProfile.GetAt(pos);
return TRUE;
}
ULONG
CHwProfileList::IndexToHwProfile(
int HwProfileIndex
)
{
if (HwProfileIndex >= m_listProfile.GetCount())
return 0XFFFFFFFF;
POSITION pos = m_listProfile.FindIndex(HwProfileIndex);
CHwProfile* pHwProfile = m_listProfile.GetAt(pos);
return pHwProfile->GetHwProfile();
}
CHwProfile::CHwProfile(
int Index,
PHWPROFILEINFO phwpfInfo,
CDevice* pDevice,
DWORD Flags
)
{
m_Index = Index;
m_hwpfInfo = *phwpfInfo;
m_pDevice = pDevice;
m_EnablePending = FALSE;
m_DisablePending = FALSE;
m_Flags = Flags;
}