vbscript: Added CreateObject implementation.

This commit is contained in:
Jacek Caban 2011-09-22 14:25:27 +02:00 committed by Alexandre Julliard
parent abb2d28721
commit 0d039cc6eb
5 changed files with 140 additions and 3 deletions

View File

@ -1,5 +1,5 @@
MODULE = vbscript.dll MODULE = vbscript.dll
IMPORTS = oleaut32 IMPORTS = oleaut32 ole32
C_SRCS = \ C_SRCS = \
compile.c \ compile.c \

View File

@ -19,10 +19,118 @@
#include "vbscript.h" #include "vbscript.h"
#include "vbscript_defs.h" #include "vbscript_defs.h"
#include "mshtmhst.h"
#include "objsafe.h"
#include "wine/debug.h" #include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(vbscript); WINE_DEFAULT_DEBUG_CHANNEL(vbscript);
#define VB_E_CANNOT_CREATE_OBJ 0x800a01ad
/* Defined as extern in urlmon.idl, but not exported by uuid.lib */
const GUID GUID_CUSTOM_CONFIRMOBJECTSAFETY =
{0x10200490,0xfa38,0x11d0,{0xac,0x0e,0x00,0xa0,0xc9,0xf,0xff,0xc0}};
static IInternetHostSecurityManager *get_sec_mgr(script_ctx_t *ctx)
{
IInternetHostSecurityManager *secmgr;
IServiceProvider *sp;
HRESULT hres;
if(!ctx->site)
return NULL;
if(ctx->secmgr)
return ctx->secmgr;
hres = IActiveScriptSite_QueryInterface(ctx->site, &IID_IServiceProvider, (void**)&sp);
if(FAILED(hres))
return NULL;
hres = IServiceProvider_QueryService(sp, &SID_SInternetHostSecurityManager, &IID_IInternetHostSecurityManager,
(void**)&secmgr);
IServiceProvider_Release(sp);
if(FAILED(hres))
return NULL;
return ctx->secmgr = secmgr;
}
static IUnknown *create_object(script_ctx_t *ctx, const WCHAR *progid)
{
IInternetHostSecurityManager *secmgr = NULL;
IObjectWithSite *obj_site;
struct CONFIRMSAFETY cs;
IClassFactoryEx *cfex;
IClassFactory *cf;
DWORD policy_size;
BYTE *bpolicy;
IUnknown *obj;
DWORD policy;
GUID guid;
HRESULT hres;
hres = CLSIDFromProgID(progid, &guid);
if(FAILED(hres))
return NULL;
TRACE("GUID %s\n", debugstr_guid(&guid));
if(ctx->safeopt & INTERFACE_USES_SECURITY_MANAGER) {
secmgr = get_sec_mgr(ctx);
if(!secmgr)
return NULL;
policy = 0;
hres = IInternetHostSecurityManager_ProcessUrlAction(secmgr, URLACTION_ACTIVEX_RUN,
(BYTE*)&policy, sizeof(policy), (BYTE*)&guid, sizeof(GUID), 0, 0);
if(FAILED(hres) || policy != URLPOLICY_ALLOW)
return NULL;
}
hres = CoGetClassObject(&guid, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, NULL, &IID_IClassFactory, (void**)&cf);
if(FAILED(hres))
return NULL;
hres = IClassFactory_QueryInterface(cf, &IID_IClassFactoryEx, (void**)&cfex);
if(SUCCEEDED(hres)) {
FIXME("Use IClassFactoryEx\n");
IClassFactoryEx_Release(cfex);
}
hres = IClassFactory_CreateInstance(cf, NULL, &IID_IUnknown, (void**)&obj);
if(FAILED(hres))
return NULL;
if(secmgr) {
cs.clsid = guid;
cs.pUnk = obj;
cs.dwFlags = 0;
hres = IInternetHostSecurityManager_QueryCustomPolicy(secmgr, &GUID_CUSTOM_CONFIRMOBJECTSAFETY,
&bpolicy, &policy_size, (BYTE*)&cs, sizeof(cs), 0);
if(SUCCEEDED(hres)) {
policy = policy_size >= sizeof(DWORD) ? *(DWORD*)bpolicy : URLPOLICY_DISALLOW;
CoTaskMemFree(bpolicy);
}
if(FAILED(hres) || policy != URLPOLICY_ALLOW) {
IUnknown_Release(obj);
return NULL;
}
}
hres = IUnknown_QueryInterface(obj, &IID_IObjectWithSite, (void**)&obj_site);
if(SUCCEEDED(hres)) {
FIXME("ObjectWithSite\n");
IObjectWithSite_Release(obj_site);
IUnknown_Release(obj);
return NULL;
}
return obj;
}
static HRESULT Global_CCur(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res) static HRESULT Global_CCur(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
{ {
FIXME("\n"); FIXME("\n");
@ -483,8 +591,30 @@ static HRESULT Global_MsgBox(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VA
static HRESULT Global_CreateObject(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res) static HRESULT Global_CreateObject(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
{ {
FIXME("\n"); IUnknown *obj;
return E_NOTIMPL; HRESULT hres;
TRACE("(%s)\n", debugstr_variant(arg));
if(V_VT(arg) != VT_BSTR) {
FIXME("non-bstr arg\n");
return E_INVALIDARG;
}
obj = create_object(This->desc->ctx, V_BSTR(arg));
if(!obj)
return VB_E_CANNOT_CREATE_OBJ;
if(res) {
hres = IUnknown_QueryInterface(obj, &IID_IDispatch, (void**)&V_DISPATCH(res));
if(FAILED(hres))
return hres;
V_VT(res) = VT_DISPATCH;
}
IUnknown_Release(obj);
return S_OK;
} }
static HRESULT Global_GetObject(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res) static HRESULT Global_GetObject(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)

View File

@ -129,6 +129,8 @@ static void destroy_script(script_ctx_t *ctx)
if(ctx->host_global) if(ctx->host_global)
IDispatch_Release(ctx->host_global); IDispatch_Release(ctx->host_global);
if(ctx->secmgr)
IInternetHostSecurityManager_Release(ctx->secmgr);
if(ctx->site) if(ctx->site)
IActiveScriptSite_Release(ctx->site); IActiveScriptSite_Release(ctx->site);
if(ctx->err_obj) if(ctx->err_obj)
@ -516,6 +518,7 @@ static HRESULT WINAPI VBScriptParse_InitNew(IActiveScriptParse *iface)
if(!ctx) if(!ctx)
return E_OUTOFMEMORY; return E_OUTOFMEMORY;
ctx->safeopt = This->safeopt;
vbsheap_init(&ctx->heap); vbsheap_init(&ctx->heap);
list_init(&ctx->objects); list_init(&ctx->objects);
list_init(&ctx->code_list); list_init(&ctx->code_list);

View File

@ -143,6 +143,9 @@ struct _script_ctx_t {
IActiveScriptSite *site; IActiveScriptSite *site;
LCID lcid; LCID lcid;
IInternetHostSecurityManager *secmgr;
DWORD safeopt;
IDispatch *host_global; IDispatch *host_global;
class_desc_t script_desc; class_desc_t script_desc;

View File

@ -20,6 +20,7 @@
#include "vbscript.h" #include "vbscript.h"
#include "objsafe.h" #include "objsafe.h"
#include "mshtmhst.h"
#include "rpcproxy.h" #include "rpcproxy.h"
#include "vbscript_classes.h" #include "vbscript_classes.h"
#include "vbsglobal.h" #include "vbsglobal.h"