nullstm.cpp
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 5k
Category:

Windows Kernel

Development Platform:

Visual C++

  1. #include "priv.h"
  2. #include "nullstm.h"
  3. #ifndef UNIX
  4. // A static empty stream implementation, for back compat & no memory hit
  5. //
  6. // Macros copied from cfdefs.h
  7. //
  8. #define STDMETHODX(fn)      HRESULT STDMETHODCALLTYPE fn
  9. #define STDMETHODX_(ret,fn) ret STDMETHODCALLTYPE fn
  10. class CNullStream {
  11. public:
  12.     IStream *vtable;
  13.     
  14.     STDMETHODX (QueryInterface)(REFIID riid, void **ppvObj);
  15.     STDMETHODX_(ULONG, AddRef)();
  16.     STDMETHODX_(ULONG, Release)();
  17.     STDMETHODX (Read)(void *pv, ULONG cb, ULONG *pcbRead) { if (pcbRead) *pcbRead = 0; return E_NOTIMPL; }
  18.     STDMETHODX (Write)(void const *pv, ULONG cb, ULONG *pcbWritten) { if (pcbWritten) *pcbWritten = 0; return E_NOTIMPL; }
  19.     STDMETHODX (Seek)(LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition) { plibNewPosition->HighPart = plibNewPosition->LowPart = 0; return E_NOTIMPL; }
  20.     STDMETHODX (SetSize)(ULARGE_INTEGER libNewSize) { return E_NOTIMPL; }
  21.     STDMETHODX (CopyTo)(IStream *, ULARGE_INTEGER, ULARGE_INTEGER *pcbRead, ULARGE_INTEGER *pcbWritten) { if (pcbRead) pcbRead->LowPart = pcbRead->HighPart = 0; if (pcbWritten) pcbWritten->LowPart = pcbWritten->HighPart = 0; return E_NOTIMPL; }
  22.     STDMETHODX (Commit)(DWORD) { return E_NOTIMPL; }
  23.     STDMETHODX (Revert)() { return E_NOTIMPL; }
  24.     STDMETHODX (LockRegion)(ULARGE_INTEGER, ULARGE_INTEGER, DWORD) { return E_NOTIMPL; }
  25.     STDMETHODX (UnlockRegion)(ULARGE_INTEGER, ULARGE_INTEGER, DWORD) { return E_NOTIMPL; }
  26.     STDMETHODX (Stat)(STATSTG *, DWORD) { return E_NOTIMPL; }
  27.     STDMETHODX (Clone)(IStream **ppstm) { *ppstm = NULL; return E_NOTIMPL; }
  28. };
  29. STDMETHODIMP CNullStream::QueryInterface(REFIID riid, void **ppvObj)
  30. {
  31.     if (IsEqualIID(riid, IID_IStream) || IsEqualIID(riid, IID_IUnknown))
  32.     {
  33.         *ppvObj=this;
  34.         // DllAddRef(); // if this dll supported CoCreateInstance
  35.         return S_OK;
  36.     }
  37.     *ppvObj = NULL;
  38.     return E_NOINTERFACE;
  39. }
  40. STDMETHODIMP_(ULONG) CNullStream::AddRef()
  41. {
  42.     // DllAddRef(); // if this dll supported CoCreateInstance
  43.     return 2;
  44. }
  45. STDMETHODIMP_(ULONG) CNullStream::Release()
  46. {
  47.     // DllRelease(); // if this dll supported CoCreateInstance
  48.     return 1;
  49. }
  50. // We need the C vtable declaration, but this is .CPP.
  51. // Simulate the vtable, swiped from objidl.h and touched up.
  52. //
  53. typedef struct IStreamVtbl
  54. {
  55.     HRESULT ( STDMETHODCALLTYPE CNullStream::*QueryInterface )(REFIID riid, void **ppvObject);
  56.     ULONG ( STDMETHODCALLTYPE CNullStream::*AddRef )( );
  57.     ULONG ( STDMETHODCALLTYPE CNullStream::*Release )( );
  58.     
  59.     HRESULT ( STDMETHODCALLTYPE CNullStream::*Read )( 
  60.         void *pv,
  61.         ULONG cb,
  62.         ULONG *pcbRead);
  63.     
  64.     HRESULT ( STDMETHODCALLTYPE CNullStream::*Write )( 
  65.         const void *pv,
  66.         ULONG cb,
  67.         ULONG *pcbWritten);
  68.     
  69.     HRESULT ( STDMETHODCALLTYPE CNullStream::*Seek )( 
  70.         LARGE_INTEGER dlibMove,
  71.         DWORD dwOrigin,
  72.         ULARGE_INTEGER *plibNewPosition);
  73.     
  74.     HRESULT ( STDMETHODCALLTYPE CNullStream::*SetSize )( 
  75.         ULARGE_INTEGER libNewSize);
  76.     
  77.     HRESULT ( STDMETHODCALLTYPE CNullStream::*CopyTo )( 
  78.         IStream *pstm,
  79.         ULARGE_INTEGER cb,
  80.         ULARGE_INTEGER *pcbRead,
  81.         ULARGE_INTEGER *pcbWritten);
  82.     
  83.     HRESULT ( STDMETHODCALLTYPE CNullStream::*Commit )( 
  84.         DWORD grfCommitFlags);
  85.     
  86.     HRESULT ( STDMETHODCALLTYPE CNullStream::*Revert )( );
  87.     
  88.     HRESULT ( STDMETHODCALLTYPE CNullStream::*LockRegion )( 
  89.         ULARGE_INTEGER libOffset,
  90.         ULARGE_INTEGER cb,
  91.         DWORD dwLockType);
  92.     
  93.     HRESULT ( STDMETHODCALLTYPE CNullStream::*UnlockRegion )( 
  94.         ULARGE_INTEGER libOffset,
  95.         ULARGE_INTEGER cb,
  96.         DWORD dwLockType);
  97.     
  98.     HRESULT ( STDMETHODCALLTYPE CNullStream::*Stat )( 
  99.         STATSTG *pstatstg,
  100.         DWORD grfStatFlag);
  101.     
  102.     HRESULT ( STDMETHODCALLTYPE CNullStream::*Clone )( 
  103.         IStream **ppstm);
  104.     
  105. } IStreamVtbl;
  106. IStream* SHConstNullStream()
  107. {
  108.     static const IStreamVtbl c_NullStream = {
  109.         CNullStream::QueryInterface, 
  110.         CNullStream::AddRef,
  111.         CNullStream::Release,
  112.         CNullStream::Read,
  113.         CNullStream::Write,
  114.         CNullStream::Seek,
  115.         CNullStream::SetSize,
  116.         CNullStream::CopyTo,
  117.         CNullStream::Commit,
  118.         CNullStream::Revert,
  119.         CNullStream::LockRegion,
  120.         CNullStream::UnlockRegion,
  121.         CNullStream::Stat,
  122.         CNullStream::Clone,
  123.     };
  124.     static const void * vtable = (void*)&c_NullStream;
  125.     return (IStream*)&vtable;
  126. }
  127. #endif