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
a47f4daf
Commit
a47f4daf
authored
Jul 20, 2020
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ntdll: Move the LPC port syscall stubs to the Unix library.
Signed-off-by:
Alexandre Julliard
<
julliard@winehq.org
>
parent
ff9ce43c
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
122 additions
and
167 deletions
+122
-167
nt.c
dlls/ntdll/nt.c
+0
-149
ntdll.spec
dlls/ntdll/ntdll.spec
+18
-18
sync.c
dlls/ntdll/unix/sync.c
+104
-0
No files found.
dlls/ntdll/nt.c
View file @
a47f4daf
...
...
@@ -674,155 +674,6 @@ NTSTATUS WINAPI NtPrivilegeCheck(
}
/*
* ports
*/
/******************************************************************************
* NtCreatePort [NTDLL.@]
* ZwCreatePort [NTDLL.@]
*/
NTSTATUS
WINAPI
NtCreatePort
(
PHANDLE
PortHandle
,
POBJECT_ATTRIBUTES
ObjectAttributes
,
ULONG
MaxConnectInfoLength
,
ULONG
MaxDataLength
,
PULONG
reserved
)
{
FIXME
(
"(%p,%p,%u,%u,%p),stub!
\n
"
,
PortHandle
,
ObjectAttributes
,
MaxConnectInfoLength
,
MaxDataLength
,
reserved
);
return
STATUS_NOT_IMPLEMENTED
;
}
/******************************************************************************
* NtConnectPort [NTDLL.@]
* ZwConnectPort [NTDLL.@]
*/
NTSTATUS
WINAPI
NtConnectPort
(
PHANDLE
PortHandle
,
PUNICODE_STRING
PortName
,
PSECURITY_QUALITY_OF_SERVICE
SecurityQos
,
PLPC_SECTION_WRITE
WriteSection
,
PLPC_SECTION_READ
ReadSection
,
PULONG
MaximumMessageLength
,
PVOID
ConnectInfo
,
PULONG
pConnectInfoLength
)
{
FIXME
(
"(%p,%s,%p,%p,%p,%p,%p,%p),stub!
\n
"
,
PortHandle
,
debugstr_w
(
PortName
->
Buffer
),
SecurityQos
,
WriteSection
,
ReadSection
,
MaximumMessageLength
,
ConnectInfo
,
pConnectInfoLength
);
if
(
ConnectInfo
&&
pConnectInfoLength
)
TRACE
(
"
\t
Message = %s
\n
"
,
debugstr_an
(
ConnectInfo
,
*
pConnectInfoLength
));
return
STATUS_NOT_IMPLEMENTED
;
}
/******************************************************************************
* NtSecureConnectPort (NTDLL.@)
* ZwSecureConnectPort (NTDLL.@)
*/
NTSTATUS
WINAPI
NtSecureConnectPort
(
PHANDLE
PortHandle
,
PUNICODE_STRING
PortName
,
PSECURITY_QUALITY_OF_SERVICE
SecurityQos
,
PLPC_SECTION_WRITE
WriteSection
,
PSID
pSid
,
PLPC_SECTION_READ
ReadSection
,
PULONG
MaximumMessageLength
,
PVOID
ConnectInfo
,
PULONG
pConnectInfoLength
)
{
FIXME
(
"(%p,%s,%p,%p,%p,%p,%p,%p,%p),stub!
\n
"
,
PortHandle
,
debugstr_w
(
PortName
->
Buffer
),
SecurityQos
,
WriteSection
,
pSid
,
ReadSection
,
MaximumMessageLength
,
ConnectInfo
,
pConnectInfoLength
);
return
STATUS_NOT_IMPLEMENTED
;
}
/******************************************************************************
* NtListenPort [NTDLL.@]
* ZwListenPort [NTDLL.@]
*/
NTSTATUS
WINAPI
NtListenPort
(
HANDLE
PortHandle
,
PLPC_MESSAGE
pLpcMessage
)
{
FIXME
(
"(%p,%p),stub!
\n
"
,
PortHandle
,
pLpcMessage
);
return
STATUS_NOT_IMPLEMENTED
;
}
/******************************************************************************
* NtAcceptConnectPort [NTDLL.@]
* ZwAcceptConnectPort [NTDLL.@]
*/
NTSTATUS
WINAPI
NtAcceptConnectPort
(
PHANDLE
PortHandle
,
ULONG
PortIdentifier
,
PLPC_MESSAGE
pLpcMessage
,
BOOLEAN
Accept
,
PLPC_SECTION_WRITE
WriteSection
,
PLPC_SECTION_READ
ReadSection
)
{
FIXME
(
"(%p,%u,%p,%d,%p,%p),stub!
\n
"
,
PortHandle
,
PortIdentifier
,
pLpcMessage
,
Accept
,
WriteSection
,
ReadSection
);
return
STATUS_NOT_IMPLEMENTED
;
}
/******************************************************************************
* NtCompleteConnectPort [NTDLL.@]
* ZwCompleteConnectPort [NTDLL.@]
*/
NTSTATUS
WINAPI
NtCompleteConnectPort
(
HANDLE
PortHandle
)
{
FIXME
(
"(%p),stub!
\n
"
,
PortHandle
);
return
STATUS_NOT_IMPLEMENTED
;
}
/******************************************************************************
* NtRegisterThreadTerminatePort [NTDLL.@]
* ZwRegisterThreadTerminatePort [NTDLL.@]
*/
NTSTATUS
WINAPI
NtRegisterThreadTerminatePort
(
HANDLE
PortHandle
)
{
FIXME
(
"(%p),stub!
\n
"
,
PortHandle
);
return
STATUS_NOT_IMPLEMENTED
;
}
/******************************************************************************
* NtRequestWaitReplyPort [NTDLL.@]
* ZwRequestWaitReplyPort [NTDLL.@]
*/
NTSTATUS
WINAPI
NtRequestWaitReplyPort
(
HANDLE
PortHandle
,
PLPC_MESSAGE
pLpcMessageIn
,
PLPC_MESSAGE
pLpcMessageOut
)
{
FIXME
(
"(%p,%p,%p),stub!
\n
"
,
PortHandle
,
pLpcMessageIn
,
pLpcMessageOut
);
if
(
pLpcMessageIn
)
{
TRACE
(
"Message to send:
\n
"
);
TRACE
(
"
\t
DataSize = %u
\n
"
,
pLpcMessageIn
->
DataSize
);
TRACE
(
"
\t
MessageSize = %u
\n
"
,
pLpcMessageIn
->
MessageSize
);
TRACE
(
"
\t
MessageType = %u
\n
"
,
pLpcMessageIn
->
MessageType
);
TRACE
(
"
\t
VirtualRangesOffset = %u
\n
"
,
pLpcMessageIn
->
VirtualRangesOffset
);
TRACE
(
"
\t
ClientId.UniqueProcess = %p
\n
"
,
pLpcMessageIn
->
ClientId
.
UniqueProcess
);
TRACE
(
"
\t
ClientId.UniqueThread = %p
\n
"
,
pLpcMessageIn
->
ClientId
.
UniqueThread
);
TRACE
(
"
\t
MessageId = %lu
\n
"
,
pLpcMessageIn
->
MessageId
);
TRACE
(
"
\t
SectionSize = %lu
\n
"
,
pLpcMessageIn
->
SectionSize
);
TRACE
(
"
\t
Data = %s
\n
"
,
debugstr_an
((
const
char
*
)
pLpcMessageIn
->
Data
,
pLpcMessageIn
->
DataSize
));
}
return
STATUS_NOT_IMPLEMENTED
;
}
/******************************************************************************
* NtReplyWaitReceivePort [NTDLL.@]
* ZwReplyWaitReceivePort [NTDLL.@]
*/
NTSTATUS
WINAPI
NtReplyWaitReceivePort
(
HANDLE
PortHandle
,
PULONG
PortIdentifier
,
PLPC_MESSAGE
ReplyMessage
,
PLPC_MESSAGE
Message
)
{
FIXME
(
"(%p,%p,%p,%p),stub!
\n
"
,
PortHandle
,
PortIdentifier
,
ReplyMessage
,
Message
);
return
STATUS_NOT_IMPLEMENTED
;
}
/*
* Misc
*/
...
...
dlls/ntdll/ntdll.spec
View file @
a47f4daf
...
...
@@ -123,7 +123,7 @@
@ extern NlsAnsiCodePage
@ extern NlsMbCodePageTag
@ extern NlsMbOemCodePageTag
@ stdcall NtAcceptConnectPort(ptr long ptr long ptr ptr)
@ stdcall
-syscall
NtAcceptConnectPort(ptr long ptr long ptr ptr)
@ stdcall NtAccessCheck(ptr long long ptr ptr ptr ptr ptr)
@ stdcall NtAccessCheckAndAuditAlarm(ptr long ptr ptr ptr long ptr long ptr ptr ptr)
# @ stub NtAccessCheckByType
...
...
@@ -154,9 +154,9 @@
@ stub NtCloseObjectAuditAlarm
# @ stub NtCompactKeys
# @ stub NtCompareTokens
@ stdcall NtCompleteConnectPort(ptr)
@ stdcall
-syscall
NtCompleteConnectPort(ptr)
# @ stub NtCompressKey
@ stdcall NtConnectPort(ptr ptr ptr ptr ptr ptr ptr ptr)
@ stdcall
-syscall
NtConnectPort(ptr ptr ptr ptr ptr ptr ptr ptr)
@ stdcall -syscall NtContinue(ptr long)
# @ stub NtCreateDebugObject
@ stdcall -syscall NtCreateDirectoryObject(ptr long ptr)
...
...
@@ -174,7 +174,7 @@
@ stdcall -syscall NtCreateMutant(ptr long ptr long)
@ stdcall -syscall NtCreateNamedPipeFile(ptr long ptr ptr long long long long long long long long long ptr)
@ stdcall NtCreatePagingFile(ptr ptr ptr ptr)
@ stdcall NtCreatePort(ptr ptr long long ptr)
@ stdcall
-syscall
NtCreatePort(ptr ptr long long ptr)
@ stdcall -syscall NtCreatePowerRequest(ptr ptr)
@ stub NtCreateProcess
# @ stub NtCreateProcessEx
...
...
@@ -233,7 +233,7 @@
@ stdcall -syscall NtInitiatePowerAction (long long long long)
@ stdcall -syscall NtIsProcessInJob(long long)
# @ stub NtIsSystemResumeAutomatic
@ stdcall NtListenPort(ptr ptr)
@ stdcall
-syscall
NtListenPort(ptr ptr)
@ stdcall NtLoadDriver(ptr)
@ stdcall -syscall NtLoadKey2(ptr ptr long)
@ stdcall -syscall NtLoadKey(ptr ptr)
...
...
@@ -332,7 +332,7 @@
@ stub NtReadRequestData
@ stdcall -syscall NtReadVirtualMemory(long ptr ptr long ptr)
@ stub NtRegisterNewDevice
@ stdcall NtRegisterThreadTerminatePort(ptr)
@ stdcall
-syscall
NtRegisterThreadTerminatePort(ptr)
@ stdcall -syscall NtReleaseKeyedEvent(long ptr long ptr)
@ stdcall -syscall NtReleaseMutant(long ptr)
@ stub NtReleaseProcessMutant
...
...
@@ -343,12 +343,12 @@
@ stdcall -syscall NtRenameKey(long ptr)
@ stdcall -syscall NtReplaceKey(ptr long ptr)
@ stub NtReplyPort
@ stdcall NtReplyWaitReceivePort(ptr ptr ptr ptr)
@ stdcall
-syscall
NtReplyWaitReceivePort(ptr ptr ptr ptr)
@ stub NtReplyWaitReceivePortEx
@ stub NtReplyWaitReplyPort
# @ stub NtRequestDeviceWakeup
@ stub NtRequestPort
@ stdcall NtRequestWaitReplyPort(ptr ptr ptr)
@ stdcall
-syscall
NtRequestWaitReplyPort(ptr ptr ptr)
# @ stub NtRequestWakeupLatency
@ stdcall -syscall NtResetEvent(long ptr)
@ stdcall -syscall NtResetWriteWatch(long ptr long)
...
...
@@ -358,7 +358,7 @@
@ stdcall -syscall NtSaveKey(long long)
# @ stub NtSaveKeyEx
# @ stub NtSaveMergedKeys
@ stdcall NtSecureConnectPort(ptr ptr ptr ptr ptr ptr ptr ptr ptr)
@ stdcall
-syscall
NtSecureConnectPort(ptr ptr ptr ptr ptr ptr ptr ptr ptr)
# @ stub NtSetBootEntryOrder
# @ stub NtSetBootOptions
@ stdcall -syscall NtSetContextThread(long ptr)
...
...
@@ -1112,7 +1112,7 @@
@ stdcall WinSqmIsOptedIn()
@ stdcall WinSqmSetDWORD(ptr long long)
@ stdcall WinSqmStartSession(ptr long long)
@ stdcall -private ZwAcceptConnectPort(ptr long ptr long ptr ptr) NtAcceptConnectPort
@ stdcall -private
-syscall
ZwAcceptConnectPort(ptr long ptr long ptr ptr) NtAcceptConnectPort
@ stdcall -private ZwAccessCheck(ptr long long ptr ptr ptr ptr ptr) NtAccessCheck
@ stdcall -private ZwAccessCheckAndAuditAlarm(ptr long ptr ptr ptr long ptr long ptr ptr ptr) NtAccessCheckAndAuditAlarm
# @ stub ZwAccessCheckByType
...
...
@@ -1143,9 +1143,9 @@
@ stub ZwCloseObjectAuditAlarm
# @ stub ZwCompactKeys
# @ stub ZwCompareTokens
@ stdcall -private ZwCompleteConnectPort(ptr) NtCompleteConnectPort
@ stdcall -private
-syscall
ZwCompleteConnectPort(ptr) NtCompleteConnectPort
# @ stub ZwCompressKey
@ stdcall -private ZwConnectPort(ptr ptr ptr ptr ptr ptr ptr ptr) NtConnectPort
@ stdcall -private
-syscall
ZwConnectPort(ptr ptr ptr ptr ptr ptr ptr ptr) NtConnectPort
@ stdcall -private -syscall ZwContinue(ptr long) NtContinue
# @ stub ZwCreateDebugObject
@ stdcall -private -syscall ZwCreateDirectoryObject(ptr long ptr) NtCreateDirectoryObject
...
...
@@ -1162,7 +1162,7 @@
@ stdcall -private -syscall ZwCreateMutant(ptr long ptr long) NtCreateMutant
@ stdcall -private -syscall ZwCreateNamedPipeFile(ptr long ptr ptr long long long long long long long long long ptr) NtCreateNamedPipeFile
@ stdcall -private ZwCreatePagingFile(ptr ptr ptr ptr) NtCreatePagingFile
@ stdcall -private ZwCreatePort(ptr ptr long long ptr) NtCreatePort
@ stdcall -private
-syscall
ZwCreatePort(ptr ptr long long ptr) NtCreatePort
@ stdcall -private -syscall ZwCreatePowerRequest(ptr ptr) NtCreatePowerRequest
@ stub ZwCreateProcess
# @ stub ZwCreateProcessEx
...
...
@@ -1220,7 +1220,7 @@
@ stdcall -private -syscall ZwInitiatePowerAction(long long long long) NtInitiatePowerAction
@ stdcall -private -syscall ZwIsProcessInJob(long long) NtIsProcessInJob
# @ stub ZwIsSystemResumeAutomatic
@ stdcall -private ZwListenPort(ptr ptr) NtListenPort
@ stdcall -private
-syscall
ZwListenPort(ptr ptr) NtListenPort
@ stdcall -private ZwLoadDriver(ptr) NtLoadDriver
@ stdcall -private -syscall ZwLoadKey2(ptr ptr long) NtLoadKey2
@ stdcall -private -syscall ZwLoadKey(ptr ptr) NtLoadKey
...
...
@@ -1319,7 +1319,7 @@
@ stub ZwReadRequestData
@ stdcall -private -syscall ZwReadVirtualMemory(long ptr ptr long ptr) NtReadVirtualMemory
@ stub ZwRegisterNewDevice
@ stdcall -private ZwRegisterThreadTerminatePort(ptr) NtRegisterThreadTerminatePort
@ stdcall -private
-syscall
ZwRegisterThreadTerminatePort(ptr) NtRegisterThreadTerminatePort
@ stdcall -private -syscall ZwReleaseKeyedEvent(long ptr long ptr) NtReleaseKeyedEvent
@ stdcall -private -syscall ZwReleaseMutant(long ptr) NtReleaseMutant
@ stub ZwReleaseProcessMutant
...
...
@@ -1330,12 +1330,12 @@
@ stdcall -private -syscall ZwRenameKey(long ptr) NtRenameKey
@ stdcall -private -syscall ZwReplaceKey(ptr long ptr) NtReplaceKey
@ stub ZwReplyPort
@ stdcall -private ZwReplyWaitReceivePort(ptr ptr ptr ptr) NtReplyWaitReceivePort
@ stdcall -private
-syscall
ZwReplyWaitReceivePort(ptr ptr ptr ptr) NtReplyWaitReceivePort
@ stub ZwReplyWaitReceivePortEx
@ stub ZwReplyWaitReplyPort
# @ stub ZwRequestDeviceWakeup
@ stub ZwRequestPort
@ stdcall -private ZwRequestWaitReplyPort(ptr ptr ptr) NtRequestWaitReplyPort
@ stdcall -private
-syscall
ZwRequestWaitReplyPort(ptr ptr ptr) NtRequestWaitReplyPort
# @ stub ZwRequestWakeupLatency
@ stdcall -private -syscall ZwResetEvent(long ptr) NtResetEvent
@ stdcall -private -syscall ZwResetWriteWatch(long ptr long) NtResetWriteWatch
...
...
@@ -1345,7 +1345,7 @@
@ stdcall -private -syscall ZwSaveKey(long long) NtSaveKey
# @ stub ZwSaveKeyEx
# @ stub ZwSaveMergedKeys
@ stdcall -private ZwSecureConnectPort(ptr ptr ptr ptr ptr ptr ptr ptr ptr) NtSecureConnectPort
@ stdcall -private
-syscall
ZwSecureConnectPort(ptr ptr ptr ptr ptr ptr ptr ptr ptr) NtSecureConnectPort
# @ stub ZwSetBootEntryOrder
# @ stub ZwSetBootOptions
@ stdcall -private -syscall ZwSetContextThread(long ptr) NtSetContextThread
...
...
dlls/ntdll/unix/sync.c
View file @
a47f4daf
...
...
@@ -1834,6 +1834,110 @@ NTSTATUS WINAPI NtOpenSection( HANDLE *handle, ACCESS_MASK access, const OBJECT_
}
/***********************************************************************
* NtCreatePort (NTDLL.@)
*/
NTSTATUS
WINAPI
NtCreatePort
(
HANDLE
*
handle
,
OBJECT_ATTRIBUTES
*
attr
,
ULONG
info_len
,
ULONG
data_len
,
ULONG
*
reserved
)
{
FIXME
(
"(%p,%p,%u,%u,%p),stub!
\n
"
,
handle
,
attr
,
info_len
,
data_len
,
reserved
);
return
STATUS_NOT_IMPLEMENTED
;
}
/***********************************************************************
* NtConnectPort (NTDLL.@)
*/
NTSTATUS
WINAPI
NtConnectPort
(
HANDLE
*
handle
,
UNICODE_STRING
*
name
,
SECURITY_QUALITY_OF_SERVICE
*
qos
,
LPC_SECTION_WRITE
*
write
,
LPC_SECTION_READ
*
read
,
ULONG
*
max_len
,
void
*
info
,
ULONG
*
info_len
)
{
FIXME
(
"(%p,%s,%p,%p,%p,%p,%p,%p),stub!
\n
"
,
handle
,
debugstr_us
(
name
),
qos
,
write
,
read
,
max_len
,
info
,
info_len
);
if
(
info
&&
info_len
)
TRACE
(
"msg = %s
\n
"
,
debugstr_an
(
info
,
*
info_len
));
return
STATUS_NOT_IMPLEMENTED
;
}
/***********************************************************************
* NtSecureConnectPort (NTDLL.@)
*/
NTSTATUS
WINAPI
NtSecureConnectPort
(
HANDLE
*
handle
,
UNICODE_STRING
*
name
,
SECURITY_QUALITY_OF_SERVICE
*
qos
,
LPC_SECTION_WRITE
*
write
,
PSID
sid
,
LPC_SECTION_READ
*
read
,
ULONG
*
max_len
,
void
*
info
,
ULONG
*
info_len
)
{
FIXME
(
"(%p,%s,%p,%p,%p,%p,%p,%p,%p),stub!
\n
"
,
handle
,
debugstr_us
(
name
),
qos
,
write
,
sid
,
read
,
max_len
,
info
,
info_len
);
return
STATUS_NOT_IMPLEMENTED
;
}
/***********************************************************************
* NtListenPort (NTDLL.@)
*/
NTSTATUS
WINAPI
NtListenPort
(
HANDLE
handle
,
LPC_MESSAGE
*
msg
)
{
FIXME
(
"(%p,%p),stub!
\n
"
,
handle
,
msg
);
return
STATUS_NOT_IMPLEMENTED
;
}
/***********************************************************************
* NtAcceptConnectPort (NTDLL.@)
*/
NTSTATUS
WINAPI
NtAcceptConnectPort
(
HANDLE
*
handle
,
ULONG
id
,
LPC_MESSAGE
*
msg
,
BOOLEAN
accept
,
LPC_SECTION_WRITE
*
write
,
LPC_SECTION_READ
*
read
)
{
FIXME
(
"(%p,%u,%p,%d,%p,%p),stub!
\n
"
,
handle
,
id
,
msg
,
accept
,
write
,
read
);
return
STATUS_NOT_IMPLEMENTED
;
}
/***********************************************************************
* NtCompleteConnectPort (NTDLL.@)
*/
NTSTATUS
WINAPI
NtCompleteConnectPort
(
HANDLE
handle
)
{
FIXME
(
"(%p),stub!
\n
"
,
handle
);
return
STATUS_NOT_IMPLEMENTED
;
}
/***********************************************************************
* NtRegisterThreadTerminatePort (NTDLL.@)
*/
NTSTATUS
WINAPI
NtRegisterThreadTerminatePort
(
HANDLE
handle
)
{
FIXME
(
"(%p),stub!
\n
"
,
handle
);
return
STATUS_NOT_IMPLEMENTED
;
}
/***********************************************************************
* NtRequestWaitReplyPort (NTDLL.@)
*/
NTSTATUS
WINAPI
NtRequestWaitReplyPort
(
HANDLE
handle
,
LPC_MESSAGE
*
msg_in
,
LPC_MESSAGE
*
msg_out
)
{
FIXME
(
"(%p,%p,%p),stub!
\n
"
,
handle
,
msg_in
,
msg_out
);
if
(
msg_in
)
TRACE
(
"datasize %u msgsize %u type %u ranges %u client %p/%p msgid %lu size %lu data %s
\n
"
,
msg_in
->
DataSize
,
msg_in
->
MessageSize
,
msg_in
->
MessageType
,
msg_in
->
VirtualRangesOffset
,
msg_in
->
ClientId
.
UniqueProcess
,
msg_in
->
ClientId
.
UniqueThread
,
msg_in
->
MessageId
,
msg_in
->
SectionSize
,
debugstr_an
(
(
const
char
*
)
msg_in
->
Data
,
msg_in
->
DataSize
));
return
STATUS_NOT_IMPLEMENTED
;
}
/***********************************************************************
* NtReplyWaitReceivePort (NTDLL.@)
*/
NTSTATUS
WINAPI
NtReplyWaitReceivePort
(
HANDLE
handle
,
ULONG
*
id
,
LPC_MESSAGE
*
reply
,
LPC_MESSAGE
*
msg
)
{
FIXME
(
"(%p,%p,%p,%p),stub!
\n
"
,
handle
,
id
,
reply
,
msg
);
return
STATUS_NOT_IMPLEMENTED
;
}
#define MAX_ATOM_LEN 255
#define IS_INTATOM(x) (((ULONG_PTR)(x) >> 16) == 0)
...
...
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