/*++ Copyright (c) 1999 Microsoft Corporation Module Name: spcabp.h Abstract: Cabinet stuff (file compression/decompression) Author: Calin Negreanu (calinn) 27-Apr-2000 Revision History: Jay Krell (a-JayK) November 2000 ported from windows\winstate\cobra\... to admin\ntsetup\textmode\kernel\spcab.h --*/ #pragma once #include "nt.h" #include "ntrtl.h" #include "nturtl.h" #include "windows.h" #include #if defined(ULONG_MAX) && !defined(_INC_LIMITS) #undef ULONG_MAX #endif #include #if !defined(NUMBER_OF) #define NUMBER_OF(x) (sizeof(x)/sizeof((x)[0])) #endif #if !defined(MAXDWORD) #define MAXDWORD (~(DWORD)0) #endif #define MAX_WCHAR_PATH 260 void SpDebugMessage(int level, const char* string); #define DEBUGMSG(x) (SpDebugMessage(x)) #define DBG_ERROR /* nothing */ #include "spcab.h" #include "fdi.h" #include "fci.h" // // This work was not quite finished, and it turns out for now (November 26, 2000), // we don't need it. // #define SETUP_CABP_SMALL_FILE_OPTIMIZATION 0 #if SETUP_CABP_SMALL_FILE_OPTIMIZATION typedef struct _SETUP_CABP_FILE_VTABLE { /* read write seek close */ int x; } SETUP_CABP_FILE_VTABLE, *PSETUP_CABP_FILE_VTABLE; typedef struct _SETUP_CABP_NT_FILE_DATA { HANDLE NtHandle; } SETUP_CABP_NT_FILE_DATA; typedef struct _SETUP_CABP_SMALL_FILE_CACHE_ENTRY_KEY { UNICODE_STRING Path; } SETUP_CABP_SMALL_FILE_CACHE_ENTRY_KEY, *PSETUP_CABP_SMALL_FILE_CACHE_ENTRY_KEY; typedef struct _SETUP_CABP_SMALL_FILE_CACHE_DATA { UCHAR Buffer[100]; LONG OpenCount; ULONG Access; ULONG Share; LONG Size; } SETUP_CABP_SMALL_FILE_CACHE_ENTRY, *PSETUP_CABP_SMALL_FILE_CACHE_ENTRY; typedef struct _SETUP_CABP_SMALL_FILE_CACHE_ENTRY { SETUP_CABP_SMALL_FILE_CACHE_KEY Key; // This must be first. SETUP_CABP_SMALL_FILE_CACHE_DATA Data } SETUP_CABP_SMALL_FILE_CACHE_ENTRY, *PSETUP_CABP_SMALL_FILE_CACHE_ENTRY; typedef struct _SETUP_CABP_SMALL_FILE_OPENED_DATA { PSETUP_CABP_SMALL_FILE_CACHE_ENTRY CacheEntry; LONG SeekPointer; ULONG Access; ULONG Share; } SETUP_CABP_SMALL_FILE_OPENED_DATA, *PSETUP_CABP_SMALL_FILE_OPENED_DATA; // // returns either STATUS_SUCCESS or STATUS_SHARING_VIOLATION // or maybe STATUS_ACCESS_DENIED in the future // NTSTATUS SpAccessCheck( PSETUP_CABP_SMALL_FILE_CACHE_ENTRY CacheEntry, ACCESS_MASK Access, ULONG Share ); typedef union _SETUP_CABP_FILE_DATA { #if SETUP_CABP_SMALL_FILE_OPTIMIZATION SETUP_CABP_SMALL_FILE_OPENED_DATA Small; #endif SETUP_CABP_NT_FILE_DATA Nt; } SETUP_CABP_FILE_DATA, *PSETUP_CABP_FILE_DATA; typedef struct _SETUP_CABP_FILE_WITH_VTABLE { PSETUP_CABP_FILE_VTABLE VTable; SETUP_CABP_FILE_DATA Data; } SETUP_CABP_FILE_WITH_VTABLE, *PSETUP_CABP_FILE_WITH_VTABLE; #ifndef KERNELMODE typedef FAST_MUTEX SETUP_CABP_LOCK; #define SpInitializeLock ExInitializeFastMutex #define SpAcquireLock ExAcquireFastMutex #define SpReleaseLock ExReleaseFastMutex #define SpDeleteLock /* nothing */ #else typedef RTL_CRITICAL_SECTION SETUP_CABP_LOCK; #define SpInitializeLock RtlInitializeCriticalSection #define SpAcquireLock RtlEnterCriticalSection #define SpReleaseLock RtlLeaveCriticalSection #define SpDeleteLock RtlDeleteCriticalSection #endif typedef struct _SETUP_CABP_SMALL_FILE_CACHE { RTL_AVL_TABLE Table; SETUP_CABP_LOCK Lock; } SETUP_CABP_SMALL_FILE_CACHE; extern SETUP_CABP_SMALL_FILE_CACHE SpSmallFileCache; extern const SETUP_CABP_FILE_VTABLE SpSmallFileVTable; extern const SETUP_CABP_FILE_VTABLE SpNtFileVTable; NTSTATUS SpConvertSmallFileToNtFile( ... ); #endif BOOL SpIsStatusFileNotFoundEtc( NTSTATUS Status ); VOID SpCloseHandle( HANDLE* HandlePointer ); VOID SpFree( PVOID* PointerPointer ); #if SETUP_CABP_SMALL_FILE_OPTIMIZATION VOID SpFreeSmallFileCacheEntry( PSETUP_CABP_SMALL_FILE_CACHE_ENTRY* SmallFileCacheEntryPointerPointer ); NTSTATUS SpOpenFile( UNICODE_STRING Path, ULONG Access, ULONG Share, ULONG OpenOrCreate, PSETUP_CABP_FILE_WITH_VTABLE* FileOut ); #endif // from windows\winstate\...\cablib.c typedef struct _FCI_CAB_HANDLE { ANSI_STRING PathA; ANSI_STRING FileFormatA; ANSI_STRING DiskFormatA; UNICODE_STRING PathW; UNICODE_STRING FileFormatW; UNICODE_STRING DiskFormatW; PCABGETCABINETNAMESA GetCabinetNamesA; PCABGETCABINETNAMESW GetCabinetNamesW; HFCI FciHandle; ERF FciErrorStruct; CCAB FciCabParams; UINT FileCount; UINT CabCount; LONGLONG FileSize; LONGLONG CompressedSize; LARGE_INTEGER StartTime; ULONG SmallFileSize; TCOMP CompressionType; TCOMP SmallFileCompressionType; } FCI_CAB_HANDLE , *PFCI_CAB_HANDLE, FCI_CAB_HANDLEA, *PFCI_CAB_HANDLEA, FCI_CAB_HANDLEW, *PFCI_CAB_HANDLEW ; // from windows\winstate\...\cablib.c typedef struct { ANSI_STRING PathA; ANSI_STRING FileA; UNICODE_STRING PathW; UNICODE_STRING FileW; HFDI FdiHandle; ERF FdiErrorStruct; FDICABINETINFO FdiCabinetInfo; PVOID Gauge; } FDI_CAB_HANDLE , *PFDI_CAB_HANDLE , FDI_CAB_HANDLEA, *PFDI_CAB_HANDLEA, FDI_CAB_HANDLEW, *PFDI_CAB_HANDLEW ; // from windows\winstate\...\cablib.c typedef struct { ANSI_STRING ExtractPathA; UNICODE_STRING ExtractPathW; PCABNOTIFICATIONA NotificationA; PCABNOTIFICATIONW NotificationW; } CAB_DATA , *PCAB_DATA , CAB_DATAA, *PCAB_DATAA, CAB_DATAW, *PCAB_DATAW ; // from windows\winstate\...\cablib.c INT DIAMONDAPI pCabFilePlacedW( IN PCCAB FciCabParams, IN PSTR FileName, IN LONG FileSize, IN BOOL Continuation, IN PVOID Context ); // from windows\winstate\...\cablib.c PVOID DIAMONDAPI pCabAlloc ( IN ULONG Size ); // from windows\winstate\...\cablib.c VOID DIAMONDAPI pCabFree ( IN PVOID Memory ); // from windows\winstate\...\cablib.c INT_PTR DIAMONDAPI pCabOpenA ( IN PSTR FileName, IN INT oFlag, IN INT pMode, OUT PINT Error, IN PVOID Context ); // from windows\winstate\...\cablib.c INT_PTR DIAMONDAPI pCabOpen1A ( IN PSTR FileName, IN INT oFlag, IN INT pMode ); // from windows\winstate\...\cablib.c UINT DIAMONDAPI pCabRead ( IN INT_PTR FileHandle, IN PVOID Buffer, IN UINT Size, OUT PINT Error, IN PVOID Context ); // from windows\winstate\...\cablib.c UINT DIAMONDAPI pCabRead1 ( IN INT_PTR FileHandle, IN PVOID Buffer, IN UINT Size ); // from windows\winstate\...\cablib.c UINT DIAMONDAPI pCabWrite ( IN INT_PTR FileHandle, IN PVOID Buffer, IN UINT Size, OUT PINT Error, IN PVOID Context ); // from windows\winstate\...\cablib.c UINT DIAMONDAPI pCabWrite1 ( IN INT_PTR FileHandle, IN PVOID Buffer, IN UINT Size ); // from windows\winstate\...\cablib.c INT DIAMONDAPI pCabClose ( IN INT_PTR FileHandle, OUT PINT Error, IN PVOID Context ); // from windows\winstate\...\cablib.c INT DIAMONDAPI pCabClose1 ( IN INT_PTR FileHandle ); // from windows\winstate\...\cablib.c LONG DIAMONDAPI pCabSeek ( IN INT_PTR FileHandle, IN LONG Distance, IN INT SeekType, OUT PINT Error, IN PVOID Context ); // from windows\winstate\...\cablib.c LONG DIAMONDAPI pCabSeek1 ( IN INT_PTR FileHandle, IN LONG Distance, IN INT SeekType ); // from windows\winstate\...\cablib.c INT DIAMONDAPI pCabDeleteA ( IN PSTR FileName, OUT PINT Error, IN PVOID Context ); // from windows\winstate\...\cablib.c BOOL DIAMONDAPI pCabGetTempFileA ( OUT PSTR FileName, IN INT FileNameLen, IN PVOID Context ); // from windows\winstate\...\cablib.c BOOL DIAMONDAPI pCabGetNextCabinetA ( IN PCCAB FciCabParams, IN ULONG PrevCabinetSize, IN PVOID Context ); // from windows\winstate\...\cablib.c BOOL DIAMONDAPI pCabGetNextCabinetW ( IN PCCAB FciCabParams, IN ULONG PrevCabinetSize, IN PVOID Context ); // from windows\winstate\...\cablib.c LONG DIAMONDAPI pCabStatusA ( IN UINT StatusType, IN ULONG Size1, IN ULONG Size2, IN PVOID Context ); // from windows\winstate\...\cablib.c LONG DIAMONDAPI pCabStatusW ( IN UINT StatusType, IN ULONG Size1, IN ULONG Size2, IN PVOID Context ); // from windows\winstate\...\cablib.c INT_PTR DIAMONDAPI pCabGetOpenInfoA ( IN PSTR FileName, OUT USHORT *Date, OUT USHORT *Time, OUT USHORT *Attributes, OUT PINT Error, IN PVOID Context ); // from windows\winstate\...\cablib.c INT_PTR DIAMONDAPI pCabNotification ( IN FDINOTIFICATIONTYPE FdiNotificationType, IN OUT PFDINOTIFICATION FdiNotification ); typedef const unsigned char* PCBYTE; INT DIAMONDAPI pCabFilePlacedA( IN PCCAB FciCabParams, IN PSTR FileName, IN LONG FileSize, IN BOOL Continuation, IN PVOID Context );