Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

148 lines
4.0 KiB

#include "pch.h"
#pragma hdrstop
#include "edc.h"
#include "ncnetcfg.h"
#include "netcfgn.h"
#include "winstall.h"
struct INSTALL_PROGRESS_DATA
{
CWizard* pWizard;
HWND hwndProgress; // NULL if no progress window
UINT nProgressDelta;
};
// type of PFN_EDC_CALLBACK
VOID
CALLBACK
InstallCallback (
IN EDC_CALLBACK_MESSAGE Message,
IN ULONG_PTR MessageData,
IN PVOID pvCallerData OPTIONAL)
{
TraceFileFunc(ttidGuiModeSetup);
INSTALL_PROGRESS_DATA* pCallbackData;
UpgradeData* pUpgradeData;
pCallbackData = (INSTALL_PROGRESS_DATA*)pvCallerData;
Assert (pCallbackData);
if ( !pCallbackData ) {
return;
}
Assert (pCallbackData->pWizard);
if ( !pCallbackData->pWizard ) {
return;
}
pUpgradeData = (UpgradeData*)pCallbackData->pWizard->GetPageData(IDD_Upgrade);
Assert(pUpgradeData);
if ( !pUpgradeData ) {
return;
}
if (EDC_INDICATE_COUNT == Message)
{
// 0-nCurrentCap and (c_nMaxProgressRange - 10) through
// c_nMaxProgressRange are spoken for. So the the delta is the
// number of items to install divided into the range remaining.
//
UINT Count = (UINT)MessageData;
pCallbackData->nProgressDelta =
((c_nMaxProgressRange - 10) - pUpgradeData->nCurrentCap) / Count;
}
else if (EDC_INDICATE_ENTRY == Message)
{
const EDC_ENTRY* pEntry = (const EDC_ENTRY*)MessageData;
NETWORK_INSTALL_PARAMS nip = {0};
nip.dwSetupFlags = NSF_PRIMARYINSTALL;
if (pCallbackData->hwndProgress)
{
OnUpgradeUpdateProgressCap (
pCallbackData->hwndProgress,
pCallbackData->pWizard,
pUpgradeData->nCurrentCap + pCallbackData->nProgressDelta);
}
(VOID) HrInstallComponentOboUser(
pCallbackData->pWizard->PNetCfg(),
&nip,
*pEntry->pguidDevClass,
pEntry->pszInfId,
NULL);
}
}
VOID
InstallDefaultComponents (
IN CWizard* pWizard,
IN DWORD dwSetupFlags,
IN HWND hwndProgress OPTIONAL)
{
TraceFileFunc(ttidGuiModeSetup);
INSTALL_PROGRESS_DATA CallbackData = {0};
CallbackData.pWizard = pWizard;
CallbackData.hwndProgress = hwndProgress;
EnumDefaultComponents (
dwSetupFlags,
InstallCallback,
&CallbackData);
}
VOID
InstallDefaultComponentsIfNeeded (
IN CWizard* pWizard)
{
TraceFileFunc(ttidGuiModeSetup);
HRESULT hr = S_OK;
BOOL fNetworkingPresent = FALSE;
// If at least one LAN capable protocol is installed then networking is installed
//
Assert(NULL != pWizard->PNetCfg());
CIterNetCfgComponent nccIter(pWizard->PNetCfg(), &GUID_DEVCLASS_NETTRANS);
INetCfgComponent* pncc;
while (!fNetworkingPresent && SUCCEEDED(hr) &&
(S_OK == (hr = nccIter.HrNext (&pncc))))
{
// Hack (Sort of) - Basically we want to install default networking if networking is
// not already installed. Unfortunately Ndiswan can bind to ndisatm, so using the
// "Can the protocol bind to an adapter?" is not sufficent. given that the users
// impression of is networking installed, is really based on what they can visually
// see in the UI. We'll (and this is the hack part), ignore hidden protocols when
// considering if a protocol can bind to and adapter.
DWORD dwCharacteristics;
hr = pncc->GetCharacteristics(&dwCharacteristics);
if (SUCCEEDED(hr) && !(dwCharacteristics & NCF_HIDDEN))
{
// Check if the protocol binds to "Lan" type adapter interfaces
//
hr = HrIsLanCapableProtocol(pncc);
if (S_OK == hr)
{
fNetworkingPresent = TRUE;
}
}
ReleaseObj(pncc);
}
if (!fNetworkingPresent)
{
InstallDefaultComponents(pWizard, EDC_DEFAULT, NULL);
}
}