/*++ Copyright (c) 1997 Microsoft Corporation Module Name: octest.h Abstract: Contains include directives and structures common for all the modules for the component's setup DLL. Author: Bogdan Andreiu (bogdana) 10-Feb-1997 Jason Allor (jasonall) 24-Feb-1998 (took over the project) Revision History: 10-Feb-1997 bogdana First draft: include directives, structure and common function headers. 20_Feb-1997 bogdana Added three multistring processing functions. 19-Mar-1997 bogdana Renamed some functions. --*/ #ifndef _OCTEST_H #define _OCTEST_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "hcttools.h" #include "logutils.h" #include "resource.h" #include "msg.h" //===================================================================== // #defines //===================================================================== // // These are used for the functions in ntlog.dll // #define PASS TLS_PASS #define FAIL TLS_SEV1 #define TLS_CUSTOM 0x00008000 #define PASS_VARIATION TLS_PASS | TL_VARIATION #define FAIL_VARIATION TLS_SEV1 | TL_VARIATION #define WARN_VARIATION TLS_WARN | TL_VARIATION #define BLOCK_VARIATION TLS_BLOCK | TL_VARIATION #define ABORT_VARIATION TLS_ABORT | TL_VARIATION #define LOG_VARIATION TLS_CUSTOM | TL_VARIATION // // Defining the EXPORT qualifier // #define EXPORT __declspec (dllexport) #define MAX_MSG_LEN 256 // String length #define MAX_OC_FUNCTIONS 20 // Number of OC functions #define TICK_TIME 3 // Size of the time slot #define NO_STEPS_FINAL 7 // Num steps component will report in final stage #define MAX_PRIVATE_DATA_SIZE 64 // Maximum size of stored private data #define MAX_PRIVATE_VALUES 8 // Maximum number of values to be tested #define MAX_STRINGS_FOR_PRIVATE_DATA 8 // Dimension of the table to choose the strings from #define MAX_MULTI_STRINGS_FOR_PRIVATE_DATA 6 // Dimension of the table to choose the multi-strings from #define MAX_WIZPAGE_TYPES 7 // Number pages types #define MAX_WIZARD_PAGES 5 // Number of pages returned by a component #define NODES_VISITED_LENGTH 5000 #define ONE_HUNDRED_GIG 0x4876E800 #define OCP_TEST_PRIVATE_BASE OC_PRIVATE_BASE #define OCP_CHECK_NEEDS OC_PRIVATE_BASE + 1 //#define DEBUG //===================================================================== // structure definitions //===================================================================== // // A structure needed for printing the OC functions // typedef struct _OCText { UINT uiOCFunction; PTSTR tszOCText; } OCTEXT, *POCTEXT; // // The table used for printing OC function names // static const OCTEXT octFunctionNames[] = { {OC_PREINITIALIZE, TEXT("OC_PREINITIALIZE")}, {OC_INIT_COMPONENT, TEXT("OC_INIT_COMPONENT")}, {OC_SET_LANGUAGE, TEXT("OC_SET_LANGUAGE")}, {OC_QUERY_IMAGE, TEXT("OC_QUERY_IMAGE")}, {OC_REQUEST_PAGES, TEXT("OC_REQUEST_PAGES")}, {OC_QUERY_CHANGE_SEL_STATE, TEXT("OC_QUERY_CHANGE_SEL_STATE")}, {OC_CALC_DISK_SPACE, TEXT("OC_CALC_DISK_SPACE")}, {OC_QUEUE_FILE_OPS, TEXT("OC_QUEUE_FILE_OPS")}, {OC_NOTIFICATION_FROM_QUEUE, TEXT("OC_NOTIFICATION_FROM_QUEUE")}, {OC_QUERY_STEP_COUNT, TEXT("OC_QUERY_STEP_COUNT")}, {OC_COMPLETE_INSTALLATION, TEXT("OC_COMPLETE_INSTALLATION")}, {OC_CLEANUP, TEXT("OC_CLEANUP")}, {OC_QUERY_STATE, TEXT("OC_QUERY_STATE")}, {OC_NEED_MEDIA, TEXT("OC_NEED_MEDIA")}, {OC_ABOUT_TO_COMMIT_QUEUE, TEXT("OC_ABOUT_TO_COMMIT_QUEUE")}, {OC_QUERY_SKIP_PAGE, TEXT("OC_QUERY_SKIP_PAGE")}, {OC_WIZARD_CREATED, TEXT("OC_WIZARD_CREATED")}, {OC_FILE_BUSY, TEXT("OC_FILE_BUSY")}, {OCP_TEST_PRIVATE_BASE, TEXT("OCP_TEST_PRIVATE_BASE")}, {OCP_CHECK_NEEDS, TEXT("OCP_CHECK_NEEDS")} }; // // Data structures // typedef struct _COMPONENT_DATA { struct _COMPONENT_DATA *Next; // // Name of the component // LPCTSTR tszComponentId; // // Open inf handle to per-component inf for this component. // HINF hinfMyInfHandle; // // Operation flags from the SETUP_DATA structure we get at init time // DWORDLONG dwlFlags; // // Language ID we're supposed to use. // LANGID LanguageId; // // These things will not typically be per-component // since the DLL gets loaded multiple times within the // context of one suite/master OC inf. // // But just in case and for completeness, we include them here. // TCHAR tszSourcePath[MAX_PATH]; TCHAR tszUnattendFile[MAX_PATH]; OCMANAGER_ROUTINES ocrHelperRoutines; UINT uiFunctionToAV; BOOL bAccessViolation; } COMPONENT_DATA, *PCOMPONENT_DATA; typedef struct _PRIVATE_DATA { TCHAR tszName[MAX_MSG_LEN]; // The name of the data value UINT uiType; // The data type REG_DWORD, REG_SZ, // REG_MULTI_SZ, REG_BINARY UINT uiSize; // The size of the data PVOID pvBuffer; // The buffer to hold the data PBYTE pbBuffer; } PRIVATE_DATA, *PPRIVATE_DATA; typedef struct _MYWIZPAGE { // // Number of pages of this type // UINT uiCount; // // The page's index within the same type // UINT uiOrdinal; // // The page's type // WizardPagesType wpType; // // The string that identifies the component queryed // TCHAR tszComponentId[MAX_PATH]; } MYWIZPAGE, *PMYWIZPAGE; typedef struct _COMPLIST { struct _COMPLIST *Next; TCHAR tszSubcomponentId[MAX_PATH]; } COMPLIST, *PCOMPLIST; // nd, *pnd typedef struct _SUBCOMP { struct _SUBCOMP *Next; TCHAR tszSubcomponentId[MAX_PATH]; // Name of this subcomponent TCHAR tszComponentId[MAX_PATH]; // Name of master component TCHAR tszParentId[MAX_PATH]; // Name of this subcomp's parent BOOL bMarked; // Used to mark this node UINT uiModeToBeOn[4]; int nNumMode; PCOMPLIST pclNeeds; PCOMPLIST pclExclude; PCOMPLIST pclChildren; } SUBCOMP, *PSUBCOMP; // sc, *psc typedef struct _CHECK_NEEDS { PCOMPLIST pclNeeds; PTCHAR tszNodesVisited; BOOL bResult; } CHECK_NEEDS, *PCHECK_NEEDS; // cn, *pcn /* This structure is used to pass parameters into the dialogbox */ typedef struct _ReturnOrAV { TCHAR *tszComponent; TCHAR *tszSubComponent; TCHAR tszAPICall[256]; BOOL bOverride; INT iReturnValue; } ReturnOrAV, *PReturnOrAV; // Some security stuff // From NT security FAQ struct UNI_STRING{ USHORT len; USHORT maxlen; WCHAR *buff; }; static HANDLE fh; // End of security stuff //===================================================================== // Global variables //===================================================================== HINSTANCE g_hDllInstance; // File log handle and dll instance handle PCOMPONENT_DATA g_pcdComponents; // linked list of components BOOL g_bUsePrivateFunctions; // Flag to allow/disallow the use of private functions WizardPagesType g_wpCurrentPageType; // Current wizard page type UINT g_uiCurrentPage; // Index of currend page OCMANAGER_ROUTINES g_ocrHelperRoutines; // Helper routines UINT g_auiPageNumberTable[MAX_WIZPAGE_TYPES]; static PSUBCOMP g_pscHead; // // The "witness" file queue : all the files queued "with" the // OCManager (as a response at OC_QUEUE_FILE_OPS) will be also // queued here. // Finally, we will perform a SetupScanFileQueue to determine // if all the file operations are done. // HSPFILEQ g_FileQueue; // // We have to set the OC Manager Routines first time // The first call to TestPrivateData must set all the values first. // All the subsequent calls will query the values and reset // one of them randomly. // static BOOL g_bFirstTime; // // If TRUE, allow the user to select initial values for the component. // If FALSE, default to preselected initial values // static BOOL g_bTestExtended; static BOOL g_bAccessViolation; static int g_nTestDialog; static BOOL g_bNoWizPage; static BOOL g_bCrashUnicode; static BOOL g_bInvalidBitmap; static int nStepsFinal; static BOOL g_bHugeSize; static BOOL g_bCloseInf; static BOOL g_bNoNeedMedia; static BOOL g_bCleanReg; static UINT g_uiFunctionToAV; HINF hInfGlobal; static BOOL g_bNoLangSupport; static BOOL g_bReboot; //===================================================================== // Function Prototypes for octest.c //===================================================================== BOOL CALLBACK ChooseVersionDlgProc(IN HWND hwnd, IN UINT uiMsg, IN WPARAM wParam, IN LPARAM lParam); BOOL CALLBACK ChooseSubcomponentDlgProc(IN HWND hwnd, IN UINT uiMsg, IN WPARAM wParam, IN LPARAM lParam); VOID ChooseVersionEx(IN LPCVOID lpcvComponentId, IN OUT PSETUP_INIT_COMPONENT psicInitComponent); EXPORT DWORD ComponentSetupProc(IN LPCVOID lpcvComponentId, IN LPCVOID lpcvSubcomponentId, IN UINT uiFunction, IN UINT uiParam1, IN PVOID pvParam2); DWORD RunOcPreinitialize(IN LPCVOID lpcvComponentId, IN LPCVOID lpcvSubcomponentId, IN UINT uiParam1); DWORD RunOcInitComponent(IN LPCVOID lpcvComponentId, IN LPCVOID lpcvSubcomponentId, IN PVOID pvParam2); DWORD RunOcQueryState(IN LPCVOID lpcvComponentId, IN LPCVOID lpcvSubcomponentId); DWORD RunOcSetLanguage(IN LPCVOID lpcvComponentId, IN LPCVOID lpcvSubcomponentId, IN UINT uiParam1); DWORD RunOcQueryImage(IN LPCVOID lpcvComponentId, IN LPCVOID lpcvSubcomponentId, IN PVOID pvParam2); DWORD RunOcRequestPages(IN LPCVOID lpcvComponentId, IN UINT uiParam1, IN PVOID pvParam2); DWORD RunOcQueryChangeSelState(IN LPCVOID lpcvComponentId, IN LPCVOID lpcvSubcomponentId, IN UINT uiParam1); DWORD RunOcCalcDiskSpace(IN LPCVOID lpcvComponentId, IN LPCVOID lpcvSubcomponentId, IN UINT uiParam1, IN PVOID pvParam2); DWORD RunOcQueueFileOps(IN LPCVOID lpcvComponentId, IN LPCVOID lpcvSubcomponentId, IN PVOID pvParam2); DWORD RunOcNeedMedia(IN LPCVOID lpcvComponentId, IN UINT uiParam1, IN PVOID pvParam2); DWORD RunOcQueryStepCount(IN LPCVOID lpcvComponentId); DWORD RunOcCompleteInstallation(IN LPCVOID lpcvComponentId, IN LPCVOID lpcvSubcomponentId); DWORD RunOcCleanup(IN LPCVOID lpcvComponentId); DWORD RunTestOcPrivateBase(IN LPCVOID lpcvSubcomponentId, IN UINT uiParam1, IN PVOID pvParam2); DWORD TestHelperRoutines(IN LPCVOID lpcvComponentId, IN OCMANAGER_ROUTINES OCManagerRoutines); DWORD TestPrivateFunction(IN LPCVOID lpcvComponentId, IN OCMANAGER_ROUTINES OCManagerRoutines); VOID TestPrivateData(IN OCMANAGER_ROUTINES OCManagerRoutines); VOID CheckPrivateValues(IN OCMANAGER_ROUTINES OCManagerRoutines, IN PRIVATE_DATA *aPrivateDataTable); BOOL SetAValue(IN OCMANAGER_ROUTINES OCManagerRoutines, IN UINT uiIndex, IN OUT PRIVATE_DATA *aPrivateDataTable); DWORD ChooseSubcomponentInitialState(IN LPCVOID lpcvComponentId, IN LPCVOID lpcvSubcomponentId); PCOMPONENT_DATA AddNewComponent(IN LPCTSTR tszComponentId); PCOMPONENT_DATA LocateComponent(IN LPCTSTR tszComponentId); VOID RemoveComponent(IN LPCTSTR tszComponentId); VOID CleanUpTest(); BOOL CreateSubcomponentInformationList(IN HINF hinf); VOID FreeSubcomponentInformationList(); VOID ClearSubcomponentInformationMarks(); PSUBCOMP FindSubcomponentInformationNode(IN PTCHAR tszComponentId, IN PTCHAR tszSubcomponentId); VOID CheckNeedsDependencies(); VOID CheckExcludeDependencies(); VOID CheckParentDependencies(); BOOL CheckNeedsDependenciesOfSubcomponent(IN OCMANAGER_ROUTINES ocrHelper, IN PSUBCOMP pscSubcomponent, IN PSUBCOMP pscWhoNeedsMe, IN OUT PTCHAR tszNodesVisited); BOOL CheckLocalNeedsDependencies(IN OCMANAGER_ROUTINES ocrHelper, IN PSUBCOMP pscSubcomponent, IN PCOMPLIST pclNeeds, IN OUT PTCHAR tszNodesVisited); BOOL AlreadyVisitedNode(IN PTCHAR tszSubcomponentId, IN PTCHAR tszNodesVisited); PTCHAR GetComponent(IN PTCHAR tszSubcomponentId, IN OUT PTCHAR tszComponentId); VOID ParseCommandLine(); VOID testAV(BOOL); BOOL TestReturnValueAndAV(IN LPCVOID lpcvComponentId, IN LPCVOID lpcvSubcomponentId, IN UINT uiFunction, IN UINT uiParam1, IN PVOID pvParam2, IN OUT PReturnOrAV raValue); BOOL BeginTest(); BOOL CALLBACK ChooseReturnOrAVDlgProc(IN HWND hwnd, IN UINT uiMsg, IN WPARAM wParam, IN LPARAM lParam); void causeAV(IN UINT uiFunction); BOOL CALLBACK CauseAVDlgProc(IN HWND hwnd, IN UINT uiMsg, IN WPARAM wParam, IN LPARAM lParam); UINT GetOCFunctionName(IN PTCHAR tszFunctionName); void SetGlobalsFromINF(HINF infHandle); void causeAVPerComponent(IN UINT uiFunction, IN LPCVOID lpcvComponentId); void SetDefaultMode(PCOMPONENT_DATA pcdComponentData); //===================================================================== // Function Prototypes for utils.c //===================================================================== VOID LogOCFunction(IN LPCVOID lpcvComponentId, IN LPCVOID lpcvSubcomponentId, IN UINT uiFunction, IN UINT uiParam1, IN PVOID pvParam2); BOOL QueryButtonCheck(IN HWND hwndDlg, IN INT iCtrlID); VOID PrintSpaceOnDrives(IN HDSKSPC DiskSpace); VOID MultiStringToString(IN PTSTR tszMultiStr, OUT PTSTR tszStr); INT MultiStringSize(IN PTSTR tszMultiStr); VOID CopyMultiString(OUT PTSTR tszMultiStrDestination, IN PTSTR tszMultiStrSource); VOID InitGlobals(); //===================================================================== // Function Prototypes for wizpage.c //===================================================================== DWORD DoPageRequest(IN LPCTSTR tszComponentId, IN WizardPagesType wpWhichOnes, IN OUT PSETUP_REQUEST_PAGES psrpSetupPages, IN OCMANAGER_ROUTINES ocrOcManagerHelperRoutines); VOID PrintModeInString(OUT PTCHAR tszString, IN UINT uiSetupMode); INT ButtonIdFromSetupMode(IN DWORD dwSetupMode); DWORD SetupModeFromButtonId(IN INT iButtonId); BOOL CALLBACK WizPageDlgProc(IN HWND hwnd, IN UINT uiMsg, IN WPARAM wParam, IN LPARAM lParam); #endif // _OCTEST_H