How to Cancel AutoPlay in XP

xiaoxiao2021-03-06  13

#include #include #include #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 (this); punk-> AddRef ( );} Else {if (IID_IQUERYCANCELAUTOPLAY == RIID) {punk = static_cast (this); punk-> addref ();} else {hr = e_nointerface;}}

* 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; }

转载请注明原文地址:https://www.9cbs.com/read-49879.html

New Post(0)