diff options
Diffstat (limited to 'Src/ie_plugin')
-rw-r--r-- | Src/ie_plugin/IWinamp.h | 189 | ||||
-rw-r--r-- | Src/ie_plugin/IWinamp.idl | 20 | ||||
-rw-r--r-- | Src/ie_plugin/IWinamp_i.c | 85 | ||||
-rw-r--r-- | Src/ie_plugin/IWinamp_p.c | 277 | ||||
-rw-r--r-- | Src/ie_plugin/Winamp.cpp | 409 | ||||
-rw-r--r-- | Src/ie_plugin/Winamp.h | 89 | ||||
-rw-r--r-- | Src/ie_plugin/WinampFactory.cpp | 65 | ||||
-rw-r--r-- | Src/ie_plugin/WinampFactory.h | 18 | ||||
-rw-r--r-- | Src/ie_plugin/dlldata.c | 38 | ||||
-rw-r--r-- | Src/ie_plugin/export.def | 7 | ||||
-rw-r--r-- | Src/ie_plugin/ie_plugin.sln | 20 | ||||
-rw-r--r-- | Src/ie_plugin/ie_plugin.vcproj | 236 | ||||
-rw-r--r-- | Src/ie_plugin/main.cpp | 169 | ||||
-rw-r--r-- | Src/ie_plugin/resource.h | 16 | ||||
-rw-r--r-- | Src/ie_plugin/winamp.rc | 113 |
15 files changed, 1751 insertions, 0 deletions
diff --git a/Src/ie_plugin/IWinamp.h b/Src/ie_plugin/IWinamp.h new file mode 100644 index 00000000..40fd1a81 --- /dev/null +++ b/Src/ie_plugin/IWinamp.h @@ -0,0 +1,189 @@ + + +/* this ALWAYS GENERATED file contains the definitions for the interfaces */ + + + /* File created by MIDL compiler version 7.00.0500 */ +/* at Mon Aug 24 16:18:09 2009 + */ +/* Compiler settings for .\IWinamp.idl: + Oicf, W1, Zp8, env=Win32 (32b run) + protocol : dce , ms_ext, c_ext, robust + error checks: allocation ref bounds_check enum stub_data + VC __declspec() decoration level: + __declspec(uuid()), __declspec(selectany), __declspec(novtable) + DECLSPEC_UUID(), MIDL_INTERFACE() +*/ +//@@MIDL_FILE_HEADING( ) + +#pragma warning( disable: 4049 ) /* more than 64k source lines */ + + +/* verify that the <rpcndr.h> version is high enough to compile this file*/ +#ifndef __REQUIRED_RPCNDR_H_VERSION__ +#define __REQUIRED_RPCNDR_H_VERSION__ 475 +#endif + +#include "rpc.h" +#include "rpcndr.h" + +#ifndef __RPCNDR_H_VERSION__ +#error this stub requires an updated version of <rpcndr.h> +#endif // __RPCNDR_H_VERSION__ + +#ifndef COM_NO_WINDOWS_H +#include "windows.h" +#include "ole2.h" +#endif /*COM_NO_WINDOWS_H*/ + +#ifndef __IWinamp_h__ +#define __IWinamp_h__ + +#if defined(_MSC_VER) && (_MSC_VER >= 1020) +#pragma once +#endif + +/* Forward Declarations */ + +#ifndef __IWinamp_FWD_DEFINED__ +#define __IWinamp_FWD_DEFINED__ +typedef interface IWinamp IWinamp; +#endif /* __IWinamp_FWD_DEFINED__ */ + + +#ifndef __Winamp_FWD_DEFINED__ +#define __Winamp_FWD_DEFINED__ + +#ifdef __cplusplus +typedef class Winamp Winamp; +#else +typedef struct Winamp Winamp; +#endif /* __cplusplus */ + +#endif /* __Winamp_FWD_DEFINED__ */ + + +/* header files for imported files */ +#include "oaidl.h" +#include "ocidl.h" + +#ifdef __cplusplus +extern "C"{ +#endif + + +#ifndef __IWinamp_INTERFACE_DEFINED__ +#define __IWinamp_INTERFACE_DEFINED__ + +/* interface IWinamp */ +/* [unique][helpstring][uuid][object] */ + + +EXTERN_C const IID IID_IWinamp; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("007374A5-FE80-4b29-AF8C-FD9C0F16C85C") + IWinamp : public IObjectWithSite + { + public: + }; + +#else /* C style interface */ + + typedef struct IWinampVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IWinamp * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + IWinamp * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + IWinamp * This); + + HRESULT ( STDMETHODCALLTYPE *SetSite )( + IWinamp * This, + /* [in] */ IUnknown *pUnkSite); + + HRESULT ( STDMETHODCALLTYPE *GetSite )( + IWinamp * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void **ppvSite); + + END_INTERFACE + } IWinampVtbl; + + interface IWinamp + { + CONST_VTBL struct IWinampVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IWinamp_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IWinamp_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IWinamp_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IWinamp_SetSite(This,pUnkSite) \ + ( (This)->lpVtbl -> SetSite(This,pUnkSite) ) + +#define IWinamp_GetSite(This,riid,ppvSite) \ + ( (This)->lpVtbl -> GetSite(This,riid,ppvSite) ) + + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IWinamp_INTERFACE_DEFINED__ */ + + + +#ifndef __ElevatorLib_LIBRARY_DEFINED__ +#define __ElevatorLib_LIBRARY_DEFINED__ + +/* library ElevatorLib */ +/* [helpstring][version][uuid] */ + + +EXTERN_C const IID LIBID_ElevatorLib; + +EXTERN_C const CLSID CLSID_Winamp; + +#ifdef __cplusplus + +class DECLSPEC_UUID("D9C17076-9F55-49b5-8BEB-6A857931E62C") +Winamp; +#endif +#endif /* __ElevatorLib_LIBRARY_DEFINED__ */ + +/* Additional Prototypes for ALL interfaces */ + +/* end of Additional Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif + + diff --git a/Src/ie_plugin/IWinamp.idl b/Src/ie_plugin/IWinamp.idl new file mode 100644 index 00000000..017baff0 --- /dev/null +++ b/Src/ie_plugin/IWinamp.idl @@ -0,0 +1,20 @@ +import "oaidl.idl"; +import "ocidl.idl"; +import "wtypes.idl"; + + [ + uuid(B44A606E-EF90-4062-BD41-197D8495884D), + version(1.0), + helpstring("Winamp 1.0 Type Library") + ] +library ElevatorLib +{ + [ + uuid(D9C17076-9F55-49b5-8BEB-6A857931E62C), + helpstring("Winamp Class") + ] + coclass Winamp + { + }; +}; + diff --git a/Src/ie_plugin/IWinamp_i.c b/Src/ie_plugin/IWinamp_i.c new file mode 100644 index 00000000..76b2773c --- /dev/null +++ b/Src/ie_plugin/IWinamp_i.c @@ -0,0 +1,85 @@ + + +/* this ALWAYS GENERATED file contains the IIDs and CLSIDs */ + +/* link this file in with the server and any clients */ + + + /* File created by MIDL compiler version 7.00.0500 */ +/* at Mon Aug 24 15:08:56 2009 + */ +/* Compiler settings for .\IWinamp.idl: + Oicf, W1, Zp8, env=Win32 (32b run) + protocol : dce , ms_ext, c_ext, robust + error checks: allocation ref bounds_check enum stub_data + VC __declspec() decoration level: + __declspec(uuid()), __declspec(selectany), __declspec(novtable) + DECLSPEC_UUID(), MIDL_INTERFACE() +*/ +//@@MIDL_FILE_HEADING( ) + +#pragma warning( disable: 4049 ) /* more than 64k source lines */ + + +#ifdef __cplusplus +extern "C"{ +#endif + + +#include <rpc.h> +#include <rpcndr.h> + +#ifdef _MIDL_USE_GUIDDEF_ + +#ifndef INITGUID +#define INITGUID +#include <guiddef.h> +#undef INITGUID +#else +#include <guiddef.h> +#endif + +#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \ + DEFINE_GUID(name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) + +#else // !_MIDL_USE_GUIDDEF_ + +#ifndef __IID_DEFINED__ +#define __IID_DEFINED__ + +typedef struct _IID +{ + unsigned long x; + unsigned short s1; + unsigned short s2; + unsigned char c[8]; +} IID; + +#endif // __IID_DEFINED__ + +#ifndef CLSID_DEFINED +#define CLSID_DEFINED +typedef IID CLSID; +#endif // CLSID_DEFINED + +#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \ + const type name = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}} + +#endif !_MIDL_USE_GUIDDEF_ + +MIDL_DEFINE_GUID(IID, IID_IWinamp,0x007374A5,0xFE80,0x4b29,0xAF,0x8C,0xFD,0x9C,0x0F,0x16,0xC8,0x5C); + + +MIDL_DEFINE_GUID(IID, LIBID_ElevatorLib,0xB44A606E,0xEF90,0x4062,0xBD,0x41,0x19,0x7D,0x84,0x95,0x88,0x4D); + + +MIDL_DEFINE_GUID(CLSID, CLSID_Winamp,0xD9C17076,0x9F55,0x49b5,0x8B,0xEB,0x6A,0x85,0x79,0x31,0xE6,0x2C); + +#undef MIDL_DEFINE_GUID + +#ifdef __cplusplus +} +#endif + + + diff --git a/Src/ie_plugin/IWinamp_p.c b/Src/ie_plugin/IWinamp_p.c new file mode 100644 index 00000000..6e0256ca --- /dev/null +++ b/Src/ie_plugin/IWinamp_p.c @@ -0,0 +1,277 @@ + + +/* this ALWAYS GENERATED file contains the proxy stub code */ + + + /* File created by MIDL compiler version 7.00.0500 */ +/* at Mon Aug 24 16:18:09 2009 + */ +/* Compiler settings for .\IWinamp.idl: + Oicf, W1, Zp8, env=Win32 (32b run) + protocol : dce , ms_ext, c_ext, robust + error checks: allocation ref bounds_check enum stub_data + VC __declspec() decoration level: + __declspec(uuid()), __declspec(selectany), __declspec(novtable) + DECLSPEC_UUID(), MIDL_INTERFACE() +*/ +//@@MIDL_FILE_HEADING( ) + +#if !defined(_M_IA64) && !defined(_M_AMD64) + + +#pragma warning( disable: 4049 ) /* more than 64k source lines */ +#if _MSC_VER >= 1200 +#pragma warning(push) +#endif + +#pragma warning( disable: 4211 ) /* redefine extern to static */ +#pragma warning( disable: 4232 ) /* dllimport identity*/ +#pragma warning( disable: 4024 ) /* array to pointer mapping*/ +#pragma warning( disable: 4152 ) /* function/data pointer conversion in expression */ +#pragma warning( disable: 4100 ) /* unreferenced arguments in x86 call */ + +#pragma optimize("", off ) + +#define USE_STUBLESS_PROXY + + +/* verify that the <rpcproxy.h> version is high enough to compile this file*/ +#ifndef __REDQ_RPCPROXY_H_VERSION__ +#define __REQUIRED_RPCPROXY_H_VERSION__ 475 +#endif + + +#include "rpcproxy.h" +#ifndef __RPCPROXY_H_VERSION__ +#error this stub requires an updated version of <rpcproxy.h> +#endif // __RPCPROXY_H_VERSION__ + + +#include "IWinamp.h" + +#define TYPE_FORMAT_STRING_SIZE 3 +#define PROC_FORMAT_STRING_SIZE 1 +#define EXPR_FORMAT_STRING_SIZE 1 +#define TRANSMIT_AS_TABLE_SIZE 0 +#define WIRE_MARSHAL_TABLE_SIZE 0 + +typedef struct _IWinamp_MIDL_TYPE_FORMAT_STRING + { + short Pad; + unsigned char Format[ TYPE_FORMAT_STRING_SIZE ]; + } IWinamp_MIDL_TYPE_FORMAT_STRING; + +typedef struct _IWinamp_MIDL_PROC_FORMAT_STRING + { + short Pad; + unsigned char Format[ PROC_FORMAT_STRING_SIZE ]; + } IWinamp_MIDL_PROC_FORMAT_STRING; + +typedef struct _IWinamp_MIDL_EXPR_FORMAT_STRING + { + long Pad; + unsigned char Format[ EXPR_FORMAT_STRING_SIZE ]; + } IWinamp_MIDL_EXPR_FORMAT_STRING; + + +static RPC_SYNTAX_IDENTIFIER _RpcTransferSyntax = +{{0x8A885D04,0x1CEB,0x11C9,{0x9F,0xE8,0x08,0x00,0x2B,0x10,0x48,0x60}},{2,0}}; + + +extern const IWinamp_MIDL_TYPE_FORMAT_STRING IWinamp__MIDL_TypeFormatString; +extern const IWinamp_MIDL_PROC_FORMAT_STRING IWinamp__MIDL_ProcFormatString; +extern const IWinamp_MIDL_EXPR_FORMAT_STRING IWinamp__MIDL_ExprFormatString; + + +extern const MIDL_STUB_DESC Object_StubDesc; + + +extern const MIDL_SERVER_INFO IWinamp_ServerInfo; +extern const MIDL_STUBLESS_PROXY_INFO IWinamp_ProxyInfo; + + + +#if !defined(__RPC_WIN32__) +#error Invalid build platform for this stub. +#endif + +#if !(TARGET_IS_NT50_OR_LATER) +#error You need a Windows 2000 or later to run this stub because it uses these features: +#error /robust command line switch. +#error However, your C/C++ compilation flags indicate you intend to run this app on earlier systems. +#error This app will fail with the RPC_X_WRONG_STUB_VERSION error. +#endif + + +static const IWinamp_MIDL_PROC_FORMAT_STRING IWinamp__MIDL_ProcFormatString = + { + 0, + { + + 0x0 + } + }; + +static const IWinamp_MIDL_TYPE_FORMAT_STRING IWinamp__MIDL_TypeFormatString = + { + 0, + { + NdrFcShort( 0x0 ), /* 0 */ + + 0x0 + } + }; + + +/* Object interface: IUnknown, ver. 0.0, + GUID={0x00000000,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}} */ + + +/* Object interface: IObjectWithSite, ver. 0.0, + GUID={0xFC4801A3,0x2BA9,0x11CF,{0xA2,0x29,0x00,0xAA,0x00,0x3D,0x73,0x52}} */ + + +/* Object interface: IWinamp, ver. 0.0, + GUID={0x007374A5,0xFE80,0x4b29,{0xAF,0x8C,0xFD,0x9C,0x0F,0x16,0xC8,0x5C}} */ + +#pragma code_seg(".orpc") +static const unsigned short IWinamp_FormatStringOffsetTable[] = + { + (unsigned short) -1, + (unsigned short) -1, + 0 + }; + +static const MIDL_STUBLESS_PROXY_INFO IWinamp_ProxyInfo = + { + &Object_StubDesc, + IWinamp__MIDL_ProcFormatString.Format, + &IWinamp_FormatStringOffsetTable[-3], + 0, + 0, + 0 + }; + + +static const MIDL_SERVER_INFO IWinamp_ServerInfo = + { + &Object_StubDesc, + 0, + IWinamp__MIDL_ProcFormatString.Format, + &IWinamp_FormatStringOffsetTable[-3], + 0, + 0, + 0, + 0}; +CINTERFACE_PROXY_VTABLE(5) _IWinampProxyVtbl = +{ + 0, + &IID_IWinamp, + IUnknown_QueryInterface_Proxy, + IUnknown_AddRef_Proxy, + IUnknown_Release_Proxy , + 0 /* (void *) (INT_PTR) -1 /* IObjectWithSite::SetSite */ , + 0 /* (void *) (INT_PTR) -1 /* IObjectWithSite::GetSite */ +}; + + +static const PRPC_STUB_FUNCTION IWinamp_table[] = +{ + STUB_FORWARDING_FUNCTION, + STUB_FORWARDING_FUNCTION +}; + +CInterfaceStubVtbl _IWinampStubVtbl = +{ + &IID_IWinamp, + &IWinamp_ServerInfo, + 5, + &IWinamp_table[-3], + CStdStubBuffer_DELEGATING_METHODS +}; + +static const MIDL_STUB_DESC Object_StubDesc = + { + 0, + NdrOleAllocate, + NdrOleFree, + 0, + 0, + 0, + 0, + 0, + IWinamp__MIDL_TypeFormatString.Format, + 1, /* -error bounds_check flag */ + 0x50002, /* Ndr library version */ + 0, + 0x70001f4, /* MIDL Version 7.0.500 */ + 0, + 0, + 0, /* notify & notify_flag routine table */ + 0x1, /* MIDL flag */ + 0, /* cs routines */ + 0, /* proxy/server info */ + 0 + }; + +const CInterfaceProxyVtbl * _IWinamp_ProxyVtblList[] = +{ + ( CInterfaceProxyVtbl *) &_IWinampProxyVtbl, + 0 +}; + +const CInterfaceStubVtbl * _IWinamp_StubVtblList[] = +{ + ( CInterfaceStubVtbl *) &_IWinampStubVtbl, + 0 +}; + +PCInterfaceName const _IWinamp_InterfaceNamesList[] = +{ + "IWinamp", + 0 +}; + +const IID * _IWinamp_BaseIIDList[] = +{ + &IID_IObjectWithSite, + 0 +}; + + +#define _IWinamp_CHECK_IID(n) IID_GENERIC_CHECK_IID( _IWinamp, pIID, n) + +int __stdcall _IWinamp_IID_Lookup( const IID * pIID, int * pIndex ) +{ + + if(!_IWinamp_CHECK_IID(0)) + { + *pIndex = 0; + return 1; + } + + return 0; +} + +const ExtendedProxyFileInfo IWinamp_ProxyFileInfo = +{ + (PCInterfaceProxyVtblList *) & _IWinamp_ProxyVtblList, + (PCInterfaceStubVtblList *) & _IWinamp_StubVtblList, + (const PCInterfaceName * ) & _IWinamp_InterfaceNamesList, + (const IID ** ) & _IWinamp_BaseIIDList, + & _IWinamp_IID_Lookup, + 1, + 2, + 0, /* table of [async_uuid] interfaces */ + 0, /* Filler1 */ + 0, /* Filler2 */ + 0 /* Filler3 */ +}; +#pragma optimize("", on ) +#if _MSC_VER >= 1200 +#pragma warning(pop) +#endif + + +#endif /* !defined(_M_IA64) && !defined(_M_AMD64)*/ + diff --git a/Src/ie_plugin/Winamp.cpp b/Src/ie_plugin/Winamp.cpp new file mode 100644 index 00000000..7135dfb6 --- /dev/null +++ b/Src/ie_plugin/Winamp.cpp @@ -0,0 +1,409 @@ +#include "Winamp.h" +#include "../Winamp/JSAPI.h" +#include <mshtmdid.h> +#include <mshtmhst.h> +#include <stdio.h> +#include <shlwapi.h> +#include <malloc.h> + +#define BUFFER_LEN 1024 + +// {294DFA02-5A90-4dc7-872D-1EF54817078D} +static const GUID CLSID_WINAMP_CRAP = +{ 0x294dfa02, 0x5a90, 0x4dc7, { 0x87, 0x2d, 0x1e, 0xf5, 0x48, 0x17, 0x7, 0x8d } }; + +Winamp::Winamp() +{ + refCount=1; + + webBrowser_=0; + connectionPointContainer=0; + cookie_=0; + document_=0; + client_site = 0; +} +/* other things being asked for: +{00000008-0000-0000-C000-000000000046} (dunno what interface) +HTMLDocument +IOleControl B196B288-BAB4-101A-B69C-00AA00341D07 +IClientSecurity +IQuickActivate +IPersistPropertyBag2 +IPersistPropertyBag +IPersistStreamInit +IPersistStorage +IViewObjectEx +IViewObject +IActiveScript BB1A2AE1-A4F9-11CF-8F20-00805F2CD064 +IOleCommandTarget B722BCCB-4E68-101B-A2BC-00AA00404770 +IDispatchEx A6EF9860-C720-11D0-9337-00A0C90DCAA9 +CB5BDC81-93C1-11cf-8F20-00805F2CD064 +6D5140D3-7436-11CE-8034-00AA006009FA (dunno what interface) +*/ + +HRESULT Winamp::QueryInterface(REFIID riid, LPVOID FAR *ppvObj) +{ + //DebugBreak(); + if (!ppvObj) + return E_POINTER; + else if (IsEqualIID(riid, IID_IUnknown)) + *ppvObj = /*static_cast<IUnknown *>*/(this); + else if (IsEqualIID(riid, IID_IObjectWithSite)) + *ppvObj = static_cast<IObjectWithSite *>(this); + //else if (IsEqualIID(riid, __uuidof(IWinamp))) + //*ppvObj = static_cast<IWinamp *>(this); + else if (IsEqualIID(riid, IID_IDispatch)) + *ppvObj = (IDispatch *)this; + else if (IsEqualIID(riid, IID_IOleObject)) + *ppvObj = (IOleObject *)this; + else if (IsEqualIID(riid, IID_IPersistStorage)) + *ppvObj = (IPersistStorage *)this; + else if (IsEqualIID(riid, IID_IDataObject)) + *ppvObj = (IDataObject *)this; + else if (IsEqualIID(riid, IID_IObjectSafety)) + *ppvObj = (IObjectSafety *)this; + else + { + LPOLESTR guidstr; + StringFromIID(riid, &guidstr); + //MessageBox(NULL, guidstr, L"queryinterface", MB_OK); + *ppvObj = NULL; + return E_NOINTERFACE; + } + + AddRef(); + return S_OK; +} + +ULONG Winamp::AddRef(void) +{ + return ++refCount; +} + +ULONG Winamp::Release(void) +{ + if (refCount == 0) + return 0; + + ULONG retCount=--refCount; + if (refCount == 0) + delete this; + return retCount; +} + + +#define DISP_TABLE \ + CHECK_ID(Test)\ + CHECK_ID(getVersion)\ + +#define CHECK_ID(str) JSAPI_DISP_ENUMIFY(str), +enum { + DISP_TABLE +}; +#undef CHECK_ID +#define CHECK_ID(str) if (wcscmp(rgszNames[i], L## #str) == 0) { rgdispid[i] = JSAPI_DISP_ENUMIFY(str); continue; } + +HRESULT Winamp::GetIDsOfNames(REFIID riid, OLECHAR FAR* FAR* rgszNames, unsigned int cNames, LCID lcid, DISPID FAR* rgdispid) +{ + bool unknowns = false; + for (unsigned int i = 0;i != cNames;i++) + { + DISP_TABLE + + rgdispid[i] = DISPID_UNKNOWN; + unknowns = true; + + } + if (unknowns) + return DISP_E_UNKNOWNNAME; + else + return S_OK; +} + +HRESULT Winamp::GetTypeInfo(unsigned int itinfo, LCID lcid, ITypeInfo FAR* FAR* pptinfo) +{ + return E_NOTIMPL; +} + +HRESULT Winamp::GetTypeInfoCount(unsigned int FAR * pctinfo) +{ + return E_NOTIMPL; +} + + +#undef CHECK_ID +#define CHECK_ID(str) case JSAPI_DISP_ENUMIFY(str): return str(wFlags, pdispparams, pvarResult, puArgErr); +HRESULT Winamp::Invoke(DISPID dispid, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, EXCEPINFO FAR * pexecinfo, unsigned int FAR *puArgErr) +{ + switch (dispid) + { + DISP_TABLE + } + return DISP_E_MEMBERNOTFOUND; +} + +HRESULT Winamp::GetSite(REFIID riid, void** ppvSite) +{ + return E_NOINTERFACE; +} + +HRESULT Winamp::SetSite(IUnknown* iu) +{/* + if (! (iu->QueryInterface(IID_IWebBrowser2, (void**) &webBrowser_) == S_OK )) + { + return E_FAIL; + } + + if (! (iu->QueryInterface(IID_IConnectionPointContainer, (void**) &connectionPointContainer) == S_OK )) + { + return E_FAIL; + // ::MessageBox(0, "xxx", 0, 0); + } + + // make sure we\'re getting browser events + IConnectionPoint* spCP; + HRESULT hr = connectionPointContainer->FindConnectionPoint(DIID_DWebBrowserEvents2, &spCP); + if (FAILED(hr)) + { + return hr; + } + hr = spCP->Advise(static_cast<IDispatch*>(this), &cookie_); +*/ + return S_OK; +} + +HRESULT Winamp::Test(WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, unsigned int FAR *puArgErr) +{ + JSAPI_VERIFY_METHOD(wFlags); + JSAPI_VERIFY_PARAMCOUNT(pdispparams, 0); + + MessageBoxA(NULL,"test", "IWinamp", MB_OK); + + JSAPI_INIT_RESULT(pvarResult, VT_BOOL); + JSAPI_SET_VARIANT(pvarResult, V_BOOL, VARIANT_TRUE); + + return S_OK; +} + + +#if 0 + +HRESULT Winamp::getVersion(WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, unsigned int FAR *puArgErr) +{ + JSAPI_VERIFY_METHOD(wFlags); + JSAPI_VERIFY_PARAMCOUNT(pdispparams, 0); + + JSAPI_INIT_RESULT(pvarResult, VT_BSTR); + JSAPI_SET_RESULT(pvarResult, bstrVal, SysAllocString(L"7766")); + + return S_OK; +} +#endif + +HRESULT Winamp::getVersion(WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, unsigned int FAR *puArgErr) +{ + JSAPI_VERIFY_METHOD(wFlags); + JSAPI_VERIFY_PARAMCOUNT(pdispparams, 0); + + wchar_t csVersion[BUFFER_LEN]; + //////////////////////////////// + DWORD BufferSize = BUFFER_LEN; + DWORD cbData; + bool keyFound = false; + + wchar_t exeName[] = L"\\winamp.exe"; + wchar_t fileName[BUFFER_LEN]; + csVersion[0]=0; + memset(&fileName[0],'\0',BUFFER_LEN); + wchar_t fileNameTemp[BUFFER_LEN]; + + HKEY hKey; + cbData = BUFFER_LEN; + + // first check the protocol handler registry key, we're looking for + // the winamp:// protocol handler. If we find this, then this is the + // "right" exe for winamp we need to get the version number on + if (RegOpenKeyEx(HKEY_CLASSES_ROOT, TEXT("winamp\\shell\\open\\command"), 0, KEY_READ, &hKey) == ERROR_SUCCESS) { + if ( RegQueryValueEx( hKey, + TEXT(""), + NULL, + NULL, + (LPBYTE) fileNameTemp, + &cbData ) != ERROR_SUCCESS) { + return ERROR_PATH_NOT_FOUND; + } + + RegCloseKey (hKey); + if (StrStrW(fileNameTemp,L"winamp.exe")) { + int indexOfFirstQuote = StrCSpnW(fileNameTemp, L"\""); + int indexOfSecondQuote = StrCSpnW(&fileNameTemp[indexOfFirstQuote+1], L"\""); + + if (indexOfFirstQuote >= 0) { + keyFound = true; + lstrcpynW(fileName,&fileNameTemp[indexOfFirstQuote+1], indexOfSecondQuote+1); + } + } else { + // some other app (itunes ??) controlling the winamp:// protocol + // return error + return ERROR_PATH_NOT_FOUND; + } + } + + if (!keyFound) { + // See if the reg key exists + if (RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Software\\Winamp"), 0, KEY_READ, &hKey) != ERROR_SUCCESS) { + return ERROR_PATH_NOT_FOUND; + } + + cbData = BUFFER_LEN; + if ( RegQueryValueEx( hKey, + TEXT(""), + NULL, + NULL, + (LPBYTE) fileName, + &cbData ) != ERROR_SUCCESS) { + return ERROR_PATH_NOT_FOUND; + } + RegCloseKey (hKey); + keyFound = true; + wcscat(fileName,exeName); + } + + if (!keyFound) { + return ERROR_PATH_NOT_FOUND; + } + + + //////////////////////////////// + static TCHAR sBackSlash[] = {'\\','\0'}; + DWORD dwVersionDataLen = GetFileVersionInfoSize(fileName, NULL); + + if (dwVersionDataLen) + { + char* fvBuf = (char *)alloca(dwVersionDataLen);//new char[dwVersionDataLen]; + if (GetFileVersionInfo(fileName, 0, dwVersionDataLen, fvBuf)) { + + LPVOID pVal; + UINT nValLen; + if (VerQueryValue(fvBuf, sBackSlash, &pVal, &nValLen)) { + if (nValLen == sizeof(VS_FIXEDFILEINFO)) { + VS_FIXEDFILEINFO* pFixedFileInfo = (VS_FIXEDFILEINFO*)pVal; + //wsprintf(csVersion, L"%d.%d.%d.%d", + // HIWORD(pFixedFileInfo->dwFileVersionMS), LOWORD(pFixedFileInfo->dwFileVersionMS), + // HIWORD(pFixedFileInfo->dwFileVersionLS), LOWORD(pFixedFileInfo->dwFileVersionLS)); + wsprintf(csVersion, L"%d.%d%d", + HIWORD(pFixedFileInfo->dwFileVersionMS), LOWORD(pFixedFileInfo->dwFileVersionMS), + HIWORD(pFixedFileInfo->dwFileVersionLS)); + } + } + } + } + + JSAPI_INIT_RESULT(pvarResult, VT_BSTR); + JSAPI_SET_RESULT(pvarResult, bstrVal, SysAllocString(csVersion)); + + return S_OK; +} + + HRESULT Winamp::SetClientSite(IOleClientSite *pClientSite) +{ + // TODO + client_site = pClientSite; + return S_OK; + } + + HRESULT Winamp::GetClientSite(IOleClientSite **ppClientSite) +{ return E_NOTIMPL; } + HRESULT Winamp::SetHostNames(LPCOLESTR szContainerApp,LPCOLESTR szContainerObj) +{ return S_OK; } + HRESULT Winamp::Close(DWORD dwSaveOption) +{ return S_OK; } + HRESULT Winamp::SetMoniker(DWORD dwWhichMoniker,IMoniker *pmk) +{ return E_NOTIMPL; } + HRESULT Winamp::GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker,IMoniker **ppmk) +{ return E_NOTIMPL; } + HRESULT Winamp::InitFromData(IDataObject *pDataObject,BOOL fCreation,DWORD dwReserved) +{ return E_NOTIMPL; } + HRESULT Winamp::GetClipboardData(DWORD dwReserved,IDataObject **ppDataObject) +{ return E_NOTIMPL; } + HRESULT Winamp::DoVerb(LONG iVerb,LPMSG lpmsg,IOleClientSite *pActiveSite,LONG lindex, HWND hwndParent, LPCRECT lprcPosRect) +{ return S_OK; } + HRESULT Winamp::EnumVerbs(IEnumOLEVERB **ppEnumOleVerb) +{ return E_NOTIMPL; } + HRESULT Winamp::Update(void) +{ return E_NOTIMPL; } + HRESULT Winamp::IsUpToDate(void) +{ return E_NOTIMPL; } + HRESULT Winamp::GetUserClassID(CLSID *pClsid) +{ return E_NOTIMPL; } + HRESULT Winamp::GetUserType(DWORD dwFormOfType,LPOLESTR *pszUserType) +{ return E_NOTIMPL; } + HRESULT Winamp::SetExtent(DWORD dwDrawAspect,SIZEL *psizel) +{ return E_NOTIMPL; } + + HRESULT Winamp::GetExtent(DWORD dwDrawAspect,SIZEL *psizel) +{ + // TODO + return E_NOTIMPL; + } + + HRESULT Winamp::Advise(IAdviseSink *pAdvSink,DWORD *pdwConnection) +{ return E_NOTIMPL; } + HRESULT Winamp::Unadvise(DWORD dwConnection) +{ return E_NOTIMPL; } + HRESULT Winamp::EnumAdvise(IEnumSTATDATA **ppenumAdvise) +{ return E_NOTIMPL; } + HRESULT Winamp::GetMiscStatus(DWORD dwAspect,DWORD *pdwStatus) +{ + *pdwStatus = OLEMISC_INVISIBLEATRUNTIME; + return S_OK; + } + HRESULT Winamp::SetColorScheme(LOGPALETTE *pLogpal) +{ return E_NOTIMPL; } + + HRESULT Winamp::GetClassID(CLSID *pClassID) +{ *pClassID = CLSID_WINAMP_CRAP; return S_OK; } + HRESULT Winamp::IsDirty(void) +{ return E_NOTIMPL; } + HRESULT Winamp::InitNew(IStorage *pStg) +{ return E_NOTIMPL; } + HRESULT Winamp::Load(IStorage *pStg) +{ return E_NOTIMPL; } + HRESULT Winamp::Save(IStorage *pStgSave, BOOL fSameAsLoad) +{ return E_NOTIMPL; } + HRESULT Winamp::SaveCompleted(IStorage *pStgNew) +{ return E_NOTIMPL; } + HRESULT Winamp::HandsOffStorage(void) +{ return E_NOTIMPL; } + +HRESULT Winamp::GetData(FORMATETC *pformatetcIn,STGMEDIUM *pmedium) +{ return E_NOTIMPL; } + HRESULT Winamp::GetDataHere(FORMATETC *pformatetc,STGMEDIUM *pmedium) +{ return E_NOTIMPL; } + HRESULT Winamp::QueryGetData(FORMATETC *pformatetc) +{ return E_NOTIMPL; } + HRESULT Winamp::GetCanonicalFormatEtc(FORMATETC *pformatectIn,FORMATETC *pformatetcOut) +{ return E_NOTIMPL; } + HRESULT Winamp::SetData(FORMATETC *pformatetc,STGMEDIUM *pmedium,BOOL fRelease) +{ return E_NOTIMPL; } + HRESULT Winamp::EnumFormatEtc(DWORD dwDirection,IEnumFORMATETC **ppenumFormatEtc) +{ return E_NOTIMPL; } + HRESULT Winamp::DAdvise(FORMATETC *pformatetc,DWORD advf,IAdviseSink *pAdvSink,DWORD *pdwConnection) +{ return E_NOTIMPL; } + HRESULT Winamp::DUnadvise(DWORD dwConnection) +{ return E_NOTIMPL; } + HRESULT Winamp::EnumDAdvise(IEnumSTATDATA **ppenumAdvise) +{ return E_NOTIMPL; } + + HRESULT Winamp::GetInterfaceSafetyOptions(REFIID riid, DWORD *pdwSupportedOptions, DWORD *pdwEnabledOptions) + { + *pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA; + *pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA; + + return S_OK; + } + HRESULT Winamp::SetInterfaceSafetyOptions(REFIID riid, DWORD dwOptionSetMask, DWORD dwEnabledOptions) + { + + return S_OK; + }
\ No newline at end of file diff --git a/Src/ie_plugin/Winamp.h b/Src/ie_plugin/Winamp.h new file mode 100644 index 00000000..87ff281a --- /dev/null +++ b/Src/ie_plugin/Winamp.h @@ -0,0 +1,89 @@ +#pragma once +#include <ocidl.h> +#include <exdisp.h> +#include <objsafe.h> + +class Winamp : public IObjectWithSite, + public IDispatch, + public IOleObject, + public IPersistStorage, + public IDataObject, + public IObjectSafety +{ +public: + Winamp(); + /* IUnknown */ + HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject); + ULONG STDMETHODCALLTYPE AddRef(void); + ULONG STDMETHODCALLTYPE Release(void); + + // *** IDispatch Methods *** + STDMETHOD (GetIDsOfNames)(REFIID riid, OLECHAR FAR* FAR* rgszNames, unsigned int cNames, LCID lcid, DISPID FAR* rgdispid); + STDMETHOD (GetTypeInfo)(unsigned int itinfo, LCID lcid, ITypeInfo FAR* FAR* pptinfo); + STDMETHOD (GetTypeInfoCount)(unsigned int FAR * pctinfo); + STDMETHOD (Invoke)(DISPID dispid, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, EXCEPINFO FAR * pexecinfo, unsigned int FAR *puArgErr); + + /* IOleObject */ + HRESULT STDMETHODCALLTYPE SetClientSite(IOleClientSite *pClientSite); + HRESULT STDMETHODCALLTYPE GetClientSite(IOleClientSite **ppClientSite); + HRESULT STDMETHODCALLTYPE SetHostNames(LPCOLESTR szContainerApp,LPCOLESTR szContainerObj); + HRESULT STDMETHODCALLTYPE Close(DWORD dwSaveOption); + HRESULT STDMETHODCALLTYPE SetMoniker(DWORD dwWhichMoniker,IMoniker *pmk); + HRESULT STDMETHODCALLTYPE GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker,IMoniker **ppmk); + HRESULT STDMETHODCALLTYPE InitFromData(IDataObject *pDataObject,BOOL fCreation,DWORD dwReserved); + HRESULT STDMETHODCALLTYPE GetClipboardData(DWORD dwReserved,IDataObject **ppDataObject); + HRESULT STDMETHODCALLTYPE DoVerb(LONG iVerb,LPMSG lpmsg,IOleClientSite *pActiveSite,LONG lindex, HWND hwndParent, LPCRECT lprcPosRect); + HRESULT STDMETHODCALLTYPE EnumVerbs(IEnumOLEVERB **ppEnumOleVerb); + HRESULT STDMETHODCALLTYPE Update(void); + HRESULT STDMETHODCALLTYPE IsUpToDate(void); + HRESULT STDMETHODCALLTYPE GetUserClassID(CLSID *pClsid); + HRESULT STDMETHODCALLTYPE GetUserType(DWORD dwFormOfType,LPOLESTR *pszUserType); + HRESULT STDMETHODCALLTYPE SetExtent(DWORD dwDrawAspect,SIZEL *psizel); + HRESULT STDMETHODCALLTYPE GetExtent(DWORD dwDrawAspect,SIZEL *psizel); + HRESULT STDMETHODCALLTYPE Advise(IAdviseSink *pAdvSink,DWORD *pdwConnection); + HRESULT STDMETHODCALLTYPE Unadvise(DWORD dwConnection); + HRESULT STDMETHODCALLTYPE EnumAdvise(IEnumSTATDATA **ppenumAdvise); + HRESULT STDMETHODCALLTYPE GetMiscStatus(DWORD dwAspect,DWORD *pdwStatus); + HRESULT STDMETHODCALLTYPE SetColorScheme(LOGPALETTE *pLogpal); + + /* IPersistStorage */ + HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pClassID); + HRESULT STDMETHODCALLTYPE IsDirty(void); + HRESULT STDMETHODCALLTYPE InitNew(IStorage *pStg); + HRESULT STDMETHODCALLTYPE Load(IStorage *pStg); + HRESULT STDMETHODCALLTYPE Save(IStorage *pStgSave, BOOL fSameAsLoad); + HRESULT STDMETHODCALLTYPE SaveCompleted(IStorage *pStgNew); + HRESULT STDMETHODCALLTYPE HandsOffStorage(void); + + /* IDataStorage */ + HRESULT STDMETHODCALLTYPE GetData(FORMATETC *pformatetcIn,STGMEDIUM *pmedium); + HRESULT STDMETHODCALLTYPE GetDataHere(FORMATETC *pformatetc,STGMEDIUM *pmedium); + HRESULT STDMETHODCALLTYPE QueryGetData(FORMATETC *pformatetc); + HRESULT STDMETHODCALLTYPE GetCanonicalFormatEtc(FORMATETC *pformatectIn,FORMATETC *pformatetcOut); + HRESULT STDMETHODCALLTYPE SetData(FORMATETC *pformatetc,STGMEDIUM *pmedium,BOOL fRelease); + HRESULT STDMETHODCALLTYPE EnumFormatEtc(DWORD dwDirection,IEnumFORMATETC **ppenumFormatEtc); + HRESULT STDMETHODCALLTYPE DAdvise(FORMATETC *pformatetc,DWORD advf,IAdviseSink *pAdvSink,DWORD *pdwConnection); + HRESULT STDMETHODCALLTYPE DUnadvise(DWORD dwConnection); + HRESULT STDMETHODCALLTYPE EnumDAdvise(IEnumSTATDATA **ppenumAdvise); + + /* IObjectSafety */ + HRESULT STDMETHODCALLTYPE GetInterfaceSafetyOptions(REFIID riid, DWORD *pdwSupportedOptions, DWORD *pdwEnabledOptions); + HRESULT STDMETHODCALLTYPE SetInterfaceSafetyOptions(REFIID riid, DWORD dwOptionSetMask, DWORD dwEnabledOptions); + + /* IObjectWithSite */ + HRESULT STDMETHODCALLTYPE GetSite(REFIID riid, void** ppvSite); + HRESULT STDMETHODCALLTYPE SetSite(IUnknown*); + + STDMETHOD (Test)(WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, unsigned int FAR *puArgErr); + STDMETHOD (getVersion)(WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, unsigned int FAR *puArgErr); +private: + LONG refCount; + IOleClientSite *client_site; + +private: +IWebBrowser2 *webBrowser_; +IConnectionPointContainer *connectionPointContainer; +DWORD cookie_; +IDispatch *document_; + +};
\ No newline at end of file diff --git a/Src/ie_plugin/WinampFactory.cpp b/Src/ie_plugin/WinampFactory.cpp new file mode 100644 index 00000000..3d7cb68b --- /dev/null +++ b/Src/ie_plugin/WinampFactory.cpp @@ -0,0 +1,65 @@ +#include "WinampFactory.h" +#include "Winamp.h" + +//FileTypeRegistrar registrar; + +WinampFactory::WinampFactory() +{ +} + +WinampFactory::~WinampFactory() +{ +} + +ULONG WinampFactory::AddRef() +{ + return 10; +} + +ULONG WinampFactory::Release() +{ + return 10; +} + +HRESULT WinampFactory::QueryInterface(REFIID riid, void ** ppAny) +{ + // IID_IUnknown is the REFIID of standard interface IUnknown + if(riid == IID_IUnknown) + { + *ppAny = (IUnknown *)this; + } + else if(riid == IID_IClassFactory) + { + *ppAny = (IClassFactory *)this; + } + else + { + *ppAny = NULL; + return E_NOINTERFACE; + } + + ((IUnknown *)(*ppAny))->AddRef(); + + return S_OK; +} + +HRESULT WinampFactory::LockServer(BOOL fLock) +{ + return S_OK; +} + +HRESULT WinampFactory::CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, void **ppAny) +{ + if(pUnkOuter != NULL) + { + return CLASS_E_NOAGGREGATION; + } + + Winamp *winamp = new Winamp; + HRESULT hr = winamp->QueryInterface(riid, ppAny); + if (FAILED(hr)) + delete winamp; + return hr; + + +}
\ No newline at end of file diff --git a/Src/ie_plugin/WinampFactory.h b/Src/ie_plugin/WinampFactory.h new file mode 100644 index 00000000..010cd661 --- /dev/null +++ b/Src/ie_plugin/WinampFactory.h @@ -0,0 +1,18 @@ +#pragma once + +#include <unknwn.h> + +class WinampFactory: public IClassFactory +{ +public: + WinampFactory(); + virtual ~WinampFactory(); + HRESULT __stdcall QueryInterface(REFIID riid, void ** ppAny); + ULONG __stdcall AddRef(); + ULONG __stdcall Release(); + + HRESULT __stdcall CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, void ** ppAny); + HRESULT __stdcall LockServer(BOOL fLock); +}; + + diff --git a/Src/ie_plugin/dlldata.c b/Src/ie_plugin/dlldata.c new file mode 100644 index 00000000..4ba7cef3 --- /dev/null +++ b/Src/ie_plugin/dlldata.c @@ -0,0 +1,38 @@ +/********************************************************* + DllData file -- generated by MIDL compiler + + DO NOT ALTER THIS FILE + + This file is regenerated by MIDL on every IDL file compile. + + To completely reconstruct this file, delete it and rerun MIDL + on all the IDL files in this DLL, specifying this file for the + /dlldata command line option + +*********************************************************/ + +#define PROXY_DELEGATION + +#include <rpcproxy.h> + +#ifdef __cplusplus +extern "C" { +#endif + +EXTERN_PROXY_FILE( IWinamp ) + + +PROXYFILE_LIST_START +/* Start of list */ + REFERENCE_PROXY_FILE( IWinamp ), +/* End of list */ +PROXYFILE_LIST_END + + +DLLDATA_ROUTINES( aProxyFileList, GET_DLL_CLSID ) + +#ifdef __cplusplus +} /*extern "C" */ +#endif + +/* end of generated dlldata file */ diff --git a/Src/ie_plugin/export.def b/Src/ie_plugin/export.def new file mode 100644 index 00000000..3851a78b --- /dev/null +++ b/Src/ie_plugin/export.def @@ -0,0 +1,7 @@ +LIBRARY "iewachk" +EXPORTS + +DllRegisterServer PRIVATE +DllUnregisterServer PRIVATE +DllCanUnloadNow PRIVATE +DllGetClassObject PRIVATE
\ No newline at end of file diff --git a/Src/ie_plugin/ie_plugin.sln b/Src/ie_plugin/ie_plugin.sln new file mode 100644 index 00000000..764005e8 --- /dev/null +++ b/Src/ie_plugin/ie_plugin.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ie_plugin", "ie_plugin.vcproj", "{4850D09C-B868-4FF4-A180-A76CB7070C40}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4850D09C-B868-4FF4-A180-A76CB7070C40}.Debug|Win32.ActiveCfg = Debug|Win32 + {4850D09C-B868-4FF4-A180-A76CB7070C40}.Debug|Win32.Build.0 = Debug|Win32 + {4850D09C-B868-4FF4-A180-A76CB7070C40}.Release|Win32.ActiveCfg = Release|Win32 + {4850D09C-B868-4FF4-A180-A76CB7070C40}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Src/ie_plugin/ie_plugin.vcproj b/Src/ie_plugin/ie_plugin.vcproj new file mode 100644 index 00000000..1ae029cf --- /dev/null +++ b/Src/ie_plugin/ie_plugin.vcproj @@ -0,0 +1,236 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9.00" + Name="ie_plugin" + ProjectGUID="{4850D09C-B868-4FF4-A180-A76CB7070C40}" + RootNamespace="ie_plugin" + Keyword="Win32Proj" + TargetFrameworkVersion="196613" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="2" + CharacterSet="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;IE_PLUGIN_EXPORTS;_CRT_SECURE_NO_WARNINGS" + MinimalRebuild="true" + BasicRuntimeChecks="3" + RuntimeLibrary="1" + UsePrecompiledHeader="0" + WarningLevel="3" + DebugInformationFormat="4" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="Version.lib shlwapi.lib" + OutputFile="$(ProgramFiles)\Winamp\browserplugins\ie\iewachk.dll" + LinkIncremental="2" + ModuleDefinitionFile="export.def" + GenerateDebugInformation="true" + SubSystem="2" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + CommandLine="IF NOT EXIST ..\output MD ..\output
IF NOT EXIST ..\output\winamp MD ..\output\winamp
IF NOT EXIST ..\output\winamp\browserplugins MD ..\output\winamp\browserplugins
IF NOT EXIST ..\output\winamp\browserplugins\ie MD ..\output\winamp\browserplugins\ie
COPY "$(ProgramFiles)"\Winamp\browserplugins\ie\iewachk.dll ..\output\winamp\browserplugins\ie
" + /> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="2" + CharacterSet="1" + WholeProgramOptimization="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="2" + EnableIntrinsicFunctions="true" + PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;IE_PLUGIN_EXPORTS;_CRT_SECURE_NO_WARNINGS" + StringPooling="true" + RuntimeLibrary="0" + BufferSecurityCheck="false" + RuntimeTypeInfo="false" + UsePrecompiledHeader="0" + WarningLevel="3" + DebugInformationFormat="3" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="Version.lib shlwapi.lib" + OutputFile="$(ProgramFiles)\Winamp\browserplugins\ie\iewachk.dll" + LinkIncremental="1" + IgnoreAllDefaultLibraries="false" + IgnoreDefaultLibraryNames="msvcprt.lib" + ModuleDefinitionFile="export.def" + GenerateDebugInformation="true" + SubSystem="2" + OptimizeReferences="2" + EnableCOMDATFolding="2" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source Files" + Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" + UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" + > + <File + RelativePath=".\export.def" + > + </File> + <File + RelativePath=".\main.cpp" + > + </File> + <File + RelativePath=".\test.html" + > + </File> + <File + RelativePath=".\Winamp.cpp" + > + </File> + <File + RelativePath=".\Winamp.h" + > + </File> + <File + RelativePath=".\WinampFactory.cpp" + > + </File> + <File + RelativePath=".\WinampFactory.h" + > + </File> + </Filter> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl;inc;xsd" + UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" + > + <File + RelativePath=".\resource.h" + > + </File> + </Filter> + <Filter + Name="Resource Files" + Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" + UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" + > + <File + RelativePath=".\winamp.rc" + > + </File> + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/Src/ie_plugin/main.cpp b/Src/ie_plugin/main.cpp new file mode 100644 index 00000000..4a8a8f7b --- /dev/null +++ b/Src/ie_plugin/main.cpp @@ -0,0 +1,169 @@ +#include <windows.h> +#include "Winamp.h" +#include "resource.h" +#include "WinampFactory.h" +#define INITGUID +#include <guiddef.h> +#include <strsafe.h> + +//D9C17076-9F55-49b5-8BEB-6A857931E62C +DEFINE_GUID(CLSID_Winamp,0xD9C17076,0x9F55,0x49b5,0x8B,0xEB,0x6A,0x85,0x79,0x31,0xE6,0x2C); + +static HRESULT UnregisterComponent(const CLSID &clsid); +static HRESULT RegisterComponent(HMODULE hModule, const CLSID &clsid, LPCWSTR pszFriendlyName); + +static const WCHAR szComponentFriendlyName[] = L"Winamp Application Detector"; + +static HINSTANCE hMainInstance=0; +static DWORD regID = 0; + +extern "C" +BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/) +{ + if (dwReason == DLL_PROCESS_ATTACH) + { + hMainInstance=hInstance; + + + // CoRegisterClassObject(CLSID_Winamp,(IClassFactory*)&cf, CLSCTX_INPROC_SERVER, REGCLS_MULTIPLEUSE, ®ID); + } + return TRUE; // ok +} + +STDAPI DllRegisterServer() +{ + HRESULT hr(S_OK); + hr = RegisterComponent(hMainInstance, CLSID_Winamp, szComponentFriendlyName); + return hr; +} + +STDAPI DllCanUnloadNow() +{ + return S_OK; +} + +STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID * ppv) +{ + HRESULT hr = E_OUTOFMEMORY; + *ppv = NULL; + + WinampFactory *winampFactory = new WinampFactory(); + if (winampFactory != NULL) { + hr = winampFactory->QueryInterface(riid, ppv); + winampFactory->Release(); + } + return hr; + +} + +STDAPI DllUnregisterServer() +{ + HRESULT hr(S_OK); + hr = UnregisterComponent(CLSID_Winamp); + return hr; +} + +static BOOL WriteRegKey(HKEY hKeyParent, LPCWSTR pszKey, LPCWSTR pszValue, HKEY *phKey = NULL) +{ + HKEY hKey; + LONG result; + result = RegCreateKeyExW(hKeyParent, pszKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL); + if (ERROR_SUCCESS != result || !hKey) return FALSE; + if (pszValue) { + result = RegSetValueExW(hKey, NULL, 0, REG_SZ, (BYTE*)pszValue, (DWORD)(sizeof(wchar_t)*(1 + lstrlenW(pszValue)))); + } + if (!phKey) RegCloseKey(hKey); + else *phKey = hKey; + + return (ERROR_SUCCESS == result); +} + +static BOOL WriteRegValue(HKEY hKeyParent, LPCWSTR pszKey, LPCWSTR pszEntry, LPCWSTR pszValue) +{ + HKEY hKey; + LONG result; + result = RegOpenKeyExW(hKeyParent, pszKey, 0, KEY_SET_VALUE, &hKey); + if (ERROR_SUCCESS != result || !hKey) return FALSE; + if (pszValue) + { + result = RegSetValueEx(hKey, pszEntry, 0, REG_SZ, (BYTE*)pszValue, (DWORD)(sizeof(wchar_t)*(1 + lstrlenW(pszValue)))); + } + RegCloseKey(hKey); + return (ERROR_SUCCESS == result); +} + +static BOOL WriteRegValue(HKEY hKeyParent, LPCWSTR pszKey, LPCWSTR pszEntry, DWORD pszValue) +{ + HKEY hKey; + LONG result; + result = RegOpenKeyExW(hKeyParent, pszKey, 0, KEY_SET_VALUE, &hKey); + if (ERROR_SUCCESS != result || !hKey) return FALSE; + if (pszValue) + { + result = RegSetValueEx(hKey, pszEntry, 0, REG_DWORD, (BYTE*)&pszValue, sizeof(DWORD)); + } + RegCloseKey(hKey); + return (ERROR_SUCCESS == result); +} + +static LONG DeleteRegKey(HKEY hKeyParent, LPCWSTR pszKey) +{ + HKEY hKey; + LONG result; + FILETIME time; + WCHAR szBuffer[512]; + DWORD dwSize = sizeof(szBuffer)/sizeof(WCHAR); + + result = RegOpenKeyExW(hKeyParent, pszKey, 0, KEY_SET_VALUE | KEY_ENUMERATE_SUB_KEYS , &hKey); + if (ERROR_SUCCESS != result) return result; + while (ERROR_SUCCESS == RegEnumKeyExW(hKey, 0, szBuffer, &dwSize, NULL, NULL, NULL, &time)) + { + if (ERROR_SUCCESS != (result = DeleteRegKey(hKey, szBuffer))) + { + RegCloseKey(hKey); + return result; + } + dwSize = sizeof(szBuffer)/sizeof(WCHAR); + } + + RegCloseKey(hKey); + return RegDeleteKeyW(hKeyParent, pszKey); +} + +static HRESULT RegisterComponent(HMODULE hModule, const CLSID &clsid, LPCWSTR pszFriendlyName) +{ + HKEY hKey, hKey2=0; + BOOL br; + WCHAR szBuffer[MAX_PATH], szCLSID[64]; + + if (!StringFromGUID2(clsid, szCLSID, sizeof(szCLSID)/sizeof(WCHAR))) return E_OUTOFMEMORY; + StringCchPrintfW(szBuffer, sizeof(szBuffer)/sizeof(WCHAR), L"CLSID\\%s", szCLSID); + + if (!WriteRegKey(HKEY_CLASSES_ROOT, szBuffer, pszFriendlyName, &hKey)) return E_ACCESSDENIED; + + if (!GetModuleFileNameW(hModule, szBuffer, sizeof(szBuffer)/sizeof(WCHAR))) return S_FALSE; + //wchar_t localizedString[MAX_PATH+15]; + //StringCbPrintf(localizedString, sizeof(localizedString), L"@%s,-%u", szBuffer, IDS_WINAMP); + + br = (WriteRegKey(hKey, L"InProcServer32" , szBuffer, &hKey2) && + WriteRegValue(hKey2, NULL, L"ThreadingModel", L"Both")); + RegCloseKey(hKey); + if (hKey2) RegCloseKey(hKey2); + if (!br) return E_ACCESSDENIED; + + return S_OK; +} + +static HRESULT UnregisterComponent(const CLSID &clsid) +{ + LONG result; + WCHAR szBuffer[MAX_PATH], szCLSID[64]; + if (!StringFromGUID2(clsid, szCLSID, sizeof(szCLSID)/sizeof(WCHAR))) return E_OUTOFMEMORY; + StringCchPrintfW(szBuffer, sizeof(szBuffer)/sizeof(WCHAR), L"CLSID\\%s", szCLSID); + + result = DeleteRegKey(HKEY_CLASSES_ROOT, szBuffer); + if (ERROR_SUCCESS != result && ERROR_FILE_NOT_FOUND != result) return S_FALSE; + + + return S_OK; +} diff --git a/Src/ie_plugin/resource.h b/Src/ie_plugin/resource.h new file mode 100644 index 00000000..fd963a45 --- /dev/null +++ b/Src/ie_plugin/resource.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by winamp.rc +// +#define IDS_WINAMP 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/Src/ie_plugin/winamp.rc b/Src/ie_plugin/winamp.rc new file mode 100644 index 00000000..9b041f79 --- /dev/null +++ b/Src/ie_plugin/winamp.rc @@ -0,0 +1,113 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,0,1 + PRODUCTVERSION 1,0,0,1 + FILEFLAGSMASK 0x17L +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "CompanyName", "Winamp SA" + VALUE "FileDescription", "Winamp Application Detector" + VALUE "FileVersion", "1, 0, 0, 1" + VALUE "InternalName", "AppDetector" + VALUE "LegalCopyright", "Copyright © 2009-2014 Winamp SA" + VALUE "OriginalFilename", "iewachk.dll" + VALUE "ProductName", "Winamp Application Detector" + VALUE "ProductVersion", "1, 0, 0, 1" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE +BEGIN + IDS_WINAMP "Nullsoft Winamp" +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + |