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
b8a973dc
Commit
b8a973dc
authored
Sep 13, 2013
by
Nikolay Sivov
Committed by
Alexandre Julliard
Sep 13, 2013
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
kernel32/tests: Some tests for ProgID section.
parent
15b6ff20
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
109 additions
and
7 deletions
+109
-7
actctx.c
dlls/kernel32/tests/actctx.c
+101
-2
actctx.c
dlls/ntdll/actctx.c
+8
-5
No files found.
dlls/kernel32/tests/actctx.c
View file @
b8a973dc
...
...
@@ -31,6 +31,7 @@ static BOOL (WINAPI *pActivateActCtx)(HANDLE,ULONG_PTR*);
static
HANDLE
(
WINAPI
*
pCreateActCtxA
)(
PCACTCTXA
);
static
HANDLE
(
WINAPI
*
pCreateActCtxW
)(
PCACTCTXW
);
static
BOOL
(
WINAPI
*
pDeactivateActCtx
)(
DWORD
,
ULONG_PTR
);
static
BOOL
(
WINAPI
*
pFindActCtxSectionStringA
)(
DWORD
,
const
GUID
*
,
ULONG
,
LPCSTR
,
PACTCTX_SECTION_KEYED_DATA
);
static
BOOL
(
WINAPI
*
pFindActCtxSectionStringW
)(
DWORD
,
const
GUID
*
,
ULONG
,
LPCWSTR
,
PACTCTX_SECTION_KEYED_DATA
);
static
BOOL
(
WINAPI
*
pGetCurrentActCtx
)(
HANDLE
*
);
static
BOOL
(
WINAPI
*
pIsDebuggerPresent
)(
void
);
...
...
@@ -86,6 +87,7 @@ static const char manifest2[] =
"</assembly>"
;
DEFINE_GUID
(
IID_CoTest
,
0x12345678
,
0x1234
,
0x5678
,
0x12
,
0x34
,
0x11
,
0x11
,
0x22
,
0x22
,
0x33
,
0x33
);
DEFINE_GUID
(
IID_CoTest2
,
0x12345678
,
0x1234
,
0x5678
,
0x12
,
0x34
,
0x11
,
0x11
,
0x22
,
0x22
,
0x33
,
0x34
);
DEFINE_GUID
(
CLSID_clrclass
,
0x22345678
,
0x1234
,
0x5678
,
0x12
,
0x34
,
0x11
,
0x11
,
0x22
,
0x22
,
0x33
,
0x33
);
DEFINE_GUID
(
IID_TlibTest
,
0x99999999
,
0x8888
,
0x7777
,
0x66
,
0x66
,
0x55
,
0x55
,
0x55
,
0x55
,
0x55
,
0x55
);
DEFINE_GUID
(
IID_TlibTest2
,
0x99999999
,
0x8888
,
0x7777
,
0x66
,
0x66
,
0x55
,
0x55
,
0x55
,
0x55
,
0x55
,
0x56
);
...
...
@@ -122,6 +124,9 @@ static const char manifest3[] =
" <progid>ProgId.ProgId.5</progid>"
" <progid>ProgId.ProgId.6</progid>"
" </comClass>"
" <comClass clsid=
\"
{12345678-1234-5678-1234-111122223334}
\"
threadingModel=
\"
Neutral
\"
>"
" <progid>ProgId.ProgId.7</progid>"
" </comClass>"
" <comInterfaceProxyStub "
" name=
\"
Iifaceps
\"
"
" tlbid=
\"
{99999999-8888-7777-6666-555555555558}
\"
"
...
...
@@ -837,7 +842,9 @@ struct strsection_header
DWORD
unk1
[
3
];
ULONG
count
;
ULONG
index_offset
;
DWORD
unk2
[
4
];
DWORD
unk2
[
2
];
ULONG
global_offset
;
ULONG
global_len
;
};
struct
string_index
...
...
@@ -901,6 +908,13 @@ struct tlibredirect_data
WORD
minor_version
;
};
struct
progidredirect_data
{
ULONG
size
;
DWORD
reserved
;
ULONG
clsid_offset
;
};
static
void
test_find_dll_redirection
(
HANDLE
handle
,
LPCWSTR
libname
,
ULONG
exid
,
int
line
)
{
ACTCTX_SECTION_KEYED_DATA
data
;
...
...
@@ -1225,19 +1239,29 @@ static void test_find_com_redirection(HANDLE handle, const GUID *clsid, const GU
ok_
(
__FILE__
,
line
)(
comclass
->
model
==
ThreadingModel_Neutral
,
"got model %d
\n
"
,
comclass
->
model
);
ok_
(
__FILE__
,
line
)(
IsEqualGUID
(
&
comclass
->
clsid
,
clsid
),
"got wrong clsid %s
\n
"
,
debugstr_guid
(
&
comclass
->
clsid
));
ok_
(
__FILE__
,
line
)(
IsEqualGUID
(
&
comclass
->
clsid2
,
clsid
),
"got wrong clsid2 %s
\n
"
,
debugstr_guid
(
&
comclass
->
clsid2
));
if
(
tlid
)
ok_
(
__FILE__
,
line
)(
IsEqualGUID
(
&
comclass
->
tlid
,
tlid
),
"got wrong tlid %s
\n
"
,
debugstr_guid
(
&
comclass
->
tlid
));
ok_
(
__FILE__
,
line
)(
comclass
->
name_len
>
0
,
"got modulename len %d
\n
"
,
comclass
->
name_len
);
if
(
progid
)
{
len
=
comclass
->
size
+
comclass
->
clrdata_len
;
ok_
(
__FILE__
,
line
)(
comclass
->
progid_offset
==
len
,
"got progid offset %d, expected %d
\n
"
,
comclass
->
progid_offset
,
len
);
}
else
ok_
(
__FILE__
,
line
)(
comclass
->
progid_offset
==
0
,
"got progid offset %d, expected 0
\n
"
,
comclass
->
progid_offset
);
if
(
comclass
->
progid_offset
)
{
ptr
=
(
WCHAR
*
)((
BYTE
*
)
comclass
+
comclass
->
progid_offset
);
ok_
(
__FILE__
,
line
)(
!
lstrcmpW
(
ptr
,
progid
),
"got wrong progid %s, expected %s
\n
"
,
wine_dbgstr_w
(
ptr
),
wine_dbgstr_w
(
progid
));
ok_
(
__FILE__
,
line
)(
lstrlenW
(
progid
)
*
sizeof
(
WCHAR
)
==
comclass
->
progid_len
,
"got progid name length %d
\n
"
,
comclass
->
progid_len
);
}
/* data length is simply header length + string data length including nulls */
len
=
comclass
->
size
+
comclass
->
progid_len
+
sizeof
(
WCHAR
)
+
comclass
->
clrdata_len
;
len
=
comclass
->
size
+
comclass
->
clrdata_len
;
if
(
comclass
->
progid_len
)
len
+=
comclass
->
progid_len
+
sizeof
(
WCHAR
);
ok_
(
__FILE__
,
line
)(
data
.
ulLength
==
len
,
"got wrong data length %d, expected %d
\n
"
,
data
.
ulLength
,
len
);
/* keyed data structure doesn't include module name, it's available from section data */
...
...
@@ -1468,6 +1492,65 @@ static void test_find_surrogate(HANDLE handle, const GUID *clsid, const WCHAR *n
data
.
ulAssemblyRosterIndex
,
exid
);
}
static
void
test_find_progid_redirection
(
HANDLE
handle
,
const
GUID
*
clsid
,
const
char
*
progid
,
ULONG
exid
,
int
line
)
{
struct
progidredirect_data
*
progiddata
;
struct
comclassredirect_data
*
comclass
;
ACTCTX_SECTION_KEYED_DATA
data
,
data2
;
struct
strsection_header
*
header
;
BOOL
ret
;
memset
(
&
data
,
0xfe
,
sizeof
(
data
));
data
.
cbSize
=
sizeof
(
data
);
ret
=
pFindActCtxSectionStringA
(
0
,
NULL
,
ACTIVATION_CONTEXT_SECTION_COM_PROGID_REDIRECTION
,
progid
,
&
data
);
if
(
!
ret
)
{
skip
(
"failed for progid=%s
\n
"
,
progid
);
return
;
}
ok_
(
__FILE__
,
line
)(
ret
,
"FindActCtxSectionStringA failed: %u
\n
"
,
GetLastError
());
progiddata
=
(
struct
progidredirect_data
*
)
data
.
lpData
;
ok_
(
__FILE__
,
line
)(
data
.
cbSize
==
sizeof
(
data
),
"data.cbSize=%u
\n
"
,
data
.
cbSize
);
ok_
(
__FILE__
,
line
)(
data
.
ulDataFormatVersion
==
1
,
"data.ulDataFormatVersion=%u
\n
"
,
data
.
ulDataFormatVersion
);
ok_
(
__FILE__
,
line
)(
data
.
lpData
!=
NULL
,
"data.lpData == NULL
\n
"
);
ok_
(
__FILE__
,
line
)(
progiddata
->
size
==
sizeof
(
*
progiddata
),
"got %d for header size
\n
"
,
progiddata
->
size
);
if
(
data
.
lpData
&&
progiddata
->
size
==
sizeof
(
*
progiddata
))
{
GUID
*
guid
;
ok_
(
__FILE__
,
line
)(
progiddata
->
reserved
==
0
,
"got reserved as %d
\n
"
,
progiddata
->
reserved
);
ok_
(
__FILE__
,
line
)(
progiddata
->
clsid_offset
>
0
,
"got clsid_offset as %d
\n
"
,
progiddata
->
clsid_offset
);
/* progid data points to generated alias guid */
guid
=
(
GUID
*
)((
BYTE
*
)
data
.
lpSectionBase
+
progiddata
->
clsid_offset
);
memset
(
&
data2
,
0
,
sizeof
(
data2
));
data2
.
cbSize
=
sizeof
(
data2
);
ret
=
pFindActCtxSectionGuid
(
0
,
NULL
,
ACTIVATION_CONTEXT_SECTION_COM_SERVER_REDIRECTION
,
guid
,
&
data2
);
ok_
(
__FILE__
,
line
)(
ret
,
"FindActCtxSectionGuid failed: %u
\n
"
,
GetLastError
());
comclass
=
(
struct
comclassredirect_data
*
)
data2
.
lpData
;
ok_
(
__FILE__
,
line
)(
IsEqualGUID
(
guid
,
&
comclass
->
alias
),
"got wrong alias referenced from progid %s, %s
\n
"
,
progid
,
debugstr_guid
(
guid
));
ok_
(
__FILE__
,
line
)(
IsEqualGUID
(
clsid
,
&
comclass
->
clsid
),
"got wrong class referenced from progid %s, %s
\n
"
,
progid
,
debugstr_guid
(
clsid
));
}
header
=
(
struct
strsection_header
*
)
data
.
lpSectionBase
;
ok_
(
__FILE__
,
line
)(
data
.
lpSectionGlobalData
==
(
BYTE
*
)
header
+
header
->
global_offset
,
"data.lpSectionGlobalData == NULL
\n
"
);
ok_
(
__FILE__
,
line
)(
data
.
ulSectionGlobalDataLength
==
header
->
global_len
,
"data.ulSectionGlobalDataLength=%u
\n
"
,
data
.
ulSectionGlobalDataLength
);
ok_
(
__FILE__
,
line
)(
data
.
lpSectionBase
!=
NULL
,
"data.lpSectionBase == NULL
\n
"
);
ok_
(
__FILE__
,
line
)(
data
.
ulSectionTotalLength
>
0
,
"data.ulSectionTotalLength=%u
\n
"
,
data
.
ulSectionTotalLength
);
ok_
(
__FILE__
,
line
)(
data
.
hActCtx
==
NULL
,
"data.hActCtx=%p
\n
"
,
data
.
hActCtx
);
ok_
(
__FILE__
,
line
)(
data
.
ulAssemblyRosterIndex
==
exid
,
"data.ulAssemblyRosterIndex=%u, expected %u
\n
"
,
data
.
ulAssemblyRosterIndex
,
exid
);
}
static
void
test_wndclass_section
(
void
)
{
static
const
WCHAR
cls1W
[]
=
{
'1'
,
'.'
,
'2'
,
'.'
,
'3'
,
'.'
,
'4'
,
'!'
,
'w'
,
'n'
,
'd'
,
'C'
,
'l'
,
'a'
,
's'
,
's'
,
'1'
,
0
};
...
...
@@ -1796,7 +1879,22 @@ static void test_actctx(void)
test_find_dll_redirection
(
handle
,
testlib_dll
,
1
,
__LINE__
);
test_find_dll_redirection
(
handle
,
testlib_dll
,
1
,
__LINE__
);
test_find_com_redirection
(
handle
,
&
IID_CoTest
,
&
IID_TlibTest
,
progidW
,
1
,
__LINE__
);
test_find_com_redirection
(
handle
,
&
IID_CoTest2
,
NULL
,
NULL
,
1
,
__LINE__
);
test_find_com_redirection
(
handle
,
&
CLSID_clrclass
,
&
IID_TlibTest
,
clrprogidW
,
1
,
__LINE__
);
test_find_progid_redirection
(
handle
,
&
IID_CoTest
,
"ProgId.ProgId"
,
1
,
__LINE__
);
test_find_progid_redirection
(
handle
,
&
IID_CoTest
,
"ProgId.ProgId.1"
,
1
,
__LINE__
);
test_find_progid_redirection
(
handle
,
&
IID_CoTest
,
"ProgId.ProgId.2"
,
1
,
__LINE__
);
test_find_progid_redirection
(
handle
,
&
IID_CoTest
,
"ProgId.ProgId.3"
,
1
,
__LINE__
);
test_find_progid_redirection
(
handle
,
&
IID_CoTest
,
"ProgId.ProgId.4"
,
1
,
__LINE__
);
test_find_progid_redirection
(
handle
,
&
IID_CoTest
,
"ProgId.ProgId.5"
,
1
,
__LINE__
);
test_find_progid_redirection
(
handle
,
&
IID_CoTest
,
"ProgId.ProgId.6"
,
1
,
__LINE__
);
test_find_progid_redirection
(
handle
,
&
CLSID_clrclass
,
"clrprogid"
,
1
,
__LINE__
);
test_find_progid_redirection
(
handle
,
&
CLSID_clrclass
,
"clrprogid.1"
,
1
,
__LINE__
);
test_find_progid_redirection
(
handle
,
&
CLSID_clrclass
,
"clrprogid.2"
,
1
,
__LINE__
);
test_find_progid_redirection
(
handle
,
&
CLSID_clrclass
,
"clrprogid.3"
,
1
,
__LINE__
);
test_find_progid_redirection
(
handle
,
&
CLSID_clrclass
,
"clrprogid.4"
,
1
,
__LINE__
);
test_find_progid_redirection
(
handle
,
&
CLSID_clrclass
,
"clrprogid.5"
,
1
,
__LINE__
);
test_find_progid_redirection
(
handle
,
&
CLSID_clrclass
,
"clrprogid.6"
,
1
,
__LINE__
);
test_find_surrogate
(
handle
,
&
IID_Iiface
,
nameW
,
versionW
,
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__
);
...
...
@@ -2039,6 +2137,7 @@ static BOOL init_funcs(void)
X
(
CreateActCtxA
);
X
(
CreateActCtxW
);
X
(
DeactivateActCtx
);
X
(
FindActCtxSectionStringA
);
X
(
FindActCtxSectionStringW
);
X
(
GetCurrentActCtx
);
X
(
IsDebuggerPresent
);
...
...
dlls/ntdll/actctx.c
View file @
b8a973dc
...
...
@@ -138,7 +138,9 @@ struct strsection_header
DWORD
unk1
[
3
];
ULONG
count
;
ULONG
index_offset
;
DWORD
unk2
[
4
];
DWORD
unk2
[
2
];
ULONG
global_offset
;
ULONG
global_len
;
};
struct
string_index
...
...
@@ -3495,7 +3497,7 @@ static void get_comserver_datalen(const struct entity_array *entities, const str
/* all string data is stored together in aligned block */
str_len
=
strlenW
(
entity
->
u
.
comclass
.
name
)
+
1
;
if
(
*
entity
->
u
.
comclass
.
progid
)
if
(
entity
->
u
.
comclass
.
progid
)
str_len
+=
strlenW
(
entity
->
u
.
comclass
.
progid
)
+
1
;
if
(
entity
->
u
.
comclass
.
version
)
str_len
+=
strlenW
(
entity
->
u
.
comclass
.
version
)
+
1
;
...
...
@@ -3509,7 +3511,7 @@ static void get_comserver_datalen(const struct entity_array *entities, const str
else
{
/* progid string is stored separately */
if
(
*
entity
->
u
.
comclass
.
progid
)
if
(
entity
->
u
.
comclass
.
progid
)
*
len
+=
aligned_string_len
((
strlenW
(
entity
->
u
.
comclass
.
progid
)
+
1
)
*
sizeof
(
WCHAR
));
*
module_len
+=
(
strlenW
(
dll
->
name
)
+
1
)
*
sizeof
(
WCHAR
);
...
...
@@ -3538,7 +3540,7 @@ static void add_comserver_record(const struct guidsection_header *section, const
UNICODE_STRING
str
;
WCHAR
*
ptrW
;
if
(
*
entity
->
u
.
comclass
.
progid
)
if
(
entity
->
u
.
comclass
.
progid
)
progid_len
=
strlenW
(
entity
->
u
.
comclass
.
progid
)
*
sizeof
(
WCHAR
);
else
progid_len
=
0
;
...
...
@@ -3779,7 +3781,8 @@ static NTSTATUS find_comserver_redirection(ACTIVATION_CONTEXT* actctx, const GUI
data
->
ulDataFormatVersion
=
1
;
data
->
lpData
=
comclass
;
/* full length includes string length with nulls */
data
->
ulLength
=
comclass
->
size
+
comclass
->
progid_len
+
sizeof
(
WCHAR
)
+
comclass
->
clrdata_len
;
data
->
ulLength
=
comclass
->
size
+
comclass
->
clrdata_len
;
if
(
comclass
->
progid_len
)
data
->
ulLength
+=
comclass
->
progid_len
+
sizeof
(
WCHAR
);
data
->
lpSectionGlobalData
=
(
BYTE
*
)
actctx
->
comserver_section
+
actctx
->
comserver_section
->
names_offset
;
data
->
ulSectionGlobalDataLength
=
actctx
->
comserver_section
->
names_len
;
data
->
lpSectionBase
=
actctx
->
comserver_section
;
...
...
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