You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
201 lines
5.9 KiB
201 lines
5.9 KiB
//+--------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1992.
|
|
//
|
|
// File: storage.cxx
|
|
//
|
|
// Contents: Contains generic storage APIs
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
|
|
#include "h/ref.hxx"
|
|
#include "h/dfexcept.hxx"
|
|
#include "h/msf.hxx"
|
|
#include "h/docfile.hxx"
|
|
#include "h/storagep.h"
|
|
#include "h/refilb.hxx"
|
|
#include "h/ole.hxx"
|
|
#include "h/funcs.hxx"
|
|
|
|
#ifdef _MSC_VER
|
|
#pragma warning (disable:4514) // unreferenced inline function
|
|
#endif
|
|
|
|
#define MAKE_ERR(c) MAKE_SCODE(SEVERITY_ERROR, FACILITY_STORAGE, c)
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Function: StgOpenStorage, public
|
|
//
|
|
// Synopsis: Instantiates a root storage from a file
|
|
// by binding to the appropriate implementation
|
|
// and starting things up
|
|
//
|
|
// Arguments: [pwcsName] - Name
|
|
// [pstgPriority] - Priority mode reopen IStorage
|
|
// [grfMode] - Permissions
|
|
// [snbExclude] - Exclusions for priority reopen
|
|
// [reserved]
|
|
// [ppstgOpen] - Docfile return
|
|
//
|
|
// Returns: Appropriate status code
|
|
//
|
|
// Modifies: [ppstgOpen]
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
STDAPI StgOpenStorage(TCHAR const *pwcsName,
|
|
IStorage *pstgPriority,
|
|
DWORD grfMode,
|
|
SNB snbExclude,
|
|
DWORD reserved,
|
|
IStorage **ppstgOpen)
|
|
{
|
|
SCODE sc;
|
|
int i;
|
|
|
|
if (!pwcsName)
|
|
return ResultFromScode(STG_E_INVALIDNAME);
|
|
|
|
CFileILB *pilb = new CFileILB(pwcsName, grfMode, FALSE);
|
|
|
|
olDebugOut((DEB_TRACE, "In StgOpenStorage(%p, %p, %lX, %p, %lx, %p)\n",
|
|
pwcsName, pstgPriority, grfMode, snbExclude,
|
|
reserved, ppstgOpen));
|
|
|
|
if (!pilb) return ResultFromScode(STG_E_INSUFFICIENTMEMORY);
|
|
olChk(VerifyPerms(grfMode));
|
|
olChk(pilb->Open(grfMode));
|
|
|
|
sc = GetScode( StgOpenStorageOnILockBytes(
|
|
pilb, pstgPriority, grfMode, snbExclude, reserved, ppstgOpen) );
|
|
|
|
EH_Err:
|
|
if (FAILED(sc)) i=pilb->ReleaseOnError();
|
|
else i=pilb->Release();
|
|
olAssert(SUCCEEDED(sc) ? i==1 : i==0);
|
|
olDebugOut((DEB_TRACE,"Out StgOpenStorage: ppstgOpen=%p ret=> %lX\n",
|
|
(ppstgOpen)?(*ppstgOpen) : NULL, sc));
|
|
return ResultFromScode(sc);
|
|
}
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Function: StgOpenStorageOnILockBytes, public
|
|
//
|
|
// Synopsis: Instantiates a root storage from an ILockBytes
|
|
// by binding to the appropriate implementation
|
|
// and starting things up
|
|
//
|
|
// Arguments: [plkbyt] - Source ILockBytes
|
|
// [pstgPriority] - For priority reopens
|
|
// [grfMode] - Permissions
|
|
// [snbExclude] - For priority reopens
|
|
// [reserved]
|
|
// [ppstgOpen] - Docfile return
|
|
//
|
|
// Returns: Appropriate status code
|
|
//
|
|
// Modifies: [ppstgOpen]
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
STDAPI StgOpenStorageOnILockBytes(ILockBytes *plkbyt,
|
|
IStorage *pstgPriority,
|
|
DWORD grfMode,
|
|
SNB snbExclude,
|
|
DWORD reserved,
|
|
IStorage **ppstgOpen)
|
|
{
|
|
CLSID cid;
|
|
#ifndef _UNICODE
|
|
return DfOpenStorageOnILockBytes(plkbyt, pstgPriority, grfMode,
|
|
snbExclude, reserved, ppstgOpen,
|
|
&cid);
|
|
#else
|
|
return DfOpenStorageOnILockBytesW(plkbyt, pstgPriority, grfMode,
|
|
snbExclude, reserved, ppstgOpen,
|
|
&cid);
|
|
#endif
|
|
}
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Function: StgIsStorageFile, public
|
|
//
|
|
// Synopsis: Determines whether the named file is a storage or not
|
|
//
|
|
// Arguments: [pwcsName] - Filename
|
|
//
|
|
// Returns: S_OK, S_FALSE or error codes
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
//Identifier for first bytes of Beta 2 Docfiles
|
|
const BYTE SIGSTG_B2[] = {0x0e, 0x11, 0xfc, 0x0d, 0xd0, 0xcf, 0x11, 0xe0};
|
|
const BYTE CBSIGSTG_B2 = sizeof(SIGSTG_B2);
|
|
|
|
STDAPI StgIsStorageFile(TCHAR const *pwcsName)
|
|
{
|
|
SCODE sc;
|
|
int i=0;
|
|
CFileILB* pilb = NULL;
|
|
|
|
olChk(ValidateNameW(pwcsName, CBMAXPATHCOMPLEN));
|
|
olMem(pilb = new CFileILB(pwcsName, (DWORD)NULL, FALSE));
|
|
olChk(pilb->Open(STGM_READ));
|
|
sc = GetScode( StgIsStorageILockBytes(pilb) );
|
|
|
|
EH_Err:
|
|
if (pilb != NULL)
|
|
i=pilb->Release();
|
|
olAssert(i==0); // should not have any more reference to it
|
|
olDebugOut((DEB_TRACE, "Out StgIsStorageFile: ret=> %lx\n", sc));
|
|
return ResultFromScode(sc);
|
|
}
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Function: StgIsStorageILockBytes, public
|
|
//
|
|
// Synopsis: Determines whether the ILockBytes is a storage or not
|
|
//
|
|
// Arguments: [plkbyt] - The ILockBytes
|
|
//
|
|
// Returns: S_OK, S_FALSE or error codes
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
STDAPI StgIsStorageILockBytes(ILockBytes *plkbyt)
|
|
{
|
|
HRESULT hr;
|
|
SCODE sc;
|
|
SStorageFile stgfile;
|
|
ULONG cbRead;
|
|
ULARGE_INTEGER ulOffset;
|
|
|
|
TRY
|
|
{
|
|
if (FAILED(sc = ValidateInterface(plkbyt, IID_ILockBytes)))
|
|
return ResultFromScode(sc);
|
|
ULISet32(ulOffset, 0);
|
|
hr = plkbyt->ReadAt(ulOffset, &stgfile, sizeof(stgfile), &cbRead);
|
|
if (FAILED(GetScode(hr)))
|
|
return hr;
|
|
}
|
|
CATCH(CException, e)
|
|
{
|
|
return ResultFromScode(e.GetErrorCode());
|
|
}
|
|
END_CATCH
|
|
|
|
if (cbRead == sizeof(stgfile))
|
|
{
|
|
if ((memcmp((void *)stgfile.abSig, SIGSTG, CBSIGSTG) == 0) ||
|
|
(memcmp((void *)stgfile.abSig, SIGSTG_B2, CBSIGSTG_B2) == 0))
|
|
return ResultFromScode(S_OK);
|
|
}
|
|
return ResultFromScode(S_FALSE);
|
|
}
|