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

Windows Kernel

Development Platform:

Visual C++

  1. #include "precomp.hxx"
  2. #pragma hdrstop
  3. #include "util.h"
  4. #include "dll.h"
  5. #include "resource.h"
  6. class CMyDocsCopyHook : public ICopyHook
  7. {
  8. public:
  9.     // IUnknown
  10.     STDMETHOD(QueryInterface)(REFIID riid, void **ppvect);
  11.     STDMETHOD_(ULONG, AddRef)();
  12.     STDMETHOD_(ULONG, Release)();
  13.     // ICopyHook
  14.     STDMETHOD_(UINT,CopyCallback)(HWND hwnd, UINT wFunc, UINT wFlags,
  15.                                   LPCTSTR pszSrcFile, DWORD dwSrcAttribs,
  16.                                   LPCTSTR pszDestFile, DWORD dwDestAttribs);
  17. private:
  18.     CMyDocsCopyHook();
  19.     ~CMyDocsCopyHook();
  20.     LONG _cRef;
  21.     friend HRESULT CMyDocsCopyHook_CreateInstance(IUnknown *punkOuter, IUnknown **ppunk, LPCOBJECTINFO poi);    // for ctor
  22. };
  23. STDMETHODIMP CMyDocsCopyHook::QueryInterface(REFIID riid, void **ppv)
  24. {
  25.     static const QITAB qit[] = {
  26.         QITABENT(CMyDocsCopyHook, ICopyHook),    // IID_ICopyHook
  27.         { 0 },
  28.     };
  29.     return QISearch(this, qit, riid, ppv);
  30. }
  31. STDMETHODIMP_ (ULONG) CMyDocsCopyHook::AddRef()
  32. {
  33.     return InterlockedIncrement(&_cRef);
  34. }
  35. STDMETHODIMP_ (ULONG) CMyDocsCopyHook::Release()
  36. {
  37.     if (InterlockedDecrement(&_cRef))
  38.         return _cRef;
  39.     delete this;
  40.     return 0;
  41. }
  42. CMyDocsCopyHook::CMyDocsCopyHook() : _cRef(1)
  43. {
  44.     DllAddRef();
  45. }
  46. CMyDocsCopyHook::~CMyDocsCopyHook()
  47. {
  48.     DllRelease();
  49. }
  50. // ICopyHook methods
  51. UINT CMyDocsCopyHook::CopyCallback(HWND hwnd, UINT wFunc, UINT wFlags,
  52.                                    LPCTSTR pszSrcFile,  DWORD dwSrcAttribs,
  53.                                    LPCTSTR pszDestFile, DWORD dwDestAttribs)
  54. {
  55.     UINT uRes = IDYES;
  56.     if ((wFunc == FO_COPY) || (wFunc == FO_MOVE))
  57.     {
  58.         TCHAR szPersonal[MAX_PATH];
  59.         if (S_OK == SHGetFolderPath(NULL, CSIDL_PERSONAL | CSIDL_FLAG_DONT_VERIFY, NULL, SHGFP_TYPE_CURRENT, szPersonal) &&
  60.             lstrcmpi(pszSrcFile, szPersonal) == 0)
  61.         {
  62.             // the source is the personal directory, now check if the
  63.             // destination is on the desktop...
  64.             DWORD dwRes = IsPathGoodMyDocsPath(hwnd, pszDestFile);
  65.             if (dwRes == PATH_IS_NONEXISTENT)
  66.             {
  67.                 lstrcpyn(szPersonal, pszDestFile, ARRAYSIZE(szPersonal));
  68.                 if (PathRemoveFileSpec(szPersonal))
  69.                 {
  70.                     dwRes = IsPathGoodMyDocsPath(hwnd, szPersonal);
  71.                 }
  72.             }
  73.             if (dwRes == PATH_IS_DESKTOP)
  74.             {
  75.                 // keep the user from moving the personal folder to the desktop
  76.                 TCHAR szVerb[ 32 ];
  77.                 LPTSTR pName = PathFindFileName(pszSrcFile);
  78.                 LoadString(g_hInstance, (wFunc == FO_COPY) ? IDS_COPY : IDS_MOVE, szVerb, ARRAYSIZE(szVerb));
  79.                 uRes = IDNO;
  80.                 GetMyDocumentsDisplayName(szPersonal, ARRAYSIZE(szPersonal));
  81.                 if (IsMyDocsHidden())
  82.                 {
  83.                     if ( IDYES == ShellMessageBox(g_hInstance, hwnd,
  84.                                                   (LPTSTR)IDS_NODRAG_DESKTOP_HIDDEN, szPersonal,
  85.                                                   MB_YESNO | MB_ICONQUESTION,
  86.                                                   szPersonal, szVerb))
  87.                     {
  88.                         RestoreMyDocsFolder();
  89.                     }
  90.                 }
  91.                 else
  92.                 {
  93.                     ShellMessageBox(g_hInstance, hwnd,
  94.                                     (LPTSTR)IDS_NODRAG_DESKTOP_NOT_HIDDEN, szPersonal,
  95.                                     MB_OK | MB_ICONSTOP, szPersonal, szVerb);
  96.                 }
  97.             }
  98.         }
  99.     }
  100.     return uRes;
  101. }
  102. HRESULT CMyDocsCopyHook_CreateInstance(IUnknown *punkOuter, IUnknown **ppunk, LPCOBJECTINFO poi)
  103. {
  104.     CMyDocsCopyHook * pMDCH = new CMyDocsCopyHook();
  105.     if (pMDCH)
  106.     {
  107.         *ppunk = SAFECAST(pMDCH, ICopyHook*);
  108.         return S_OK;
  109.     }
  110.     *ppunk = NULL;
  111.     return E_OUTOFMEMORY;
  112. }