ReactOS  0.4.14-dev-77-gd9e7c48
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.

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 {
639  install_ctx_t *ctx;
640  HRESULT hres;
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
664  release_install_ctx(ctx);
665 
666  return hres;
667 }
IBindStatusCallback * bsc_from_bctx(IBindCtx *bctx)
Definition: bindctx.c:70
static HRESULT distunit_on_stop(void *ctx, const WCHAR *cache_file, HRESULT hresult, const WCHAR *error_str)
Definition: axinstall.c:613
#define TRUE
Definition: types.h:120
IUri * uri
Definition: axinstall.c:46
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define debugstr_w
Definition: kernel32.h:32
#define FIXME(fmt,...)
Definition: debug.h:110
#define TRACE(s)
Definition: solgame.cpp:4
HRESULT hres
Definition: protocol.c:465
LONG HRESULT
Definition: typedefs.h:77
static LPCSTR DWORD void * pvReserved
Definition: str.c:196
HRESULT download_to_cache(IUri *uri, stop_cache_binding_proc_t proc, void *ctx, IBindStatusCallback *callback)
Definition: download.c:375
GLbitfield flags
Definition: glext.h:7161
BOOL release_on_stop
Definition: axinstall.c:48
static void release_install_ctx(install_ctx_t *ctx)
Definition: axinstall.c:60
HRESULT WINAPI CreateUri(LPCWSTR pwzURI, DWORD dwFlags, DWORD_PTR dwReserved, IUri **ppURI)
Definition: uri.c:5701
IBindStatusCallback * callback
Definition: axinstall.c:47
static BOOL heap_free(void *mem)
Definition: appwiz.h:75

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 void failure_msgbox(install_ctx_t *ctx, HRESULT hres)
Definition: axinstall.c:604
#define debugstr_w
Definition: kernel32.h:32
static const WCHAR * cache_file
Definition: protocol.c:102
#define TRACE(s)
Definition: solgame.cpp:4
#define S_OK
Definition: intsafe.h:59
static HRESULT install_file(install_ctx_t *ctx, const WCHAR *cache_file)
Definition: axinstall.c:559
BOOL release_on_stop
Definition: axinstall.c:48
static void release_install_ctx(install_ctx_t *ctx)
Definition: axinstall.c:60
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 = strchrW(ptr, '%'))) {
282  if(buf)
283  memcpy(buf+len, prev_ptr, ptr-prev_ptr);
284  len += ptr-prev_ptr;
285 
286  if(!strncmpiW(ptr, expand_dirW, ARRAY_SIZE(expand_dirW))) {
287  len2 = strlenW(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  strcpyW(buf+len, prev_ptr);
305  *size = len + strlenW(prev_ptr) + 1;
306 }
WINE_UNICODE_INLINE unsigned int strlenW(const WCHAR *str)
Definition: unicode.h:212
const WCHAR * tmp_dir
Definition: axinstall.c:52
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
WINE_UNICODE_INLINE WCHAR * strchrW(const WCHAR *str, WCHAR ch)
Definition: unicode.h:248
char * cmd
Definition: vfdcmd.c:85
#define strncmpiW(s1, s2, n)
Definition: unicode.h:40
#define debugstr_w
Definition: kernel32.h:32
#define FIXME(fmt,...)
Definition: debug.h:110
static PVOID ptr
Definition: dispmode.c:27
GLsizeiptr size
Definition: glext.h:5919
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
GLenum GLsizei len
Definition: glext.h:6722
WINE_UNICODE_INLINE WCHAR * strcpyW(WCHAR *dst, const WCHAR *src)
Definition: unicode.h:219
#define ARRAY_SIZE(a)
Definition: main.h:24

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;
204  HRESULT hres;
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 = strlenW(ctx->tmp_dir);
217  file_len = strlenW(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 }
WINE_UNICODE_INLINE unsigned int strlenW(const WCHAR *str)
Definition: unicode.h:212
const WCHAR * tmp_dir
Definition: axinstall.c:52
#define WARN(fmt,...)
Definition: debug.h:111
WCHAR * install_file
Definition: axinstall.c:50
static void * heap_alloc(size_t len)
Definition: appwiz.h:65
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define FIXME(fmt,...)
Definition: debug.h:110
static PVOID ptr
Definition: dispmode.c:27
smooth NULL
Definition: ftsmooth.c:416
enum install_type install_type
Definition: axinstall.c:54
static const WCHAR dllW[]
Definition: axinstall.c:36
HRESULT hres
Definition: protocol.c:465
static const WCHAR infW[]
Definition: axinstall.c:35
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:77
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static BOOL file_exists(const WCHAR *file_name)
Definition: axinstall.c:70
const WCHAR * cache_file
Definition: axinstall.c:51
#define S_OK
Definition: intsafe.h:59
static DWORD path_len
Definition: batch.c:31
#define E_NOTIMPL
Definition: ddrawi.h:99
const WCHAR * file_name
Definition: axinstall.c:53
HRESULT WINAPI ExtractFilesW(LPCWSTR CabName, LPCWSTR ExpandDir, DWORD Flags, LPCWSTR FileList, LPVOID LReserved, DWORD Reserved)
Definition: files.c:780
static const WCHAR ocxW[]
Definition: axinstall.c:37

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  sprintfW(buf, fmt, hres);
610  MessageBoxW(ctx->hwnd, buf, NULL, MB_OK);
611 }
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
smooth NULL
Definition: ftsmooth.c:416
HRESULT hres
Definition: protocol.c:465
int WINAPI MessageBoxW(_In_opt_ HWND, _In_opt_ LPCWSTR, _In_opt_ LPCWSTR, _In_ UINT)
__wchar_t WCHAR
Definition: xmlstorage.h:180
HINSTANCE urlmon_instance
Definition: urlmon_main.c:43
#define ARRAY_SIZE(a)
Definition: main.h:24
#define sprintfW
Definition: unicode.h:58
#define IDS_AXINSTALL_FAILURE
Definition: resource.h:26
#define MB_OK
Definition: winuser.h:784
Definition: dsound.c:943

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:802
#define INVALID_FILE_ATTRIBUTES
Definition: vfdcmd.c:23
static LPCWSTR file_name
Definition: protocol.c:146

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;
484  HRESULT hres;
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;
500  update_counter(ctx, hwnd);
501  ctx->timer = SetTimer(hwnd, 1, 1000, NULL);
502  return TRUE;
503 }
const DOCKBAR PVOID HWND HWND * hwnd
Definition: tooldock.h:22
#define STM_SETICON
Definition: winuser.h:2074
#define TRUE
Definition: types.h:120
#define ID_AXINSTALL_ICON
Definition: resource.h:24
static const WCHAR ctxW[]
Definition: axinstall.c:33
static void update_counter(install_ctx_t *ctx, HWND hwnd)
Definition: axinstall.c:460
#define OIC_WARNING
Definition: winuser.h:1154
UINT_PTR WPARAM
Definition: windef.h:207
IUri * uri
Definition: axinstall.c:46
OLECHAR * BSTR
Definition: compat.h:1934
BOOL WINAPI SetDlgItemTextW(_In_ HWND, _In_ int, _In_ LPCWSTR)
smooth NULL
Definition: ftsmooth.c:416
UINT_PTR WINAPI SetTimer(_In_opt_ HWND, _In_ UINT_PTR, _In_ UINT, _In_opt_ TIMERPROC)
INT_PTR timer
Definition: axinstall.c:57
HRESULT hres
Definition: protocol.c:465
BOOL WINAPI SetPropW(_In_ HWND, _In_ LPCWSTR, _In_opt_ HANDLE)
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:77
LRESULT WINAPI SendDlgItemMessageW(_In_ HWND, _In_ int, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:274
HICON WINAPI LoadIconW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
Definition: cursoricon.c:2044
#define ID_AXINSTALL_LOCATION
Definition: resource.h:22

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;
420  HRESULT hres;
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 
435  hres = extract_cab_file(ctx);
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:
442  hres = install_inf_file(ctx);
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)
457  return hres;
458 }
BOOL WINAPI CreateDirectoryW(IN LPCWSTR lpPathName, IN LPSECURITY_ATTRIBUTES lpSecurityAttributes)
Definition: dir.c:90
#define TRUE
Definition: types.h:120
static HRESULT install_inf_file(install_ctx_t *ctx)
Definition: axinstall.c:350
const WCHAR * tmp_dir
Definition: axinstall.c:52
DWORD WINAPI GetTickCount(VOID)
Definition: time.c:445
#define assert(x)
Definition: debug.h:53
#define E_FAIL
Definition: ddrawi.h:102
WCHAR * install_file
Definition: axinstall.c:50
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
DWORD WINAPI GetTempPathW(IN DWORD count, OUT LPWSTR path)
Definition: path.c:2079
unsigned int BOOL
Definition: ntddk_ex.h:94
#define debugstr_w
Definition: kernel32.h:32
#define FIXME(fmt,...)
Definition: debug.h:110
smooth NULL
Definition: ftsmooth.c:416
enum install_type install_type
Definition: axinstall.c:54
BOOL WINAPI RemoveDirectoryW(IN LPCWSTR lpPathName)
Definition: dir.c:732
static HRESULT extract_cab_file(install_ctx_t *ctx)
Definition: axinstall.c:200
#define TRACE(s)
Definition: solgame.cpp:4
HRESULT hres
Definition: protocol.c:465
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:77
#define MAX_PATH
Definition: compat.h:26
UINT WINAPI GetTempFileNameW(IN LPCWSTR lpPathName, IN LPCWSTR lpPrefixString, IN UINT uUnique, OUT LPWSTR lpTempFileName)
Definition: filename.c:84
unsigned long DWORD
Definition: ntddk_ex.h:95
#define ARRAY_SIZE(a)
Definition: main.h:24
GLuint res
Definition: glext.h:9613
static HRESULT setup_dll(install_ctx_t *ctx)
Definition: axinstall.c:251
IBindStatusCallback * callback
Definition: axinstall.c:47
#define SUCCEEDED(hr)
Definition: intsafe.h:57

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;
562  HRESULT hres;
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 = strrchrW(path, '/');
578  if(!ptr)
579  ptr = path;
580  else
581  ptr++;
582 
583  ptr2 = strrchrW(ptr, '\\');
584  if(ptr2)
585  ptr = ptr2+1;
586 
587  ctx->file_name = ptr;
588  ext = strrchrW(ptr, '.');
589  if(!ext)
590  ext = ptr;
591 
592  if(!strcmpiW(ext, cab_extW)) {
593  hres = install_cab_file(ctx);
594  }else {
595  FIXME("Unsupported extension %s\n", debugstr_w(ext));
596  hres = E_NOTIMPL;
597  }
599  }
600 
601  return hres;
602 }
GLsizei const GLchar ** path
Definition: glext.h:7234
IUri * uri
Definition: axinstall.c:46
OLECHAR * BSTR
Definition: compat.h:1934
#define debugstr_w
Definition: kernel32.h:32
#define FIXME(fmt,...)
Definition: debug.h:110
static PVOID ptr
Definition: dispmode.c:27
static const WCHAR * cache_file
Definition: protocol.c:102
char ext[3]
Definition: mkdosfs.c:358
#define TRACE(s)
Definition: solgame.cpp:4
HRESULT hres
Definition: protocol.c:465
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:77
static BOOL install_warning(install_ctx_t *ctx)
Definition: axinstall.c:534
#define strcmpiW(s1, s2)
Definition: unicode.h:39
WINE_UNICODE_INLINE WCHAR * strrchrW(const WCHAR *str, WCHAR ch)
Definition: unicode.h:254
static const WCHAR cab_extW[]
Definition: axinstall.c:34
const WCHAR * cache_file
Definition: axinstall.c:51
#define S_OK
Definition: intsafe.h:59
#define E_NOTIMPL
Definition: ddrawi.h:99
Definition: services.c:325
const WCHAR * file_name
Definition: axinstall.c:53
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:274
static HRESULT install_cab_file(install_ctx_t *ctx)
Definition: axinstall.c:415
#define SUCCEEDED(hr)
Definition: intsafe.h:57

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;
356  HRESULT hres;
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 += strlenW(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 
382  if(len) {
383  default_install = FALSE;
384 
385  for(key = buf; *key; key += strlenW(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) {
406  if(FAILED(hres)) {
407  WARN("RunSetupCommandW failed: %08x\n", hres);
408  return hres;
409  }
410  }
411 
412  return S_OK;
413 }
INT WINAPI GetPrivateProfileStringW(LPCWSTR section, LPCWSTR entry, LPCWSTR def_val, LPWSTR buffer, UINT len, LPCWSTR filename)
Definition: profile.c:1142
#define TRUE
Definition: types.h:120
WINE_UNICODE_INLINE unsigned int strlenW(const WCHAR *str)
Definition: unicode.h:212
const WCHAR * tmp_dir
Definition: axinstall.c:52
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
#define WARN(fmt,...)
Definition: debug.h:111
#define E_FAIL
Definition: ddrawi.h:102
#define RSC_FLAG_INF
Definition: advpub.h:130
WCHAR * install_file
Definition: axinstall.c:50
unsigned int BOOL
Definition: ntddk_ex.h:94
#define debugstr_w
Definition: kernel32.h:32
smooth NULL
Definition: ftsmooth.c:416
static HRESULT process_hook_section(install_ctx_t *ctx, const WCHAR *sect_name)
Definition: axinstall.c:308
#define TRACE(s)
Definition: solgame.cpp:4
HRESULT hres
Definition: protocol.c:465
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:77
HRESULT WINAPI RunSetupCommandW(HWND hWnd, LPCWSTR szCmdName, LPCWSTR szInfSection, LPCWSTR szDir, LPCWSTR lpszTitle, HANDLE *phEXE, DWORD dwFlags, LPVOID pvReserved)
Definition: install.c:991
unsigned long DWORD
Definition: ntddk_ex.h:95
HKEY key
Definition: reg.c:42
GLenum GLsizei len
Definition: glext.h:6722
#define S_OK
Definition: intsafe.h:59
#define ARRAY_SIZE(a)
Definition: main.h:24
Definition: path.c:42

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;
538  HRESULT hres;
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 }
#define TRUE
Definition: types.h:120
INT_PTR WINAPI DialogBoxParamW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _In_opt_ HWND, _In_opt_ DLGPROC, _In_ LPARAM)
#define ID_AXINSTALL_WARNING_DLG
Definition: resource.h:21
#define FIXME(fmt,...)
Definition: debug.h:110
smooth NULL
Definition: ftsmooth.c:416
LONG_PTR LPARAM
Definition: windef.h:208
HRESULT hres
Definition: protocol.c:465
HINSTANCE urlmon_instance
Definition: urlmon_main.c:43
static INT_PTR WINAPI warning_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
Definition: axinstall.c:505
LONG HRESULT
Definition: typedefs.h:77
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
IBindStatusCallback * callback
Definition: axinstall.c:47

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;
313  HRESULT hres;
314 
315  static const WCHAR runW[] = {'r','u','n',0};
316 
318  if(!len)
319  return S_OK;
320 
321  for(key = buf; *key; key += strlenW(key)+1) {
322  if(!strcmpiW(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 
330  expand_command(ctx, val, NULL, &size);
331 
332  cmd = heap_alloc(size*sizeof(WCHAR));
333  if(!cmd)
334  heap_free(cmd);
335 
336  expand_command(ctx, val, cmd, &size);
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 }
INT WINAPI GetPrivateProfileStringW(LPCWSTR section, LPCWSTR entry, LPCWSTR def_val, LPWSTR buffer, UINT len, LPCWSTR filename)
Definition: profile.c:1142
WINE_UNICODE_INLINE unsigned int strlenW(const WCHAR *str)
Definition: unicode.h:212
const WCHAR * tmp_dir
Definition: axinstall.c:52
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
Definition: ftp_var.h:139
char * cmd
Definition: vfdcmd.c:85
WCHAR * install_file
Definition: axinstall.c:50
static void * heap_alloc(size_t len)
Definition: appwiz.h:65
#define debugstr_w
Definition: kernel32.h:32
#define FIXME(fmt,...)
Definition: debug.h:110
smooth NULL
Definition: ftsmooth.c:416
GLuint GLfloat * val
Definition: glext.h:7180
#define TRACE(s)
Definition: solgame.cpp:4
GLsizeiptr size
Definition: glext.h:5919
HRESULT hres
Definition: protocol.c:465
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:77
HRESULT WINAPI RunSetupCommandW(HWND hWnd, LPCWSTR szCmdName, LPCWSTR szInfSection, LPCWSTR szDir, LPCWSTR lpszTitle, HANDLE *phEXE, DWORD dwFlags, LPVOID pvReserved)
Definition: install.c:991
#define MAX_PATH
Definition: compat.h:26
unsigned long DWORD
Definition: ntddk_ex.h:95
HKEY key
Definition: reg.c:42
GLenum GLsizei len
Definition: glext.h:6722
#define strcmpiW(s1, s2)
Definition: unicode.h:39
#define S_OK
Definition: intsafe.h:59
#define ARRAY_SIZE(a)
Definition: main.h:24
#define E_NOTIMPL
Definition: ddrawi.h:99
static void expand_command(install_ctx_t *ctx, const WCHAR *cmd, WCHAR *buf, size_t *size)
Definition: axinstall.c:274
Definition: path.c:42
static BOOL heap_free(void *mem)
Definition: appwiz.h:75

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);
67  heap_free(ctx);
68 }
IUri * uri
Definition: axinstall.c:46
WCHAR * install_file
Definition: axinstall.c:50
IBindStatusCallback * callback
Definition: axinstall.c:47
static BOOL heap_free(void *mem)
Definition: appwiz.h:75

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 {
253  HMODULE module;
254  HRESULT hres;
255 
256  HRESULT (WINAPI *reg_func)(void);
257 
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 HRESULT
Definition: msvc.h:9
HMODULE module
Definition: main.cpp:47
struct png_info_def **typedef void(__cdecl typeof(png_destroy_read_struct))(struct png_struct_def **
Definition: typeof.h:49
#define WARN(fmt,...)
Definition: debug.h:111
#define E_FAIL
Definition: ddrawi.h:102
WCHAR * install_file
Definition: axinstall.c:50
#define LoadLibraryW(x)
Definition: compat.h:404
#define FreeLibrary(x)
Definition: compat.h:405
HRESULT hres
Definition: protocol.c:465
LONG HRESULT
Definition: typedefs.h:77
#define WINAPI
Definition: msvc.h:8
#define GetProcAddress(x, y)
Definition: compat.h:410

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 
470  button_hwnd = GetDlgItem(hwnd, ID_AXINSTALL_INSTALL_BTN);
471  EnableWindow(button_hwnd, TRUE);
472  }else {
473  WCHAR buf[100];
475  sprintfW(text, buf, ctx->counter);
476  }
477 
479 }
const DOCKBAR PVOID HWND HWND * hwnd
Definition: tooldock.h:22
#define TRUE
Definition: types.h:120
#define IDS_AXINSTALL_INSTALL
Definition: resource.h:28
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
const WCHAR * text
Definition: package.c:1827
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
BOOL WINAPI SetDlgItemTextW(_In_ HWND, _In_ int, _In_ LPCWSTR)
INT_PTR timer
Definition: axinstall.c:57
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
__wchar_t WCHAR
Definition: xmlstorage.h:180
HINSTANCE urlmon_instance
Definition: urlmon_main.c:43
BOOL WINAPI KillTimer(_In_opt_ HWND, _In_ UINT_PTR)
BOOL WINAPI EnableWindow(_In_ HWND, _In_ BOOL)
#define IDS_AXINSTALL_INSTALLN
Definition: resource.h:27
#define ARRAY_SIZE(a)
Definition: main.h:24
#define sprintfW
Definition: unicode.h:58
#define ID_AXINSTALL_INSTALL_BTN
Definition: resource.h:23

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) {
516  install_ctx_t *ctx = GetPropW(hwnd, ctxW);
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 }
const DOCKBAR PVOID HWND HWND * hwnd
Definition: tooldock.h:22
#define TRUE
Definition: types.h:120
static const WCHAR ctxW[]
Definition: axinstall.c:33
static void update_counter(install_ctx_t *ctx, HWND hwnd)
Definition: axinstall.c:460
BOOL WINAPI EndDialog(_In_ HWND, _In_ INT_PTR)
static UINT WPARAM LPARAM lparam
Definition: combo.c:716
#define WM_TIMER
Definition: winuser.h:1724
#define WM_COMMAND
Definition: winuser.h:1722
static BOOL init_warning_dialog(HWND hwnd, install_ctx_t *ctx)
Definition: axinstall.c:481
HANDLE WINAPI GetPropW(_In_ HWND, _In_ LPCWSTR)
#define msg(x)
Definition: auth_time.c:54
#define ID_AXINSTALL_INSTALL_BTN
Definition: resource.h:23
#define IDCANCEL
Definition: winuser.h:825
#define WM_INITDIALOG
Definition: winuser.h:1721
static UINT WPARAM wparam
Definition: combo.c:716

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().