ReactOS 0.4.16-dev-747-gbc52d5f
install.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Typedefs

typedef enum _FILE_COPY_STATUS FILE_COPY_STATUS
 
typedef VOID(__cdeclPFILE_COPY_STATUS_ROUTINE) (IN FILE_COPY_STATUS,...)
 

Enumerations

enum  _FILE_COPY_STATUS { None = 0 }
 

Functions

BOOLEAN NTAPI PrepareFileCopy (IN OUT PUSETUP_DATA pSetupData, IN PFILE_COPY_STATUS_ROUTINE StatusRoutine OPTIONAL)
 
BOOLEAN NTAPI DoFileCopy (IN OUT PUSETUP_DATA pSetupData, IN PSP_FILE_CALLBACK_W MsgHandler, IN PVOID Context OPTIONAL)
 

Typedef Documentation

◆ FILE_COPY_STATUS

◆ PFILE_COPY_STATUS_ROUTINE

typedef VOID(__cdecl * PFILE_COPY_STATUS_ROUTINE) (IN FILE_COPY_STATUS,...)

Definition at line 18 of file install.h.

Enumeration Type Documentation

◆ _FILE_COPY_STATUS

Enumerator
None 

Definition at line 12 of file install.h.

13{
14 None = 0,
15 // Success = 0,
enum _FILE_COPY_STATUS FILE_COPY_STATUS
@ None
Definition: install.h:14

Function Documentation

◆ DoFileCopy()

BOOLEAN NTAPI DoFileCopy ( IN OUT PUSETUP_DATA  pSetupData,
IN PSP_FILE_CALLBACK_W  MsgHandler,
IN PVOID Context  OPTIONAL 
)

Definition at line 828 of file install.c.

832{
834
836 (HSPFILEQ)pSetupData->SetupFileQueue,
837 MsgHandler,
838 Context);
839
840 SpFileQueueClose((HSPFILEQ)pSetupData->SetupFileQueue);
841 pSetupData->SetupFileQueue = NULL;
842
843 return Success;
844}
unsigned char BOOLEAN
#define NULL
Definition: types.h:112
@ Success
Definition: eventcreate.c:712
#define SpFileQueueClose
Definition: fileqsup.h:137
#define SpFileQueueCommit
Definition: fileqsup.h:141

Referenced by FileCopyPage(), and PrepareAndDoCopyThread().

◆ PrepareFileCopy()

BOOLEAN NTAPI PrepareFileCopy ( IN OUT PUSETUP_DATA  pSetupData,
IN PFILE_COPY_STATUS_ROUTINE StatusRoutine  OPTIONAL 
)

Definition at line 685 of file install.c.

