294 lines
6.2 KiB
C
294 lines
6.2 KiB
C
|
/*++
|
||
|
Copyright (c) 1999-2000 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
spcab.h
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Kernel mode support for cabbing files, esp. for Win9x uninstall.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
20-Oct-1999 Ovidiu Temereanca (ovidiut) - File creation.
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
November 2000 Jay Krell (a-JayK)
|
||
|
ported from windows\winstate\cobra\utils\inc\cablib.h
|
||
|
|
||
|
--*/
|
||
|
#pragma once
|
||
|
|
||
|
#include "spmemory.h"
|
||
|
|
||
|
// this is a bit of an interface boundary crossing hack, but only experimental at the moment
|
||
|
#define sptcompTYPE_MSZIP_BIG_FILES_NONE_SMALL_FILES 0x0004
|
||
|
|
||
|
//
|
||
|
// Types
|
||
|
//
|
||
|
|
||
|
typedef BOOL(NTAPI CABGETCABINETNAMESA)(
|
||
|
IN PCSTR CabPath,
|
||
|
IN UINT CabPathChars,
|
||
|
IN PCSTR CabFileName,
|
||
|
IN UINT CabFileNameChars,
|
||
|
IN PCSTR CabDiskName,
|
||
|
IN UINT CabDiskNameChars,
|
||
|
IN INT CabFileNr,
|
||
|
IN OUT PINT CabDiskNr
|
||
|
);
|
||
|
typedef CABGETCABINETNAMESA *PCABGETCABINETNAMESA;
|
||
|
|
||
|
typedef BOOL(NTAPI CABGETCABINETNAMESW)(
|
||
|
IN PCWSTR CabPath,
|
||
|
IN UINT CabPathChars,
|
||
|
IN PCWSTR CabFileName,
|
||
|
IN UINT CabFileNameChars,
|
||
|
IN PCWSTR CabDiskName,
|
||
|
IN UINT CabDiskNameChars,
|
||
|
IN INT CabFileNr,
|
||
|
IN OUT PINT CabDiskNr
|
||
|
);
|
||
|
typedef CABGETCABINETNAMESW *PCABGETCABINETNAMESW;
|
||
|
|
||
|
typedef BOOL(NTAPI CABNOTIFICATIONA)(
|
||
|
IN PCSTR FileName
|
||
|
);
|
||
|
typedef CABNOTIFICATIONA *PCABNOTIFICATIONA;
|
||
|
|
||
|
typedef BOOL(NTAPI CABNOTIFICATIONW)(
|
||
|
IN PCWSTR FileName
|
||
|
);
|
||
|
typedef CABNOTIFICATIONW *PCABNOTIFICATIONW;
|
||
|
|
||
|
typedef PVOID OCABHANDLE;
|
||
|
|
||
|
struct _FCI_CAB_HANDLE;
|
||
|
typedef struct _FCI_CAB_HANDLE* PFCI_CAB_HANDLE;
|
||
|
typedef PFCI_CAB_HANDLE CCABHANDLE;
|
||
|
|
||
|
//
|
||
|
// API
|
||
|
//
|
||
|
|
||
|
CCABHANDLE
|
||
|
SpCabCreateCabinetA(
|
||
|
IN PCSTR CabPath,
|
||
|
IN PCSTR CabFileFormat,
|
||
|
IN PCSTR CabDiskFormat,
|
||
|
IN LONG MaxFileSize
|
||
|
);
|
||
|
|
||
|
CCABHANDLE
|
||
|
SpCabCreateCabinetW(
|
||
|
IN PCWSTR CabPath,
|
||
|
IN PCWSTR CabFileFormat,
|
||
|
IN PCWSTR CabDiskFormat,
|
||
|
IN LONG MaxFileSize
|
||
|
);
|
||
|
|
||
|
CCABHANDLE
|
||
|
SpCabCreateCabinetExA(
|
||
|
IN PCABGETCABINETNAMESA CabGetCabinetNames,
|
||
|
IN LONG MaxFileSize
|
||
|
);
|
||
|
|
||
|
CCABHANDLE
|
||
|
SpCabCreateCabinetExW(
|
||
|
IN PCABGETCABINETNAMESW CabGetCabinetNames,
|
||
|
IN LONG MaxFileSize
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
SpCabAddFileToCabinetW(
|
||
|
IN CCABHANDLE CabHandle,
|
||
|
IN PCWSTR FileName,
|
||
|
IN PCWSTR StoredName
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
SpCabFlushAndCloseCabinetEx(
|
||
|
IN CCABHANDLE CabHandle,
|
||
|
OUT PUINT FileCount, OPTIONAL
|
||
|
OUT PLONGLONG FileSize, OPTIONAL
|
||
|
OUT PUINT CabFileCount, OPTIONAL
|
||
|
OUT PLONGLONG CabFileSize OPTIONAL
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
SpCabFlushAndCloseCabinet(
|
||
|
IN CCABHANDLE CabHandle
|
||
|
);
|
||
|
|
||
|
OCABHANDLE
|
||
|
SpCabOpenCabinetA(
|
||
|
IN PCSTR FileName
|
||
|
);
|
||
|
|
||
|
OCABHANDLE
|
||
|
SpCabOpenCabinetW(
|
||
|
IN PCWSTR FileName
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
SpCabExtractAllFilesExA(
|
||
|
IN OCABHANDLE CabHandle,
|
||
|
IN PCSTR ExtractPath,
|
||
|
IN PCABNOTIFICATIONA CabNotification OPTIONAL
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
SpCabExtractAllFilesA(
|
||
|
IN OCABHANDLE CabHandle,
|
||
|
IN PCSTR ExtractPath
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
SpCabExtractAllFilesExW(
|
||
|
IN OCABHANDLE CabHandle,
|
||
|
IN PCWSTR ExtractPath,
|
||
|
IN PCABNOTIFICATIONW CabNotification OPTIONAL
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
SpCabExtractAllFilesW(
|
||
|
IN OCABHANDLE CabHandle,
|
||
|
IN PCWSTR ExtractPath
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
SpCabCloseCabinet(
|
||
|
IN OCABHANDLE CabHandle
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
SpFreeStringW(
|
||
|
PUNICODE_STRING String
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
SpFreeStringA(
|
||
|
PANSI_STRING String
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
SpConvertToNulTerminatedNtStringsA(
|
||
|
PCSTR Ansi,
|
||
|
PANSI_STRING AnsiString OPTIONAL,
|
||
|
PUNICODE_STRING UnicodeString OPTIONAL
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
SpConvertToNulTerminatedNtStringsW(
|
||
|
PCWSTR Unicode,
|
||
|
PANSI_STRING AnsiString OPTIONAL,
|
||
|
PUNICODE_STRING UnicodeString OPTIONAL
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
SpStringCopyNA(
|
||
|
PSTR Dest,
|
||
|
PCSTR Source,
|
||
|
SIZE_T Max
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
SpStringCopyNW(
|
||
|
PWSTR Dest,
|
||
|
PCWSTR Source,
|
||
|
SIZE_T Max
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
SpMoveStringA(
|
||
|
PANSI_STRING Dest,
|
||
|
PANSI_STRING Source
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
SpMoveStringW(
|
||
|
PUNICODE_STRING Dest,
|
||
|
PUNICODE_STRING Source
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
SpCabFlushAndCloseCabinet(
|
||
|
IN CCABHANDLE CabHandle
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
SpCabCloseCabinet(
|
||
|
IN OCABHANDLE CabHandle
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
SpCreateDirectoryForFileA(
|
||
|
IN PCSTR FilePathA,
|
||
|
IN ULONG CreateFlags
|
||
|
);
|
||
|
|
||
|
#define SpBoolToDbgPrintLevel(f) ((f) ? DPFLTR_TRACE_LEVEL : DPFLTR_ERROR_LEVEL)
|
||
|
#define SpBoolToStringA(f) ((f) ? "true" : "false")
|
||
|
#define SpPointerToDbgPrintLevel(p) DPFLTR_TRACE_LEVEL/*(((p) != NULL && (p) != LongToPtr(-1)) ? DPFLTR_TRACE_LEVEL : DPFLTR_ERROR_LEVEL)*/
|
||
|
#define SpHandleToDbgPrintLevel(h) DPFLTR_TRACE_LEVEL/*(((h) != NULL && (h) != LongToPtr(-1)) ? DPFLTR_TRACE_LEVEL : DPFLTR_ERROR_LEVEL)*/
|
||
|
#define SpNtStatusToDbgPrintLevel(s) \
|
||
|
((NT_SUCCESS(s) \
|
||
|
|| (s) == STATUS_NO_SUCH_FILE \
|
||
|
|| (s) == STATUS_OBJECT_PATH_NOT_FOUND \
|
||
|
|| (s) == STATUS_OBJECT_NAME_NOT_FOUND \
|
||
|
|| (s) == STATUS_NOT_FOUND \
|
||
|
) ? DPFLTR_TRACE_LEVEL : DPFLTR_ERROR_LEVEL)
|
||
|
|
||
|
#define SpBooleanToStringA(x) ((x) ? "True" : "False")
|
||
|
#define SpBooleanToStringW(x) ((x) ? L"True" : L"False")
|
||
|
|
||
|
NTSTATUS
|
||
|
SpAnsiStringToUnicodeString(
|
||
|
PUNICODE_STRING DestinationStringW,
|
||
|
PCANSI_STRING SourceStringA,
|
||
|
BOOL Allocate
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
SpUnicodeStringToAnsiString(
|
||
|
PANSI_STRING DestinationStringA,
|
||
|
PCUNICODE_STRING SourceStringW,
|
||
|
BOOL Allocate
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
SpKnownSizeUnicodeToDbcsN(
|
||
|
OUT PSTR Ansi,
|
||
|
IN PCWSTR Unicode,
|
||
|
IN SIZE_T AnsiSize
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
SpEnsureTrailingBackSlashA(
|
||
|
IN PSTR str
|
||
|
);
|
||
|
|
||
|
PCWSTR
|
||
|
SpGetFileNameFromPathW(
|
||
|
IN PCWSTR PathSpec
|
||
|
);
|
||
|
|
||
|
PSTR
|
||
|
SpJoinPathsA(
|
||
|
PCSTR a,
|
||
|
PCSTR b
|
||
|
);
|
||
|
|
||
|
HANDLE
|
||
|
SpOpenFile1W(
|
||
|
IN PCWSTR FileName
|
||
|
);
|
||
|
|
||
|
HANDLE
|
||
|
SpCreateFile1A(
|
||
|
IN PCSTR FileName
|
||
|
);
|