77 DPRINT(
"SetupExtractFile(CabinetFileName: '%S', SourceFileName: '%S', DestinationPathName: '%S')\n",
78 CabinetFileName, SourceFileName, DestinationPathName);
80 if (QueueHeader->HasCurrentCabinet)
82 DPRINT(
"CurrentCabinetName: '%S'\n", QueueHeader->CurrentCabinetName);
85 if (QueueHeader->HasCurrentCabinet &&
86 (
wcscmp(CabinetFileName, QueueHeader->CurrentCabinetName) == 0))
88 DPRINT(
"Using same cabinet as last time\n");
93 &QueueHeader->Search);
96 DPRINT(
"Sequential miss on file: %S\n", SourceFileName);
101 &QueueHeader->Search);
106 DPRINT(
"Using new cabinet\n");
108 if (QueueHeader->HasCurrentCabinet)
110 QueueHeader->HasCurrentCabinet =
FALSE;
115 ARRAYSIZE(QueueHeader->CurrentCabinetName),
123 CabStatus =
CabinetOpen(&QueueHeader->CabinetContext);
126 DPRINT(
"Opened cabinet %S\n", CabinetFileName );
127 QueueHeader->HasCurrentCabinet =
TRUE;
131 DPRINT(
"Cannot open cabinet (%d)\n", CabStatus);
138 &QueueHeader->Search);
143 DPRINT1(
"Unable to find '%S' in cabinet '%S'\n",
152 DPRINT(
"Cannot extract file %S (%d)\n", SourceFileName, CabStatus);
167 if (QueueHeader ==
NULL)
224 if (QueueHandle ==
NULL)
278 if (QueueHandle ==
NULL ||
279 SourceRootPath ==
NULL ||
280 SourceFileName ==
NULL ||
281 TargetDirectory ==
NULL)
288 DPRINT(
"SetupQueueCopy(Cab '%S', SrcRootPath '%S', SrcPath '%S', SrcFN '%S' --> DstPath '%S', DstFN '%S')\n",
289 SourceCabinet ? SourceCabinet :
L"n/a",
290 SourceRootPath, SourcePath, SourceFileName,
291 TargetDirectory, TargetFileName);
302 if (SourceCabinet !=
NULL)
333 if (SourcePath !=
NULL)
399 if (TargetFileName !=
NULL)
442 if (QueueHandle ==
NULL || PathPart1 ==
NULL)
449 DPRINT1(
"SetupQueueDeleteW(PathPart1 '%S', PathPart2 '%S')\n",
450 PathPart1, PathPart2);
479 if (PathPart2 !=
NULL)
514 if (QueueHandle ==
NULL ||
515 SourcePath ==
NULL ||
516 TargetFileName ==
NULL)
523 DPRINT1(
"SetupQueueRenameW(SrcPath '%S', SrcFN '%S' --> DstPath '%S', DstFN '%S')\n",
524 SourcePath, SourceFileName, TargetPath, TargetFileName);
552 if (SourceFileName !=
NULL)
569 if (TargetPath !=
NULL)
633 if (QueueHandle ==
NULL)
665 ListEntry = ListEntry->
Flink)
671 Entry->TargetDirectory,
Entry->TargetFileName);
673 DPRINT1(
" -----> " "Delete: '%S'\n", FileDstPath);
675 FilePathInfo.
Target = FileDstPath;
678 FilePathInfo.
Flags = 0;
756 ListEntry = ListEntry->
Flink)
766 Entry->TargetDirectory,
Entry->TargetFileName);
768 DPRINT1(
" -----> " "Rename: '%S' ==> '%S'\n", FileSrcPath, FileDstPath);
770 FilePathInfo.
Target = FileDstPath;
771 FilePathInfo.
Source = FileSrcPath;
773 FilePathInfo.
Flags = 0;
854 ListEntry = ListEntry->
Flink)
870 Entry->SourceFileName);
880 Entry->SourceCabinet);
898 DPRINT(
" -----> " "Copy: '%S' ==> '%S'\n", FileSrcPath, FileDstPath);
905 FilePathInfo.
Target = FileDstPath;
906 FilePathInfo.
Source = FileSrcPath;
908 FilePathInfo.
Flags = 0;
933 Entry->SourceFileName,
934 Entry->TargetDirectory);
#define CAB_STATUS_SUCCESS
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
ULONG CabinetOpen(IN OUT PCABINET_CONTEXT CabinetContext)
ULONG CabinetFindFirst(IN PCABINET_CONTEXT CabinetContext, IN PCWSTR FileName, IN OUT PCAB_SEARCH Search)
PCWSTR CabinetGetCabinetName(IN PCABINET_CONTEXT CabinetContext)
ULONG CabinetExtractFile(IN PCABINET_CONTEXT CabinetContext, IN PCAB_SEARCH Search)
VOID CabinetSetEventHandlers(IN PCABINET_CONTEXT CabinetContext, IN PCABINET_OVERWRITE Overwrite, IN PCABINET_EXTRACT Extract, IN PCABINET_DISK_CHANGE DiskChange, IN PCABINET_CREATE_FILE CreateFile)
VOID CabinetInitialize(IN OUT PCABINET_CONTEXT CabinetContext)
VOID CabinetCleanup(IN OUT PCABINET_CONTEXT CabinetContext)
VOID CabinetSetCabinetName(IN PCABINET_CONTEXT CabinetContext, IN PCWSTR FileName)
VOID CabinetSetDestinationPath(IN PCABINET_CONTEXT CabinetContext, IN PCWSTR DestinationPath)
ULONG CabinetFindNextFileSequential(IN PCABINET_CONTEXT CabinetContext, IN PCWSTR FileName, IN OUT PCAB_SEARCH Search)
#define NT_SUCCESS(StatCode)
HSPFILEQ WINAPI SetupOpenFileQueue(void)
#define InsertTailList(ListHead, Entry)
#define IsListEmpty(ListHead)
#define RemoveHeadList(ListHead)
#define InitializeListHead(ListHead)
#define SPFILENOTIFY_ENDDELETE
#define SPFILENOTIFY_RENAMEERROR
BOOL(WINAPI * pSpFileQueueCommit)(IN HWND Owner, IN HSPFILEQ QueueHandle, IN PSP_FILE_CALLBACK_W MsgHandler, IN PVOID Context OPTIONAL)
pSpFileQueueDelete SpFileQueueDelete
#define SPFILENOTIFY_STARTDELETE
BOOL(WINAPI * pSpFileQueueClose)(IN HSPFILEQ QueueHandle)
BOOL(WINAPI * pSpFileQueueDelete)(IN HSPFILEQ QueueHandle, IN PCWSTR PathPart1, IN PCWSTR PathPart2 OPTIONAL)
pSpFileQueueClose SpFileQueueClose
UINT(CALLBACK * PSP_FILE_CALLBACK_W)(IN PVOID Context, IN UINT Notification, IN UINT_PTR Param1, IN UINT_PTR Param2)
#define SPFILENOTIFY_STARTSUBQUEUE
#define SPFILENOTIFY_ENDQUEUE
pSpFileQueueCopy SpFileQueueCopy
#define SPFILENOTIFY_ENDCOPY
#define SPFILENOTIFY_DELETEERROR
#define SPFILENOTIFY_STARTCOPY
#define SPFILENOTIFY_COPYERROR
BOOL(WINAPI * pSpFileQueueCopy)(IN HSPFILEQ QueueHandle, IN PCWSTR SourceRootPath, IN PCWSTR SourcePath OPTIONAL, IN PCWSTR SourceFileName, IN PCWSTR SourceDescription OPTIONAL, IN PCWSTR SourceCabinet OPTIONAL, IN PCWSTR SourceTagFile OPTIONAL, IN PCWSTR TargetDirectory, IN PCWSTR TargetFileName OPTIONAL, IN ULONG CopyStyle)
HSPFILEQ(WINAPI * pSpFileQueueOpen)(VOID)
#define SPFILENOTIFY_ENDSUBQUEUE
#define SPFILENOTIFY_STARTRENAME
#define SPFILENOTIFY_ENDRENAME
pSpFileQueueOpen SpFileQueueOpen
pSpFileQueueCommit SpFileQueueCommit
pSpFileQueueRename SpFileQueueRename
#define SPFILENOTIFY_STARTQUEUE
BOOL(WINAPI * pSpFileQueueRename)(IN HSPFILEQ QueueHandle, IN PCWSTR SourcePath, IN PCWSTR SourceFileName OPTIONAL, IN PCWSTR TargetPath OPTIONAL, IN PCWSTR TargetFileName)
NTSTATUS CombinePaths(OUT PWSTR PathBuffer, IN SIZE_T cchPathSize, IN ULONG NumberOfPathComponents, IN ...)
NTSTATUS SetupMoveFile(IN PCWSTR ExistingFileName, IN PCWSTR NewFileName, IN ULONG Flags)
NTSTATUS ConcatPaths(IN OUT PWSTR PathBuffer, IN SIZE_T cchPathSize, IN ULONG NumberOfPathComponents, IN ...)
NTSTATUS SetupCopyFile(IN PCWSTR SourceFileName, IN PCWSTR DestinationFileName, IN BOOLEAN FailIfExists)
NTSTATUS SetupDeleteFile(IN PCWSTR FileName, IN BOOLEAN ForceDelete)
#define MOVEFILE_WRITE_THROUGH
#define MOVEFILE_REPLACE_EXISTING
#define MOVEFILE_COPY_ALLOWED
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
unsigned __int3264 UINT_PTR
_Out_writes_bytes_to_opt_ AbsoluteSecurityDescriptorSize PSECURITY_DESCRIPTOR _Inout_ PULONG _Out_writes_bytes_to_opt_ DaclSize PACL _Inout_ PULONG _Out_writes_bytes_to_opt_ SaclSize PACL _Inout_ PULONG _Out_writes_bytes_to_opt_ OwnerSize PSID Owner
_In_ ULONG _In_ ULONG _In_ ULONG Length
NTSTRSAFEAPI RtlStringCchCopyW(_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cchDest, _In_ NTSTRSAFE_PCWSTR pszSrc)
_Check_return_ _CRTIMP int __cdecl wcscmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
PULONG MinorVersion OPTIONAL
base of all file and directory entries
struct _LIST_ENTRY * Flink
#define RtlZeroMemory(Destination, Length)
#define CONTAINING_RECORD(address, type, field)
#define STATUS_UNSUCCESSFUL
struct _FILEQUEUEHEADER * PFILEQUEUEHEADER
static VOID SetupDeleteQueueEntry(IN PQUEUEENTRY Entry)
BOOL WINAPI SetupQueueRenameW(IN HSPFILEQ QueueHandle, IN PCWSTR SourcePath, IN PCWSTR SourceFileName OPTIONAL, IN PCWSTR TargetPath OPTIONAL, IN PCWSTR TargetFileName)
struct _FILEQUEUEHEADER FILEQUEUEHEADER
BOOL WINAPI SetupQueueDeleteW(IN HSPFILEQ QueueHandle, IN PCWSTR PathPart1, IN PCWSTR PathPart2 OPTIONAL)
struct _QUEUEENTRY * PQUEUEENTRY
struct _QUEUEENTRY QUEUEENTRY
BOOL WINAPI SetupCloseFileQueue(IN HSPFILEQ QueueHandle)
BOOL WINAPI SetupQueueCopyWithCab(IN HSPFILEQ QueueHandle, IN PCWSTR SourceRootPath, IN PCWSTR SourcePath OPTIONAL, IN PCWSTR SourceFileName, IN PCWSTR SourceDescription OPTIONAL, IN PCWSTR SourceCabinet OPTIONAL, IN PCWSTR SourceTagFile OPTIONAL, IN PCWSTR TargetDirectory, IN PCWSTR TargetFileName OPTIONAL, IN ULONG CopyStyle)
BOOL WINAPI SetupCommitFileQueueW(IN HWND Owner, IN HSPFILEQ QueueHandle, IN PSP_FILE_CALLBACK_W MsgHandler, IN PVOID Context OPTIONAL)
static NTSTATUS SetupExtractFile(IN OUT PFILEQUEUEHEADER QueueHeader, IN PCWSTR CabinetFileName, IN PCWSTR SourceFileName, IN PCWSTR DestinationPathName)
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO