136 lines
3.9 KiB
C
136 lines
3.9 KiB
C
/*
|
|
* cabinet.dll main
|
|
*
|
|
* Copyright 2002 Patrik Stridvall
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
#include "config.h"
|
|
|
|
#include <assert.h>
|
|
#include <stdarg.h>
|
|
#include <string.h>
|
|
|
|
#include "windef.h"
|
|
#include "winbase.h"
|
|
#include "winerror.h"
|
|
#define NO_SHLWAPI_REG
|
|
#include "shlwapi.h"
|
|
#undef NO_SHLWAPI_REG
|
|
|
|
#include "cabinet.h"
|
|
|
|
#include "wine/debug.h"
|
|
|
|
WINE_DEFAULT_DEBUG_CHANNEL(cabinet);
|
|
|
|
/***********************************************************************
|
|
* DllGetVersion (CABINET.2)
|
|
*
|
|
* Retrieves version information of the 'CABINET.DLL'
|
|
*
|
|
* PARAMS
|
|
* pdvi [O] pointer to version information structure.
|
|
*
|
|
* RETURNS
|
|
* Success: S_OK
|
|
* Failure: E_INVALIDARG
|
|
*
|
|
* NOTES
|
|
* Supposedly returns version from IE6SP1RP1
|
|
*/
|
|
HRESULT WINAPI DllGetVersion (DLLVERSIONINFO *pdvi)
|
|
{
|
|
WARN("hmmm... not right version number \"5.1.1106.1\"?\n");
|
|
|
|
if (pdvi->cbSize != sizeof(DLLVERSIONINFO)) return E_INVALIDARG;
|
|
|
|
pdvi->dwMajorVersion = 5;
|
|
pdvi->dwMinorVersion = 1;
|
|
pdvi->dwBuildNumber = 1106;
|
|
pdvi->dwPlatformID = 1;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
/***********************************************************************
|
|
* Extract (CABINET.3)
|
|
*
|
|
* Apparently an undocumented function, presumably to extract a CAB file
|
|
* to somewhere...
|
|
*
|
|
* PARAMS
|
|
* dest pointer to a buffer of 0x32c bytes containing
|
|
* [I] - number with value 1 at index 0x18
|
|
* - the dest path starting at index 0x1c
|
|
* [O] - a linked list with the filename existing inside the
|
|
* CAB file at idx 0x10
|
|
* - the number of files inside the CAB file at index 0x14
|
|
* - the name of the last file with dest path at idx 0x120
|
|
* what [I] char* describing what to uncompress, I guess.
|
|
*
|
|
* RETURNS
|
|
* Success: S_OK
|
|
* Failure: E_OUTOFMEMORY (?)
|
|
*/
|
|
HRESULT WINAPI Extract(EXTRACTdest *dest, LPCSTR what)
|
|
{
|
|
#define DUMPC(idx) idx >= sizeof(EXTRACTdest) ? ' ' : \
|
|
((unsigned char*) dest)[idx] >= 0x20 ? \
|
|
((unsigned char*) dest)[idx] : '.'
|
|
|
|
#define DUMPH(idx) idx >= sizeof(EXTRACTdest) ? 0x55 : ((unsigned char*) dest)[idx]
|
|
|
|
LPSTR dir;
|
|
unsigned int i;
|
|
|
|
TRACE("(dest == %0lx, what == %s)\n", (long) dest, debugstr_a(what));
|
|
|
|
if (!dest) {
|
|
/* win2k will crash here */
|
|
FIXME("called without valid parameter dest!\n");
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
for (i=0; i < sizeof(EXTRACTdest); i+=8)
|
|
TRACE( "dest[%04x]:%02x %02x %02x %02x %02x %02x %02x %02x %c%c%c%c%c%c%c%c\n",
|
|
i,
|
|
DUMPH(i+0), DUMPH(i+1), DUMPH(i+2), DUMPH(i+3),
|
|
DUMPH(i+4), DUMPH(i+5), DUMPH(i+6), DUMPH(i+7),
|
|
DUMPC(i+0), DUMPC(i+1), DUMPC(i+2), DUMPC(i+3),
|
|
DUMPC(i+4), DUMPC(i+5), DUMPC(i+6), DUMPC(i+7));
|
|
|
|
dir = LocalAlloc(LPTR, strlen(dest->directory)+1);
|
|
if (!dir) return E_OUTOFMEMORY;
|
|
lstrcpyA(dir, dest->directory);
|
|
dest->filecount=0;
|
|
dest->filelist = NULL;
|
|
|
|
TRACE("extracting to dir: %s\n", debugstr_a(dir));
|
|
|
|
/* FIXME: what to do on failure? */
|
|
if (!process_cabinet(what, dir, FALSE, FALSE, dest)) {
|
|
LocalFree(dir);
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
LocalFree(dir);
|
|
|
|
TRACE("filecount %08lx,lastfile %s\n",
|
|
dest->filecount, debugstr_a(dest->lastfile));
|
|
|
|
return S_OK;
|
|
}
|