#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_