From 401becab3ebc24808f983407d2992ee02a0641b5 Mon Sep 17 00:00:00 2001 From: James Hawkins Date: Thu, 20 Apr 2006 10:09:00 -0500 Subject: [PATCH] advpack: Implement the RunPostSetupCommands callback. --- dlls/advpack/install.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/dlls/advpack/install.c b/dlls/advpack/install.c index e7911cae144..6bab9c0ecb5 100644 --- a/dlls/advpack/install.c +++ b/dlls/advpack/install.c @@ -58,6 +58,9 @@ typedef HRESULT (*iterate_fields_func)(HINF hinf, PCWSTR field, void *arg); /* Advanced INF commands */ static const WCHAR RegisterOCXs[] = {'R','e','g','i','s','t','e','r','O','C','X','s',0}; +static const WCHAR RunPostSetupCommands[] = { + 'R','u','n','P','o','s','t','S','e','t','u','p','C','o','m','m','a','n','d','s',0 +}; /* Advanced INF callbacks */ static HRESULT register_ocxs_callback(HINF hinf, PCWSTR field, void *arg) @@ -93,6 +96,30 @@ static HRESULT register_ocxs_callback(HINF hinf, PCWSTR field, void *arg) return hr; } +static HRESULT run_post_setup_commands_callback(HINF hinf, PCWSTR field, void *arg) +{ + ADVInfo *info = (ADVInfo *)arg; + INFCONTEXT context; + HRESULT hr = S_OK; + DWORD size; + + BOOL ok = SetupFindFirstLineW(hinf, field, NULL, &context); + + for (; ok; ok = SetupFindNextLine(&context, &context)) + { + WCHAR buffer[MAX_INF_STRING_LENGTH]; + + if (!SetupGetLineTextW(&context, NULL, NULL, NULL, buffer, + MAX_INF_STRING_LENGTH, &size)) + continue; + + if (launch_exe(buffer, info->working_dir, NULL)) + hr = E_FAIL; + } + + return hr; +} + /* sequentially returns pointers to parameters in a parameter list * returns NULL if the parameter is empty, e.g. one,,three */ LPWSTR get_parameter(LPWSTR *params, WCHAR separator) @@ -222,6 +249,13 @@ static HRESULT adv_install(ADVInfo *info) hr = iterate_section_fields(info->hinf, info->install_sec, RegisterOCXs, register_ocxs_callback, NULL); + if (hr != S_OK) + return hr; + + hr = iterate_section_fields(info->hinf, info->install_sec, RunPostSetupCommands, + run_post_setup_commands_callback, info); + if (hr != S_OK) + return hr; return hr; }