688{
689 HINF InfHandle;
690 INFCONTEXT CabinetsContext;
691 PCWSTR CabinetName;
692 UINT ErrorLine;
693#if defined(__REACTOS__) && defined(USE_CABINET_INF)
694 ULONG InfFileSize;
695 PVOID InfFileData;
696 CABINET_CONTEXT CabinetContext;
697#endif
698 WCHAR PathBuffer[MAX_PATH];
699
700 /* Create the file queue */
701 pSetupData->SetupFileQueue = (PVOID)SpFileQueueOpen();
702 if (pSetupData->SetupFileQueue == NULL)
703 {
704 pSetupData->LastErrorNumber = ERROR_COPY_QUEUE;
705 if (pSetupData->ErrorRoutine)
706 pSetupData->ErrorRoutine(pSetupData);
707 return FALSE;
708 }
709
710 /* Prepare the copy of the common files that are not in installation cabinets */
711 if (!PrepareCopyInfFile(pSetupData, pSetupData->SetupInf, NULL))
712 {
713 /* FIXME: show an error dialog */
714 return FALSE;
715 }
716
717 /* Search for the 'Cabinets' section */
718 if (!SpInfFindFirstLine(pSetupData->SetupInf, L"Cabinets", NULL, &CabinetsContext))
719 {
720 /* Skip this step and return success if no cabinet file is listed */
721 return TRUE;
722 }
723
724 /*
725 * Enumerate the installation cabinets listed in the
726 * 'Cabinets' section and parse their inf files.
727 */
728 do
729 {
730 if (!INF_GetData(&CabinetsContext, NULL, &CabinetName))
731 break;
732
733 CombinePaths(PathBuffer, ARRAYSIZE(PathBuffer), 2,
734 pSetupData->SourcePath.Buffer, CabinetName);
735
736#if defined(__REACTOS__) && defined(USE_CABINET_INF)
737 INF_FreeData(CabinetName);
738
739 CabinetInitialize(&CabinetContext);
740 CabinetSetEventHandlers(&CabinetContext, NULL, NULL, NULL);
741 CabinetSetCabinetName(&CabinetContext, PathBuffer);
742
743 if (CabinetOpen(&CabinetContext) == CAB_STATUS_SUCCESS)
744 {
745 DPRINT("Cabinet %S\n", PathBuffer);
746
747 InfFileData = CabinetGetCabinetReservedArea(&CabinetContext, &InfFileSize);
748 if (InfFileData == NULL)
749 {
750 CabinetCleanup(&CabinetContext);
751
752 pSetupData->LastErrorNumber = ERROR_CABINET_SCRIPT;
753 if (pSetupData->ErrorRoutine)
754 pSetupData->ErrorRoutine(pSetupData, PathBuffer);
755 return FALSE;
756 }
757 }
758 else
759 {
760 DPRINT("Cannot open cabinet: %S.\n", PathBuffer);
761 CabinetCleanup(&CabinetContext);
762
763 pSetupData->LastErrorNumber = ERROR_CABINET_MISSING;
764 if (pSetupData->ErrorRoutine)
765 pSetupData->ErrorRoutine(pSetupData, PathBuffer);
766 return FALSE;
767 }
768
769 InfHandle = INF_OpenBufferedFileA((PSTR)InfFileData,
770 InfFileSize,
771 NULL,
773 pSetupData->LanguageId,
774 &ErrorLine);
775
776 CabinetCleanup(&CabinetContext);
777#else
778 {
779 PWCHAR ptr;
780
781 /* First find the filename */
782 ptr = wcsrchr(PathBuffer, L'\\');
783 if (!ptr) ptr = PathBuffer;
784
785 /* Then find its extension */
786 ptr = wcsrchr(ptr, L'.');
787 if (!ptr)
788 ptr = PathBuffer + wcslen(PathBuffer);
789
790 /* Replace it by '.inf' */
791 wcscpy(ptr, L".inf");
792
793 InfHandle = SpInfOpenInfFile(PathBuffer,
794 NULL,
796 pSetupData->LanguageId,
797 &ErrorLine);
798 }
799#endif
800
801 if (InfHandle == INVALID_HANDLE_VALUE)
802 {
803 pSetupData->LastErrorNumber = ERROR_INVALID_CABINET_INF;
804 if (pSetupData->ErrorRoutine)
805 pSetupData->ErrorRoutine(pSetupData, PathBuffer);
806 return FALSE;
807 }
808
809 if (!PrepareCopyInfFile(pSetupData, InfHandle, CabinetName))
810 {
811#if !(defined(__REACTOS__) && defined(USE_CABINET_INF))
812 SpInfCloseInfFile(InfHandle);
813#endif
814 /* FIXME: show an error dialog */
815 return FALSE;
816 }
817
818#if !(defined(__REACTOS__) && defined(USE_CABINET_INF))
819 SpInfCloseInfFile(InfHandle);
820#endif
821 } while (SpInfFindNextLine(&CabinetsContext, &CabinetsContext));
822
823 return TRUE;
824}
BOOLEAN PrepareCopyInfFile(IN OUT PUSETUP_DATA pSetupData, IN HINF InfFile, IN PCWSTR SourceCabinet OPTIONAL)
Definition: install.c:504
#define CAB_STATUS_SUCCESS
Definition: cabinet.h:23
HINF WINAPI INF_OpenBufferedFileA(IN PSTR FileBuffer, IN ULONG FileSize, IN PCSTR InfClass, IN DWORD InfStyle, IN LCID LocaleId, OUT PUINT ErrorLine)
Definition: infsupp.c:249
ULONG CabinetOpen(IN OUT PCABINET_CONTEXT CabinetContext)
Definition: cabinet.c:627
PVOID CabinetGetCabinetReservedArea(IN PCABINET_CONTEXT CabinetContext, OUT PULONG Size)
Definition: cabinet.c:1372
VOID CabinetSetEventHandlers(IN PCABINET_CONTEXT CabinetContext, IN PCABINET_OVERWRITE Overwrite, IN PCABINET_EXTRACT Extract, IN PCABINET_DISK_CHANGE DiskChange, IN PCABINET_CREATE_FILE CreateFile)
Definition: cabinet.c:1355
VOID CabinetInitialize(IN OUT PCABINET_CONTEXT CabinetContext)
Definition: cabinet.c:507
VOID CabinetCleanup(IN OUT PCABINET_CONTEXT CabinetContext)
Definition: cabinet.c:535
VOID CabinetSetCabinetName(IN PCABINET_CONTEXT CabinetContext, IN PCWSTR FileName)
Definition: cabinet.c:586
wcscpy
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
#define wcsrchr
Definition: compat.h:16
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define MAX_PATH
Definition: compat.h:34
@ ERROR_CABINET_MISSING
Definition: errorcode.h:44
@ ERROR_CABINET_SCRIPT
Definition: errorcode.h:45
@ ERROR_COPY_QUEUE
Definition: errorcode.h:46
@ ERROR_INVALID_CABINET_INF
Definition: errorcode.h:43
#define SpFileQueueOpen
Definition: fileqsup.h:136
NTSTATUS CombinePaths(OUT PWSTR PathBuffer, IN SIZE_T cchPathSize, IN ULONG NumberOfPathComponents, IN ...)
Definition: filesup.c:664
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define SpInfFindNextLine
Definition: infsupp.h:141
#define INF_STYLE_WIN4
Definition: infsupp.h:43
FORCEINLINE VOID INF_FreeData(IN PCWSTR InfData)
Definition: infsupp.h:154
#define SpInfOpenInfFile
Definition: infsupp.h:148
#define SpInfCloseInfFile
Definition: infsupp.h:139
#define SpInfFindFirstLine
Definition: infsupp.h:140
BOOLEAN INF_GetData(IN PINFCONTEXT Context, OUT PCWSTR *Key, OUT PCWSTR *Data)
Definition: infsupp.c:77
static PVOID ptr
Definition: dispmode.c:27
unsigned int UINT
Definition: ndis.h:50
#define L(x)
Definition: ntvdm.h:50
#define DPRINT
Definition: sndvol32.h:73
char * PSTR
Definition: typedefs.h:51
const uint16_t * PCWSTR
Definition: typedefs.h:57
void * PVOID
Definition: typedefs.h:50
uint16_t * PWCHAR
Definition: typedefs.h:56
uint32_t ULONG
Definition: typedefs.h:59
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by PrepareAndDoCopyThread(), and PrepareCopyPage().