* FILE: subsys/system/usetup/filesup.c
* PURPOSE: File support functions
* PROGRAMMER: Eric Kohl
+ * Casper S. Hornstrup (chorns@users.sourceforge.net)
*/
/* INCLUDES *****************************************************************/
#include "usetup.h"
#include "filesup.h"
+#include "cabinet.h"
/* FUNCTIONS ****************************************************************/
+static BOOLEAN HasCurrentCabinet = FALSE;
+static WCHAR CurrentCabinetName[MAX_PATH];
+
NTSTATUS
CreateDirectory(PWCHAR DirectoryName)
{
FILE_SYNCHRONOUS_IO_ALERT | FILE_SEQUENTIAL_ONLY);
if (!NT_SUCCESS(Status))
{
-CHECKPOINT1;
return(Status);
}
FileStandardInformation);
if (!NT_SUCCESS(Status))
{
-CHECKPOINT1;
NtClose(FileHandleSource);
return(Status);
}
FileBasicInformation);
if (!NT_SUCCESS(Status))
{
-CHECKPOINT1;
NtClose(FileHandleSource);
return(Status);
}
0);
if (!NT_SUCCESS(Status))
{
-CHECKPOINT1;
NtClose(FileHandleSource);
return(Status);
}
FilePositionInformation);
if (!NT_SUCCESS(Status))
{
-CHECKPOINT1;
NtClose(FileHandleSource);
NtClose(FileHandleDest);
return(Status);
FilePositionInformation);
if (!NT_SUCCESS(Status))
{
-CHECKPOINT1;
NtClose(FileHandleSource);
NtClose(FileHandleDest);
return(Status);
PAGE_READWRITE);
if (!NT_SUCCESS(Status))
{
-CHECKPOINT1;
NtClose(FileHandleSource);
NtClose(FileHandleDest);
return(Status);
DPRINT("STATUS_END_OF_FILE\n");
break;
}
-CHECKPOINT1;
NtClose(FileHandleSource);
NtClose(FileHandleDest);
return(Status);
NULL);
if (!NT_SUCCESS(Status))
{
-CHECKPOINT1;
NtFreeVirtualMemory(NtCurrentProcess(),
(PVOID *)&Buffer,
&RegionSize,
}
+NTSTATUS
+SetupExtractFile(PWCHAR CabinetFileName,
+ PWCHAR SourceFileName,
+ PWCHAR DestinationPathName)
+{
+ ULONG CabStatus;
+
+ DPRINT("SetupExtractFile(CabinetFileName %S, SourceFileName %S, DestinationPathName %S)\n",
+ CabinetFileName, SourceFileName, DestinationPathName);
+
+ if (HasCurrentCabinet)
+ {
+ DPRINT("CurrentCabinetName: %S\n", CurrentCabinetName);
+ }
+
+ if ((HasCurrentCabinet) && (wcscmp(CabinetFileName, CurrentCabinetName) == 0))
+ {
+ DPRINT("Using same cabinet as last time\n");
+ }
+ else
+ {
+ DPRINT("Using new cabinet\n");
+
+ if (HasCurrentCabinet)
+ {
+ CabinetCleanup();
+ }
+
+ wcscpy(CurrentCabinetName, CabinetFileName);
+
+ CabinetInitialize();
+ CabinetSetEventHandlers(NULL, NULL, NULL);
+ CabinetSetCabinetName(CabinetFileName);
+
+ CabStatus = CabinetOpen();
+ if (CabStatus == CAB_STATUS_SUCCESS)
+ {
+ DPRINT("Opened cabinet %S\n", CabinetGetCabinetName());
+ HasCurrentCabinet = TRUE;
+ }
+ else
+ {
+ DPRINT("Cannot open cabinet (%d)\n", CabStatus);
+ return STATUS_UNSUCCESSFUL;
+ }
+ }
+
+ CabinetSetDestinationPath(DestinationPathName);
+ CabStatus = CabinetExtractFile(SourceFileName);
+ if (CabStatus != CAB_STATUS_SUCCESS)
+ {
+ DPRINT("Cannot extract file %S (%d)\n", SourceFileName, CabStatus);
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ return STATUS_SUCCESS;
+}
+
+
BOOLEAN
DoesFileExist(PWSTR PathName,
PWSTR FileName)
FILE_SYNCHRONOUS_IO_ALERT);
if (!NT_SUCCESS(Status))
{
-CHECKPOINT1;
return(FALSE);
}