Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
9c44cb4f
Commit
9c44cb4f
authored
Sep 02, 2013
by
Nikolay Sivov
Committed by
Alexandre Julliard
Sep 02, 2013
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ntdll: Store all interface redirection data in context.
parent
3c0b7ba0
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
90 additions
and
9 deletions
+90
-9
actctx.c
dlls/kernel32/tests/actctx.c
+9
-0
actctx.c
dlls/ntdll/actctx.c
+81
-9
No files found.
dlls/kernel32/tests/actctx.c
View file @
9c44cb4f
...
...
@@ -92,6 +92,7 @@ DEFINE_GUID(IID_TlibTest4, 0x99999999, 0x8888, 0x7777, 0x66, 0x66, 0x55, 0x55, 0
DEFINE_GUID
(
IID_Iifaceps
,
0x66666666
,
0x8888
,
0x7777
,
0x66
,
0x66
,
0x55
,
0x55
,
0x55
,
0x55
,
0x55
,
0x55
);
DEFINE_GUID
(
IID_Ibifaceps
,
0x66666666
,
0x8888
,
0x7777
,
0x66
,
0x66
,
0x55
,
0x55
,
0x55
,
0x55
,
0x55
,
0x57
);
DEFINE_GUID
(
IID_Iifaceps2
,
0x76666666
,
0x8888
,
0x7777
,
0x66
,
0x66
,
0x55
,
0x55
,
0x55
,
0x55
,
0x55
,
0x55
);
DEFINE_GUID
(
IID_Iifaceps3
,
0x86666666
,
0x8888
,
0x7777
,
0x66
,
0x66
,
0x55
,
0x55
,
0x55
,
0x55
,
0x55
,
0x55
);
DEFINE_GUID
(
IID_PS32
,
0x66666666
,
0x8888
,
0x7777
,
0x66
,
0x66
,
0x55
,
0x55
,
0x55
,
0x55
,
0x55
,
0x56
);
static
const
char
manifest3
[]
=
...
...
@@ -129,6 +130,13 @@ static const char manifest3[] =
" numMethods=
\"
10
\"
"
" baseInterface=
\"
{66666666-8888-7777-6666-555555555557}
\"
"
" />"
" <comInterfaceExternalProxyStub "
" name=
\"
Iifaceps3
\"
"
" tlbid=
\"
{99999999-8888-7777-6666-555555555558}
\"
"
" iid=
\"
{86666666-8888-7777-6666-555555555555}
\"
"
" numMethods=
\"
10
\"
"
" baseInterface=
\"
{66666666-8888-7777-6666-555555555557}
\"
"
" />"
"</assembly>"
;
static
const
char
manifest_wndcls1
[]
=
...
...
@@ -1629,6 +1637,7 @@ static void test_actctx(void)
test_find_com_redirection
(
handle
,
&
IID_CoTest
,
&
IID_TlibTest
,
1
,
__LINE__
);
test_find_ifaceps_redirection
(
handle
,
&
IID_Iifaceps
,
&
IID_TlibTest4
,
&
IID_Ibifaceps
,
NULL
,
1
,
__LINE__
);
test_find_ifaceps_redirection
(
handle
,
&
IID_Iifaceps2
,
&
IID_TlibTest4
,
&
IID_Ibifaceps
,
&
IID_PS32
,
1
,
__LINE__
);
test_find_ifaceps_redirection
(
handle
,
&
IID_Iifaceps3
,
&
IID_TlibTest4
,
&
IID_Ibifaceps
,
NULL
,
1
,
__LINE__
);
test_find_string_fail
();
b
=
pDeactivateActCtx
(
0
,
cookie
);
ok
(
b
,
"DeactivateActCtx failed: %u
\n
"
,
GetLastError
());
...
...
dlls/ntdll/actctx.c
View file @
9c44cb4f
...
...
@@ -242,6 +242,12 @@ struct comclassredirect_data
DWORD
miscstatusdocprint
;
};
enum
ifaceps_mask
{
NumMethods
=
1
,
BaseIface
=
2
};
/*
Sections structure.
...
...
@@ -339,8 +345,13 @@ struct entity
}
comclass
;
struct
{
WCHAR
*
iid
;
WCHAR
*
base
;
WCHAR
*
tlib
;
WCHAR
*
name
;
}
proxy
;
WCHAR
*
ps32
;
/* only stored for 'comInterfaceExternalProxyStub' */
DWORD
mask
;
ULONG
nummethods
;
}
ifaceps
;
struct
{
WCHAR
*
name
;
...
...
@@ -478,6 +489,9 @@ static const WCHAR miscstatusiconW[] = {'m','i','s','c','S','t','a','t','u','s',
static
const
WCHAR
miscstatuscontentW
[]
=
{
'm'
,
'i'
,
's'
,
'c'
,
'S'
,
't'
,
'a'
,
't'
,
'u'
,
's'
,
'C'
,
'o'
,
'n'
,
't'
,
'e'
,
'n'
,
't'
,
0
};
static
const
WCHAR
miscstatusthumbnailW
[]
=
{
'm'
,
'i'
,
's'
,
'c'
,
'S'
,
't'
,
'a'
,
't'
,
'u'
,
's'
,
'T'
,
'h'
,
'u'
,
'm'
,
'b'
,
'n'
,
'a'
,
'i'
,
'l'
,
0
};
static
const
WCHAR
miscstatusdocprintW
[]
=
{
'm'
,
'i'
,
's'
,
'c'
,
'S'
,
't'
,
'a'
,
't'
,
'u'
,
's'
,
'D'
,
'o'
,
'c'
,
'P'
,
'r'
,
'i'
,
'n'
,
't'
,
0
};
static
const
WCHAR
baseInterfaceW
[]
=
{
'b'
,
'a'
,
's'
,
'e'
,
'I'
,
'n'
,
't'
,
'e'
,
'r'
,
'f'
,
'a'
,
'c'
,
'e'
,
0
};
static
const
WCHAR
nummethodsW
[]
=
{
'n'
,
'u'
,
'm'
,
'M'
,
'e'
,
't'
,
'h'
,
'o'
,
'd'
,
's'
,
0
};
static
const
WCHAR
proxyStubClsid32W
[]
=
{
'p'
,
'r'
,
'o'
,
'x'
,
'y'
,
'S'
,
't'
,
'u'
,
'b'
,
'C'
,
'l'
,
's'
,
'i'
,
'd'
,
'3'
,
'2'
,
0
};
static
const
WCHAR
activatewhenvisibleW
[]
=
{
'a'
,
'c'
,
't'
,
'i'
,
'v'
,
'a'
,
't'
,
'e'
,
'w'
,
'h'
,
'e'
,
'n'
,
'v'
,
'i'
,
's'
,
'i'
,
'b'
,
'l'
,
'e'
,
0
};
static
const
WCHAR
actslikebuttonW
[]
=
{
'a'
,
'c'
,
't'
,
's'
,
'l'
,
'i'
,
'k'
,
'e'
,
'b'
,
'u'
,
't'
,
't'
,
'o'
,
'n'
,
0
};
...
...
@@ -722,8 +736,10 @@ static void free_entity_array(struct entity_array *array)
RtlFreeHeap
(
GetProcessHeap
(),
0
,
entity
->
u
.
comclass
.
progid
);
break
;
case
ACTIVATION_CONTEXT_SECTION_COM_INTERFACE_REDIRECTION
:
RtlFreeHeap
(
GetProcessHeap
(),
0
,
entity
->
u
.
proxy
.
iid
);
RtlFreeHeap
(
GetProcessHeap
(),
0
,
entity
->
u
.
proxy
.
name
);
RtlFreeHeap
(
GetProcessHeap
(),
0
,
entity
->
u
.
ifaceps
.
iid
);
RtlFreeHeap
(
GetProcessHeap
(),
0
,
entity
->
u
.
ifaceps
.
base
);
RtlFreeHeap
(
GetProcessHeap
(),
0
,
entity
->
u
.
ifaceps
.
ps32
);
RtlFreeHeap
(
GetProcessHeap
(),
0
,
entity
->
u
.
ifaceps
.
name
);
break
;
case
ACTIVATION_CONTEXT_SECTION_COM_TYPE_LIBRARY_REDIRECTION
:
RtlFreeHeap
(
GetProcessHeap
(),
0
,
entity
->
u
.
typelib
.
tlbid
);
...
...
@@ -1377,6 +1393,26 @@ static BOOL parse_com_class_elem(xmlbuf_t* xmlbuf, struct dll_redirect* dll, str
return
ret
;
}
static
BOOL
parse_nummethods
(
const
xmlstr_t
*
str
,
struct
entity
*
entity
)
{
const
WCHAR
*
curr
;
ULONG
num
=
0
;
for
(
curr
=
str
->
ptr
;
curr
<
str
->
ptr
+
str
->
len
;
curr
++
)
{
if
(
*
curr
>=
'0'
&&
*
curr
<=
'9'
)
num
=
num
*
10
+
*
curr
-
'0'
;
else
{
ERR
(
"wrong numeric value %s
\n
"
,
debugstr_xmlstr
(
str
));
return
FALSE
;
}
}
entity
->
u
.
ifaceps
.
nummethods
=
num
;
return
TRUE
;
}
static
BOOL
parse_cominterface_proxy_stub_elem
(
xmlbuf_t
*
xmlbuf
,
struct
dll_redirect
*
dll
)
{
xmlstr_t
attr_name
,
attr_value
;
...
...
@@ -1390,11 +1426,29 @@ static BOOL parse_cominterface_proxy_stub_elem(xmlbuf_t* xmlbuf, struct dll_redi
{
if
(
xmlstr_cmp
(
&
attr_name
,
iidW
))
{
if
(
!
(
entity
->
u
.
proxy
.
iid
=
xmlstrdupW
(
&
attr_value
)))
return
FALSE
;
if
(
!
(
entity
->
u
.
ifaceps
.
iid
=
xmlstrdupW
(
&
attr_value
)))
return
FALSE
;
}
if
(
xmlstr_cmp
(
&
attr_name
,
nameW
))
else
if
(
xmlstr_cmp
(
&
attr_name
,
nameW
))
{
if
(
!
(
entity
->
u
.
ifaceps
.
name
=
xmlstrdupW
(
&
attr_value
)))
return
FALSE
;
}
else
if
(
xmlstr_cmp
(
&
attr_name
,
baseInterfaceW
))
{
if
(
!
(
entity
->
u
.
ifaceps
.
base
=
xmlstrdupW
(
&
attr_value
)))
return
FALSE
;
entity
->
u
.
ifaceps
.
mask
|=
BaseIface
;
}
else
if
(
xmlstr_cmp
(
&
attr_name
,
nummethodsW
))
{
if
(
!
(
parse_nummethods
(
&
attr_value
,
entity
)))
return
FALSE
;
entity
->
u
.
ifaceps
.
mask
|=
NumMethods
;
}
else
if
(
xmlstr_cmp
(
&
attr_name
,
tlbidW
))
{
if
(
!
(
entity
->
u
.
ifaceps
.
tlib
=
xmlstrdupW
(
&
attr_value
)))
return
FALSE
;
}
/* not used */
else
if
(
xmlstr_cmp
(
&
attr_name
,
proxyStubClsid32W
)
||
xmlstr_cmp
(
&
attr_name
,
threadingmodelW
))
{
if
(
!
(
entity
->
u
.
proxy
.
name
=
xmlstrdupW
(
&
attr_value
)))
return
FALSE
;
}
else
{
...
...
@@ -1646,11 +1700,29 @@ static BOOL parse_com_interface_external_proxy_stub_elem(xmlbuf_t* xmlbuf,
{
if
(
xmlstr_cmp
(
&
attr_name
,
iidW
))
{
if
(
!
(
entity
->
u
.
proxy
.
iid
=
xmlstrdupW
(
&
attr_value
)))
return
FALSE
;
if
(
!
(
entity
->
u
.
ifaceps
.
iid
=
xmlstrdupW
(
&
attr_value
)))
return
FALSE
;
}
if
(
xmlstr_cmp
(
&
attr_name
,
nameW
))
else
if
(
xmlstr_cmp
(
&
attr_name
,
nameW
))
{
if
(
!
(
entity
->
u
.
ifaceps
.
name
=
xmlstrdupW
(
&
attr_value
)))
return
FALSE
;
}
else
if
(
xmlstr_cmp
(
&
attr_name
,
baseInterfaceW
))
{
if
(
!
(
entity
->
u
.
ifaceps
.
base
=
xmlstrdupW
(
&
attr_value
)))
return
FALSE
;
entity
->
u
.
ifaceps
.
mask
|=
BaseIface
;
}
else
if
(
xmlstr_cmp
(
&
attr_name
,
nummethodsW
))
{
if
(
!
(
parse_nummethods
(
&
attr_value
,
entity
)))
return
FALSE
;
entity
->
u
.
ifaceps
.
mask
|=
NumMethods
;
}
else
if
(
xmlstr_cmp
(
&
attr_name
,
proxyStubClsid32W
))
{
if
(
!
(
entity
->
u
.
ifaceps
.
ps32
=
xmlstrdupW
(
&
attr_value
)))
return
FALSE
;
}
else
if
(
xmlstr_cmp
(
&
attr_name
,
tlbidW
))
{
if
(
!
(
entity
->
u
.
proxy
.
name
=
xmlstrdupW
(
&
attr_value
)))
return
FALSE
;
if
(
!
(
entity
->
u
.
ifaceps
.
tlib
=
xmlstrdupW
(
&
attr_value
)))
return
FALSE
;
}
else
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment