ReactOS 0.4.16-dev-338-g34e76ad
axinstall.c File Reference
#include <assert.h>
#include "urlmon_main.h"
#include "resource.h"
#include "advpub.h"
#include "fdi.h"
#include "wine/debug.h"
Include dependency graph for axinstall.c:

Go to the source code of this file.

Classes

struct  install_ctx_t
 

Macros

#define OEMRESOURCE
 

Enumerations

enum  install_type { INSTALL_UNKNOWN , INSTALL_DLL , INSTALL_INF }
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (urlmon)
 
static void release_install_ctx (install_ctx_t *ctx)
 
static BOOL file_exists (const WCHAR *file_name)
 
static HRESULT extract_cab_file (install_ctx_t *ctx)
 
static HRESULT setup_dll (install_ctx_t *ctx)
 
static void expand_command (install_ctx_t *ctx, const WCHAR *cmd, WCHAR *buf, size_t *size)
 
static HRESULT process_hook_section (install_ctx_t *ctx, const WCHAR *sect_name)
 
static HRESULT install_inf_file (install_ctx_t *ctx)
 
static HRESULT install_cab_file (install_ctx_t *ctx)
 
static void update_counter (install_ctx_t *ctx, HWND hwnd)
 
static BOOL init_warning_dialog (HWND hwnd, install_ctx_t *ctx)
 
static INT_PTR WINAPI warning_proc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
 
static BOOL install_warning (install_ctx_t *ctx)
 
static HRESULT install_file (install_ctx_t *ctx, const WCHAR *cache_file)
 
static void failure_msgbox (install_ctx_t *ctx, HRESULT hres)
 
static HRESULT distunit_on_stop (void *ctx, const WCHAR *cache_file, HRESULT hresult, const WCHAR *error_str)
 
HRESULT WINAPI AsyncInstallDistributionUnit (const WCHAR *szDistUnit, const WCHAR *szTYPE, const WCHAR *szExt, DWORD dwFileVersionMS, DWORD dwFileVersionLS, const WCHAR *szURL, IBindCtx *pbc, void *pvReserved, DWORD flags)
 

Variables

static const WCHAR ctxW [] = {'c','t','x',0}
 
static const WCHAR cab_extW [] = {'.','c','a','b',0}
 
static const WCHAR infW [] = {'i','n','f',0}
 
static const WCHAR dllW [] = {'d','l','l',0}
 
static const WCHAR ocxW [] = {'o','c','x',0}
 

Macro Definition Documentation

◆ OEMRESOURCE

#define OEMRESOURCE

Definition at line 19 of file axinstall.c.

Enumeration Type Documentation

◆ install_type

Enumerator
INSTALL_UNKNOWN 
INSTALL_DLL 
INSTALL_INF 

Definition at line 39 of file axinstall.c.

39 {
43};
@ INSTALL_UNKNOWN
Definition: axinstall.c:40
@ INSTALL_DLL
Definition: axinstall.c:41
@ INSTALL_INF
Definition: axinstall.c:42

Function Documentation

◆ AsyncInstallDistributionUnit()

HRESULT WINAPI AsyncInstallDistributionUnit ( const WCHAR szDistUnit,
const WCHAR szTYPE,
const WCHAR szExt,
DWORD  dwFileVersionMS,
DWORD  dwFileVersionLS,
const WCHAR szURL,
IBindCtx pbc,
void pvReserved,
DWORD  flags 
)

Definition at line 636 of file axinstall.c.

