129 if (src2)
while (*src2 ==
'\\') src2++;
137 if (src3)
while (*src3 ==
'\\') src3++;
152 unsigned int src_len = 1, dst_len = 1;
155 if (
op->src_root) src_len +=
strlenW(
op->src_root) + 1;
156 if (
op->src_path) src_len +=
strlenW(
op->src_path) + 1;
157 if (
op->src_file) src_len +=
strlenW(
op->src_file) + 1;
158 if (
op->dst_path) dst_len +=
strlenW(
op->dst_path) + 1;
159 if (
op->dst_file) dst_len +=
strlenW(
op->dst_file) + 1;
160 src_len *=
sizeof(
WCHAR);
161 dst_len *=
sizeof(
WCHAR);
176 paths->Win32Error = 0;
232 statusA.
cbSize =
sizeof(statusA);
274 static const WCHAR SourceDisksNames[] =
275 {
'S',
'o',
'u',
'r',
'c',
'e',
'D',
'i',
's',
'k',
's',
'N',
'a',
'm',
'e',
's',0};
276 static const WCHAR SourceDisksFiles[] =
277 {
'S',
'o',
'u',
'r',
'c',
'e',
'D',
'i',
's',
'k',
's',
'F',
'i',
'l',
'e',
's',0};
339 if (len2 &&
ptr >
op->src_path &&
ptr[-1] !=
'\\') *
ptr++ =
'\\';
355 static const WCHAR Dest[] = {
'D',
'e',
's',
't',
'i',
'n',
'a',
't',
'i',
'o',
'n',
'D',
'i',
'r',
's',0};
356 static const WCHAR Def[] = {
'D',
'e',
'f',
'a',
'u',
'l',
't',
'D',
'e',
's',
't',
'D',
'i',
'r',0};
380 static const WCHAR extW[] = {
'.',
'c',
'a',
'b',0};
388 TRACE(
"extract_cabinet_file(cab = '%s' ; root = '%s' ; src = '%s' ; dst = '%s')\n",
396 if (!advpack && !(advpack =
LoadLibraryA(
"advpack.dll" )))
398 ERR(
"could not load advpack.dll\n" );
401 if (!(pExtractFiles = (
void *)
GetProcAddress( advpack,
"ExtractFiles" )))
403 ERR(
"could not find ExtractFiles in advpack.dll\n" );
424 const WCHAR *src_fileW;
430 ERR(
"GetTempPathW error\n");
445 if (src_fileW) ++src_fileW;
446 else src_fileW =
src;
466 TRACE(
"pExtractFiles(cab_file = '%s' ; cab_path = '%s', src_file = '%s')\n",
470 pExtractFiles(
cab_file, cab_path, 0, src_file,
NULL, 0 );
482 pExtractFiles(
cab_file, cab_path, 0, 0, 0, 0 );
538 if (!
op->src_file)
op->src_file =
op->dst_file;
545 TRACE(
"root=%s path=%s file=%s -> dir=%s file=%s descr=%s tag=%s\n",
573 if (
params->SecurityDescriptor)
577 if (!
op->src_file)
op->src_file =
op->dst_file;
584 TRACE(
"root=%s path=%s file=%s -> dir=%s file=%s descr=%s tag=%s\n",
610 params.TargetDirectory = dst_dir;
635 params.TargetDirectory = dst_dir;
775 op->src_file =
strdupW( SourceFilename );
779 op->dst_file =
strdupW( TargetFilename );
824 LPWSTR security_key, security_descriptor =
NULL;
831 TRACE(
"hinf=%p/%p section=%s root=%s\n",
850 if (!security_descriptor)
857 MyFree( security_descriptor );
871 params.SecurityDescriptor = security_descriptor;
874 if (!hlist) hlist = hinf;
875 if (!hinf) hinf = hlist;
891 if (security_descriptor)
892 MyFree( security_descriptor );
928 if (!hlist) hlist = hinf;
976 if (!hlist) hlist = hinf;
1023 while((
len =
strlenW(new_path)) && new_path[
len - 1] ==
'\\')
1024 new_path[
len - 1] = 0;
1040 if(!(slash =
strrchrW(new_path,
'\\')))
1046 len = slash - new_path;
1053 new_path[
len] =
'\\';
1080 ERR(
"GetTempPathW error\n");
1113 ERR(
"LZOpenFileW(2) error %d %s\n", (
int)hTemp,
debugstr_w(TempFile));
1127 lRes =
LZCopy(hSource, hTemp);
1156 DWORD VersionSizeSource=0;
1157 DWORD VersionSizeTarget=0;
1177 TRACE(
"SizeTarget %i ... SizeSource %i\n",VersionSizeTarget,
1180 if (VersionSizeSource && VersionSizeTarget)
1187 WCHAR SubBlock[2]={
'\\',0};
1210 TRACE(
"Versions: Source %i.%i target %i.%i\n",
1211 SourceInfo->dwFileVersionMS, SourceInfo->dwFileVersionLS,
1212 TargetInfo->dwFileVersionMS, TargetInfo->dwFileVersionLS);
1218 filepaths.
Flags = 0;
1220 if (TargetInfo->dwFileVersionMS > SourceInfo->dwFileVersionMS)
1227 else if ((TargetInfo->dwFileVersionMS == SourceInfo->dwFileVersionMS)
1228 && (TargetInfo->dwFileVersionLS > SourceInfo->dwFileVersionLS))
1236 (TargetInfo->dwFileVersionMS ==
1237 SourceInfo->dwFileVersionMS)
1238 &&(TargetInfo->dwFileVersionLS ==
1239 SourceInfo->dwFileVersionLS))
1256 FIXME(
"Notify user target file exists\n");
1263 ERR(
"Unsupported style(s) 0x%x\n",
style);
1269 TRACE(
"Did copy... rc was %i\n",rc);
1330 static const WCHAR CopyFiles[] = {
'C',
'o',
'p',
'y',
'F',
'i',
'l',
'e',
's',0};
1381 if (
p[-1] !=
'\\') *
p++ =
'\\';
1407 if (!
queue->copy_queue.count && !
queue->delete_queue.count && !
queue->rename_queue.count)
1414 if (
queue->delete_queue.count)
1417 queue->delete_queue.count )))
goto done;
1438 if (
queue->rename_queue.count)
1441 queue->rename_queue.count )))
goto done;
1449 TRACE(
"renaming file %s -> %s\n",
1463 if (
queue->copy_queue.count)
1466 queue->copy_queue.count )))
goto done;
1477 TRACE(
"copying file %s -> %s\n",
1519 psidOwner, psidGroup, pDacl, pSacl );
1571 if (!
queue->copy_queue.count)
return TRUE;
1578 FIXME(
"flags %x not fully implemented\n",
flags);
1722 TRACE(
"start queue\n" );
1725 TRACE(
"end queue\n" );
1728 TRACE(
"start subqueue %ld count %ld\n", param1, param2 );
1731 TRACE(
"end subqueue %ld\n", param1 );
1760 ERR(
"copy error %d %s -> %s\n",
paths->Win32Error,
1764 TRACE(
"need media\n" );
1786 TRACE(
"start queue\n" );
1789 TRACE(
"end queue\n" );
1792 TRACE(
"start subqueue %ld count %ld\n", param1, param2 );
1795 TRACE(
"end subqueue %ld\n", param1 );
1815 ERR(
"rename error %d %s -> %s\n",
paths->Win32Error,
1825 TRACE(
"copy error %d %s -> %s\n",
paths->Win32Error,
1829 TRACE(
"need media\n" );
1845 FIXME(
"stub: (Error Number %d when attempting to delete %s)\n",
1857 FIXME(
"stub: (Error Number %d when attempting to delete %s)\n",
1869 FIXME(
"stub: (Error Number %d when attempting to rename %s to %s)\n",
1881 FIXME(
"stub: (Error Number %d when attempting to rename %s to %s)\n",
1896 FIXME(
"stub: (Error Number %d when attempting to copy file %s from %s to %s)\n",
1910 FIXME(
"stub: (Error Number %d when attempting to copy file %s from %s to %s)\n",
1921 return queue->flags;
#define SPQ_SCAN_USE_CALLBACKEX
#define ERROR_INVALID_PARAMETER
BOOL WINAPI CreateDirectoryW(IN LPCWSTR lpPathName, IN LPSECURITY_ATTRIBUTES lpSecurityAttributes)
unsigned __int3264 UINT_PTR
BOOL WINAPI SetupFindFirstLineW(IN HINF InfHandle, IN PCWSTR Section, IN PCWSTR Key, IN OUT PINFCONTEXT Context)
#define SP_COPY_NEWER_ONLY
static BOOL build_filepathsW(const struct file_op *op, FILEPATHS_W *paths)
PSP_FILE_CALLBACK_A orig_handler
BOOL WINAPI SetupDiGetActualSectionToInstallW(HINF InfHandle, PCWSTR InfSectionName, PWSTR InfSectionWithExt, DWORD InfSectionWithExtSize, PDWORD RequiredSize, PWSTR *Extension)
BOOL WINAPI SetupQueueRenameA(HSPFILEQ handle, PCSTR SourcePath, PCSTR SourceFilename, PCSTR TargetPath, PCSTR TargetFilename)
#define SPFILENOTIFY_QUEUESCAN
static WCHAR * get_destination_dir(HINF hinf, const WCHAR *section)
WINE_UNICODE_INLINE unsigned int strlenW(const WCHAR *str)
BOOL WINAPI SetupQueueCopySectionW(HSPFILEQ queue, PCWSTR src_root, HINF hinf, HINF hlist, PCWSTR section, DWORD style)
#define WideCharToMultiByte
DWORD WINAPI SetNamedSecurityInfoW(LPWSTR pObjectName, SE_OBJECT_TYPE ObjectType, SECURITY_INFORMATION SecurityInfo, PSID psidOwner, PSID psidGroup, PACL pDacl, PACL pSacl)
char * strcat(char *DstString, const char *SrcString)
BOOL WINAPI GetSecurityDescriptorSacl(PSECURITY_DESCRIPTOR pSecurityDescriptor, LPBOOL lpbSaclPresent, PACL *pSacl, LPBOOL lpbSaclDefaulted)
#define SPFILENOTIFY_STARTREGISTRATION
#define MOVEFILE_REPLACE_EXISTING
BOOL WINAPI SetupScanFileQueueA(HSPFILEQ handle, DWORD flags, HWND window, PSP_FILE_CALLBACK_A handler, PVOID context, PDWORD result)
BOOL WINAPI SetupCommitFileQueueA(HWND owner, HSPFILEQ queue, PSP_FILE_CALLBACK_A handler, PVOID context)
#define SPFILENOTIFY_STARTQUEUE
ACPI_SIZE strlen(const char *String)
BOOL WINAPI SetupScanFileQueueW(HSPFILEQ handle, DWORD flags, HWND window, PSP_FILE_CALLBACK_W handler, PVOID context, PDWORD result)
static const WCHAR rootW[]
static const WCHAR DotSecurity[]
BOOL WINAPI SetupQueueRenameSectionW(HSPFILEQ queue, HINF hinf, HINF hlist, PCWSTR section)
static char * strdupWtoA(const WCHAR *str)
BOOL WINAPI SetupGetFileQueueCount(HSPFILEQ handle, UINT op, PUINT result)
HSPFILEQ WINAPI SetupOpenFileQueue(void)
#define SPFILENOTIFY_ENDCOPY
#define MOVEFILE_COPY_ALLOWED
BOOL WINAPI pSetupSetQueueFlags(HSPFILEQ handle, DWORD flags)
#define SPFILENOTIFY_QUEUESCAN_EX
#define ERROR_NOT_ENOUGH_MEMORY
#define SPFILENOTIFY_STARTRENAME
#define INVALID_HANDLE_VALUE
DWORD WINAPI GetLastError(VOID)
UINT(CALLBACK * PSP_FILE_CALLBACK_A)(PVOID, UINT, UINT_PTR, UINT_PTR)
BOOL WINAPI SetupQueueCopyW(HSPFILEQ queue, PCWSTR src_root, PCWSTR src_path, PCWSTR src_file, PCWSTR src_descr, PCWSTR src_tag, PCWSTR dst_dir, PCWSTR dst_file, DWORD style)
#define GROUP_SECURITY_INFORMATION
BOOL WINAPI SetupQueueCopySectionA(HSPFILEQ queue, PCSTR src_root, HINF hinf, HINF hlist, PCSTR section, DWORD style)
WCHAR * PARSER_get_dest_dir(INFCONTEXT *context)
HFILE WINAPI LZOpenFileW(LPWSTR fn, LPOFSTRUCT ofs, WORD mode)
UINT WINAPI SetupDeleteErrorW(HWND parent, PCWSTR dialogTitle, PCWSTR file, UINT w32error, DWORD style)
BOOL WINAPI SetupQueueDeleteA(HSPFILEQ handle, PCSTR part1, PCSTR part2)
DWORD WINAPI pSetupGetQueueFlags(HSPFILEQ handle)
#define SPFILENOTIFY_ENDRENAME
#define SPFILENOTIFY_TARGETNEWER
SIZE_T WINAPI HeapSize(HANDLE, DWORD, LPCVOID)
BOOL WINAPI SetupSetFileQueueAlternatePlatformW(HSPFILEQ handle, PSP_ALTPLATFORM_INFO platform, PCWSTR catalogfile)
static void free_file_op_queue(struct file_op_queue *queue)
BOOL WINAPI GetSecurityDescriptorGroup(PSECURITY_DESCRIPTOR pSecurityDescriptor, PSID *pGroup, LPBOOL lpbGroupDefaulted)
#define SP_COPY_LANGUAGEAWARE
void WINAPI LZClose(HFILE fd)
#define SPQ_SCAN_USE_CALLBACK
#define SP_COPY_IN_USE_NEEDS_REBOOT
#define SPFILENOTIFY_STARTSUBQUEUE
#define SPFILENOTIFY_ENDSUBQUEUE
BOOL WINAPI SetupQueueDeleteW(HSPFILEQ handle, PCWSTR part1, PCWSTR part2)
#define SPFILENOTIFY_RENAMEERROR
namespace GUID const ADDRINFOEXW ADDRINFOEXW struct timeval OVERLAPPED LPLOOKUPSERVICE_COMPLETION_ROUTINE HANDLE * handle
static BOOL extract_cabinet_file(const WCHAR *cabinet, const WCHAR *root, const WCHAR *src, const WCHAR *dst)
DWORD WINAPI GetTempPathW(IN DWORD count, OUT LPWSTR path)
BOOL WINAPI SetupInstallFileA(HINF hinf, PINFCONTEXT inf_context, PCSTR source, PCSTR root, PCSTR dest, DWORD style, PSP_FILE_CALLBACK_A handler, PVOID context)
GLenum const GLfloat * params
DWORD SECURITY_INFORMATION
UINT WINAPI SetupDeleteErrorA(HWND parent, PCSTR dialogTitle, PCSTR file, UINT w32error, DWORD style)
DWORD WINAPI GetFileAttributesW(LPCWSTR lpFileName)
#define SPFILENOTIFY_ENDDELETE
struct file_op_queue rename_queue
HINSTANCE WINAPI DECLSPEC_HOTPATCH LoadLibraryA(LPCSTR lpLibFileName)
GLenum GLuint GLenum GLsizei length
BOOL WINAPI MoveFileW(IN LPCWSTR lpExistingFileName, IN LPCWSTR lpNewFileName)
BOOL WINAPI DeleteFileW(IN LPCWSTR lpFileName)
static const WCHAR CopyFiles[]
BOOL WINAPI SetupSetFileQueueFlags(HSPFILEQ handle, DWORD mask, DWORD flags)
static BOOL do_file_copyW(LPCWSTR source, LPCWSTR target, DWORD style, PSP_FILE_CALLBACK_W handler, PVOID context)
BOOL WINAPI SetupQueueDeleteSectionW(HSPFILEQ queue, HINF hinf, HINF hlist, PCWSTR section)
#define SP_COPY_FORCE_NEWER
BOOL WINAPI SetupQueueCopyA(HSPFILEQ queue, PCSTR src_root, PCSTR src_path, PCSTR src_file, PCSTR src_descr, PCSTR src_tag, PCSTR dst_dir, PCSTR dst_file, DWORD style)
NTSYSAPI BOOLEAN NTAPI RtlCreateUnicodeStringFromAsciiz(_Out_ PUNICODE_STRING Destination, _In_ PCSZ Source)
#define SPFILENOTIFY_STARTCOPY
BOOL WINAPI SetupQueueDefaultCopyA(HSPFILEQ queue, HINF hinf, PCSTR src_root, PCSTR src_file, PCSTR dst_file, DWORD style)
#define ERROR_FILE_NOT_FOUND
BOOL WINAPI GetSecurityDescriptorDacl(PSECURITY_DESCRIPTOR pSecurityDescriptor, LPBOOL lpbDaclPresent, PACL *pDacl, LPBOOL lpbDaclDefaulted)
static void get_src_file_info(HINF hinf, struct file_op *op)
#define SP_COPY_NOOVERWRITE
#define SPFILENOTIFY_STARTDELETE
static void queue_file_op(struct file_op_queue *queue, struct file_op *op)
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
BOOL WINAPI CopyFileW(IN LPCWSTR lpExistingFileName, IN LPCWSTR lpNewFileName, IN BOOL bFailIfExists)
UINT(CALLBACK * PSP_FILE_CALLBACK_W)(IN PVOID Context, IN UINT Notification, IN UINT_PTR Param1, IN UINT_PTR Param2)
UINT WINAPI GetTempFileNameW(IN LPCWSTR lpPathName, IN LPCWSTR lpPrefixString, IN UINT uUnique, OUT LPWSTR lpTempFileName)
WCHAR * PARSER_get_src_root(HINF hinf)
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
unsigned __int3264 UINT_PTR
#define SP_COPY_NEWER_OR_SAME
#define INVALID_FILE_ATTRIBUTES
UINT WINAPI SetupDefaultQueueCallbackA(PVOID context, UINT notification, UINT_PTR param1, UINT_PTR param2)
#define SPFILENOTIFY_COPYERROR
_In_opt_ PVOID _In_ ULONG _In_ PVOID context
#define SP_COPY_FORCE_NOOVERWRITE
static BOOL create_full_pathW(const WCHAR *path)
UINT WINAPI SetupDefaultQueueCallbackW(PVOID context, UINT notification, UINT_PTR param1, UINT_PTR param2)
DWORD WINAPI GetFileVersionInfoSizeW(LPCWSTR filename, LPDWORD handle)
static void concat_W(WCHAR *buffer, const WCHAR *src1, const WCHAR *src2, const WCHAR *src3)
#define memcpy(s1, s2, n)
void WINAPI SetupTermDefaultQueueCallback(PVOID context)
BOOL WINAPI SetupCommitFileQueueW(HWND owner, HSPFILEQ handle, PSP_FILE_CALLBACK_W handler, PVOID context)
BOOL WINAPI SetupSetFileQueueAlternatePlatformA(HSPFILEQ handle, PSP_ALTPLATFORM_INFO platform, PCSTR catalogfile)
#define SP_COPY_REPLACEONLY
static IHTMLWindow2 * window
#define SP_COPY_SOURCE_ABSOLUTE
UINT CALLBACK QUEUE_callback_WtoA(void *context, UINT notification, UINT_PTR param1, UINT_PTR param2)
PVOID WINAPI SetupInitDefaultQueueCallbackEx(HWND owner, HWND progress, UINT msg, DWORD reserved1, PVOID reserved2)
#define SP_COPY_FORCE_IN_USE
GLsizei const GLuint * paths
BOOL WINAPI SetupQueueCopyIndirectW(PSP_FILE_COPY_PARAMS_W params)
WINE_UNICODE_INLINE WCHAR * strrchrW(const WCHAR *str, WCHAR ch)
LONG WINAPI LZCopy(HFILE src, HFILE dest)
UINT WINAPI SetupRenameErrorA(HWND parent, PCSTR dialogTitle, PCSTR source, PCSTR target, UINT w32error, DWORD style)
UINT WINAPI SetupCopyErrorA(HWND parent, PCSTR dialogTitle, PCSTR diskname, PCSTR sourcepath, PCSTR sourcefile, PCSTR targetpath, UINT w32error, DWORD style, PSTR pathbuffer, DWORD buffersize, PDWORD requiredsize)
struct file_op_queue delete_queue
#define SPFILENOTIFY_ENDREGISTRATION
WINE_UNICODE_INLINE WCHAR * strcpyW(WCHAR *dst, const WCHAR *src)
PSECURITY_DESCRIPTOR dst_sd
BOOL WINAPI SetupQueueRenameSectionA(HSPFILEQ queue, HINF hinf, HINF hlist, PCSTR section)
BOOL WINAPI GetSecurityDescriptorOwner(PSECURITY_DESCRIPTOR pSecurityDescriptor, PSID *pOwner, LPBOOL lpbOwnerDefaulted)
GLsizei GLsizei GLchar * source
HLOCAL NTAPI LocalFree(HLOCAL hMem)
PVOID WINAPI SetupInitDefaultQueueCallback(HWND owner)
#define SP_COPY_DELETESOURCE
static WCHAR * strdupW(const WCHAR *str)
WINE_UNICODE_INLINE WCHAR * strcatW(WCHAR *dst, const WCHAR *src)
static const WCHAR sourceW[]
#define OWNER_SECURITY_INFORMATION
UINT WINAPI SetupRenameErrorW(HWND parent, PCWSTR dialogTitle, PCWSTR source, PCWSTR target, UINT w32error, DWORD style)
BOOL WINAPI SetupFindNextLine(IN PINFCONTEXT ContextIn, OUT PINFCONTEXT ContextOut)
#define MultiByteToWideChar
BOOL WINAPI GetFileVersionInfoW(LPCWSTR filename, DWORD handle, DWORD datasize, LPVOID data)
struct file_op_queue copy_queue
#define SP_COPY_WARNIFSKIP
#define SPFILENOTIFY_DELETEERROR
#define SPFILENOTIFY_ENDQUEUE
BOOL WINAPI SetupGetIntField(IN PINFCONTEXT Context, IN ULONG FieldIndex, OUT INT *IntegerValue)
char * strcpy(char *DstString, const char *SrcString)
#define SP_COPY_SOURCEPATH_ABSOLUTE
BOOL WINAPI MoveFileExW(IN LPCWSTR lpExistingFileName, IN LPCWSTR lpNewFileName OPTIONAL, IN DWORD dwFlags)
#define GetProcAddress(x, y)
LPVOID WINAPI MyMalloc(DWORD dwSize)
BOOL WINAPI SetupQueueCopyIndirectA(PSP_FILE_COPY_PARAMS_A params)
#define ERROR_PATH_NOT_FOUND
BOOL WINAPI SetupQueueDefaultCopyW(HSPFILEQ queue, HINF hinf, PCWSTR src_root, PCWSTR src_file, PCWSTR dst_file, DWORD style)
#define ERROR_ALREADY_EXISTS
UINT(* handler)(MSIPACKAGE *)
BOOL WINAPI SetupQueueRenameW(HSPFILEQ handle, PCWSTR SourcePath, PCWSTR SourceFilename, PCWSTR TargetPath, PCWSTR TargetFilename)
VOID WINAPI MyFree(LPVOID lpMem)
BOOL WINAPI SetupQueueDeleteSectionA(HSPFILEQ queue, HINF hinf, HINF hlist, PCSTR section)
BOOL WINAPI SetupCloseFileQueue(HSPFILEQ handle)
#define HeapFree(x, y, z)
static WCHAR * strdupAtoW(const char *str)
#define SPFILENOTIFY_NEEDMEDIA
#define DACL_SECURITY_INFORMATION
UINT WINAPI SetupCopyErrorW(HWND parent, PCWSTR dialogTitle, PCWSTR diskname, PCWSTR sourcepath, PCWSTR sourcefile, PCWSTR targetpath, UINT w32error, DWORD style, PWSTR pathbuffer, DWORD buffersize, PDWORD requiredsize)
static void(WINAPI *pExtractFiles)(LPSTR
BOOL WINAPI VerQueryValueW(LPCVOID pBlock, LPCWSTR lpSubBlock, LPVOID *lplpBuffer, PUINT puLen)
BOOL WINAPI ConvertStringSecurityDescriptorToSecurityDescriptorW(LPCWSTR StringSecurityDescriptor, DWORD StringSDRevision, PSECURITY_DESCRIPTOR *SecurityDescriptor, PULONG SecurityDescriptorSize)
BOOL WINAPI SetupGetLineTextW(PINFCONTEXT context, HINF hinf, PCWSTR section_name, PCWSTR key_name, PWSTR buffer, DWORD size, PDWORD required)
BOOL WINAPI SetupGetFileQueueFlags(HSPFILEQ handle, PDWORD flags)
BOOL WINAPI SetupInstallFileW(HINF hinf, PINFCONTEXT inf_context, PCWSTR source, PCWSTR root, PCWSTR dest, DWORD style, PSP_FILE_CALLBACK_W handler, PVOID context)
BOOL WINAPI SetupGetStringFieldW(IN PINFCONTEXT Context, IN ULONG FieldIndex, OUT PWSTR ReturnBuffer, IN ULONG ReturnBufferSize, OUT PULONG RequiredSize)