windows-nt/Source/XPSP1/NT/shell/ext/cabview/fdidll.c
2020-09-26 16:20:57 +08:00

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);
}