638{
641
642 TRACE("(%s %s %s %x %x %s %p %p %x)\n", debugstr_w(szDistUnit), debugstr_w(szTYPE), debugstr_w(szExt),
643 dwFileVersionMS, dwFileVersionLS, debugstr_w(szURL), pbc, pvReserved, flags);
644
645 if(szDistUnit || szTYPE || szExt)
646 FIXME("Unsupported arguments\n");
647
648 ctx = heap_alloc_zero(sizeof(*ctx));
649 if(!ctx)
650 return E_OUTOFMEMORY;
651
652 hres = CreateUri(szURL, 0, 0, &ctx->uri);
653 if(FAILED(hres)) {
654 heap_free(ctx);
655 return E_OUTOFMEMORY;
656 }
657
658 ctx->callback = bsc_from_bctx(pbc);
659
660 hres = download_to_cache(ctx->uri, distunit_on_stop, ctx, ctx->callback);
661 if(hres == MK_S_ASYNCHRONOUS)
662 ctx->release_on_stop = TRUE;
663 else
665
666 return hres;
667}
static BOOL heap_free(void *mem)
Definition: appwiz.h:76
static HRESULT distunit_on_stop(void *ctx, const WCHAR *cache_file, HRESULT hresult, const WCHAR *error_str)
Definition: axinstall.c:613
static void release_install_ctx(install_ctx_t *ctx)
Definition: axinstall.c:60
#define FIXME(fmt,...)
Definition: precomp.h:53
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define TRUE
Definition: types.h:120
HRESULT WINAPI CreateUri(LPCWSTR pwzURI, DWORD dwFlags, DWORD_PTR dwReserved, IUri **ppURI)
Definition: uri.c:5700
GLbitfield flags
Definition: glext.h:7161
#define FAILED(hr)
Definition: intsafe.h:51
#define debugstr_w
Definition: kernel32.h:32
static LPCSTR DWORD void * pvReserved
Definition: str.c:196
HRESULT hres
Definition: protocol.c:465
#define TRACE(s)
Definition: solgame.cpp:4
IBindStatusCallback * bsc_from_bctx(IBindCtx *bctx)
Definition: bindctx.c:70
HRESULT download_to_cache(IUri *uri, stop_cache_binding_proc_t proc, void *ctx, IBindStatusCallback *callback)
Definition: download.c:375

Referenced by install_codebase().

◆ distunit_on_stop()

static HRESULT distunit_on_stop ( void ctx,
const WCHAR cache_file,
HRESULT  hresult,
const WCHAR error_str 
)
static

Definition at line 613 of file axinstall.c.

614{
615 install_ctx_t *install_ctx = ctx;
616
617 TRACE("(%p %s %08x %s)\n", ctx, debugstr_w(cache_file), hresult, debugstr_w(error_str));
618
619 if(hresult == S_OK) {
620 hresult = install_file(install_ctx, cache_file);
621 if(FAILED(hresult))
622 failure_msgbox(ctx, hresult);
623 }
624
625 if(install_ctx->callback)
626 IBindStatusCallback_OnStopBinding(install_ctx->callback, hresult, error_str);
627
628 if(install_ctx->release_on_stop)
629 release_install_ctx(install_ctx);
630 return S_OK;
631}
static HRESULT install_file(install_ctx_t *ctx, const WCHAR *cache_file)
Definition: axinstall.c:559
static void failure_msgbox(install_ctx_t *ctx, HRESULT hres)
Definition: axinstall.c:604
#define S_OK
Definition: intsafe.h:52
static const WCHAR * cache_file
Definition: protocol.c:102
BOOL release_on_stop
Definition: axinstall.c:48
IBindStatusCallback * callback
Definition: axinstall.c:47

Referenced by AsyncInstallDistributionUnit().

◆ expand_command()

static void expand_command ( install_ctx_t ctx,
const WCHAR cmd,
WCHAR buf,
size_t size 
)
static

Definition at line 274 of file axinstall.c.

