ReactOS 0.4.16-dev-297-gc569aee
extrac32.c File Reference
#include <windows.h>
#include <shellapi.h>
#include <setupapi.h>
#include <shlwapi.h>
#include <shlobj.h>
#include "wine/unicode.h"
#include "wine/debug.h"
Include dependency graph for extrac32.c:

Go to the source code of this file.

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (extrac32)
 
static void create_target_directory (LPWSTR Target)
 
static UINT WINAPI ExtCabCallback (PVOID Context, UINT Notification, UINT_PTR Param1, UINT_PTR Param2)
 
static void extract (LPCWSTR cabfile, LPWSTR destdir)
 
static void copy_file (LPCWSTR source, LPCWSTR destination)
 
static LPWSTRget_extrac_args (LPWSTR cmdline, int *pargc)
 
int PASCAL wWinMain (HINSTANCE hInstance, HINSTANCE prev, LPWSTR cmdline, int show)
 

Variables

static BOOL force_mode
 
static BOOL show_content
 

Function Documentation

◆ copy_file()

static void copy_file ( LPCWSTR  source,
LPCWSTR  destination 
)
static

Definition at line 105 of file extrac32.c.

106{
107 WCHAR destfile[MAX_PATH];
108
109 /* append source filename if destination is a directory */
110 if (PathIsDirectoryW(destination))
111 {
112 PathCombineW(destfile, destination, PathFindFileNameW(source));
113 destination = destfile;
114 }
115
116 if (PathFileExistsW(destination) && !force_mode)
117 {
118 static const WCHAR overwriteMsg[] = {'O','v','e','r','w','r','i','t','e',' ','"','%','s','"','?',0};
119 static const WCHAR titleMsg[] = {'E','x','t','r','a','c','t',0};
120 WCHAR msg[MAX_PATH+100];
121 snprintfW(msg, ARRAY_SIZE(msg), overwriteMsg, destination);
122 if (MessageBoxW(NULL, msg, titleMsg, MB_YESNO | MB_ICONWARNING) != IDYES)
123 return;
124 }
125
126 WINE_TRACE("copying %s to %s\n", wine_dbgstr_w(source), wine_dbgstr_w(destination));
127 CopyFileW(source, destination, FALSE);
128}
#define msg(x)
Definition: auth_time.c:54
#define ARRAY_SIZE(A)
Definition: main.h:20
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
#define MAX_PATH
Definition: compat.h:34
BOOL WINAPI CopyFileW(IN LPCWSTR lpExistingFileName, IN LPCWSTR lpNewFileName, IN BOOL bFailIfExists)
Definition: copy.c:439
LPWSTR WINAPI PathFindFileNameW(LPCWSTR lpszPath)
Definition: path.c:394
BOOL WINAPI PathFileExistsW(LPCWSTR lpszPath)
Definition: path.c:1777
BOOL WINAPI PathIsDirectoryW(LPCWSTR lpszPath)
Definition: path.c:1723
static BOOL force_mode
Definition: extrac32.c:33
#define wine_dbgstr_w
Definition: kernel32.h:34
#define PathCombineW
Definition: pathcch.h:317
#define snprintfW
Definition: unicode.h:66
#define WINE_TRACE
Definition: debug.h:354
#define MB_YESNO
Definition: winuser.h:820
int WINAPI MessageBoxW(_In_opt_ HWND hWnd, _In_opt_ LPCWSTR lpText, _In_opt_ LPCWSTR lpCaption, _In_ UINT uType)
#define MB_ICONWARNING
Definition: winuser.h:789
#define IDYES
Definition: winuser.h:838
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by ITERATE_DuplicateFiles(), unpack_iso(), and wWinMain().

◆ create_target_directory()

static void create_target_directory ( LPWSTR  Target)
static

Definition at line 36 of file extrac32.c.

37{
39 int res;
40
42 *PathFindFileNameW(dir) = 0; /* Truncate file name */
44 {
47 WINE_ERR("Can't create directory: %s\n", wine_dbgstr_w(dir));
48 }
49}
unsigned int dir
Definition: maze.c:112
#define ERROR_SUCCESS
Definition: deptool.c:10
GLuint res
Definition: glext.h:9613
#define ERROR_ALREADY_EXISTS
Definition: disk.h:80
#define strcpyW(d, s)
Definition: unicode.h:35
#define WINE_ERR
Definition: debug.h:371
int WINAPI SHCreateDirectoryExW(HWND hWnd, LPCWSTR path, LPSECURITY_ATTRIBUTES sec)
Definition: shlfileop.cpp:906
_In_ WDFIOTARGET Target
Definition: wdfrequest.h:306

