mirror of https://github.com/tongzx/nt5src
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.
156 lines
3.9 KiB
156 lines
3.9 KiB
/*++
|
|
|
|
Copyright (C) 1996-2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
Abstract:
|
|
|
|
History:
|
|
|
|
--*/
|
|
|
|
|
|
#ifndef __SMRTMRSH_H__
|
|
#define __SMRTMRSH_H__
|
|
|
|
#include <wbemcli.h>
|
|
#include <wstlallc.h>
|
|
#include <wmimsg.h>
|
|
#include <comutl.h>
|
|
#include <sync.h>
|
|
#include <unk.h>
|
|
#include <map>
|
|
|
|
#define HASHSIZE 16
|
|
|
|
class CHash
|
|
{
|
|
BYTE m_achHash[HASHSIZE];
|
|
|
|
public:
|
|
|
|
CHash( PBYTE pHash ) { memcpy( m_achHash, pHash, HASHSIZE ); }
|
|
|
|
bool operator < ( const CHash& rHash ) const
|
|
{
|
|
return memcmp( m_achHash, rHash.m_achHash, HASHSIZE ) < 0;
|
|
}
|
|
|
|
};
|
|
|
|
|
|
/***************************************************************************
|
|
CSmartObjectMarshaler
|
|
****************************************************************************/
|
|
|
|
class CSmartObjectMarshaler
|
|
: public CUnkBase< IWmiObjectMarshal, &IID_IWmiObjectMarshal >
|
|
{
|
|
CCritSec m_cs;
|
|
std::map<CHash, BOOL, std::less<CHash>, wbem_allocator<BOOL> > m_SentMap;
|
|
|
|
HRESULT GetMaxMarshalSize( IWbemClassObject* pObj,
|
|
LPCWSTR wszNamespace,
|
|
DWORD dwFlags,
|
|
ULONG* pulSize );
|
|
|
|
HRESULT InternalPack( IWbemClassObject* pObj,
|
|
LPCWSTR wszNamespace,
|
|
DWORD dwFlags,
|
|
ULONG cBuff,
|
|
PBYTE pBuff,
|
|
ULONG* pcUsed );
|
|
public:
|
|
|
|
CSmartObjectMarshaler( CLifeControl* pCtl, IUnknown* pUnk = NULL )
|
|
: CUnkBase< IWmiObjectMarshal, &IID_IWmiObjectMarshal >( pCtl )
|
|
{
|
|
}
|
|
|
|
STDMETHOD(Pack)( IWbemClassObject* pObj,
|
|
LPCWSTR wszNamespace,
|
|
DWORD dwFlags,
|
|
ULONG cBuff,
|
|
PBYTE pBuff,
|
|
ULONG* pcUsed );
|
|
|
|
STDMETHOD(Unpack)( ULONG cBuff,
|
|
PBYTE pBuff,
|
|
DWORD dwFlags,
|
|
IWbemClassObject** pObj,
|
|
ULONG* pcUsed )
|
|
{
|
|
return WBEM_E_NOT_SUPPORTED;
|
|
}
|
|
|
|
STDMETHOD(Flush)();
|
|
};
|
|
|
|
/***************************************************************************
|
|
CSmartObjectUnmarshaler
|
|
****************************************************************************/
|
|
|
|
class CSmartObjectUnmarshaler
|
|
: public CUnkBase< IWmiObjectMarshal, &IID_IWmiObjectMarshal >
|
|
{
|
|
CCritSec m_cs;
|
|
|
|
ULONG m_ulMaxCacheSize;
|
|
ULONG m_ulCacheSize;
|
|
|
|
CWbemPtr<IMarshal> m_pUnmrsh;
|
|
CWbemPtr<IWbemLocator> m_pLocator;
|
|
CWbemPtr<IWbemClassObject> m_pEmptyClass;
|
|
|
|
struct CacheRecord
|
|
{
|
|
DWORD m_dwClassSize;
|
|
DWORD m_dwLastUsedTime;
|
|
CWbemPtr<IWbemClassObject> m_pClassPart;
|
|
};
|
|
|
|
typedef std::map< CHash,
|
|
CacheRecord,
|
|
std::less<CHash>,
|
|
wbem_allocator<CacheRecord> > ClassPartMap;
|
|
|
|
ClassPartMap m_Cache;
|
|
|
|
void MakeRoomInCache( DWORD dwSize );
|
|
|
|
HRESULT EnsureInitialized();
|
|
|
|
HRESULT CacheClassPart(PBYTE pHash, DWORD dwSize, IWbemClassObject* pInst);
|
|
|
|
HRESULT FindClassPart( PBYTE pClassPartHash,
|
|
LPCWSTR wszClassPath,
|
|
IWbemClassObject** ppClassPart );
|
|
|
|
public:
|
|
|
|
CSmartObjectUnmarshaler( CLifeControl* pCtl, IUnknown* pUnk = NULL )
|
|
: CUnkBase< IWmiObjectMarshal, &IID_IWmiObjectMarshal >( pCtl ),
|
|
m_ulMaxCacheSize(0x500000), m_ulCacheSize(0) { }
|
|
|
|
STDMETHOD(Pack)( IWbemClassObject* pObj,
|
|
LPCWSTR wszNamespace,
|
|
DWORD dwFlags,
|
|
ULONG cBuff,
|
|
PBYTE pBuff,
|
|
ULONG* pcUsed )
|
|
{
|
|
return WBEM_E_NOT_SUPPORTED;
|
|
}
|
|
|
|
STDMETHOD(Unpack)( ULONG cBuff,
|
|
PBYTE pBuff,
|
|
DWORD dwFlags,
|
|
IWbemClassObject** pObj,
|
|
ULONG* pcUsed );
|
|
|
|
STDMETHOD(Flush)();
|
|
};
|
|
|
|
#endif __SMRTMRSH_H__
|
|
|