//+------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1992. // // File: reserved.hxx // // Contents: Definition for class to handle reserved memory for // property operation. // // Classes: CWin32ReservedMemory // CWin31ReservedMemory // // History: 07-Jun-92 BillMo Created. // 29-Aug-96 MikeHill Split CReservedMemory into CWin31 & CWin32 // //-------------------------------------------------------------------------- #ifndef _RESERVED_HXX_ #define _RESERVED_HXX_ #include #include // for SIZEOF_ACL //+------------------------------------------------------------------------- // // Class: CReservedMemory // // Purpose: Provide a memory reservation mechanism. Once initialized, // a pointer to the memory can be retrieved with the Lock // which obviously locks the buffer as well. // //-------------------------------------------------------------------------- class CReservedMemory { public: virtual ~CReservedMemory() {}; public: virtual HRESULT Init(VOID) = 0; virtual BYTE * LockMemory(VOID) = 0; virtual VOID UnlockMemory(VOID) = 0; }; //+---------------------------------------------------------------------------- // // Class: CWin32ReservedMemory // // Purpose: Defines a derivation of CReservedMemory which can be // used in a Win32 environment. // // History: In win 3.1, it was vitally important that docfile // be able to save to the same or a new file without requiring // any new memory allocations. This can't be guaranteed any longer // in NT, since other parts of the system don't adhere to it, but // the docfile code still sticks to the guarantee within itself. // The property set code tries to follow this requirement as well. // When a property set is grown, the implementation needs to realloc // a larger buffer. If it cannot, it falls back on the "reserved" // memory represented by this class. That memory comes from a // temporary file which is created when necessary. // //+---------------------------------------------------------------------------- #ifndef _MAC class CWin32ReservedMemory : public CReservedMemory { // Constructors. public: CWin32ReservedMemory() { _hFile = INVALID_HANDLE_VALUE; _hMapping = NULL; _pb = NULL; _fInitialized = FALSE; _pCreatorOwner = NULL; _cInits = 0; } ~CWin32ReservedMemory(); // Public overrides public: HRESULT Init(VOID) { if (!_fInitialized) return(_Init()); else return(S_OK); } BYTE * LockMemory(VOID); VOID UnlockMemory(VOID); // Internal methods private: HRESULT _Init(VOID); void FreeResources(); // Internal data private: // The temporary file HANDLE _hFile; // A mapping of the temporary file HANDLE _hMapping; // A view of the mapping. BYTE * _pb; // A critsec and a flag to show if it's initialized. BOOL _fInitialized; CRITICAL_SECTION _critsec; // A counter to guarantee that this (global) class is // only initialized once. LONG _cInits; // The DACL to set on the temporary file. struct { ACL acl; BYTE rgb[ SIZEOF_ACL - sizeof(ACL) ]; } _DaclBuffer; // Other structures necessary to put a DACL on the temp file. PSID _pCreatorOwner; SECURITY_ATTRIBUTES _secattr; SECURITY_DESCRIPTOR _sd; }; #endif // #ifndef _MAC //+---------------------------------------------------------------------------- // // Class: CWin31ReservedMemory // // Purpose: This derivation of CReservedMemory assumes the Win 3.1 // architecture of shared-memory DLLs and cooperative multi-threading. // // This class assumes that the g_pbPropSetReserved extern is a // large enough buffer for the largest property set. // Note that on the Mac, g_pbPropSetReserved should exist in // a shared-data library, so that there need not be one // Reserved buffer per instance of the property set library. // //+---------------------------------------------------------------------------- #ifdef _MAC class CWin31ReservedMemory : public CReservedMemory { // Constructors public: CWin31ReservedMemory() { #if DBG==1 _fLocked = FALSE; #endif } ~CWin31ReservedMemory() { DfpAssert( !_fLocked ); } // Public overrides public: HRESULT Init(VOID) { return(S_OK); } BYTE * LockMemory(VOID); VOID UnlockMemory(VOID); // Private data private: #if DBG==1 BOOL _fLocked; #endif }; #endif // #ifdef _MAC // // Provide an extern for the instantiation of CReservedMemory. // We use the CWin31 class on the Mac, and the CWin32 everywhere // else. Also, along with the CWin31 extern, we must extern // the global reserved memory buffer. // #ifdef _MAC EXTERN_C long g_pbPropSetReserved[]; extern CWin31ReservedMemory g_ReservedMemory; #else extern CWin32ReservedMemory g_ReservedMemory; #endif #endif // #ifndef _RESERVED_HXX_