572 lines
13 KiB
C
572 lines
13 KiB
C
// This header can go away once the types in oc.h are fixed to support
|
|
// ansi and unicode at the same time.
|
|
|
|
|
|
|
|
#ifndef UNICODE
|
|
#define POC_FILL_IN_SETUP_DATA_PROC_W ULONG_PTR
|
|
#endif
|
|
|
|
typedef struct _deb_OCM_CLIENT_CALLBACKSW {
|
|
//
|
|
// Routine to fill in the setup data structure that provides info
|
|
// about the environment in which the OC Manager is running.
|
|
//
|
|
POC_FILL_IN_SETUP_DATA_PROC_A FillInSetupDataA;
|
|
|
|
//
|
|
// Routine to log an error.
|
|
//
|
|
POC_LOG_ERROR LogError;
|
|
|
|
//
|
|
// Routine to indicate need to reboot
|
|
//
|
|
POC_SET_REBOOT_PROC SetReboot;
|
|
|
|
POC_FILL_IN_SETUP_DATA_PROC_W FillInSetupDataW;
|
|
|
|
} deb_OCM_CLIENT_CALLBACKSW, *deb_POCM_CLIENT_CALLBACKSW;
|
|
|
|
|
|
typedef struct _deb_OCM_CLIENT_CALLBACKSA {
|
|
//
|
|
// Routine to fill in the setup data structure that provides info
|
|
// about the environment in which the OC Manager is running.
|
|
//
|
|
POC_FILL_IN_SETUP_DATA_PROC_A FillInSetupDataA;
|
|
|
|
//
|
|
// Routine to log an error.
|
|
//
|
|
POC_LOG_ERROR LogError;
|
|
|
|
//
|
|
// Routine to indicate need to reboot
|
|
//
|
|
POC_SET_REBOOT_PROC SetReboot;
|
|
|
|
} deb_OCM_CLIENT_CALLBACKSA, *deb_POCM_CLIENT_CALLBACKSA;
|
|
|
|
typedef struct _deb_OPTIONAL_COMPONENTA {
|
|
//
|
|
// String id of name of inf file in the OC Manager's
|
|
// InfListStringTable string table. If -1, then
|
|
// the subcomponent does not appear on the OC page.
|
|
//
|
|
LONG InfStringId;
|
|
|
|
//
|
|
// Backpointer to top level component
|
|
//
|
|
LONG TopLevelStringId;
|
|
|
|
//
|
|
// String id of parent component, -1 if none.
|
|
//
|
|
LONG ParentStringId;
|
|
|
|
//
|
|
// String id of first child, -1 if none.
|
|
//
|
|
LONG FirstChildStringId;
|
|
|
|
//
|
|
// Count of children.
|
|
//
|
|
UINT ChildrenCount;
|
|
|
|
//
|
|
// String id of next sibling, -1 if none.
|
|
//
|
|
LONG NextSiblingStringId;
|
|
|
|
//
|
|
// String ids of needs and needed by.
|
|
//
|
|
PLONG NeedsStringIds;
|
|
UINT NeedsCount;
|
|
PLONG NeededByStringIds;
|
|
UINT NeededByCount;
|
|
|
|
// String ids of exclude and excluded by
|
|
|
|
PLONG ExcludeStringIds;
|
|
UINT ExcludeCount;
|
|
PLONG ExcludedByStringIds;
|
|
UINT ExcludedByCount;
|
|
|
|
//
|
|
// Misc flags.
|
|
//
|
|
UINT InternalFlags;
|
|
|
|
//
|
|
// Approximation of required disk space.
|
|
//
|
|
LONGLONG SizeApproximation;
|
|
|
|
//
|
|
// Icon index of the component.
|
|
// -1 means we're supposed to get it from the component itself.
|
|
// -2 means we're supposed to use IconDll and IconResource
|
|
//
|
|
UINT IconIndex;
|
|
CHAR IconDll[MAX_PATH];
|
|
CHAR IconResource[50];
|
|
|
|
//
|
|
// Selection state (SELSTATE_xxx constants).
|
|
//
|
|
UINT SelectionState;
|
|
UINT OriginalSelectionState;
|
|
|
|
// Installation Flag as obtained from the inf
|
|
|
|
UINT InstalledState;
|
|
|
|
//
|
|
// Mode bits.
|
|
//
|
|
UINT ModeBits;
|
|
|
|
//
|
|
// Human-readable stuff describing the component.
|
|
//
|
|
CHAR Description[MAXOCDESC];
|
|
CHAR Tip[MAXOCTIP];
|
|
|
|
//
|
|
// From here down, stuff is meaningful only for top-level components.
|
|
//
|
|
|
|
//
|
|
// Stuff describing the OC's installation DLL and how to call it.
|
|
//
|
|
CHAR InstallationDllName[MAX_PATH];
|
|
CHAR InterfaceFunctionName[MAX_PATH];
|
|
|
|
HMODULE InstallationDll;
|
|
POCSETUPPROC InstallationRoutine;
|
|
|
|
//
|
|
// Version of the OC Manager to which this component was written.
|
|
//
|
|
UINT ExpectedVersion;
|
|
|
|
// this flag indicates whether the subcomponent was intialialized
|
|
|
|
BOOL Exists;
|
|
|
|
//
|
|
// Flags: ANSI/Unicode, etc.
|
|
//
|
|
UINT Flags;
|
|
|
|
} deb_OPTIONAL_COMPONENTA, *deb_POPTIONAL_COMPONENTA;
|
|
|
|
//
|
|
// locale info
|
|
//
|
|
typedef struct _deb_LOCALEA {
|
|
LCID lcid;
|
|
CHAR DecimalSeparator[4];
|
|
} deb_LOCALEA, *deb_PLOCALEA;
|
|
|
|
//
|
|
// Define structure corresponding to an instance of the OC Manager.
|
|
// This is actually somewhat broken, in that this actually closely corresponds
|
|
// to a master OC INF, and we might want to consider breaking out the string
|
|
// tables into another structure, so we can more easily achieve a unified
|
|
// namespace if we have multiple master OC INFs at play simultaneously.
|
|
//
|
|
typedef struct _deb_OC_MANAGERA {
|
|
//
|
|
// Callbacks into OC Manaer client.
|
|
//
|
|
deb_OCM_CLIENT_CALLBACKSA Callbacks;
|
|
|
|
//
|
|
// Handle of Master OC INF.
|
|
//
|
|
HINF MasterOcInf;
|
|
|
|
//
|
|
// unattended inf handle
|
|
//
|
|
HINF UnattendedInf;
|
|
|
|
//
|
|
// Master OC Inf file, and unattended file
|
|
//
|
|
CHAR MasterOcInfPath[MAX_PATH];
|
|
CHAR UnattendedInfPath[MAX_PATH];
|
|
|
|
// we run from whatever directory the master inf is in
|
|
|
|
CHAR SourceDir[MAX_PATH];
|
|
|
|
//
|
|
// Name of "suite" -- in other words, a shortname that
|
|
// is unique to the master OC inf that this structure represents.
|
|
// We base it on the name of the master OC inf itself.
|
|
//
|
|
CHAR SuiteName[MAX_PATH];
|
|
|
|
//
|
|
// page titles
|
|
//
|
|
CHAR SetupPageTitle[MAX_PATH];
|
|
|
|
// window title
|
|
|
|
CHAR WindowTitle[MAX_PATH];
|
|
|
|
//
|
|
// List of per-component OC INFs currently loaded.
|
|
// Each inf's name is in the string table and the extra data
|
|
// for each is an OC_INF structure.
|
|
//
|
|
PVOID InfListStringTable;
|
|
|
|
//
|
|
// String table for names of all components and subcomponents.
|
|
// Extra data for each is an OPTIONAL_COMPONENT structure.
|
|
//
|
|
PVOID ComponentStringTable;
|
|
|
|
//
|
|
// pointer to OcSetupPage structure so we can free this data
|
|
// if the user cancels before we get to the wizard page.
|
|
//
|
|
PVOID OcSetupPage;
|
|
|
|
|
|
//
|
|
// Setup mode (custom, typical, etc)
|
|
//
|
|
UINT SetupMode;
|
|
|
|
//
|
|
// List of top-level optional component string IDs.
|
|
// This is necessary because we need to preserve ordering
|
|
// from the master OC Inf.
|
|
//
|
|
UINT TopLevelOcCount;
|
|
PLONG TopLevelOcStringIds;
|
|
UINT TopLevelParentOcCount;
|
|
PLONG TopLevelParentOcStringIds;
|
|
|
|
|
|
//
|
|
// Are there subcomponents on the details page?
|
|
//
|
|
BOOL SubComponentsPresent;
|
|
|
|
//
|
|
// Each element in this array points to an array that
|
|
// gives ordering for querying wizard pages from the optional components.
|
|
//
|
|
PLONG WizardPagesOrder[WizPagesTypeMax];
|
|
|
|
//
|
|
// Subkey relative to szPrivateDataRoot where private
|
|
// data for components plugged into the OC will live.
|
|
// 2 8-char DWORD representations plus a separator and nul.
|
|
//
|
|
CHAR PrivateDataSubkey[18];
|
|
HKEY hKeyPrivateData;
|
|
HKEY hKeyPrivateDataRoot;
|
|
|
|
//
|
|
// If we are completing installation, this item is the window handle
|
|
// of the progress text control.
|
|
//
|
|
HWND ProgressTextWindow;
|
|
|
|
//
|
|
// String id of component currently processing an interface routine.
|
|
// -1 means the OC manager is not currently processing one.
|
|
//
|
|
LONG CurrentComponentStringId;
|
|
|
|
// Component Ids of aborted components
|
|
|
|
LONG *AbortedComponentIds;
|
|
UINT AbortedCount;
|
|
|
|
//
|
|
// Various flags
|
|
//
|
|
UINT InternalFlags;
|
|
|
|
//
|
|
// setup data
|
|
//
|
|
|
|
SETUP_DATA SetupData;
|
|
|
|
} deb_OC_MANAGERA, *deb_POC_MANAGERA;
|
|
|
|
|
|
|
|
typedef struct _deb_OPTIONAL_COMPONENTW {
|
|
//
|
|
// String id of name of inf file in the OC Manager's
|
|
// InfListStringTable string table. If -1, then
|
|
// the subcomponent does not appear on the OC page.
|
|
//
|
|
LONG InfStringId;
|
|
|
|
//
|
|
// Backpointer to top level component
|
|
//
|
|
LONG TopLevelStringId;
|
|
|
|
//
|
|
// String id of parent component, -1 if none.
|
|
//
|
|
LONG ParentStringId;
|
|
|
|
//
|
|
// String id of first child, -1 if none.
|
|
//
|
|
LONG FirstChildStringId;
|
|
|
|
//
|
|
// Count of children.
|
|
//
|
|
UINT ChildrenCount;
|
|
|
|
//
|
|
// String id of next sibling, -1 if none.
|
|
//
|
|
LONG NextSiblingStringId;
|
|
|
|
//
|
|
// String ids of needs and needed by.
|
|
//
|
|
PLONG NeedsStringIds;
|
|
UINT NeedsCount;
|
|
PLONG NeededByStringIds;
|
|
UINT NeededByCount;
|
|
|
|
// String ids of exclude and excluded by
|
|
|
|
PLONG ExcludeStringIds;
|
|
UINT ExcludeCount;
|
|
PLONG ExcludedByStringIds;
|
|
UINT ExcludedByCount;
|
|
|
|
//
|
|
// Misc flags.
|
|
//
|
|
UINT InternalFlags;
|
|
|
|
//
|
|
// Approximation of required disk space.
|
|
//
|
|
LONGLONG SizeApproximation;
|
|
|
|
//
|
|
// Icon index of the component.
|
|
// -1 means we're supposed to get it from the component itself.
|
|
// -2 means we're supposed to use IconDll and IconResource
|
|
//
|
|
UINT IconIndex;
|
|
WCHAR IconDll[MAX_PATH];
|
|
WCHAR IconResource[50];
|
|
|
|
//
|
|
// Selection state (SELSTATE_xxx constants).
|
|
//
|
|
UINT SelectionState;
|
|
UINT OriginalSelectionState;
|
|
|
|
// Installation Flag as obtained from the inf
|
|
|
|
UINT InstalledState;
|
|
|
|
//
|
|
// Mode bits.
|
|
//
|
|
UINT ModeBits;
|
|
|
|
//
|
|
// Human-readable stuff describing the component.
|
|
//
|
|
WCHAR Description[MAXOCDESC];
|
|
WCHAR Tip[MAXOCTIP];
|
|
|
|
//
|
|
// From here down, stuff is meaningful only for top-level components.
|
|
//
|
|
|
|
//
|
|
// Stuff describing the OC's installation DLL and how to call it.
|
|
//
|
|
WCHAR InstallationDllName[MAX_PATH];
|
|
CHAR InterfaceFunctionName[MAX_PATH];
|
|
|
|
HMODULE InstallationDll;
|
|
POCSETUPPROC InstallationRoutine;
|
|
|
|
//
|
|
// Version of the OC Manager to which this component was written.
|
|
//
|
|
UINT ExpectedVersion;
|
|
|
|
// this flag indicates whether the subcomponent was intialialized
|
|
|
|
BOOL Exists;
|
|
|
|
//
|
|
// Flags: ANSI/Unicode, etc.
|
|
//
|
|
UINT Flags;
|
|
|
|
} deb_OPTIONAL_COMPONENTW, *deb_POPTIONAL_COMPONENTW;
|
|
|
|
//
|
|
// locale info
|
|
//
|
|
typedef struct _deb_LOCALEW {
|
|
LCID lcid;
|
|
WCHAR DecimalSeparator[4];
|
|
} deb_LOCALEW, *deb_PLOCALEW;
|
|
|
|
//
|
|
// Define structure corresponding to an instance of the OC Manager.
|
|
// This is actually somewhat broken, in that this actually closely corresponds
|
|
// to a master OC INF, and we might want to consider breaking out the string
|
|
// tables into another structure, so we can more easily achieve a unified
|
|
// namespace if we have multiple master OC INFs at play simultaneously.
|
|
//
|
|
typedef struct _deb_OC_MANAGERW {
|
|
//
|
|
// Callbacks into OC Manaer client.
|
|
//
|
|
deb_OCM_CLIENT_CALLBACKSW Callbacks;
|
|
|
|
//
|
|
// Handle of Master OC INF.
|
|
//
|
|
HINF MasterOcInf;
|
|
|
|
//
|
|
// unattended inf handle
|
|
//
|
|
HINF UnattendedInf;
|
|
|
|
//
|
|
// Master OC Inf file, and unattended file
|
|
//
|
|
WCHAR MasterOcInfPath[MAX_PATH];
|
|
WCHAR UnattendedInfPath[MAX_PATH];
|
|
|
|
// we run from whatever directory the master inf is in
|
|
|
|
WCHAR SourceDir[MAX_PATH];
|
|
|
|
//
|
|
// Name of "suite" -- in other words, a shortname that
|
|
// is unique to the master OC inf that this structure represents.
|
|
// We base it on the name of the master OC inf itself.
|
|
//
|
|
WCHAR SuiteName[MAX_PATH];
|
|
|
|
//
|
|
// page titles
|
|
//
|
|
WCHAR SetupPageTitle[MAX_PATH];
|
|
|
|
// window title
|
|
|
|
WCHAR WindowTitle[MAX_PATH];
|
|
|
|
//
|
|
// List of per-component OC INFs currently loaded.
|
|
// Each inf's name is in the string table and the extra data
|
|
// for each is an OC_INF structure.
|
|
//
|
|
PVOID InfListStringTable;
|
|
|
|
//
|
|
// String table for names of all components and subcomponents.
|
|
// Extra data for each is an OPTIONAL_COMPONENT structure.
|
|
//
|
|
PVOID ComponentStringTable;
|
|
|
|
//
|
|
// pointer to OcSetupPage structure so we can free this data
|
|
// if the user cancels before we get to the wizard page.
|
|
//
|
|
PVOID OcSetupPage;
|
|
|
|
//
|
|
// Setup mode (custom, typical, etc)
|
|
//
|
|
UINT SetupMode;
|
|
|
|
//
|
|
// List of top-level optional component string IDs.
|
|
// This is necessary because we need to preserve ordering
|
|
// from the master OC Inf.
|
|
//
|
|
UINT TopLevelOcCount;
|
|
PLONG TopLevelOcStringIds;
|
|
UINT TopLevelParentOcCount;
|
|
PLONG TopLevelParentOcStringIds;
|
|
|
|
|
|
//
|
|
// Are there subcomponents on the details page?
|
|
//
|
|
BOOL SubComponentsPresent;
|
|
|
|
//
|
|
// Each element in this array points to an array that
|
|
// gives ordering for querying wizard pages from the optional components.
|
|
//
|
|
PLONG WizardPagesOrder[WizPagesTypeMax];
|
|
|
|
//
|
|
// Subkey relative to szPrivateDataRoot where private
|
|
// data for components plugged into the OC will live.
|
|
// 2 8-char DWORD representations plus a separator and nul.
|
|
//
|
|
WCHAR PrivateDataSubkey[18];
|
|
HKEY hKeyPrivateData;
|
|
HKEY hKeyPrivateDataRoot;
|
|
|
|
//
|
|
// If we are completing installation, this item is the window handle
|
|
// of the progress text control.
|
|
//
|
|
HWND ProgressTextWindow;
|
|
|
|
//
|
|
// String id of component currently processing an interface routine.
|
|
// -1 means the OC manager is not currently processing one.
|
|
//
|
|
LONG CurrentComponentStringId;
|
|
|
|
// Component Ids of aborted components
|
|
|
|
LONG *AbortedComponentIds;
|
|
int AbortedCount;
|
|
|
|
//
|
|
// Various flags
|
|
//
|
|
UINT InternalFlags;
|
|
|
|
//
|
|
// setup data
|
|
//
|
|
|
|
SETUP_DATAW SetupData;
|
|
|
|
} deb_OC_MANAGERW, *deb_POC_MANAGERW;
|
|
|