Referenced by ExtCabCallback().

◆ ExtCabCallback()

static UINT WINAPI ExtCabCallback ( PVOID  Context,
UINT  Notification,
UINT_PTR  Param1,
UINT_PTR  Param2 
)
static

Definition at line 51 of file extrac32.c.

52{
54 FILEPATHS_W *pFilePaths;
55
56 switch(Notification)
57 {
59 pInfo = (FILE_IN_CABINET_INFO_W*)Param1;
60 if(show_content)
61 {
62 FILETIME ft;
63 SYSTEMTIME st;
64 CHAR date[12], time[12], buf[2 * MAX_PATH];
65 int count;
67
68 /* DosDate and DosTime already represented at local time */
69 DosDateTimeToFileTime(pInfo->DosDate, pInfo->DosTime, &ft);
70 FileTimeToSystemTime(&ft, &st);
71 GetDateFormatA(0, 0, &st, "MM'-'dd'-'yyyy", date, sizeof date);
72 GetTimeFormatA(0, 0, &st, "HH':'mm':'ss", time, sizeof time);
73 count = wsprintfA(buf, "%s %s %c%c%c%c %15u %S\n", date, time,
74 pInfo->DosAttribs & FILE_ATTRIBUTE_ARCHIVE ? 'A' : '-',
75 pInfo->DosAttribs & FILE_ATTRIBUTE_HIDDEN ? 'H' : '-',
76 pInfo->DosAttribs & FILE_ATTRIBUTE_READONLY ? 'R' : '-',
77 pInfo->DosAttribs & FILE_ATTRIBUTE_SYSTEM ? 'S' : '-',
78 pInfo->FileSize, pInfo->NameInCabinet);
80 return FILEOP_SKIP;
81 }
82 else
83 {
86 /* SetupIterateCabinet() doesn't create full path to target by itself,
87 so we should do it manually */
89 return FILEOP_DOIT;
90 }
92 pFilePaths = (FILEPATHS_W*)Param1;
93 WINE_TRACE("Extracted %s\n", wine_dbgstr_w(pFilePaths->Target));
94 return NO_ERROR;
95 }
96 return NO_ERROR;
97}
HANDLE WINAPI GetStdHandle(IN DWORD nStdHandle)
Definition: console.c:203
#define NO_ERROR
Definition: dderror.h:5
#define lstrcpyW
Definition: compat.h:749
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
BOOL WINAPI FileTimeToSystemTime(IN CONST FILETIME *lpFileTime, OUT LPSYSTEMTIME lpSystemTime)
Definition: time.c:188
BOOL WINAPI DosDateTimeToFileTime(IN WORD wFatDate, IN WORD wFatTime, OUT LPFILETIME lpFileTime)
Definition: time.c:75
static void create_target_directory(LPWSTR Target)
Definition: extrac32.c:36
static BOOL show_content
Definition: extrac32.c:34
#define FILEOP_SKIP
Definition: fileqsup.h:49
#define FILEOP_DOIT
Definition: fileqsup.h:48
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
INT WINAPI GetTimeFormatA(LCID lcid, DWORD dwFlags, const SYSTEMTIME *lpTime, LPCSTR lpFormat, LPSTR lpTimeStr, INT cchOut)
Definition: lcformat.c:1044
INT WINAPI GetDateFormatA(LCID lcid, DWORD dwFlags, const SYSTEMTIME *lpTime, LPCSTR lpFormat, LPSTR lpDateStr, INT cchOut)
Definition: lcformat.c:936
LPWSTR WINAPI lstrcatW(LPWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:274
__u16 date
Definition: mkdosfs.c:8
__u16 time
Definition: mkdosfs.c:8
#define FILE_ATTRIBUTE_READONLY
Definition: nt_native.h:702
#define FILE_ATTRIBUTE_HIDDEN
Definition: nt_native.h:703
#define FILE_ATTRIBUTE_SYSTEM
Definition: nt_native.h:704
#define FILE_ATTRIBUTE_ARCHIVE
Definition: nt_native.h:706
#define SPFILENOTIFY_FILEEXTRACTED
Definition: setupapi.h:564
#define SPFILENOTIFY_FILEINCABINET
Definition: setupapi.h:562
PCWSTR Target
Definition: fileqsup.h:60
WCHAR FullTargetName[MAX_PATH]
Definition: setupapi.h:804
_In_ PWDFDEVICE_INIT _In_ PFN_WDF_DEVICE_SHUTDOWN_NOTIFICATION Notification
Definition: wdfcontrol.h:115
#define STD_OUTPUT_HANDLE
Definition: winbase.h:294
int WINAPIV wsprintfA(_Out_ LPSTR, _In_ _Printf_format_string_ LPCSTR,...)
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
char CHAR
Definition: xmlstorage.h:175

Referenced by extract().

◆ extract()

static void extract ( LPCWSTR  cabfile,
LPWSTR  destdir 
)
static

Definition at line 99 of file extrac32.c.

100{
101 if (!SetupIterateCabinetW(cabfile, 0, ExtCabCallback, destdir))
102 WINE_ERR("Could not extract cab file %s\n", wine_dbgstr_w(cabfile));
103}
BOOL WINAPI SetupIterateCabinetW(PCWSTR CabinetFile, DWORD Reserved, PSP_FILE_CALLBACK_W MsgHandler, PVOID Context)
Definition: setupcab.c:575
static UINT WINAPI ExtCabCallback(PVOID Context, UINT Notification, UINT_PTR Param1, UINT_PTR Param2)
Definition: extrac32.c:51

Referenced by halveImage3D(), test_FDIIsCabinet(), and wWinMain().

◆ get_extrac_args()

static LPWSTR * get_extrac_args ( LPWSTR  cmdline,
int pargc 
)
static

Definition at line 130 of file extrac32.c.

131{
132 enum {OUTSIDE_ARG, INSIDE_ARG, INSIDE_QUOTED_ARG} state;
133 LPWSTR str;
134 int argc;
135 LPWSTR *argv;
136 int max_argc = 16;
137 BOOL new_arg;
138
139 WINE_TRACE("cmdline: %s\n", wine_dbgstr_w(cmdline));
140 str = HeapAlloc(GetProcessHeap(), 0, (strlenW(cmdline) + 1) * sizeof(WCHAR));
141 if(!str) return NULL;
143 argv = HeapAlloc(GetProcessHeap(), 0, (max_argc + 1) * sizeof(LPWSTR));
144 if(!argv)
145 {
147 return NULL;
148 }
149
150 /* Split command line to separate arg-strings and fill argv */
151 state = OUTSIDE_ARG;
152 argc = 0;
153 while(*str)
154 {
155 new_arg = FALSE;
156 /* Check character */
157 if(isspaceW(*str)) /* white space */
158 {
159 if(state == INSIDE_ARG)
160 {
161 state = OUTSIDE_ARG;
162 *str = 0;
163 }
164 }
165 else if(*str == '"') /* double quote */
166 switch(state)
167 {
168 case INSIDE_QUOTED_ARG:
169 state = OUTSIDE_ARG;
170 *str = 0;
171 break;
172 case INSIDE_ARG:
173 *str = 0;
174 /* Fall through */
175 case OUTSIDE_ARG:
176 if(!*++str) continue;
177 state = INSIDE_QUOTED_ARG;
178 new_arg = TRUE;
179 break;
180 }
181 else /* regular character */
182 if(state == OUTSIDE_ARG)
183 {
184 state = INSIDE_ARG;
185 new_arg = TRUE;
186 }
187
188 /* Add new argv entry, if need */
189 if(new_arg)
190 {
191 if(argc >= max_argc - 1)
192 {
193 /* Realloc argv here because there always should be
194 at least one reserved cell for terminating NULL */
195 max_argc *= 2;
197 (max_argc + 1) * sizeof(LPWSTR));
198 if(!argv)
199 {
201 return NULL;
202 }
203 }
204 argv[argc++] = str;
205 }
206
207 str++;
208 }
209
210 argv[argc] = NULL;
211 *pargc = argc;
212
213 if(TRACE_ON(extrac32))
214 {
215 int i;
216 for(i = 0; i < argc; i++)
217 WINE_TRACE("arg %d: %s\n", i, wine_dbgstr_w(argv[i]));
218 }
219 return argv;
220}
static int argc
Definition: ServiceArgs.c:12
static int state
Definition: maze.c:121
#define TRUE
Definition: types.h:120
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
#define HeapReAlloc
Definition: compat.h:734
#define TRACE_ON(x)
Definition: compat.h:75
#define HeapFree(x, y, z)
Definition: compat.h:735
unsigned int BOOL
Definition: ntddk_ex.h:94
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 argv
Definition: mplay32.c:18
#define strlenW(s)
Definition: unicode.h:34
#define isspaceW(n)
Definition: unicode.h:58
const WCHAR * str
TCHAR * cmdline
Definition: stretchblt.cpp:32
WCHAR * LPWSTR
Definition: xmlstorage.h:184

