#include
Bool CancelremoveDriverageOPlay (Bool B);
Static HRESULT _REGISTERFORIQUERYCANCELAUTOPLAY (DWORD * pdwregisterrot); Static HRESULT _UNREGOSTERFORQUERYCANCELAUTOPLAY (DWORD DWREGISTERROT); static bool iswindowsxporgreater ();
Bool CancelremoveDriverautoplay (BOOL B) {if (! iswindowsxporgreater ()) {Return False;} static bool s_bautoplaycanceled = false; static dword s_dwrot = 0;
IF (s_bautoplaycanceled == b) {return true;}
if (0 == s_dwRot) {if (b) {HRESULT hr = _RegisterForIQueryCancelAutoplay (& s_dwRot); if (SUCCEEDED (hr)) {s_bAutoPlayCanceled = true; return true;} else {assert (0); return false;}} else {return true;}} else {if (b) {return true;} else {HRESULT hr = _UnregisterForIQueryCancelAutoplay (s_dwRot); if (SUCCEEDED (hr)) {s_dwRot = 0; s_bAutoPlayCanceled = false; return true;} else {assert (0); return false;}}}}
Static Bool IswindowsxPorgreater () {osversioninfoExa OSVI = {0};
Osvi.dwosversionInfosize = Sizeof (OSVI);
IF (! GetversionExa ((OsversionInfoa *) & OSVI)) {// if it failed, IT Must Be a down level gratform Osvi.dwosveionFosize = SizeOf (OsversionInfoa); getVersionexa ((OsversionInfoa *) & Osvi);}
return (VER_PLATFORM_WIN32_NT == osvi.dwPlatformId && ((osvi.dwMajorVersion> 5) || (osvi.dwMajorVersion == 5 && (osvi.dwMinorVersion> 0 || (osvi.dwMinorVersion == 0 && LOWORD (osvi.dwBuildNumber)> 2195))))))))))))))))))))));
class CQueryCancelAutoplay: public IQueryCancelAutoPlay {public: // IUnknown interface STDMETHODIMP QueryInterface (REFIID riid, void ** ppv); STDMETHODIMP_ (ULONG) AddRef (); STDMETHODIMP_ (ULONG) Release (); // IQueryCancelAutoPlay interface STDMETHODIMP AllowAutoPlay (LPCWSTR pszPath, DWORD DWCONTENTTYPE, LPCWSTR PSZLABEL, DWORD DWSERIALNUMBER;
PUBLIC: CQueryCanceLautoplay (): m_cref (1) {} ~ CQueryCanceLautoplay ()} private: ulong m_cref;};
Static HRESULT GETCANCELAUTOPLAYMONIKER (iMoniker ** ppmoniker) {// create the moniker what we'll Put in the rot Return CreateClassMoniker (CLSID_QUERYCANCELAUTOPLAY, PPMONIKER);}
HRESULT _REGISTERFORIQUERYCANCELAUTOPLAY (DWORD * PDWREGISTERROT) {IMONIKER * PMONIKER = NULL;
HRESULT HR = getcancelautoplaymoniker (& PMONIKER);
IF (succeeded) {irunningObjectTable * Prot = null; hr = getrunningObjectTable (0, & prot);
IF (succeeded (hr)) {CQUERYCANCELAUTOPLAY * PQCA = New CQUERYCANCELAUTOPLAY (); if (null! = pqca) {iUnknown * punk = null;
HR = PQCA-> queryinterface (IID_IUNKNOWN, (VOID **) & PUNK);
IF (succeededed (hr)) {// register ... hr = prot-> register (Rotflags_RegistrationKeepsalive, Punk, PMoniker, PDWregisterRot);
Punk-> release ();} pqca-> release ();} else {hr = e_outofmemory; }prot-> release ();} PMoniker-> Release ();} return hr;}
HRESULT _UnregisterForIQueryCancelAutoplay (DWORD dwRegisterROT) {IRunningObjectTable * prot; if (SUCCEEDED (GetRunningObjectTable (0, & prot))) {// Remove our instance from the ROT prot-> Revoke (dwRegisterROT); prot-> Release ();} return S_OK }
STDMETHODIMP CQueryCancelAutoplay :: QueryInterface (REFIID riid, void ** ppv) {IUnknown * punk = NULL; HRESULT hr = S_OK; if (IID_IUnknown == riid) {punk = static_cast
* ppv = punk;
Return hr;}
STDMETHODIMP_ (ULONG) CQUERYCANCELAUTOPLAY:: AddRef () {return :: interlockedIncrement ((long *) & m_cref);}
STDMETHODIMP_ (ULONG) CQUERYCANCELAUTOPLAY:: Release () {ulong cref = :: interlockedDecrement ((long *) & m_cref);
IF (! CREF) {delete this;}
Return Cref;}
STDMETHODIMP CQueryCancelAutoplay :: AllowAutoPlay (LPCWSTR pszPath, DWORD dwContentType, LPCWSTR pszLabel, DWORD dwSerialNumber) {HRESULT hr = S_OK; // do what you want to do // return S_FALSE to cancel the autoplay // return S_OK to do autoplay return hr; }