windows-nt/Source/XPSP1/NT/base/ntsetup/textmode/kernel/spcabp.h
2020-09-26 16:20:57 +08:00

452 lines
9.4 KiB
C

/*++
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 <stdio.h>
#if defined(ULONG_MAX) && !defined(_INC_LIMITS)
#undef ULONG_MAX
#endif
#include <limits.h>
#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
);