//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1999. // // File: dlproxy.hxx // // Contents: Proxy class which is used by the downlevel Daemon process // to communicate with the CI process. // // History: 1-30-96 srikants Created // //---------------------------------------------------------------------------- #pragma once #include #include #include #include #define CI_NO_CATALOG_NAME L"[!none!]" // // Signatures for structures laid out in the shared memory buffer. // enum { eFilterSig1 = 0x11111111, eFilterSig2 = 0x22222222, eFilterSig3 = 0x33333333, eFilterSig4 = 0x44444444, eFilterSig5 = 0x55555555, eFilterSig6 = 0x66666666, eFilterSig7 = 0x77777777, eFilterSig8 = 0x88888888, eFilterSig9 = 0x99999999, eFilterSigA = 0xAAAAAAAA }; const FILTER_DATA_READY_BUF_SIZE = CI_FILTER_BUFFER_SIZE_DEFAULT * 1024; // const MAX_DL_VAR_BUF_SIZE = 128*1024; // // Length of the variable length part in the data passed between the // DownLevel Daemon process and CI. // This is set to the same value as the size of the entrybuffer because // that is the biggest data passed between the two. // const MAX_DL_VAR_BUF_SIZE = FILTER_DATA_READY_BUF_SIZE; //+--------------------------------------------------------------------------- // // Class: CFilterReadyLayout // // Purpose: Layout of the data for FilterReady() call // // History: 1-30-96 srikants Created // //---------------------------------------------------------------------------- class CFilterReadyLayout { public: void Init( ULONG cbMax, ULONG cb, ULONG cMaxDocs ) { _cbMax = cbMax - FIELD_OFFSET( CFilterReadyLayout, _abBuffer ) ; Win4Assert( cb <= _cbMax ); if ( cb > _cbMax ) { THROW( CException( STATUS_NO_MEMORY) ); } _sig1 = eFilterSig1; _cb = cb; _cMaxDocs = cMaxDocs; _sig2 = eFilterSig2; } BOOL IsValid() const { return eFilterSig1 == _sig1 && eFilterSig2 == _sig2 && _cb <= _cbMax; } ULONG GetCount() const { return _cb; } void SetCount( ULONG cb ) { _cb = cb; } ULONG GetMaxDocs() const { return _cMaxDocs; } BYTE const * GetBuffer() const { return (BYTE const *) _abBuffer; } BYTE * GetBuffer() { return (BYTE *) _abBuffer; } private: ULONG _sig1; // Signature ULONG _cbMax; // Maximum BYTES in _wcBuffer; ULONG _cb; // Number of bytes in the current buffer ULONG _cMaxDocs; // Maximum number of documents ULONG _sig2; // Signature LONGLONG _abBuffer[1]; // Place holder for the buffer }; //+--------------------------------------------------------------------------- // // Class: CFilterDataLayout // // Purpose: Layout of the data for FilterDataReady() call // // History: 1-30-96 srikants Created // //---------------------------------------------------------------------------- class CFilterDataLayout { public: void Init( BYTE const * pEntryBuf, ULONG cb ) { _sig3 = eFilterSig3; _cbMax = sizeof(_ab); _cb = cb; Win4Assert( _cb <= _cbMax ); Win4Assert( pEntryBuf == GetBuffer() ); } BOOL IsValid() const { return eFilterSig3 == _sig3 && _cb <= _cbMax; } ULONG GetSize() const { return _cb; } BYTE const * GetBuffer() const { return (BYTE *) _ab; } BYTE * GetBuffer() { return (BYTE *) _ab; } ULONG GetMaxSize() const { return sizeof(_ab); } private: ULONG _sig3; // Signature ULONG _cbMax; // Maximum number of bytes allowed ULONG _cb; // Number of valid bytes in the buffer // // Guarantee 8 byte alignment of data. // LONGLONG _ab[FILTER_DATA_READY_BUF_SIZE/sizeof(LONGLONG)]; // Maximum size of the buffer for data }; //+--------------------------------------------------------------------------- // // Class: CFilterMoreDoneLayout // // Purpose: Layout for FilterMore() and FilterDone() calls. // // History: 1-30-96 srikants Created // //---------------------------------------------------------------------------- class CFilterMoreDoneLayout { public: void Init( STATUS const * aStatus, ULONG cStatus ) { _sig4 = eFilterSig4; Win4Assert( cStatus <= CI_MAX_DOCS_IN_WORDLIST ); _cStatus = cStatus; RtlCopyMemory( _aStatus, aStatus, cStatus * sizeof(STATUS) ); } BOOL IsValid() const { return eFilterSig4 == _sig4 && _cStatus <= CI_MAX_DOCS_IN_WORDLIST; } STATUS const * GetStatusArray() const { return _aStatus; } ULONG GetCount() const { return _cStatus; } private: ULONG _sig4; // Signature ULONG _cStatus; // Number of status elements valid STATUS _aStatus[CI_MAX_DOCS_IN_WORDLIST]; // Array of statuses }; //+--------------------------------------------------------------------------- // // Class: CFilterStoreValueLayout // // Purpose: Layout for the data of FilterStoreValue() call // // History: 1-31-96 srikants Created // //---------------------------------------------------------------------------- class CFilterStoreValueLayout { public: SCODE Init( ULONG cbMax, WORKID widFake, CFullPropSpec const & ps, CStorageVariant const & var ); void Get( WORKID & widFake, CFullPropSpec & ps, CStorageVariant & var ); BOOL IsValid() const { return eFilterSig5 == _sig5 && _cb <= _cbMax; } BYTE const * GetBuffer() const { return (BYTE *) _ab; } BYTE * GetBuffer() { return (BYTE *) _ab; } ULONG GetCount() const { return _cb; } WORKID GetWorkid() const { return _widFake; } void SetStatus( BOOL fSuccess ) { _fSuccess = fSuccess; } BOOL GetStatus() const { return _fSuccess; } private: ULONG _sig5; WORKID _widFake; ULONG _cbMax; // Maximum number of bytes allowed in _ab ULONG _cb; BOOL _fSuccess; // Success code of the operation // // We will serialize the FULLPROPSPEC first and then the VARIANT // // FORCE a 8byte alignment. // LONGLONG _ab[1]; // place holder for variable data }; //+--------------------------------------------------------------------------- // // Class: CFilterStoreSecurityLayout // // Purpose: Layout for the data of FilterStoreSecurity() call // // History: 06 Fen 96 AlanW Created // //---------------------------------------------------------------------------- class CFilterStoreSecurityLayout { public: void Init( ULONG cbMax, WORKID widFake, PSECURITY_DESCRIPTOR pSD, ULONG cbSD ); BOOL IsValid() const { return eFilterSig8 == _sig8 && _cb <= _cbMax; } PSECURITY_DESCRIPTOR GetSD() { return &_ab; } ULONG GetCount() const { return _cb; } WORKID GetWorkid() const { return _widFake; } void SetSdid( ULONG sdid ) { _sdid = sdid; } ULONG GetSdid() const { return _sdid; } void SetStatus( BOOL fSuccess ) { _fSuccess = fSuccess; } BOOL GetStatus() const { return _fSuccess; } private: ULONG _sig8; ULONG _cbMax; // Maximum number of bytes allowed in _ab ULONG _cb; WORKID _widFake; ULONG _sdid; // Return value of the operation BOOL _fSuccess; // Success code of the operation // // The variable data is a copy of a self-relative security descriptor // SECURITY_DESCRIPTOR _ab; // place holder for variable data }; class CPidMapper; class CSimplePidRemapper; //+--------------------------------------------------------------------------- // // Class: CFPSToPROPIDLayout // // Purpose: Layout of data for the FPSToPROPID() call. // // History: 30-Dec-1997 kylep Created // //---------------------------------------------------------------------------- class CFPSToPROPIDLayout { public: void Init( ULONG cbMax, CFullPropSpec const & fps ); BOOL IsValid() const { return eFilterSig6 == _sig6 && _cb <= _cbMax; } BYTE const * GetBuffer() const { return (BYTE *) &_ab[0]; } BYTE * GetBuffer() { return (BYTE *) &_ab[0]; } ULONG GetCount() const { return _cb; } void SetCount( ULONG cb ) { _cb = cb; } PROPID GetPROPID() const { return *((PROPID *)&_ab[0]); } private: ULONG _sig6; ULONG _cbMax; // Maximum number of bytes allowed ULONG _cb; // Number of valid bytes serialized LONGLONG _ab[1]; // Serialized bytes }; //+--------------------------------------------------------------------------- // // Class: CFilterStartupDataLayout // // Purpose: Startup data for the filter daemon. It is passed through // from the client in the main process to the client in the // daemon. // // History: 12-13-96 srikants Created // //---------------------------------------------------------------------------- class CFilterStartupDataLayout { public: void Init() { _sigA = eFilterSigA; _cbMax = sizeof(_ab); _cb = 0; } BOOL IsValid() const { return eFilterSigA == _sigA && _cb <= _cbMax; } BOOL SetData( GUID const & clsidDaemonClientMgr, BYTE const * pbData, ULONG cbData ) { Win4Assert( IsValid() ); if ( cbData <= _cbMax ) { _clsidDaemonClientMgr = clsidDaemonClientMgr; RtlCopyMemory( _ab, pbData, cbData ); _cb = cbData; return TRUE; } else return FALSE; } BYTE const * GetData( ULONG & cbData ) { cbData = _cb; return (BYTE const *) _ab; } GUID const & GetClientMgrCLSID() const { return _clsidDaemonClientMgr; } private: ULONG _sigA; // Signature ULONG _cbMax; // Maximum number of bytes in the var buffer ULONG _cb; // Number of bytes in the var buffer. GUID _clsidDaemonClientMgr; // CLSID of the client component. LONGLONG _ab[ 65536 / sizeof LONGLONG ]; // Client data location, same as eMaxVarData }; //+--------------------------------------------------------------------------- // // Class: CFilterSharedMemLayout // // Purpose: Layout of the shared memory between the CI and DownLevel // daemon process. // // History: 1-31-96 srikants Created // //---------------------------------------------------------------------------- class CFilterSharedMemLayout { public: // // Type of the work signalled by the Daemon to CI. // enum EFilterWorkType { eNone, eFilterStartupData, eFilterReady, eFilterDataReady, eFilterMore, eFilterDone, eFilterStoreValue, eFPSToPROPID, eFilterStoreSecurity, }; void Init() { _type = eNone; _sig7 = eFilterSig7; RtlZeroMemory( &_data, sizeof(_data) ); } BOOL IsValid() const { return eFilterSig7 == _sig7; } EFilterWorkType GetWorkType() const { return _type; } void SetWorkType( EFilterWorkType type ) { _type = type; } SCODE GetStatus() const { return _status; } void SetStatus( SCODE status ) { _status = status; } CFilterStartupDataLayout & GetStartupData() { return _data._filterStartup; } CFilterReadyLayout & GetFilterReady() { return _data._filterReady; } CFilterDataLayout & GetFilterDataReady() { return _filterData; } CFilterMoreDoneLayout & GetFilterMore() { return _data._filterMore; } CFilterMoreDoneLayout & GetFilterDone() { return _data._filterDone; } CFilterStoreValueLayout & GetFilterStoreValueLayout() { return _data._filterStore; } CFilterStoreSecurityLayout & GetFilterStoreSecurityLayout() { return _data._filterSdStore; } CFPSToPROPIDLayout & GetFPSToPROPID() { return _data._FPSToPROPID; } ULONG GetMaxVarDataSize() const { return sizeof(_data); } private: EFilterWorkType _type; // Type of the work. ULONG _sig7; // Signature. SCODE _status; // Status of the operation. CFilterDataLayout _filterData; // // Overlay for various functions. // union { enum { eMaxVarData = 64 * 1024 }; // 64K CFilterStartupDataLayout _filterStartup; CFilterReadyLayout _filterReady; CFilterMoreDoneLayout _filterMore; CFilterMoreDoneLayout _filterDone; CFilterStoreValueLayout _filterStore; CFilterStoreSecurityLayout _filterSdStore; CFPSToPROPIDLayout _FPSToPROPID; BYTE _ab[eMaxVarData]; } _data; }; // // Total size of the shared memory between the Daemon and CI. // const MAX_DL_SHARED_MEM = sizeof(CFilterSharedMemLayout); //+--------------------------------------------------------------------------- // // Class: CGenericCiProxy // // Purpose: Proxy class for the DaemonProcess to communicate // with CI process. // // History: 1-30-96 srikants Created // //---------------------------------------------------------------------------- class CGenericCiProxy : public CiProxy { enum { iDaemon = 0, iParent = 1 }; // indices of wait handles public: CGenericCiProxy( CSharedNameGen & nameGen, DWORD dwMemSize, DWORD parentId ); ~CGenericCiProxy(); // // CiProxy methods // virtual SCODE FilterReady( BYTE* docBuffer, ULONG & cb, ULONG cMaxDocs ); virtual SCODE FilterDataReady ( BYTE const * pEntryBuf, ULONG cb ); virtual SCODE FilterMore( STATUS const * aStatus, ULONG cStatus ); virtual SCODE FilterDone( STATUS const * aStatus, ULONG cStatus ); virtual SCODE FilterStoreValue( WORKID widFake, CFullPropSpec const & ps, CStorageVariant const & var, BOOL & fCanStore ); virtual SCODE FilterStoreSecurity( WORKID widFake, PSECURITY_DESCRIPTOR pSD, ULONG cbSD, BOOL & fCanStore ); // // PPidConverter methods // virtual SCODE FPSToPROPID( CFullPropSpec const & fps, PROPID & pid ); BYTE const * GetStartupData( GUID & clsidClientMgr, ULONG & cb ); BYTE * GetEntryBuffer( ULONG & cb ); void SetPriority( ULONG priClass, ULONG priThread ); private: // // No default constructor. // CGenericCiProxy(); void _LokGiveWork( CFilterSharedMemLayout::EFilterWorkType type ) { _pLayout->SetWorkType( type ); _evtDaemon.Reset(); _evtCi.Set(); } void _WaitForResponse(); void ProbeForParentProcess(); CIPMutexSem _mutex; // Shared mutex protecting the // common data. CLocalSystemSharedMemory _sharedMem; // Shared memory used by the two. CFilterSharedMemLayout * _pLayout; // Layout of the shared memory CEventSem _evtCi; // Event used to signal CI. CEventSem _evtDaemon; // Event used to signal Daemon. HANDLE _aWait[2]; // Array of handles to wait on ULONG _cHandles; };