508 lines
11 KiB
C
508 lines
11 KiB
C
|
#ifndef _UNATTEND_H_
|
||
|
#define _UNATTEND_H_
|
||
|
|
||
|
#define MAX_BUF MAX_INF_STRING_LENGTH
|
||
|
|
||
|
typedef enum _UNATTENDTYPE {
|
||
|
UAT_STRING,
|
||
|
UAT_LONGINT,
|
||
|
UAT_BOOLEAN,
|
||
|
UAT_NONE,
|
||
|
} UNATTENDTYPE;
|
||
|
|
||
|
//
|
||
|
// Each possible Answer from the unattended file must have a
|
||
|
// corresponding enumerated type present in this typedef.
|
||
|
// This is required since it is the method by which Pages
|
||
|
// can be assured that they point to the correct answer
|
||
|
//
|
||
|
typedef enum _UNATTENDENTRIES {
|
||
|
UAE_PROGRAM, // DetachedProgram
|
||
|
UAE_ARGUMENT, // Arguments
|
||
|
UAE_TIMEZONE, // TimeZone
|
||
|
UAE_FULLNAME, // FullName
|
||
|
UAE_ORGNAME, // OrgName
|
||
|
UAE_COMPNAME, // Computer Name
|
||
|
UAE_ADMINPASS, // Administrator Password
|
||
|
UAE_PRODID, // Product ID
|
||
|
UAE_MODE, // SetupMode
|
||
|
UAE_AUTOLOGON, // autoadminlogon
|
||
|
UAE_PROFILESDIR, // Profiles directory
|
||
|
UAE_PROGRAMFILES, // Program Files directory
|
||
|
UAE_COMMONPROGRAMFILES, // Program Files\Common Files directory
|
||
|
UAE_PROGRAMFILES_X86, // Program Files (x86) directory
|
||
|
UAE_COMMONPROGRAMFILES_X86, // Program Files\Common Files (x86) directory
|
||
|
} UNATTENDENTRIES;
|
||
|
|
||
|
#ifndef MIDL_PASS
|
||
|
struct _UNATTENDANSWER;
|
||
|
struct _UNATTENDITEM;
|
||
|
struct _UNATTENDPAGE;
|
||
|
struct _UNATTENDWIZARD;
|
||
|
#endif
|
||
|
|
||
|
//
|
||
|
// This is the callback function that checks wether or not an
|
||
|
// answer is valid. Called automatically by UnattendFindAnswer
|
||
|
//
|
||
|
typedef
|
||
|
BOOL
|
||
|
(* LPFNCHECKVALID)(
|
||
|
struct _UNATTENDANSWER *rec
|
||
|
);
|
||
|
|
||
|
|
||
|
//
|
||
|
// This is the callback function that is used to special case
|
||
|
// the activation code. Really useful for those dialog boxes
|
||
|
// which include check boxes, radio buttons, etc, etc.
|
||
|
//
|
||
|
typedef
|
||
|
BOOL
|
||
|
(* LPFNSETACTIVE)(
|
||
|
HWND hwnd,
|
||
|
DWORD contextinfo,
|
||
|
struct _UNATTENDITEM *item
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// This structure is used to determine where and how to find
|
||
|
// an answer and also to determine wether or not that answer
|
||
|
// is present, of the correct type, etc, etc. This structure
|
||
|
// should never be used by anything other then the unattend
|
||
|
// module.
|
||
|
//
|
||
|
typedef struct _UNATTENDANSWER {
|
||
|
//
|
||
|
// Unique identifier for this answer.
|
||
|
//
|
||
|
UNATTENDENTRIES AnswerId;
|
||
|
|
||
|
//
|
||
|
// Has the answer been found in the unattend file and
|
||
|
// is it known to be of the correct 'format'
|
||
|
//
|
||
|
BOOL Present;
|
||
|
|
||
|
//
|
||
|
// Is the answer absolutely required for setup to work?
|
||
|
//
|
||
|
BOOL Required;
|
||
|
|
||
|
//
|
||
|
// Was there an error in parsing the string? If so it might
|
||
|
// be appropriate to display a message box notifying the
|
||
|
// user of this condition
|
||
|
//
|
||
|
BOOL ParseErrors;
|
||
|
|
||
|
//
|
||
|
// The Answer structure. Since there are several possible
|
||
|
// types, from string to numbers, a union is required
|
||
|
//
|
||
|
union {
|
||
|
PWSTR String;
|
||
|
LONG Num;
|
||
|
BOOL Bool;
|
||
|
} Answer;
|
||
|
|
||
|
//
|
||
|
// The following 3 items are the implementation dependant
|
||
|
// portion of this structure. Each pointer points to
|
||
|
// a string which is used in a GetPrivateProfile call.
|
||
|
// Note that it is important to keep these as constant
|
||
|
// pointers and that they will have to be changed when
|
||
|
// an OLE model is implemented.
|
||
|
//
|
||
|
const PCWSTR Section;
|
||
|
const PCWSTR Key;
|
||
|
const PCWSTR DefaultAnswer;
|
||
|
|
||
|
//
|
||
|
// This specifies which of the members in the union is
|
||
|
// the one we want ie: is it a string, an int, or a bool?
|
||
|
//
|
||
|
UNATTENDTYPE Type;
|
||
|
|
||
|
//
|
||
|
// This callback function is called so that the validity
|
||
|
// of the answer can be determined
|
||
|
//
|
||
|
LPFNCHECKVALID pfnCheckValid;
|
||
|
|
||
|
} UNATTENDANSWER, *PUNATTENDANSWER;
|
||
|
|
||
|
|
||
|
//
|
||
|
// Each item on a dialog page must be represented by the following
|
||
|
// structure. An array of items is built and is stored in the
|
||
|
// structure for the page
|
||
|
//
|
||
|
typedef struct _UNATTENDITEM {
|
||
|
//
|
||
|
// Specifies the control id of item so that we can send
|
||
|
// messages to it
|
||
|
//
|
||
|
DWORD ControlId;
|
||
|
|
||
|
//
|
||
|
// Reserved for special message passing
|
||
|
//
|
||
|
DWORD Reserved1;
|
||
|
|
||
|
//
|
||
|
// Reserved for special message passing
|
||
|
//
|
||
|
DWORD Reserved2;
|
||
|
|
||
|
//
|
||
|
// Callback function to call when we are trying to set active
|
||
|
// the dialog. Really useful in the case radio and check boxes.
|
||
|
//
|
||
|
LPFNSETACTIVE pfnSetActive;
|
||
|
|
||
|
//
|
||
|
// Pointer to the answer which is associated with this item
|
||
|
//
|
||
|
PUNATTENDANSWER Item;
|
||
|
|
||
|
} UNATTENDITEM, *PUNATTENDITEM;
|
||
|
|
||
|
|
||
|
//
|
||
|
// Each page in the wizard must have one of the following structures
|
||
|
// filled out to describe its contents
|
||
|
//
|
||
|
typedef struct _UNATTENDPAGE {
|
||
|
//
|
||
|
// The IDD of the dialog page
|
||
|
// Required so that we can correspond to a dialog box
|
||
|
//
|
||
|
DWORD PageId;
|
||
|
|
||
|
//
|
||
|
// RUN TIME Flag that determines if we show the page to the user
|
||
|
// Is determined by wether or not the answer is present and correct
|
||
|
//
|
||
|
BOOL ShowPage;
|
||
|
|
||
|
//
|
||
|
// Wether or not the page has been loaded once. Since we only
|
||
|
// want to copy the answer to the screen once, this acts as a
|
||
|
// sentry
|
||
|
//
|
||
|
BOOL LoadPage;
|
||
|
|
||
|
//
|
||
|
// After we have loaded the page, should we show it no matter what?
|
||
|
// Useful for the title and finish pages
|
||
|
//
|
||
|
BOOL NeverSkip;
|
||
|
|
||
|
//
|
||
|
// How many items we have on the page
|
||
|
//
|
||
|
UINT ItemCount;
|
||
|
|
||
|
//
|
||
|
// Pointer to an array of items of size ItemCount
|
||
|
//
|
||
|
PUNATTENDITEM Item;
|
||
|
|
||
|
} UNATTENDPAGE, *PUNATTENDPAGE;
|
||
|
|
||
|
|
||
|
//
|
||
|
// Information structure about how the unattended operation for the Wizard
|
||
|
// is proceeding
|
||
|
//
|
||
|
typedef struct _UNATTENDWIZARD {
|
||
|
//
|
||
|
// Wether or not we should show the wizard -- IGNORED since TedM
|
||
|
// doesn't want to duplicated the code in PSN_WIZNEXT. Kept for
|
||
|
// Future use
|
||
|
//
|
||
|
BOOL ShowWizard;
|
||
|
|
||
|
//
|
||
|
// Flag that indicates that we have filled the array of answers
|
||
|
// specified in this structure. Since we ideally once want to do
|
||
|
// this once...
|
||
|
//
|
||
|
BOOL Initialized;
|
||
|
|
||
|
//
|
||
|
// Wether or not the ENTIRE unattended operation was successful.
|
||
|
// If he required a single input from the user, then it was not.
|
||
|
// Determines if the 'finish' page is a place were the user must
|
||
|
// supply some input
|
||
|
//
|
||
|
BOOL Successful;
|
||
|
|
||
|
//
|
||
|
// How many pages we have information about
|
||
|
//
|
||
|
UINT PageCount;
|
||
|
|
||
|
//
|
||
|
// Pointer to an array of pages
|
||
|
//
|
||
|
PUNATTENDPAGE Page;
|
||
|
|
||
|
//
|
||
|
// How many answer we have to fill
|
||
|
//
|
||
|
UINT AnswerCount;
|
||
|
|
||
|
//
|
||
|
// Pointer to an array of answers that are to be used
|
||
|
//
|
||
|
PUNATTENDANSWER Answer;
|
||
|
|
||
|
} UNATTENDWIZARD, *PUNATTENDWIZARD;
|
||
|
|
||
|
|
||
|
//
|
||
|
// Global pointer to the answer file
|
||
|
//
|
||
|
extern WCHAR AnswerFile[MAX_PATH];
|
||
|
|
||
|
|
||
|
//
|
||
|
// Constants for the wizard notification messages
|
||
|
//
|
||
|
|
||
|
#define WIZARD_NEXT_OK 0
|
||
|
#define WIZARD_NEXT_DISALLOWED -1
|
||
|
#define WIZARD_ACTIVATE_PAGE 0
|
||
|
#define WIZARD_SKIP_PAGE -1
|
||
|
|
||
|
#define VALIDATE_DATA_INVALID -1
|
||
|
#define VALIDATE_DATA_OK 1
|
||
|
|
||
|
//
|
||
|
// Interface Functions
|
||
|
//
|
||
|
VOID
|
||
|
UnattendInitialize(
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
UnattendSetActiveDlg(
|
||
|
IN HWND hwnd,
|
||
|
IN DWORD controlid
|
||
|
);
|
||
|
|
||
|
// For PSN_WIZNEXT/PSN_WIZFINISH only
|
||
|
VOID
|
||
|
UnattendAdvanceIfValid (
|
||
|
IN HWND hwnd
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
UnattendErrorDlg(
|
||
|
IN HWND hwnd,
|
||
|
IN DWORD controlid
|
||
|
);
|
||
|
|
||
|
PWSTR
|
||
|
UnattendFetchString(
|
||
|
IN UNATTENDENTRIES entry
|
||
|
);
|
||
|
|
||
|
// Wrapper to simply return a value in DWL_MSGRESULT, return value is always TRUE
|
||
|
BOOL
|
||
|
ReturnDlgResult (
|
||
|
HWND hdlg,
|
||
|
LRESULT Result
|
||
|
);
|
||
|
|
||
|
// Sends message, returns DWL_MSGRESULT, preservs original value in DWL_MSGRESULT
|
||
|
LRESULT
|
||
|
SendDlgMessage (
|
||
|
HWND hdlg,
|
||
|
UINT Message,
|
||
|
WPARAM wParam,
|
||
|
LPARAM lParam
|
||
|
);
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// Types and routines for afpnp.c
|
||
|
//
|
||
|
|
||
|
typedef struct {
|
||
|
PVOID Buffer;
|
||
|
UINT Size;
|
||
|
} BUFFER, *PBUFFER;
|
||
|
|
||
|
typedef struct {
|
||
|
PWSTR Start;
|
||
|
PWSTR End;
|
||
|
UINT Size;
|
||
|
} MULTISZ, *PMULTISZ;
|
||
|
|
||
|
typedef struct {
|
||
|
PCWSTR Start;
|
||
|
PCWSTR Current;
|
||
|
} MULTISZ_ENUM, *PMULTISZ_ENUM;
|
||
|
|
||
|
#define BUFFER_INIT {NULL,0}
|
||
|
#define MULTISZ_INIT {NULL,NULL,0}
|
||
|
|
||
|
typedef struct _tagAFDRIVERATTRIBS {
|
||
|
BOOL Broken;
|
||
|
BOOL Initialized;
|
||
|
HINF InfHandle;
|
||
|
PCWSTR FilePath;
|
||
|
PCWSTR InfPath;
|
||
|
PCWSTR OriginalInstallMedia;
|
||
|
MULTISZ PnpIdList;
|
||
|
PCWSTR ClassInstall32Section; // no cleanup needed
|
||
|
GUID Guid;
|
||
|
struct _tagAFDRIVERATTRIBS *Next;
|
||
|
} AF_DRIVER_ATTRIBS, *PAF_DRIVER_ATTRIBS;
|
||
|
|
||
|
typedef struct {
|
||
|
PAF_DRIVER_ATTRIBS Driver;
|
||
|
BOOL WantAll;
|
||
|
} AF_DRIVER_ENUM, *PAF_DRIVER_ENUM;
|
||
|
|
||
|
typedef struct {
|
||
|
PVOID DriverTable;
|
||
|
PAF_DRIVER_ATTRIBS FirstDriver;
|
||
|
} AF_DRIVERS, *PAF_DRIVERS;
|
||
|
|
||
|
|
||
|
// Alloc or realloc depending on presense of Old (like c runtime realloc)
|
||
|
PVOID
|
||
|
MySmartAlloc (
|
||
|
PCVOID Old, OPTIONAL
|
||
|
UINT Size
|
||
|
);
|
||
|
|
||
|
// Free if p is not NULL
|
||
|
VOID
|
||
|
MySmartFree (
|
||
|
PCVOID p
|
||
|
);
|
||
|
|
||
|
// Allocs only if SizeNeeded outgrew size previously allocated in Buf
|
||
|
PVOID
|
||
|
ReusableAlloc (
|
||
|
IN OUT PBUFFER Buf,
|
||
|
IN UINT SizeNeeded
|
||
|
);
|
||
|
|
||
|
// Cleans up BUFFER structs
|
||
|
VOID
|
||
|
ReusableFree (
|
||
|
IN OUT PBUFFER Buf
|
||
|
);
|
||
|
|
||
|
// Adds a string to a MULTISZ alloc, growing/reallocating if necessary
|
||
|
PWSTR
|
||
|
MultiSzAppendString (
|
||
|
IN OUT PMULTISZ MultiSz,
|
||
|
IN PCWSTR String
|
||
|
);
|
||
|
|
||
|
// Cleans up MULTISZ structs
|
||
|
VOID
|
||
|
MultiSzFree (
|
||
|
IN OUT PMULTISZ MultiSz
|
||
|
);
|
||
|
|
||
|
// Simplifies logic surrounding multisz processing
|
||
|
BOOL
|
||
|
EnumFirstMultiSz (
|
||
|
IN OUT PMULTISZ_ENUM EnumPtr,
|
||
|
IN PCWSTR MultiSz
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
EnumNextMultiSz (
|
||
|
IN OUT PMULTISZ_ENUM EnumPtr
|
||
|
);
|
||
|
|
||
|
// Simplifies getting string fields in loops
|
||
|
PCWSTR
|
||
|
SyssetupGetStringField (
|
||
|
IN PINFCONTEXT InfContext,
|
||
|
IN DWORD Field,
|
||
|
IN OUT PBUFFER Buf
|
||
|
);
|
||
|
|
||
|
|
||
|
// For progress bar UI computations
|
||
|
INT
|
||
|
CountAfDrivers (
|
||
|
IN PAF_DRIVERS Drivers,
|
||
|
OUT INT *ClassInstallers OPTIONAL
|
||
|
);
|
||
|
|
||
|
// Pulls in answer file data, parses into structs
|
||
|
PAF_DRIVERS
|
||
|
CreateAfDriverTable (
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
DestroyAfDriverTable (
|
||
|
IN PAF_DRIVERS Drivers
|
||
|
);
|
||
|
|
||
|
// Enumeration of AF_DRIVERS
|
||
|
BOOL
|
||
|
EnumFirstAfDriver (
|
||
|
OUT PAF_DRIVER_ENUM EnumPtr,
|
||
|
IN PAF_DRIVERS Drivers
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
EnumFirstAfDriverEx (
|
||
|
OUT PAF_DRIVER_ENUM EnumPtr,
|
||
|
IN PAF_DRIVERS Drivers,
|
||
|
IN BOOL WantAll
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
EnumNextAfDriver (
|
||
|
IN OUT PAF_DRIVER_ENUM EnumPtr
|
||
|
);
|
||
|
|
||
|
// Builds INF list of answer file-supplied drivers for a device
|
||
|
BOOL
|
||
|
SyssetupInstallAnswerFileDriver (
|
||
|
IN PAF_DRIVERS Drivers,
|
||
|
IN HDEVINFO hDevInfo,
|
||
|
IN PSP_DEVINFO_DATA DeviceInfoData,
|
||
|
OUT PAF_DRIVER_ATTRIBS *AfDriver
|
||
|
);
|
||
|
|
||
|
// Fixes the source INF path after installation completes
|
||
|
BOOL
|
||
|
SyssetupFixAnswerFileDriverPath (
|
||
|
IN PAF_DRIVER_ATTRIBS Driver,
|
||
|
IN HDEVINFO hDevInfo,
|
||
|
IN PSP_DEVINFO_DATA DeviceInfoData
|
||
|
);
|
||
|
|
||
|
|
||
|
HINF
|
||
|
pOpenAnswerFile (
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
GetAnswerFileSetting (
|
||
|
IN PCWSTR Section,
|
||
|
IN PCWSTR Key,
|
||
|
OUT PWSTR Buffer,
|
||
|
IN UINT BufferSize
|
||
|
);
|
||
|
|
||
|
#endif // _UNATTEND_H_
|