275{
276 const WCHAR *ptr = cmd, *prev_ptr = cmd;
277 size_t len = 0, len2;
278
279 static const WCHAR expand_dirW[] = {'%','E','X','T','R','A','C','T','_','D','I','R','%'};
280
281 while((ptr = wcschr(ptr, '%'))) {
282 if(buf)
283 memcpy(buf+len, prev_ptr, ptr-prev_ptr);
284 len += ptr-prev_ptr;
285
286 if(!_wcsnicmp(ptr, expand_dirW, ARRAY_SIZE(expand_dirW))) {
287 len2 = lstrlenW(ctx->tmp_dir);
288 if(buf)
289 memcpy(buf+len, ctx->tmp_dir, len2*sizeof(WCHAR));
290 len += len2;
291 ptr += ARRAY_SIZE(expand_dirW);
292 }else {
293 FIXME("Can't expand %s\n", debugstr_w(ptr));
294 if(buf)
295 buf[len] = '%';
296 len++;
297 ptr++;
298 }
299
300 prev_ptr = ptr;
301 }
302
303 if(buf)
304 lstrcpyW(buf+len, prev_ptr);
305 *size = len + lstrlenW(prev_ptr) + 1;
306}
#define ARRAY_SIZE(A)
Definition: main.h:20
#define wcschr
Definition: compat.h:17
#define lstrcpyW
Definition: compat.h:749
#define lstrlenW
Definition: compat.h:750
GLsizeiptr size
Definition: glext.h:5919
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLenum GLsizei len
Definition: glext.h:6722
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static PVOID ptr
Definition: dispmode.c:27
_Check_return_ _CRTIMP int __cdecl _wcsnicmp(_In_reads_or_z_(_MaxCount) const wchar_t *_Str1, _In_reads_or_z_(_MaxCount) const wchar_t *_Str2, _In_ size_t _MaxCount)
Definition: ftp_var.h:139
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by process_hook_section().

◆ extract_cab_file()

static HRESULT extract_cab_file ( install_ctx_t ctx)
static

Definition at line 200 of file axinstall.c.

201{
202 size_t path_len, file_len;
203 WCHAR *ptr;
205
206#ifdef __REACTOS__
207 hres = Modified_ExtractFilesW(ctx->cache_file, ctx->tmp_dir);
208#else
209 hres = ExtractFilesW(ctx->cache_file, ctx->tmp_dir, 0, NULL, NULL, 0);
210#endif
211 if(FAILED(hres)) {
212 WARN("ExtractFilesW failed: %08x\n", hres);
213 return hres;
214 }
215
216 path_len = lstrlenW(ctx->tmp_dir);
217 file_len = lstrlenW(ctx->file_name);
218 ctx->install_file = heap_alloc((path_len+file_len+2)*sizeof(WCHAR));
219 if(!ctx->install_file)
220 return E_OUTOFMEMORY;
221
222 memcpy(ctx->install_file, ctx->tmp_dir, path_len*sizeof(WCHAR));
223 ctx->install_file[path_len] = '\\';
224 memcpy(ctx->install_file+path_len+1, ctx->file_name, (file_len+1)*sizeof(WCHAR));
225
226 /* NOTE: Assume that file_name contains ".cab" extension */
227 ptr = ctx->install_file+path_len+1+file_len-3;
228
229 memcpy(ptr, infW, sizeof(infW));
230 if(file_exists(ctx->install_file)) {
231 ctx->install_type = INSTALL_INF;
232 return S_OK;
233 }
234
235 memcpy(ptr, dllW, sizeof(dllW));
236 if(file_exists(ctx->install_file)) {
237 ctx->install_type = INSTALL_DLL;
238 return S_OK;
239 }
240
241 memcpy(ptr, ocxW, sizeof(ocxW));
242 if(file_exists(ctx->install_file)) {
243 ctx->install_type = INSTALL_DLL;
244 return S_OK;
245 }
246
247 FIXME("No known install file\n");
248 return E_NOTIMPL;
249}
static void * heap_alloc(size_t len)
Definition: appwiz.h:66
static BOOL file_exists(const WCHAR *file_name)
Definition: axinstall.c:70
static const WCHAR infW[]
Definition: axinstall.c:35
static const WCHAR ocxW[]
Definition: axinstall.c:37
static const WCHAR dllW[]
Definition: axinstall.c:36
#define WARN(fmt,...)
Definition: precomp.h:61
#define E_NOTIMPL
Definition: ddrawi.h:99
#define NULL
Definition: types.h:112
HRESULT WINAPI ExtractFilesW(LPCWSTR CabName, LPCWSTR ExpandDir, DWORD Flags, LPCWSTR FileList, LPVOID LReserved, DWORD Reserved)
Definition: files.c:802
static DWORD path_len
Definition: batch.c:31