Referenced by wWinMain().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( extrac32  )

◆ wWinMain()

int PASCAL wWinMain ( HINSTANCE  hInstance,
HINSTANCE  hPrevInstance,
LPWSTR  lpCmdLine,
int  nShowCmd 
)

This file has no copyright assigned and is placed in the Public Domain. This file is part of the w64 mingw-runtime package. No warranty is given; refer to the file DISCLAIMER.PD within this package.

Definition at line 222 of file extrac32.c.

223{
224 LPWSTR *argv;
225 int argc;
226 int i;
227 WCHAR check, cmd = 0;
229 LPCWSTR cabfile = NULL;
230
231 path[0] = 0;
232
233 /* Do not use CommandLineToArgvW() or __wgetmainargs() to parse
234 * command line for this program. It should treat each quote as argument
235 * delimiter. This doesn't match with behavior of mentioned functions.
236 * Do not use args provided by wmain() for the same reason.
237 */
239
240 if(!argv)
241 {
242 WINE_ERR("Command line parsing failed\n");
243 return 0;
244 }
245
246 /* Parse arguments */
247 for(i = 0; i < argc; i++)
248 {
249 /* Get cabfile */
250 if (argv[i][0] != '/' && argv[i][0] != '-')
251 {
252 if (!cabfile)
253 {
254 cabfile = argv[i];
255 continue;
256 } else
257 break;
258 }
259 /* Get parameters for commands */
260 check = toupperW( argv[i][1] );
261 switch(check)
262 {
263 case 'A':
264 WINE_FIXME("/A not implemented\n");
265 break;
266 case 'Y':
268 break;
269 case 'L':
270 if ((i + 1) >= argc) return 0;
272 return 0;
273 break;
274 case 'C':
275 case 'E':
276 case 'D':
277 if (cmd) return 0;
278 cmd = check;
279 break;
280 default:
281 return 0;
282 }
283 }
284
285 if (!cabfile)
286 return 0;
287
288 if (cmd == 'C')
289 {
290 if ((i + 1) != argc) return 0;
292 return 0;
293 }
294 else if (!cmd)
295 /* Use extraction by default if names of required files presents */
296 cmd = i < argc ? 'E' : 'D';
297
298 if (cmd == 'E' && !path[0])
300
302
303 /* Execute the specified command */
304 switch(cmd)
305 {
306 case 'C':
307 /* Copy file */
308 copy_file(cabfile, path);
309 break;
310 case 'D':
311 /* Display CAB archive */
313 /* Fall through */
314 case 'E':
315 /* Extract CAB archive */
316 extract(cabfile, path);
317 break;
318 }
319 return 0;
320}
#define GetCurrentDirectoryW(x, y)
Definition: compat.h:756
DWORD WINAPI GetFullPathNameW(IN LPCWSTR lpFileName, IN DWORD nBufferLength, OUT LPWSTR lpBuffer, OUT LPWSTR *lpFilePart)
Definition: path.c:1106
#define check(expected, result)
Definition: dplayx.c:32
static void extract(LPCWSTR cabfile, LPWSTR destdir)
Definition: extrac32.c:99
static LPWSTR * get_extrac_args(LPWSTR cmdline, int *pargc)
Definition: extrac32.c:130
static void copy_file(LPCWSTR source, LPCWSTR destination)
Definition: extrac32.c:105
#define PathAddBackslashW
Definition: pathcch.h:301
#define toupperW(n)
Definition: unicode.h:51
#define WINE_FIXME
Definition: debug.h:366
Definition: ftp_var.h:139

Variable Documentation

◆ force_mode

BOOL force_mode
static

Definition at line 33 of file extrac32.c.

Referenced by copy_file(), and wWinMain().

◆ show_content

BOOL show_content
static

Definition at line 34 of file extrac32.c.

Referenced by ExtCabCallback(), and wWinMain().