static BOOLEAN HasCurrentCabinet = FALSE;
static WCHAR CurrentCabinetName[MAX_PATH];
+static CAB_SEARCH Search;
NTSTATUS
SetupCreateDirectory(PWCHAR DirectoryName)
FILE_SEQUENTIAL_ONLY);
if(!NT_SUCCESS(Status))
{
- DPRINT1("NtOpenFile failed: %x\n", Status);
+ DPRINT1("NtOpenFile failed: %x, %wZ\n", Status, &FileName);
goto done;
}
#else
FileHandleSource);
if(!NT_SUCCESS(Status))
{
- DPRINT1("NtCreateSection failed: %x\n", Status);
+ DPRINT1("NtCreateSection failed: %x, %wZ\n", Status, SourceFileName);
goto closesrc;
}
PAGE_READONLY );
if(!NT_SUCCESS(Status))
{
- DPRINT1("NtMapViewOfSection failed: %x\n", Status);
+ DPRINT1("NtMapViewOfSection failed: %x, %wZ\n", Status, SourceFileName);
goto closesrcsec;
}
PWCHAR DestinationPathName)
{
ULONG CabStatus;
- CAB_SEARCH Search;
DPRINT("SetupExtractFile(CabinetFileName %S, SourceFileName %S, DestinationPathName %S)\n",
CabinetFileName, SourceFileName, DestinationPathName);
if ((HasCurrentCabinet) && (wcscmp(CabinetFileName, CurrentCabinetName) == 0))
{
DPRINT("Using same cabinet as last time\n");
+
+ /* Use our last location because the files should be sequential */
+ CabStatus = CabinetFindNextFileSequential(SourceFileName, &Search);
+ if (CabStatus != CAB_STATUS_SUCCESS)
+ {
+ DPRINT("Sequential miss on file: %S\n", SourceFileName);
+
+ /* Looks like we got unlucky */
+ CabStatus = CabinetFindFirst(SourceFileName, &Search);
+ }
}
else
{
DPRINT("Cannot open cabinet (%d)\n", CabStatus);
return STATUS_UNSUCCESSFUL;
}
+
+ /* We have to start at the beginning here */
+ CabStatus = CabinetFindFirst(SourceFileName, &Search);
}
+
+ if (CabStatus != CAB_STATUS_SUCCESS)
+ {
+ DPRINT1("Unable to find '%S' in cabinet '%S'\n", SourceFileName, CabinetGetCabinetName());
+ return STATUS_UNSUCCESSFUL;
+ }
CabinetSetDestinationPath(DestinationPathName);
- CabinetFindFirst( SourceFileName, &Search );
CabStatus = CabinetExtractFile(&Search);
if (CabStatus != CAB_STATUS_SUCCESS)
{