Referenced by install_cab_file().

◆ failure_msgbox()

static void failure_msgbox ( install_ctx_t ctx,
HRESULT  hres 
)
static

Definition at line 604 of file axinstall.c.

605{
606 WCHAR buf[1024], fmt[1024];
607
609 swprintf(buf, fmt, hres);
610 MessageBoxW(ctx->hwnd, buf, NULL, MB_OK);
611}
#define IDS_AXINSTALL_FAILURE
Definition: resource.h:26
#define swprintf
Definition: precomp.h:40
Definition: dsound.c:943
HINSTANCE urlmon_instance
Definition: urlmon_main.c:43
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
int WINAPI MessageBoxW(_In_opt_ HWND hWnd, _In_opt_ LPCWSTR lpText, _In_opt_ LPCWSTR lpCaption, _In_ UINT uType)
#define MB_OK
Definition: winuser.h:793

Referenced by distunit_on_stop().

◆ file_exists()

static BOOL file_exists ( const WCHAR file_name)
inlinestatic

Definition at line 70 of file axinstall.c.

71{
73}
DWORD WINAPI GetFileAttributesW(LPCWSTR lpFileName)
Definition: fileinfo.c:652
static LPCWSTR file_name
Definition: protocol.c:147
#define INVALID_FILE_ATTRIBUTES
Definition: vfdcmd.c:23

Referenced by check_directory(), create_cache(), extract_cab_file(), and HandleCommandLine().

◆ init_warning_dialog()

static BOOL init_warning_dialog ( HWND  hwnd,
install_ctx_t ctx 
)
static

Definition at line 481 of file axinstall.c.

482{
483 BSTR display_uri;
485
486 if(!SetPropW(hwnd, ctxW, ctx))
487 return FALSE;
488
489 hres = IUri_GetDisplayUri(ctx->uri, &display_uri);
490 if(FAILED(hres))
491 return FALSE;
492
494 SysFreeString(display_uri);
495
497 (WPARAM)LoadIconW(0, (const WCHAR*)OIC_WARNING), 0);
498
499 ctx->counter = 4;
501 ctx->timer = SetTimer(hwnd, 1, 1000, NULL);
502 return TRUE;
503}
static const WCHAR ctxW[]
Definition: axinstall.c:33
static void update_counter(install_ctx_t *ctx, HWND hwnd)
Definition: axinstall.c:460
#define FALSE
Definition: types.h:117
OLECHAR * BSTR
Definition: compat.h:2293
#define ID_AXINSTALL_ICON
Definition: resource.h:24
#define ID_AXINSTALL_LOCATION
Definition: resource.h:22
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:271
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
UINT_PTR WPARAM
Definition: windef.h:207
#define STM_SETICON
Definition: winuser.h:2095
BOOL WINAPI SetDlgItemTextW(_In_ HWND, _In_ int, _In_ LPCWSTR)
UINT_PTR WINAPI SetTimer(_In_opt_ HWND, _In_ UINT_PTR, _In_ UINT, _In_opt_ TIMERPROC)
LRESULT WINAPI SendDlgItemMessageW(_In_ HWND, _In_ int, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI SetPropW(_In_ HWND, _In_ LPCWSTR, _In_opt_ HANDLE)
HICON WINAPI LoadIconW(_In_opt_ HINSTANCE hInstance, _In_ LPCWSTR lpIconName)
Definition: cursoricon.c:2127

Referenced by warning_proc().

◆ install_cab_file()

static HRESULT install_cab_file ( install_ctx_t ctx)
static

Definition at line 415 of file axinstall.c.

416{
417 WCHAR tmp_path[MAX_PATH], tmp_dir[MAX_PATH];
418 BOOL res = FALSE, leave_temp = FALSE;
419 DWORD i;
421
422 GetTempPathW(ARRAY_SIZE(tmp_path), tmp_path);
423
424 for(i=0; !res && i < 100; i++) {
425 GetTempFileNameW(tmp_path, NULL, GetTickCount() + i*17037, tmp_dir);
426 res = CreateDirectoryW(tmp_dir, NULL);
427 }
428 if(!res)
429 return E_FAIL;
430
431 ctx->tmp_dir = tmp_dir;
432
433 TRACE("Using temporary directory %s\n", debugstr_w(tmp_dir));
434
436 if(SUCCEEDED(hres)) {
437 if(ctx->callback)
438 IBindStatusCallback_OnProgress(ctx->callback, 0, 0, BINDSTATUS_INSTALLINGCOMPONENTS, ctx->install_file);
439
440 switch(ctx->install_type) {
441 case INSTALL_INF:
443 break;
444 case INSTALL_DLL:
445 FIXME("Installing DLL, registering in temporary location\n");
446 hres = setup_dll(ctx);
447 if(SUCCEEDED(hres))
448 leave_temp = TRUE;
449 break;
450 default:
451 assert(0);
452 }
453 }
454
455 if(!leave_temp)
456 RemoveDirectoryW(ctx->tmp_dir);
457 return hres;
458}
static HRESULT install_inf_file(install_ctx_t *ctx)
Definition: axinstall.c:350
static HRESULT extract_cab_file(install_ctx_t *ctx)
Definition: axinstall.c:200
static HRESULT setup_dll(install_ctx_t *ctx)
Definition: axinstall.c:251
#define E_FAIL
Definition: ddrawi.h:102
#define MAX_PATH
Definition: compat.h:34
BOOL WINAPI CreateDirectoryW(IN LPCWSTR lpPathName, IN LPSECURITY_ATTRIBUTES lpSecurityAttributes)
Definition: dir.c:90
BOOL WINAPI RemoveDirectoryW(IN LPCWSTR lpPathName)
Definition: dir.c:732
DWORD WINAPI GetTempPathW(IN DWORD count, OUT LPWSTR path)
Definition: path.c:2080
DWORD WINAPI GetTickCount(VOID)
Definition: time.c:455
#define assert(x)
Definition: debug.h:53
UINT WINAPI GetTempFileNameW(IN LPCWSTR lpPathName, IN LPCWSTR lpPrefixString, IN UINT uUnique, OUT LPWSTR lpTempFileName)
Definition: filename.c:84
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint res
Definition: glext.h:9613
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define SUCCEEDED(hr)
Definition: intsafe.h:50

Referenced by install_file().

◆ install_file()

static HRESULT install_file ( install_ctx_t ctx,
const WCHAR cache_file 
)
static

Definition at line 559 of file axinstall.c.

560{
561 BSTR path;
563
564 TRACE("%s\n", debugstr_w(cache_file));
565
566 ctx->cache_file = cache_file;
567
568 if(!install_warning(ctx)) {
569 TRACE("Installation cancelled\n");
570 return S_OK;
571 }
572
573 hres = IUri_GetPath(ctx->uri, &path);
574 if(SUCCEEDED(hres)) {
575 const WCHAR *ptr, *ptr2, *ext;
576
577 ptr = wcsrchr(path, '/');
578 if(!ptr)
579 ptr = path;
580 else
581 ptr++;
582
583 ptr2 = wcsrchr(ptr, '\\');
584 if(ptr2)
585 ptr = ptr2+1;
586
587 ctx->file_name = ptr;
588 ext = wcsrchr(ptr, '.');
589 if(!ext)
590 ext = ptr;
591
592 if(!wcsicmp(ext, cab_extW)) {
594 }else {
595 FIXME("Unsupported extension %s\n", debugstr_w(ext));
596 hres = E_NOTIMPL;
597 }
599 }
600
601 return hres;
602}
static BOOL install_warning(install_ctx_t *ctx)
Definition: axinstall.c:534
static HRESULT install_cab_file(install_ctx_t *ctx)
Definition: axinstall.c:415
static const WCHAR cab_extW[]
Definition: axinstall.c:34
#define wcsrchr
Definition: compat.h:16
#define wcsicmp
Definition: compat.h:15
static const WCHAR *const ext[]
Definition: module.c:53

Referenced by distunit_on_stop().

◆ install_inf_file()

static HRESULT install_inf_file ( install_ctx_t ctx)
static

Definition at line 350 of file axinstall.c.

351{
352 WCHAR buf[2048], sect_name[128];
353 BOOL default_install = TRUE;
354 const WCHAR *key;
355 DWORD len;
357
358 static const WCHAR setup_hooksW[] = {'S','e','t','u','p',' ','H','o','o','k','s',0};
359 static const WCHAR add_codeW[] = {'A','d','d','.','C','o','d','e',0};
360
361 len = GetPrivateProfileStringW(setup_hooksW, NULL, NULL, buf, ARRAY_SIZE(buf), ctx->install_file);
362 if(len) {
363 default_install = FALSE;
364
365 for(key = buf; *key; key += lstrlenW(key)+1) {
366 TRACE("[Setup Hooks] key: %s\n", debugstr_w(key));
367
368 len = GetPrivateProfileStringW(setup_hooksW, key, NULL, sect_name, ARRAY_SIZE(sect_name),
369 ctx->install_file);
370 if(!len) {
371 WARN("Could not get key value\n");
372 return E_FAIL;
373 }
374
375 hres = process_hook_section(ctx, sect_name);
376 if(FAILED(hres))
377 return hres;
378 }
379 }
380
381 len = GetPrivateProfileStringW(add_codeW, NULL, NULL, buf, ARRAY_SIZE(buf), ctx->install_file);
382 if(len) {
383 default_install = FALSE;
384
385 for(key = buf; *key; key += lstrlenW(key)+1) {
386 TRACE("[Add.Code] key: %s\n", debugstr_w(key));
387
388 len = GetPrivateProfileStringW(add_codeW, key, NULL, sect_name, ARRAY_SIZE(sect_name),
389 ctx->install_file);
390 if(!len) {
391 WARN("Could not get key value\n");
392 return E_FAIL;
393 }
394
395 hres = RunSetupCommandW(ctx->hwnd, ctx->install_file, sect_name,
396 ctx->tmp_dir, NULL, NULL, RSC_FLAG_INF, NULL);
397 if(FAILED(hres)) {
398 WARN("RunSetupCommandW failed: %08x\n", hres);
399 return hres;
400 }
401 }
402 }
403
404 if(default_install) {
405 hres = RunSetupCommandW(ctx->hwnd, ctx->install_file, NULL, ctx->tmp_dir, NULL, NULL, RSC_FLAG_INF, NULL);
406 if(FAILED(hres)) {
407 WARN("RunSetupCommandW failed: %08x\n", hres);
408 return hres;
409 }
410 }
411
412 return S_OK;
413}
#define RSC_FLAG_INF
Definition: advpub.h:130
static HRESULT process_hook_section(install_ctx_t *ctx, const WCHAR *sect_name)
Definition: axinstall.c:308
HRESULT WINAPI RunSetupCommandW(HWND hWnd, LPCWSTR szCmdName, LPCWSTR szInfSection, LPCWSTR szDir, LPCWSTR lpszTitle, HANDLE *phEXE, DWORD dwFlags, LPVOID pvReserved)
Definition: install.c:990
INT WINAPI GetPrivateProfileStringW(LPCWSTR section, LPCWSTR entry, LPCWSTR def_val, LPWSTR buffer, UINT len, LPCWSTR filename)
Definition: profile.c:1142
Definition: copy.c:22

Referenced by install_cab_file().

◆ install_warning()

static BOOL install_warning ( install_ctx_t ctx)
static

Definition at line 534 of file axinstall.c.

535{
536 IWindowForBindingUI *window_iface;
537 HWND parent_hwnd = NULL;
539
540 if(!ctx->callback) {
541 FIXME("no callback\n");
542 return FALSE;
543 }
544
545 hres = IBindStatusCallback_QueryInterface(ctx->callback, &IID_IWindowForBindingUI, (void**)&window_iface);
546 if(FAILED(hres))
547 return FALSE;
548
549 hres = IWindowForBindingUI_GetWindow(window_iface, &IID_ICodeInstall, &ctx->hwnd);
550 IWindowForBindingUI_Release(window_iface);
551 if(FAILED(hres))
552 return FALSE;
553
554 ctx->cancel = TRUE;
556 return !ctx->cancel;
557}
static INT_PTR WINAPI warning_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
Definition: axinstall.c:505
#define ID_AXINSTALL_WARNING_DLG
Definition: resource.h:21
LONG_PTR LPARAM
Definition: windef.h:208
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
INT_PTR WINAPI DialogBoxParamW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _In_opt_ HWND, _In_opt_ DLGPROC, _In_ LPARAM)

