ole32: Support BIND_OPTS3 in bind context.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
stable
Nikolay Sivov 2019-11-03 23:58:58 +03:00 committed by Alexandre Julliard
parent ab6274180b
commit 89ef98ab8a
2 changed files with 23 additions and 28 deletions

View File

@ -57,7 +57,7 @@ typedef struct BindCtxImpl{
DWORD bindCtxTableLastIndex; /* first free index in the table */
DWORD bindCtxTableSize; /* size table */
BIND_OPTS2 bindOption2; /* a structure which contains the bind options*/
BIND_OPTS3 options;
} BindCtxImpl;
@ -246,17 +246,17 @@ BindCtxImpl_SetBindOptions(IBindCtx* iface,BIND_OPTS *pbindopts)
{
BindCtxImpl *This = impl_from_IBindCtx(iface);
TRACE("(%p,%p)\n",This,pbindopts);
TRACE("(%p,%p)\n",This, pbindopts);
if (pbindopts==NULL)
return E_POINTER;
if (pbindopts->cbStruct > sizeof(BIND_OPTS2))
if (pbindopts->cbStruct > sizeof(This->options))
{
WARN("invalid size\n");
return E_INVALIDARG; /* FIXME : not verified */
WARN("invalid size %u.\n", pbindopts->cbStruct);
return E_INVALIDARG;
}
memcpy(&This->bindOption2, pbindopts, pbindopts->cbStruct);
memcpy(&This->options, pbindopts, pbindopts->cbStruct);
return S_OK;
}
@ -267,19 +267,16 @@ static HRESULT WINAPI
BindCtxImpl_GetBindOptions(IBindCtx* iface,BIND_OPTS *pbindopts)
{
BindCtxImpl *This = impl_from_IBindCtx(iface);
ULONG cbStruct;
DWORD size;
TRACE("(%p,%p)\n",This,pbindopts);
if (pbindopts==NULL)
return E_POINTER;
cbStruct = pbindopts->cbStruct;
if (cbStruct > sizeof(BIND_OPTS2))
cbStruct = sizeof(BIND_OPTS2);
memcpy(pbindopts, &This->bindOption2, cbStruct);
pbindopts->cbStruct = cbStruct;
size = min(pbindopts->cbStruct, sizeof(This->options));
memcpy(pbindopts, &This->options, size);
pbindopts->cbStruct = size;
return S_OK;
}
@ -520,16 +517,11 @@ static HRESULT BindCtxImpl_Construct(BindCtxImpl* This)
This->IBindCtx_iface.lpVtbl = &VT_BindCtxImpl;
This->ref = 0;
/* Initialize the BIND_OPTS2 structure */
This->bindOption2.cbStruct = sizeof(BIND_OPTS2);
This->bindOption2.grfFlags = 0;
This->bindOption2.grfMode = STGM_READWRITE;
This->bindOption2.dwTickCountDeadline = 0;
This->bindOption2.dwTrackFlags = 0;
This->bindOption2.dwClassContext = CLSCTX_SERVER;
This->bindOption2.locale = GetThreadLocale();
This->bindOption2.pServerInfo = 0;
memset(&This->options, 0, sizeof(This->options));
This->options.cbStruct = sizeof(This->options);
This->options.grfMode = STGM_READWRITE;
This->options.dwClassContext = CLSCTX_SERVER;
This->options.locale = GetThreadLocale();
/* Initialize the bindctx table */
This->bindCtxTableSize=0;

View File

@ -1888,7 +1888,7 @@ static void test_bind_context(void)
HRESULT hr;
IBindCtx *pBindCtx;
IEnumString *pEnumString;
BIND_OPTS2 bind_opts;
BIND_OPTS3 bind_opts;
HeapUnknown *unknown;
HeapUnknown *unknown2;
IUnknown *param_obj;
@ -1908,19 +1908,20 @@ static void test_bind_context(void)
bind_opts.cbStruct = -1;
hr = IBindCtx_GetBindOptions(pBindCtx, (BIND_OPTS *)&bind_opts);
ok_ole_success(hr, "IBindCtx_GetBindOptions");
ok(bind_opts.cbStruct == sizeof(bind_opts) ||
bind_opts.cbStruct == sizeof(bind_opts) + sizeof(void*), /* Vista */
"bind_opts.cbStruct was %d\n", bind_opts.cbStruct);
ok(bind_opts.cbStruct == sizeof(BIND_OPTS3) || broken(bind_opts.cbStruct == sizeof(BIND_OPTS2)) /* XP */,
"Unexpected bind_opts.cbStruct %d.\n", bind_opts.cbStruct);
bind_opts.cbStruct = sizeof(BIND_OPTS);
hr = IBindCtx_GetBindOptions(pBindCtx, (BIND_OPTS *)&bind_opts);
ok_ole_success(hr, "IBindCtx_GetBindOptions");
ok(bind_opts.cbStruct == sizeof(BIND_OPTS), "bind_opts.cbStruct was %d\n", bind_opts.cbStruct);
memset(&bind_opts, 0xfe, sizeof(bind_opts));
bind_opts.cbStruct = sizeof(bind_opts);
hr = IBindCtx_GetBindOptions(pBindCtx, (BIND_OPTS *)&bind_opts);
ok_ole_success(hr, "IBindCtx_GetBindOptions");
ok(bind_opts.cbStruct == sizeof(bind_opts), "bind_opts.cbStruct was %d\n", bind_opts.cbStruct);
ok(bind_opts.cbStruct == sizeof(bind_opts) || bind_opts.cbStruct == sizeof(BIND_OPTS2) /* XP */,
"Unexpected bind_opts.cbStruct %d.\n", bind_opts.cbStruct);
ok(bind_opts.grfFlags == 0, "bind_opts.grfFlags was 0x%x instead of 0\n", bind_opts.grfFlags);
ok(bind_opts.grfMode == STGM_READWRITE, "bind_opts.grfMode was 0x%x instead of STGM_READWRITE\n", bind_opts.grfMode);
ok(bind_opts.dwTickCountDeadline == 0, "bind_opts.dwTickCountDeadline was %d instead of 0\n", bind_opts.dwTickCountDeadline);
@ -1929,6 +1930,8 @@ static void test_bind_context(void)
"bind_opts.dwClassContext should have been 0x15 instead of 0x%x\n", bind_opts.dwClassContext);
ok(bind_opts.locale == GetThreadLocale(), "bind_opts.locale should have been 0x%x instead of 0x%x\n", GetThreadLocale(), bind_opts.locale);
ok(bind_opts.pServerInfo == NULL, "bind_opts.pServerInfo should have been NULL instead of %p\n", bind_opts.pServerInfo);
if (bind_opts.cbStruct >= sizeof(BIND_OPTS3))
ok(bind_opts.hwnd == NULL, "Unexpected bind_opts.hwnd %p.\n", bind_opts.hwnd);
bind_opts.cbStruct = -1;
hr = IBindCtx_SetBindOptions(pBindCtx, (BIND_OPTS *)&bind_opts);