76{
78
79 DPRINT(
"SetupExtractFile(CabinetFileName: '%S', SourceFileName: '%S', DestinationPathName: '%S')\n",
80 CabinetFileName, SourceFileName, DestinationPathName);
81
82 if (QueueHeader->HasCurrentCabinet)
83 {
84 DPRINT(
"CurrentCabinetName: '%S'\n", QueueHeader->CurrentCabinetName);
85 }
86
87 if (QueueHeader->HasCurrentCabinet &&
88 (
wcscmp(CabinetFileName, QueueHeader->CurrentCabinetName) == 0))
89 {
90 DPRINT(
"Using same cabinet as last time\n");
91
92
94 SourceFileName,
95 &QueueHeader->Search);
97 {
98 DPRINT(
"Sequential miss on file: %S\n", SourceFileName);
99
100
102 SourceFileName,
103 &QueueHeader->Search);
104 }
105 }
106 else
107 {
108 DPRINT(
"Using new cabinet\n");
109
110 if (QueueHeader->HasCurrentCabinet)
111 {
112 QueueHeader->HasCurrentCabinet =
FALSE;
114 }
115
117 ARRAYSIZE(QueueHeader->CurrentCabinetName),
118 CabinetFileName);
119
124
125 CabStatus =
CabinetOpen(&QueueHeader->CabinetContext);
127 {
128 DPRINT(
"Opened cabinet %S\n", CabinetFileName );
129 QueueHeader->HasCurrentCabinet =
TRUE;
130 }
131 else
132 {
133 DPRINT(
"Cannot open cabinet (%d)\n", CabStatus);
135 }
136
137
139 SourceFileName,
140 &QueueHeader->Search);
141 }
142
144 {
145 DPRINT1(
"Unable to find '%S' in cabinet '%S'\n",
148 }
149
153 {
154 DPRINT(
"Cannot extract file %S (%d)\n", SourceFileName, CabStatus);
156 }
157
159}
#define CAB_STATUS_SUCCESS
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)
_Check_return_ _CRTIMP int __cdecl wcscmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
#define STATUS_UNSUCCESSFUL