Referenced by install_file().

◆ process_hook_section()

static HRESULT process_hook_section ( install_ctx_t ctx,
const WCHAR sect_name 
)
static

Definition at line 308 of file axinstall.c.

309{
310 WCHAR buf[2048], val[2*MAX_PATH];
311 const WCHAR *key;
312 DWORD len;
314
315 static const WCHAR runW[] = {'r','u','n',0};
316
317 len = GetPrivateProfileStringW(sect_name, NULL, NULL, buf, ARRAY_SIZE(buf), ctx->install_file);
318 if(!len)
319 return S_OK;
320
321 for(key = buf; *key; key += lstrlenW(key)+1) {
322 if(!wcsicmp(key, runW)) {
323 WCHAR *cmd;
324 size_t size;
325
326 len = GetPrivateProfileStringW(sect_name, runW, NULL, val, ARRAY_SIZE(val), ctx->install_file);
327
328 TRACE("Run %s\n", debugstr_w(val));
329
331
332 cmd = heap_alloc(size*sizeof(WCHAR));
333 if(!cmd)
334 heap_free(cmd);
335
337 hres = RunSetupCommandW(ctx->hwnd, cmd, NULL, ctx->tmp_dir, NULL, NULL, 0, NULL);
338 heap_free(cmd);
339 if(FAILED(hres))
340 return hres;
341 }else {
342 FIXME("Unsupported hook %s\n", debugstr_w(key));
343 return E_NOTIMPL;
344 }
345 }
346
347 return S_OK;
348}
static void expand_command(install_ctx_t *ctx, const WCHAR *cmd, WCHAR *buf, size_t *size)
Definition: axinstall.c:274
GLuint GLfloat * val
Definition: glext.h:7180

Referenced by install_inf_file().

◆ release_install_ctx()

static void release_install_ctx ( install_ctx_t ctx)
static

Definition at line 60 of file axinstall.c.

61{
62 if(ctx->uri)
63 IUri_Release(ctx->uri);
64 if(ctx->callback)
65 IBindStatusCallback_Release(ctx->callback);
66 heap_free(ctx->install_file);
68}

Referenced by AsyncInstallDistributionUnit(), and distunit_on_stop().

◆ setup_dll()

static HRESULT setup_dll ( install_ctx_t ctx)
static

Definition at line 251 of file axinstall.c.

252{
255
256 HRESULT (WINAPI *reg_func)(void);
257
258 module = LoadLibraryW(ctx->install_file);
259 if(!module)
260 return E_FAIL;
261
262 reg_func = (void*)GetProcAddress(module, "DllRegisterServer");
263 if(reg_func) {
264 hres = reg_func();
265 }else {
266 WARN("no DllRegisterServer function\n");
267 hres = E_FAIL;
268 }
269
271 return hres;
272}
#define GetProcAddress(x, y)
Definition: compat.h:753
#define FreeLibrary(x)
Definition: compat.h:748
#define LoadLibraryW(x)
Definition: compat.h:747
#define HRESULT
Definition: msvc.h:7
#define WINAPI
Definition: msvc.h:6

