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