ReactOS  0.4.14-dev-554-g2f8d847
axinstall.c
Go to the documentation of this file.
1 /*
2  * Copyright 2012 Jacek Caban for CodeWeavers
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18 
19 #define OEMRESOURCE
20 
21 #include <assert.h>
22 
23 #include "urlmon_main.h"
24 #include "resource.h"
25 
26 #include "advpub.h"
27 #include "fdi.h"
28 
29 #include "wine/debug.h"
30 
32 
33 static const WCHAR ctxW[] = {'c','t','x',0};
34 static const WCHAR cab_extW[] = {'.','c','a','b',0};
35 static const WCHAR infW[] = {'i','n','f',0};
36 static const WCHAR dllW[] = {'d','l','l',0};
37 static const WCHAR ocxW[] = {'o','c','x',0};
38 
43 };
44 
45 typedef struct {
51  const WCHAR *cache_file;
52  const WCHAR *tmp_dir;
53  const WCHAR *file_name;
56  int counter;
59 
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 }
69 
70 static inline BOOL file_exists(const WCHAR *file_name)
71 {
73 }
74 
75 #ifdef __REACTOS__
76 
77 /* The following definitions were copied from dll/win32/advpack32/files.c */
78 
79 /* SESSION Operation */
80 #define EXTRACT_FILLFILELIST 0x00000001
81 #define EXTRACT_EXTRACTFILES 0x00000002
82 
83 struct FILELIST{
85  struct FILELIST *next;
87 };
88 
89 typedef struct {
90  INT FileSize;
91  ERF Error;
92  struct FILELIST *FileList;
93  INT FileCount;
94  INT Operation;
96  CHAR CurrentFile[MAX_PATH];
98  struct FILELIST *FilterList;
99 } SESSION;
100 
101 static HRESULT (WINAPI *pExtract)(SESSION*, LPCSTR);
102 
103 
104 /* The following functions were copied from dll/win32/advpack32/files.c
105  All unused arguments are removed */
106 
107 static void free_file_node(struct FILELIST *pNode)
108 {
109  HeapFree(GetProcessHeap(), 0, pNode->FileName);
110  HeapFree(GetProcessHeap(), 0, pNode);
111 }
112 
113 static void free_file_list(SESSION* session)
114 {
115  struct FILELIST *next, *curr = session->FileList;
116 
117  while (curr)
118  {
119  next = curr->next;
120  free_file_node(curr);
121  curr = next;
122  }
123 }
124 
125 HRESULT WINAPI Modified_ExtractFilesA(LPCSTR CabName, LPCSTR ExpandDir)
126 {
127  SESSION session;
129  HRESULT res = S_OK;
130  LPSTR szConvertedList = NULL;
131 
132  TRACE("(%s, %s)\n", debugstr_a(CabName), debugstr_a(ExpandDir));
133 
134  if (!CabName || !ExpandDir)
135  return E_INVALIDARG;
136 
139 
140  hCabinet = LoadLibraryA("cabinet.dll");
141  if (!hCabinet)
142  return E_FAIL;
143 
144  ZeroMemory(&session, sizeof(SESSION));
145 
146  pExtract = (void *)GetProcAddress(hCabinet, "Extract");
147  if (!pExtract)
148  {
149  res = E_FAIL;
150  goto done;
151  }
152 
153  lstrcpyA(session.Destination, ExpandDir);
154 
156  res = pExtract(&session, CabName);
157 
158 done:
159  free_file_list(&session);
161  HeapFree(GetProcessHeap(), 0, szConvertedList);
162 
163  return res;
164 }
165 
166 
167 
168 HRESULT WINAPI Modified_ExtractFilesW(LPCWSTR CabName, LPCWSTR ExpandDir)
169 {
170  char *cab_name = NULL, *expand_dir = NULL;
171  HRESULT hres = S_OK;
172 
173  TRACE("(%s, %s, %d)\n", debugstr_w(CabName), debugstr_w(ExpandDir));
174 
175  if(CabName) {
176  cab_name = heap_strdupWtoA(CabName);
177  if(!cab_name)
178  return E_OUTOFMEMORY;
179  }
180 
181  if(ExpandDir) {
182  expand_dir = heap_strdupWtoA(ExpandDir);
183  if(!expand_dir)
185  }
186 
187  /* cabinet.dll, which does the real job of extracting files, doesn't have UNICODE API,
188  so we need W->A conversion at some point anyway. */
189  if(SUCCEEDED(hres))
190  hres = Modified_ExtractFilesA(cab_name, expand_dir);
191 
192  heap_free(cab_name);
193  heap_free(expand_dir);
194  return hres;
195 }
196 
197 #endif
198 
199 
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 = 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 }
250 
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 }
273 
274 static void expand_command(install_ctx_t *ctx, const WCHAR *cmd, WCHAR *buf, size_t *size)
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 }
307 
308 static HRESULT process_hook_section(install_ctx_t *ctx, const WCHAR *sect_name)
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 += 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 
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 }
349 
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 += 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 
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) {
406  if(FAILED(hres)) {
407  WARN("RunSetupCommandW failed: %08x\n", hres);
408  return hres;
409  }
410  }
411 
412  return S_OK;
413 }
414 
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 }
459 
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  swprintf(text, buf, ctx->counter);
476  }
477 
479 }
480 
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 }
504 
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 }
533 
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 }
558 
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 = 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)) {
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 }
603 
605 {
606  WCHAR buf[1024], fmt[1024];
607 
609  swprintf(buf, fmt, hres);
610  MessageBoxW(ctx->hwnd, buf, NULL, MB_OK);
611 }
612 
613 static HRESULT distunit_on_stop(void *ctx, const WCHAR *cache_file, HRESULT hresult, const WCHAR *error_str)
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 }
632 
633 /***********************************************************************
634  * AsyncInstallDistributionUnit (URLMON.@)
635  */
636 HRESULT WINAPI AsyncInstallDistributionUnit(const WCHAR *szDistUnit, const WCHAR *szTYPE, const WCHAR *szExt,
637  DWORD dwFileVersionMS, DWORD dwFileVersionLS, const WCHAR *szURL, IBindCtx *pbc, void *pvReserved, DWORD flags)
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 }
BOOL WINAPI CreateDirectoryW(IN LPCWSTR lpPathName, IN LPSECURITY_ATTRIBUTES lpSecurityAttributes)
Definition: dir.c:90
const DOCKBAR PVOID HWND HWND * hwnd
Definition: tooldock.h:22
#define HRESULT
Definition: msvc.h:9
#define STM_SETICON
Definition: winuser.h:2074
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
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
#define ID_AXINSTALL_ICON
Definition: resource.h:24
HMODULE module
Definition: main.cpp:47
static HRESULT install_inf_file(install_ctx_t *ctx)
Definition: axinstall.c:350
#define IDS_AXINSTALL_INSTALL
Definition: resource.h:28
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
LIST_ENTRY FilterList
Definition: Filter.c:24
struct png_info_def **typedef void(__cdecl typeof(png_destroy_read_struct))(struct png_struct_def **
Definition: typeof.h:49
static void free_file_node(struct FILELIST *pNode)
Definition: files.c:594
INT_PTR WINAPI DialogBoxParamW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _In_opt_ HWND, _In_opt_ DLGPROC, _In_ LPARAM)
const WCHAR * tmp_dir
Definition: axinstall.c:52
static const WCHAR ctxW[]
Definition: axinstall.c:33
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
#define EXTRACT_EXTRACTFILES
Definition: files.c:521
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
Definition: ftp_var.h:139
struct FILELIST * FileList
Definition: files.c:532
GLsizei const GLchar ** path
Definition: glext.h:7234
const WCHAR * text
Definition: package.c:1827
static void update_counter(install_ctx_t *ctx, HWND hwnd)
Definition: axinstall.c:460
char CHAR
Definition: xmlstorage.h:175
vector< FileInfo > FileList
Definition: DriveVolume.h:63
#define WARN(fmt,...)
Definition: debug.h:111
_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)
DWORD WINAPI GetTickCount(VOID)
Definition: time.c:455
PULONG FileCount
Definition: SfcGetFiles.c:18
#define assert(x)
Definition: debug.h:53
#define ZeroMemory
Definition: winbase.h:1642
#define OIC_WARNING
Definition: winuser.h:1154
char * cmd
Definition: vfdcmd.c:85
UINT_PTR WPARAM
Definition: windef.h:207
#define ID_AXINSTALL_WARNING_DLG
Definition: resource.h:21
IUri * uri
Definition: axinstall.c:46
OLECHAR * BSTR
Definition: compat.h:1942
static void failure_msgbox(install_ctx_t *ctx, HRESULT hres)
Definition: axinstall.c:604
int32_t INT_PTR
Definition: typedefs.h:62
char * LPSTR
Definition: xmlstorage.h:182
#define lstrlenW
Definition: compat.h:415
#define E_FAIL
Definition: ddrawi.h:102
#define RSC_FLAG_INF
Definition: advpub.h:130
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: axinstall.c:636
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
WCHAR * install_file
Definition: axinstall.c:50
int32_t INT
Definition: typedefs.h:56
BOOL WINAPI EndDialog(_In_ HWND, _In_ INT_PTR)
static void * heap_alloc(size_t len)
Definition: appwiz.h:65
BOOL WINAPI SetDlgItemTextW(_In_ HWND, _In_ int, _In_ LPCWSTR)
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
static void free_file_list(SESSION *session)
Definition: files.c:651
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
DWORD WINAPI GetTempPathW(IN DWORD count, OUT LPWSTR path)
Definition: path.c:2079
unsigned int BOOL
Definition: ntddk_ex.h:94
DWORD WINAPI GetFileAttributesW(LPCWSTR lpFileName)
Definition: fileinfo.c:802
DWORD WINAPI GetFileAttributesA(LPCSTR lpFileName)
Definition: fileinfo.c:786
Definition: fci.h:44
static UINT WPARAM LPARAM lparam
Definition: combo.c:716
#define debugstr_w
Definition: kernel32.h:32
HINSTANCE WINAPI DECLSPEC_HOTPATCH LoadLibraryA(LPCSTR lpLibFileName)
Definition: loader.c:111
#define FIXME(fmt,...)
Definition: debug.h:110
static PVOID ptr
Definition: dispmode.c:27
#define E_INVALIDARG
Definition: ddrawi.h:101
static const WCHAR * cache_file
Definition: protocol.c:102
#define LoadLibraryW(x)
Definition: compat.h:412
smooth NULL
Definition: ftsmooth.c:416
char ext[3]
Definition: mkdosfs.c:358
enum install_type install_type
Definition: axinstall.c:54
LONG_PTR LPARAM
Definition: windef.h:208
static HRESULT process_hook_section(install_ctx_t *ctx, const WCHAR *sect_name)
Definition: axinstall.c:308
_Check_return_ _CRTIMP _CONST_RETURN wchar_t *__cdecl wcsrchr(_In_z_ const wchar_t *_Str, _In_ wchar_t _Ch)
_Reserved_ PVOID Reserved
Definition: winddi.h:3974
const char * LPCSTR
Definition: xmlstorage.h:183
#define EXTRACT_FILLFILELIST
Definition: files.c:520
BOOL WINAPI RemoveDirectoryW(IN LPCWSTR lpPathName)
Definition: dir.c:732
UINT_PTR WINAPI SetTimer(_In_opt_ HWND, _In_ UINT_PTR, _In_ UINT, _In_opt_ TIMERPROC)
static const WCHAR dllW[]
Definition: axinstall.c:36
BOOL DoExtract
Definition: files.c:526
GLuint GLfloat * val
Definition: glext.h:7180
INT_PTR timer
Definition: axinstall.c:57
static HRESULT extract_cab_file(install_ctx_t *ctx)
Definition: axinstall.c:200
#define TRACE(s)
Definition: solgame.cpp:4
#define FreeLibrary(x)
Definition: compat.h:413
GLsizeiptr size
Definition: glext.h:5919
HRESULT hres
Definition: protocol.c:465
#define GetProcessHeap()
Definition: compat.h:403
_CONST_RETURN wchar_t *__cdecl wcschr(_In_z_ const wchar_t *_Str, wchar_t _Ch)
BOOL WINAPI SetPropW(_In_ HWND, _In_ LPCWSTR, _In_opt_ HANDLE)
int WINAPI MessageBoxW(_In_opt_ HWND, _In_opt_ LPCWSTR, _In_opt_ LPCWSTR, _In_ UINT)
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
static const WCHAR infW[]
Definition: axinstall.c:35
__wchar_t WCHAR
Definition: xmlstorage.h:180
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
#define debugstr_a
Definition: kernel32.h:31
LONG HRESULT
Definition: typedefs.h:77
static LPCSTR DWORD void * pvReserved
Definition: str.c:196
static HMODULE hCabinet
Definition: urlmon_main.c:45
static char * heap_strdupWtoA(const WCHAR *str)
#define WM_TIMER
Definition: winuser.h:1724
HRESULT WINAPI RunSetupCommandW(HWND hWnd, LPCWSTR szCmdName, LPCWSTR szInfSection, LPCWSTR szDir, LPCWSTR lpszTitle, HANDLE *phEXE, DWORD dwFlags, LPVOID pvReserved)
Definition: install.c:990
HRESULT download_to_cache(IUri *uri, stop_cache_binding_proc_t proc, void *ctx, IBindStatusCallback *callback)
Definition: download.c:375
#define MAX_PATH
Definition: compat.h:26
#define swprintf(buf, format,...)
Definition: sprintf.c:56
#define WINAPI
Definition: msvc.h:8
UINT WINAPI GetTempFileNameW(IN LPCWSTR lpPathName, IN LPCWSTR lpPrefixString, IN UINT uUnique, OUT LPWSTR lpTempFileName)
Definition: filename.c:84
Definition: files.c:529
unsigned long DWORD
Definition: ntddk_ex.h:95
_In_ PUNICODE_STRING _Inout_ PUNICODE_STRING Destination
Definition: rtlfuncs.h:2891
BOOL Error
Definition: chkdsk.c:66
LRESULT WINAPI SendDlgItemMessageW(_In_ HWND, _In_ int, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define INVALID_FILE_ATTRIBUTES
Definition: vfdcmd.c:23
LPSTR WINAPI lstrcpyA(LPSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:100
GLbitfield flags
Definition: glext.h:7161
struct FILELIST * next
Definition: files.c:525
BOOL WINAPI KillTimer(_In_opt_ HWND, _In_ UINT_PTR)
HKEY key
Definition: reg.c:42
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
GLenum GLsizei len
Definition: glext.h:6722
static BOOL install_warning(install_ctx_t *ctx)
Definition: axinstall.c:534
_Must_inspect_result_ _Out_ PLARGE_INTEGER FileSize
Definition: fsrtlfuncs.h:108
#define WM_COMMAND
Definition: winuser.h:1722
static BOOL init_warning_dialog(HWND hwnd, install_ctx_t *ctx)
Definition: axinstall.c:481
#define wcsicmp
Definition: string.h:1152
INT Operation
Definition: files.c:534
WINE_DEFAULT_DEBUG_CHANNEL(urlmon)
static BOOL file_exists(const WCHAR *file_name)
Definition: axinstall.c:70
BOOL WINAPI EnableWindow(_In_ HWND, _In_ BOOL)
static const WCHAR cab_extW[]
Definition: axinstall.c:34
LPSTR FileName
Definition: files.c:524
const WCHAR * cache_file
Definition: axinstall.c:51
#define S_OK
Definition: intsafe.h:59
#define IDS_AXINSTALL_INSTALLN
Definition: resource.h:27
static unsigned __int64 next
Definition: rand_nt.c:6
install_type
Definition: axinstall.c:39
static DWORD path_len
Definition: batch.c:31
static HRESULT install_file(install_ctx_t *ctx, const WCHAR *cache_file)
Definition: axinstall.c:559
#define lstrcpyW
Definition: compat.h:414
#define ARRAY_SIZE(a)
Definition: main.h:24
#define E_NOTIMPL
Definition: ddrawi.h:99
const WCHAR * file_name
Definition: axinstall.c:53
BOOL release_on_stop
Definition: axinstall.c:48
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:271
#define IDS_AXINSTALL_FAILURE
Definition: resource.h:26
unsigned int UINT
Definition: ndis.h:50
#define MB_OK
Definition: winuser.h:784
HANDLE WINAPI GetPropW(_In_ HWND, _In_ LPCWSTR)
static LPCWSTR file_name
Definition: protocol.c:147
static void release_install_ctx(install_ctx_t *ctx)
Definition: axinstall.c:60
#define msg(x)
Definition: auth_time.c:54
GLuint res
Definition: glext.h:9613
HRESULT WINAPI CreateUri(LPCWSTR pwzURI, DWORD dwFlags, DWORD_PTR dwReserved, IUri **ppURI)
Definition: uri.c:5700
static HRESULT setup_dll(install_ctx_t *ctx)
Definition: axinstall.c:251
HRESULT WINAPI ExtractFilesW(LPCWSTR CabName, LPCWSTR ExpandDir, DWORD Flags, LPCWSTR FileList, LPVOID LReserved, DWORD Reserved)
Definition: files.c:780
HICON WINAPI LoadIconW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
Definition: cursoricon.c:2044
_In_ FLT_SET_CONTEXT_OPERATION Operation
Definition: fltkernel.h:1468
#define GetProcAddress(x, y)
Definition: compat.h:418
static void expand_command(install_ctx_t *ctx, const WCHAR *cmd, WCHAR *buf, size_t *size)
Definition: axinstall.c:274
static HRESULT install_cab_file(install_ctx_t *ctx)
Definition: axinstall.c:415
#define ERROR_PATH_NOT_FOUND
Definition: winerror.h:106
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
#define ID_AXINSTALL_INSTALL_BTN
Definition: resource.h:23
#define IDCANCEL
Definition: winuser.h:825
CHAR Destination[MAX_PATH]
Definition: files.c:535
#define WM_INITDIALOG
Definition: winuser.h:1721
Definition: dsound.c:943
#define HeapFree(x, y, z)
Definition: compat.h:402
static const WCHAR ocxW[]
Definition: axinstall.c:37
IBindStatusCallback * callback
Definition: axinstall.c:47
#define SUCCEEDED(hr)
Definition: intsafe.h:57
static UINT WPARAM wparam
Definition: combo.c:716
Definition: path.c:42
static BOOL heap_free(void *mem)
Definition: appwiz.h:75
#define ID_AXINSTALL_LOCATION
Definition: resource.h:22