Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
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-cw
Commits
25acfbb4
Commit
25acfbb4
authored
Oct 25, 2018
by
Daniel Lehman
Committed by
Alexandre Julliard
Oct 26, 2018
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ntdll: Implement RtlWaitOnAddress functions.
Signed-off-by:
Daniel Lehman
<
dlehman25@gmail.com
>
Signed-off-by:
Alexandre Julliard
<
julliard@winehq.org
>
parent
61cdd8e3
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
137 additions
and
0 deletions
+137
-0
ntdll.spec
dlls/ntdll/ntdll.spec
+3
-0
sync.c
dlls/ntdll/sync.c
+49
-0
om.c
dlls/ntdll/tests/om.c
+82
-0
winternl.h
include/winternl.h
+3
-0
No files found.
dlls/ntdll/ntdll.spec
View file @
25acfbb4
...
...
@@ -978,6 +978,9 @@
# @ stub RtlValidateUnicodeString
@ stdcall RtlVerifyVersionInfo(ptr long int64)
@ stdcall -arch=x86_64 RtlVirtualUnwind(long long long ptr ptr ptr ptr ptr)
@ stdcall RtlWaitOnAddress(ptr ptr long ptr)
@ stdcall RtlWakeAddressAll(ptr)
@ stdcall RtlWakeAddressSingle(ptr)
@ stdcall RtlWakeAllConditionVariable(ptr)
@ stdcall RtlWakeConditionVariable(ptr)
@ stub RtlWalkFrameChain
...
...
dlls/ntdll/sync.c
View file @
25acfbb4
...
...
@@ -61,6 +61,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(ntdll);
HANDLE
keyed_event
=
NULL
;
static
const
LARGE_INTEGER
zero_timeout
;
static
inline
int
interlocked_dec_if_nonzero
(
int
*
dest
)
{
int
val
,
tmp
;
...
...
@@ -1955,3 +1957,50 @@ NTSTATUS WINAPI RtlSleepConditionVariableSRW( RTL_CONDITION_VARIABLE *variable,
RtlAcquireSRWLockExclusive
(
lock
);
return
status
;
}
/***********************************************************************
* RtlWaitOnAddress (NTDLL.@)
*/
NTSTATUS
WINAPI
RtlWaitOnAddress
(
const
void
*
addr
,
const
void
*
cmp
,
SIZE_T
size
,
const
LARGE_INTEGER
*
timeout
)
{
switch
(
size
)
{
case
1
:
if
(
*
(
const
UCHAR
*
)
addr
!=
*
(
const
UCHAR
*
)
cmp
)
return
STATUS_SUCCESS
;
break
;
case
2
:
if
(
*
(
const
USHORT
*
)
addr
!=
*
(
const
USHORT
*
)
cmp
)
return
STATUS_SUCCESS
;
break
;
case
4
:
if
(
*
(
const
ULONG
*
)
addr
!=
*
(
const
ULONG
*
)
cmp
)
return
STATUS_SUCCESS
;
break
;
case
8
:
if
(
*
(
const
ULONG64
*
)
addr
!=
*
(
const
ULONG64
*
)
cmp
)
return
STATUS_SUCCESS
;
break
;
default:
return
STATUS_INVALID_PARAMETER
;
}
return
NtWaitForKeyedEvent
(
keyed_event
,
addr
,
0
,
timeout
);
}
/***********************************************************************
* RtlWakeAddressAll (NTDLL.@)
*/
void
WINAPI
RtlWakeAddressAll
(
const
void
*
addr
)
{
while
(
NtReleaseKeyedEvent
(
keyed_event
,
addr
,
0
,
&
zero_timeout
)
==
STATUS_SUCCESS
)
{}
}
/***********************************************************************
* RtlWakeAddressSingle (NTDLL.@)
*/
void
WINAPI
RtlWakeAddressSingle
(
const
void
*
addr
)
{
NtReleaseKeyedEvent
(
keyed_event
,
addr
,
0
,
&
zero_timeout
);
}
dlls/ntdll/tests/om.c
View file @
25acfbb4
...
...
@@ -70,6 +70,10 @@ static NTSTATUS (WINAPI *pNtReleaseKeyedEvent)( HANDLE, const void *, BOOLEAN, c
static
NTSTATUS
(
WINAPI
*
pNtCreateIoCompletion
)(
PHANDLE
,
ACCESS_MASK
,
POBJECT_ATTRIBUTES
,
ULONG
);
static
NTSTATUS
(
WINAPI
*
pNtOpenIoCompletion
)(
PHANDLE
,
ACCESS_MASK
,
POBJECT_ATTRIBUTES
);
static
NTSTATUS
(
WINAPI
*
pNtQueryInformationFile
)(
HANDLE
,
PIO_STATUS_BLOCK
,
void
*
,
ULONG
,
FILE_INFORMATION_CLASS
);
static
NTSTATUS
(
WINAPI
*
pNtQuerySystemTime
)(
LARGE_INTEGER
*
);
static
NTSTATUS
(
WINAPI
*
pRtlWaitOnAddress
)(
const
void
*
,
const
void
*
,
SIZE_T
,
const
LARGE_INTEGER
*
);
static
void
(
WINAPI
*
pRtlWakeAddressAll
)(
const
void
*
);
static
void
(
WINAPI
*
pRtlWakeAddressSingle
)(
const
void
*
);
#define KEYEDEVENT_WAIT 0x0001
#define KEYEDEVENT_WAKE 0x0002
...
...
@@ -2064,6 +2068,79 @@ static void test_mutant(void)
NtClose
(
mutant
);
}
static
void
test_wait_on_address
(
void
)
{
DWORD
ticks
;
SIZE_T
size
;
NTSTATUS
status
;
LARGE_INTEGER
timeout
;
LONG64
address
,
compare
;
if
(
!
pRtlWaitOnAddress
)
{
win_skip
(
"RtlWaitOnAddress not supported, skipping test
\n
"
);
return
;
}
if
(
0
)
/* crash on Windows */
{
pRtlWaitOnAddress
(
&
address
,
NULL
,
8
,
NULL
);
pRtlWaitOnAddress
(
NULL
,
&
compare
,
8
,
NULL
);
pRtlWaitOnAddress
(
NULL
,
NULL
,
8
,
NULL
);
}
/* don't crash */
pRtlWakeAddressSingle
(
NULL
);
pRtlWakeAddressAll
(
NULL
);
/* invalid values */
address
=
0
;
compare
=
0
;
status
=
pRtlWaitOnAddress
(
&
address
,
&
compare
,
5
,
NULL
);
ok
(
status
==
STATUS_INVALID_PARAMETER
,
"got %x
\n
"
,
status
);
/* values match */
address
=
0
;
compare
=
0
;
pNtQuerySystemTime
(
&
timeout
);
timeout
.
QuadPart
+=
100
*
10000
;
ticks
=
GetTickCount
();
status
=
pRtlWaitOnAddress
(
&
address
,
&
compare
,
8
,
&
timeout
);
ticks
=
GetTickCount
()
-
ticks
;
ok
(
status
==
STATUS_TIMEOUT
,
"got 0x%08x
\n
"
,
status
);
ok
(
ticks
>=
100
&&
ticks
<=
1000
,
"got %u
\n
"
,
ticks
);
ok
(
address
==
0
,
"got %s
\n
"
,
wine_dbgstr_longlong
(
address
));
ok
(
compare
==
0
,
"got %s
\n
"
,
wine_dbgstr_longlong
(
compare
));
/* different address size */
for
(
size
=
1
;
size
<=
4
;
size
<<=
1
)
{
compare
=
~
0
;
compare
<<=
size
*
8
;
timeout
.
QuadPart
=
-
100
*
10000
;
ticks
=
GetTickCount
();
status
=
pRtlWaitOnAddress
(
&
address
,
&
compare
,
size
,
&
timeout
);
ticks
=
GetTickCount
()
-
ticks
;
ok
(
status
==
STATUS_TIMEOUT
,
"got 0x%08x
\n
"
,
status
);
ok
(
ticks
>=
100
&&
ticks
<=
1000
,
"got %u
\n
"
,
ticks
);
status
=
pRtlWaitOnAddress
(
&
address
,
&
compare
,
size
<<
1
,
&
timeout
);
ok
(
!
status
,
"got 0x%08x
\n
"
,
status
);
}
address
=
0
;
compare
=
1
;
status
=
pRtlWaitOnAddress
(
&
address
,
&
compare
,
8
,
NULL
);
ok
(
!
status
,
"got 0x%08x
\n
"
,
status
);
/* no waiters */
address
=
0
;
pRtlWakeAddressSingle
(
&
address
);
ok
(
address
==
0
,
"got %s
\n
"
,
wine_dbgstr_longlong
(
address
));
pRtlWakeAddressAll
(
&
address
);
ok
(
address
==
0
,
"got %s
\n
"
,
wine_dbgstr_longlong
(
address
));
}
START_TEST
(
om
)
{
HMODULE
hntdll
=
GetModuleHandleA
(
"ntdll.dll"
);
...
...
@@ -2117,6 +2194,10 @@ START_TEST(om)
pNtCreateIoCompletion
=
(
void
*
)
GetProcAddress
(
hntdll
,
"NtCreateIoCompletion"
);
pNtOpenIoCompletion
=
(
void
*
)
GetProcAddress
(
hntdll
,
"NtOpenIoCompletion"
);
pNtQueryInformationFile
=
(
void
*
)
GetProcAddress
(
hntdll
,
"NtQueryInformationFile"
);
pNtQuerySystemTime
=
(
void
*
)
GetProcAddress
(
hntdll
,
"NtQuerySystemTime"
);
pRtlWaitOnAddress
=
(
void
*
)
GetProcAddress
(
hntdll
,
"RtlWaitOnAddress"
);
pRtlWakeAddressAll
=
(
void
*
)
GetProcAddress
(
hntdll
,
"RtlWakeAddressAll"
);
pRtlWakeAddressSingle
=
(
void
*
)
GetProcAddress
(
hntdll
,
"RtlWakeAddressSingle"
);
test_case_sensitive
();
test_namespace_pipe
();
...
...
@@ -2130,4 +2211,5 @@ START_TEST(om)
test_mutant
();
test_keyed_events
();
test_null_device
();
test_wait_on_address
();
}
include/winternl.h
View file @
25acfbb4
...
...
@@ -2865,6 +2865,9 @@ NTSYSAPI BOOLEAN WINAPI RtlValidAcl(PACL);
NTSYSAPI
BOOLEAN
WINAPI
RtlValidSid
(
PSID
);
NTSYSAPI
BOOLEAN
WINAPI
RtlValidateHeap
(
HANDLE
,
ULONG
,
LPCVOID
);
NTSYSAPI
NTSTATUS
WINAPI
RtlVerifyVersionInfo
(
const
RTL_OSVERSIONINFOEXW
*
,
DWORD
,
DWORDLONG
);
NTSYSAPI
NTSTATUS
WINAPI
RtlWaitOnAddress
(
const
void
*
,
const
void
*
,
SIZE_T
,
const
LARGE_INTEGER
*
);
NTSYSAPI
void
WINAPI
RtlWakeAddressAll
(
const
void
*
);
NTSYSAPI
void
WINAPI
RtlWakeAddressSingle
(
const
void
*
);
NTSYSAPI
void
WINAPI
RtlWakeAllConditionVariable
(
RTL_CONDITION_VARIABLE
*
);
NTSYSAPI
void
WINAPI
RtlWakeConditionVariable
(
RTL_CONDITION_VARIABLE
*
);
NTSYSAPI
NTSTATUS
WINAPI
RtlWalkHeap
(
HANDLE
,
PVOID
);
...
...
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