#include <windows.h>
#include <shobjidl.h>
#include <shlobj.h>
#include <assert.h>
bool cancelremovedriverautoplay( bool b );
static hresult _registerforiquerycancelautoplay( dword* pdwregisterrot);
static hresult _unregisterforiquerycancelautoplay(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 platform
osvi.dwosversioninfosize = 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 that we'll put in the rot
return createclassmoniker(clsid_querycancelautoplay, ppmoniker);
}
hresult _registerforiquerycancelautoplay( dword* pdwregisterrot)
{
imoniker* pmoniker =null;
hresult hr = getcancelautoplaymoniker( &pmoniker);
if (succeeded(hr))
{
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 (succeeded(hr))
{
// register...
hr = prot->register(rotflags_registrationkeepsalive,
punk, pmoniker, pdwregisterrot);