Leaked source code of windows server 2003
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

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