169 lines
4.1 KiB
C
169 lines
4.1 KiB
C
/*
|
|
* FDIDLL.C -- FDI interface using CABINET.DLL
|
|
*
|
|
* Microsoft Confidential
|
|
* Copyright (C) Microsoft Corporation 1997
|
|
* All Rights Reserved.
|
|
*
|
|
* Author:
|
|
* Mike Sliger
|
|
*
|
|
* History:
|
|
* 21-Jan-1997 msliger Initial version
|
|
* 24-Jan-1997 msliger Changed to public include file
|
|
*
|
|
* Overview:
|
|
* This code is a wrapper which provides access to the actual FDI code
|
|
* in CABINET.DLL. CABINET.DLL dynamically loads/unloads as needed.
|
|
*/
|
|
|
|
#include <windows.h>
|
|
|
|
#include "fdi.h"
|
|
|
|
static HINSTANCE hCabinetDll; /* DLL module handle */
|
|
|
|
/* pointers to the functions in the DLL */
|
|
|
|
static HFDI (FAR DIAMONDAPI *pfnFDICreate)(
|
|
PFNALLOC pfnalloc,
|
|
PFNFREE pfnfree,
|
|
PFNOPEN pfnopen,
|
|
PFNREAD pfnread,
|
|
PFNWRITE pfnwrite,
|
|
PFNCLOSE pfnclose,
|
|
PFNSEEK pfnseek,
|
|
int cpuType,
|
|
PERF perf);
|
|
static BOOL (FAR DIAMONDAPI *pfnFDIIsCabinet)(
|
|
HFDI hfdi,
|
|
INT_PTR hf,
|
|
PFDICABINETINFO pfdici);
|
|
static BOOL (FAR DIAMONDAPI *pfnFDICopy)(
|
|
HFDI hfdi,
|
|
char *pszCabinet,
|
|
char *pszCabPath,
|
|
int flags,
|
|
PFNFDINOTIFY pfnfdin,
|
|
PFNFDIDECRYPT pfnfdid,
|
|
void *pvUser);
|
|
static BOOL (FAR DIAMONDAPI *pfnFDIDestroy)(
|
|
HFDI hfdi);
|
|
|
|
|
|
/*
|
|
* FDICreate -- Create an FDI context
|
|
*
|
|
* See fdi_int.h for entry/exit conditions.
|
|
*/
|
|
|
|
HFDI FAR DIAMONDAPI FDICreate(PFNALLOC pfnalloc,
|
|
PFNFREE pfnfree,
|
|
PFNOPEN pfnopen,
|
|
PFNREAD pfnread,
|
|
PFNWRITE pfnwrite,
|
|
PFNCLOSE pfnclose,
|
|
PFNSEEK pfnseek,
|
|
int cpuType,
|
|
PERF perf)
|
|
{
|
|
HFDI hfdi;
|
|
|
|
hCabinetDll = LoadLibrary(TEXT("CABINET"));
|
|
if (hCabinetDll == NULL)
|
|
{
|
|
return(NULL);
|
|
}
|
|
|
|
pfnFDICreate = (void *) GetProcAddress(hCabinetDll,"FDICreate");
|
|
pfnFDICopy = (void *) GetProcAddress(hCabinetDll,"FDICopy");
|
|
pfnFDIIsCabinet = (void *) GetProcAddress(hCabinetDll,"FDIIsCabinet");
|
|
pfnFDIDestroy = (void *) GetProcAddress(hCabinetDll,"FDIDestroy");
|
|
|
|
if ((pfnFDICreate == NULL) ||
|
|
(pfnFDICopy == NULL) ||
|
|
(pfnFDIIsCabinet == NULL) ||
|
|
(pfnFDIDestroy == NULL))
|
|
{
|
|
FreeLibrary(hCabinetDll);
|
|
|
|
return(NULL);
|
|
}
|
|
|
|
hfdi = pfnFDICreate(pfnalloc,pfnfree,
|
|
pfnopen,pfnread,pfnwrite,pfnclose,pfnseek,cpuType,perf);
|
|
if (hfdi == NULL)
|
|
{
|
|
FreeLibrary(hCabinetDll);
|
|
}
|
|
|
|
return(hfdi);
|
|
}
|
|
|
|
|
|
/*
|
|
* FDIIsCabinet -- Determines if file is a cabinet, returns info if it is
|
|
*
|
|
* See fdi_int.h for entry/exit conditions.
|
|
*/
|
|
|
|
BOOL FAR DIAMONDAPI FDIIsCabinet(HFDI hfdi,
|
|
INT_PTR hf,
|
|
PFDICABINETINFO pfdici)
|
|
{
|
|
if (pfnFDIIsCabinet == NULL)
|
|
{
|
|
return(FALSE);
|
|
}
|
|
|
|
return(pfnFDIIsCabinet(hfdi,hf,pfdici));
|
|
}
|
|
|
|
|
|
/*
|
|
* FDICopy -- extracts files from a cabinet
|
|
*
|
|
* See fdi_int.h for entry/exit conditions.
|
|
*/
|
|
|
|
BOOL FAR DIAMONDAPI FDICopy(HFDI hfdi,
|
|
char *pszCabinet,
|
|
char *pszCabPath,
|
|
int flags,
|
|
PFNFDINOTIFY pfnfdin,
|
|
PFNFDIDECRYPT pfnfdid,
|
|
void *pvUser)
|
|
{
|
|
if (pfnFDICopy == NULL)
|
|
{
|
|
return(FALSE);
|
|
}
|
|
|
|
return(pfnFDICopy(hfdi,pszCabinet,pszCabPath,flags,pfnfdin,pfnfdid,pvUser));
|
|
}
|
|
|
|
|
|
/*
|
|
* FDIDestroy -- Destroy an FDI context
|
|
*
|
|
* See fdi_int.h for entry/exit conditions.
|
|
*/
|
|
|
|
BOOL FAR DIAMONDAPI FDIDestroy(HFDI hfdi)
|
|
{
|
|
BOOL rc;
|
|
|
|
if (pfnFDIDestroy == NULL)
|
|
{
|
|
return(FALSE);
|
|
}
|
|
|
|
rc = pfnFDIDestroy(hfdi);
|
|
if (rc == TRUE)
|
|
{
|
|
FreeLibrary(hCabinetDll);
|
|
}
|
|
|
|
return(rc);
|
|
}
|