Referenced by install_cab_file().

◆ update_counter()

static void update_counter ( install_ctx_t ctx,
HWND  hwnd 
)
static

Definition at line 460 of file axinstall.c.

461{
462 WCHAR text[100];
463
464 if(--ctx->counter <= 0) {
465 HWND button_hwnd;
466
467 KillTimer(hwnd, ctx->timer);
469
471 EnableWindow(button_hwnd, TRUE);
472 }else {
473 WCHAR buf[100];
475 swprintf(text, buf, ctx->counter);
476 }
477
479}
const WCHAR * text
Definition: package.c:1794
#define IDS_AXINSTALL_INSTALL
Definition: resource.h:28
#define ID_AXINSTALL_INSTALL_BTN
Definition: resource.h:23
#define IDS_AXINSTALL_INSTALLN
Definition: resource.h:27
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
BOOL WINAPI EnableWindow(_In_ HWND, _In_ BOOL)
BOOL WINAPI KillTimer(_In_opt_ HWND, _In_ UINT_PTR)

Referenced by init_warning_dialog(), and warning_proc().

◆ warning_proc()

static INT_PTR WINAPI warning_proc ( HWND  hwnd,
UINT  msg,
WPARAM  wparam,
LPARAM  lparam 
)
static

Definition at line 505 of file axinstall.c.

506{
507 switch(msg) {
508 case WM_INITDIALOG: {
510 EndDialog(hwnd, 0);
511 return TRUE;
512 }
513 case WM_COMMAND:
514 switch(wparam) {
517 if(ctx)
518 ctx->cancel = FALSE;
519 EndDialog(hwnd, 0);
520 return FALSE;
521 }
522 case IDCANCEL:
523 EndDialog(hwnd, 0);
524 return FALSE;
525 }
526 case WM_TIMER:
528 return TRUE;
529 }
530
531 return FALSE;
532}
@ lparam
Definition: SystemMenu.c:31
@ wparam
Definition: SystemMenu.c:30
#define msg(x)
Definition: auth_time.c:54
static BOOL init_warning_dialog(HWND hwnd, install_ctx_t *ctx)
Definition: axinstall.c:481
#define IDCANCEL
Definition: winuser.h:834
#define WM_COMMAND
Definition: winuser.h:1743
#define WM_INITDIALOG
Definition: winuser.h:1742
#define WM_TIMER
Definition: winuser.h:1745
HANDLE WINAPI GetPropW(_In_ HWND, _In_ LPCWSTR)
BOOL WINAPI EndDialog(_In_ HWND, _In_ INT_PTR)

Referenced by install_warning().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( urlmon  )

Variable Documentation

◆ cab_extW

const WCHAR cab_extW[] = {'.','c','a','b',0}
static

Definition at line 34 of file axinstall.c.

Referenced by install_file().

◆ ctxW

const WCHAR ctxW[] = {'c','t','x',0}
static

Definition at line 33 of file axinstall.c.

Referenced by init_warning_dialog(), and warning_proc().

◆ dllW

const WCHAR dllW[] = {'d','l','l',0}
static

Definition at line 36 of file axinstall.c.

Referenced by extract_cab_file(), get_object_dll_path(), and test_SearchPathW().

◆ infW

const WCHAR infW[] = {'i','n','f',0}
static

◆ ocxW

const WCHAR ocxW[] = {'o','c','x',0}
static

Definition at line 37 of file axinstall.c.

Referenced by extract_cab_file().