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

375 lines
9.3 KiB
C++

#ifndef __TSMAIN_H__
#define __TSMAIN_H__
/*++
Copyright (C) 1997-1999 Microsoft Corporation
Module Name:
tsmain.h
Abstract:
header file for tsmain.cpp
Author:
William Hsieh (williamh) created
Revision History:
--*/
//
// Wizard32 command and parameter definitions
//
//
//
// INPUT:
// pParam -- troubleshooter parameter. The contents vary depends on
// the command specified in the block. See below
// for detail.
//
//
// OUTPUT:
// TRUE -- if the function succeeded.
// FALSE -- if the function failed. GetLastError() should be able
// to retreive the error code
typedef enum tagTShooterCommand
{
TSHOOTER_QUERY = 0,
TSHOOTER_ABOUT,
TSHOOTER_ADDPAGES
}TSHOOTER_COMMAND, *PTSHOOTER_COMMAND;
// parameter header.
typedef struct tagTShooterParamHeader
{
DWORD cbSize; // size of the entire structure
TSHOOTER_COMMAND Command; // command
}TSHOOTER_PARAMHEADER, *PTSHOOTER_PARAMHEADER;
//
// QUERY command asks the troubleshooter the following questions:
// (1). if the troubleshooter supports the given DeviceId/Problem combination.
// (2). the brief description about the troubleshooter
// (3). the ranking on the DeviceId and the problem.
// If the troubleshooter does not support the device id and problem
// combination, it should resturn FALSE and set the error code
// to ERROR_INVALID_FUNCTION. The DescBuffer and DescBufferSize
// can be ignored. If the provided DescBuffer is too small, it should
// fill DescBufferSize with the required size, set the error code
// to ERROR_INSUFFICIENT_BUFFER and return FALSE.
//
// parameter definition for TSHOOTER_QUERY command
//
// The Header.Command must be TSHOOTER_QUERY;
// The header.cbSize must be sizeof(TSHOOTER_QUERY_PARAM);
//
// IN DeviceId -- device instance id
// IN Problem -- Configuration manager defined problem number
// IN OUT DescBuffer -- buffer to receive the troubleshooter description text
// IN OUT DescBufferSize -- Description buffer size in char(byte for ANSI)
// Troubleshooter should fill this field with required
// size on return.
// OUT DeviceRank -- to receive the device ranking
// OUT ProblemRank -- to receive the problem ranking
//
//
typedef struct tagTShooterQueryParam
{
TSHOOTER_PARAMHEADER Header;
LPCTSTR DeviceId;
ULONG Problem;
LPTSTR DescBuffer;
DWORD DescBufferSize;
DWORD DeviceRank;
DWORD ProblemRank;
}TSHOOTER_QUERYPARAM, *PTSHOOTER_QUERYPARAM;
// The TSHOOTER_ABOUT asks the troubleshooter to display its about dialog box.
// The about dialog box should tell user what the troubleshooter is all about.
//
// The about dialog box is supposed to be Modal. If the troubleshooter
// implements a modaless about dialog box, it should disable
// the given hwndOwner after the dialog box is created and reenable
// it after the dialog box is destroyed.
//
// parameter definition for ABOUT troubleshooter command
//
// Header.Command must be TSHOOTER_ABOUT;
// Header.cbSize must be sizeof(TSHOOTER_ABOUT_PARAM);
//
// IN hwndOwner -- the window handle to serve as the owner window
// of the troubleshooter about dialog box
//
//
typedef struct tagTShooterAboutParam
{
TSHOOTER_PARAMHEADER Header;
HWND hwndOwner;
}TSHOOTER_ABOUTPARAM, *PTSHOOTER_ABOUTPARAM;
//
// The TSHOOTER_ADDPAGES asks the troubleshooter to add its wizard
// pages to the provided property sheet header.
//
//
// parameter definition for ADDPAGES troubleshooter command
//
// Header.Command must be TSHOOTER_ADDPAGRES;
// Header.cbSize must be sizeof(TSHOOTER_ADDPAGES_PARAM);
//
// IN DeviceId -- the hardware id of the device
// IN Problem -- Configuration Manager defined problem number
// IN OUT ppsh -- property sheet header to which the troubleshooter
// add its pages
// IN MaxPages -- total pages alloated for the ppsh.
// The troubleshooter should not add more than
// (MaxPages - ppsh.nPages) pages
//
typedef struct tagTShooterAddPagesParam
{
TSHOOTER_PARAMHEADER Header;
LPCTSTR DeviceId;
ULONG Problem;
LPPROPSHEETHEADER PropSheetHeader;
DWORD MaxPages;
}TSHOOTER_ADDPAGESPARAM, *PTSHOOTER_ADDPAGESPARAM;
// Each Troubleshooting wizard must provide an entry point for Device Manager
// to call:
typedef BOOL (APIENTRY *WIZARDENTRY)(PTSHOOTER_PARAMHEADER pParam);
typedef enum tagTShooterWizadType
{
TWT_ANY = 0, // any type of troubleshooter wizard
TWT_PROBLEM_SPECIFIC, // problem specific wizards
TWT_CLASS_SPECIFIC, // class specific wizards
TWT_GENERAL_PURPOSE, // general purpose
TWT_DEVMGR_DEFAULT // device manager default
}TSHOOTERWIZARDTYPE, *PTSHOOTERWIZARTYPE;
//
// class that represent a wizard32 troubleshooter
//
class CWizard
{
public:
CWizard(HMODULE hWizardDll, FARPROC WizardEntry)
: m_WizardEntry((WIZARDENTRY)WizardEntry),
m_hWizardDll(hWizardDll),
m_Problem(0),
m_DeviceRank(0),
m_ProblemRank(0),
m_AddedPages(0),
m_pDevice(NULL)
{}
~CWizard()
{
if (m_hWizardDll)
FreeLibrary(m_hWizardDll);
}
LPCTSTR GetDescription()
{
return m_strDescription.IsEmpty() ? NULL : (LPCTSTR)m_strDescription;
}
virtual BOOL Query(CDevice* pDevice, ULONG Problem);
virtual BOOL About(HWND hwndOwner);
virtual BOOL AddPages(LPPROPSHEETHEADER ppsh, DWORD MaxPages);
ULONG DeviceRank()
{
return m_DeviceRank;
}
ULONG ProblemRank()
{
return m_ProblemRank;
}
UINT m_AddedPages;
protected:
WIZARDENTRY m_WizardEntry;
HINSTANCE m_hWizardDll;
String m_strDescription;
ULONG m_Problem;
ULONG m_DeviceRank;
ULONG m_ProblemRank;
CDevice* m_pDevice;
};
//
// Class that collects all available troubleshooter
//
class CWizardList
{
public:
CWizardList(TSHOOTERWIZARDTYPE Type = TWT_ANY) : m_Type(Type)
{}
~CWizardList();
BOOL Create(CDevice* pDevice, ULONG Problem);
int NumberOfWizards()
{
return m_listWizards.GetCount();
}
BOOL GetFirstWizard(CWizard** ppWizard, PVOID* pContext);
BOOL GetNextWizard(CWizard** ppWizard, PVOID& Context);
private:
BOOL CreateWizardsFromStrings(LPTSTR msz, CDevice* pDevice, ULONG Problem);
CList<CWizard*, CWizard*> m_listWizards;
TSHOOTERWIZARDTYPE m_Type;
};
//
// class that represents the troubleshooter wizard introduction page
//
class CWizardIntro : public CPropSheetPage
{
public:
CWizardIntro() : m_pDevice(NULL), m_hFontBold(NULL),
m_hFontBigBold(NULL),
m_pSelectedWizard(NULL), m_Problem(0),
CPropSheetPage(g_hInstance, IDD_WIZINTRO)
{
}
virtual ~CWizardIntro()
{
if (m_hFontBold)
DeleteObject(m_hFontBold);
if (m_hFontBigBold)
DeleteObject(m_hFontBigBold);
}
virtual BOOL OnInitDialog(LPPROPSHEETPAGE ppsp);
virtual BOOL OnWizNext();
virtual BOOL OnSetActive();
virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
HPROPSHEETPAGE Create(CDevice* pDevice);
private:
CDevice* m_pDevice;
HFONT m_hFontBold;
HFONT m_hFontBigBold;
CWizardList m_Wizards;
ULONG m_Problem;
CWizard* m_pSelectedWizard;
};
//
// class that represents the troubleshooter property sheet
//
class CWizard98
{
public:
CWizard98(HWND hwndParent, UINT MaxPages = 32);
BOOL CreateIntroPage(CDevice* pDevice);
UINT GetMaxPages()
{
return m_MaxPages;
}
INT_PTR DoSheet()
{
return ::PropertySheet(&m_psh);
}
PROPSHEETHEADER m_psh;
private:
CDevice* m_pDevice;
UINT m_MaxPages;
};
class CTSLauncher
{
public:
CTSLauncher() : m_hTSL(NULL)
{}
~CTSLauncher()
{
Close();
}
BOOL Open(LPCTSTR DeviceId, const GUID& ClassGuid, ULONG Problem)
{
return FALSE;
}
BOOL Close()
{
m_hTSL = NULL;
return TRUE;
}
BOOL Go()
{
return FALSE;
}
BOOL EnumerateStatus(int Index, DWORD& Status)
{
return FALSE;
}
private:
HANDLE m_hTSL;
};
#if 0
typedef enum tagFixItCommand
{
FIXIT_COMMAND_DONOTHING = 0,
FIXIT_COMMAND_UPGRADEDRIVERS,
FIXIT_COMMAND_REINSTALL,
FIXIT_COMMAND_ENABLEDEVICE
FIXIT_COMMAND_RESTARTCOMPUTER
} FIXIT_COMMAND, *PFIXIT_COMMAND;
class CProblemAgent
{
public:
CProblemAgent(CDevice* pDevice, ULONG Problem, ULONG Status);
~CProblemAgent();
// retreive the problem description text
LPCTSTR ProblemText()
{
return m_strDescription.IsEmpty() ? NULL : (LPCTSTR)m_strDescription;
}
LPCTSTR InstructionText()
{
return m_strInstruction.IsEmpty() ? NULL : (LPCTSTR)m_strInstruction;
}
// fix the problem
virtual BOOL FixIt(HWND hwndOwner)
{
return TRUE;
}
protected:
BOOL UpdateDriver(HWND hwndOwner, m_pDevice);
BOOL Reinstall(HWND hwndOwner);
BOOL RestartComputer(HWND hwndOwner);
BOOL EnableDevice()
CDevice* m_pDevice;
ULONG m_Problem;
ULONG m_Status;
String m_strDescription;
String m_strInstruction;
FIXITCOMMAND m_Command;
};
#endif
INT_PTR
StartTroubleshootingWizard(
HWND hWndParent,
CDevice* pDevice
);
#endif // __PROBLEM_H__