[1/4] ntdll: Implement RtlInterlockedPushListSListEx and fix calling convention of RtlInterlockedPushListSList.

Sebastian Lackner sebastian at fds-team.de
Wed Feb 10 20:52:21 CST 2016


Signed-off-by: Sebastian Lackner <sebastian at fds-team.de>
---

Besides the calling convention, both functions are identical.

 dlls/ntdll/ntdll.spec |    3 ++-
 dlls/ntdll/rtl.c      |   31 ++++++++++++++++++++++++++++---
 2 files changed, 30 insertions(+), 4 deletions(-)

diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
index 4e49709..d3cd489 100644
--- a/dlls/ntdll/ntdll.spec
+++ b/dlls/ntdll/ntdll.spec
@@ -706,7 +706,8 @@
 @ stdcall RtlInterlockedFlushSList(ptr)
 @ stdcall RtlInterlockedPopEntrySList(ptr)
 @ stdcall RtlInterlockedPushEntrySList(ptr ptr)
-@ stdcall RtlInterlockedPushListSList(ptr ptr ptr long)
+@ stdcall -norelay RtlInterlockedPushListSList(ptr ptr ptr long)
+@ stdcall RtlInterlockedPushListSListEx(ptr ptr ptr long)
 # @ stub RtlInvertRangeList
 @ stdcall RtlIpv4AddressToStringA(ptr ptr)
 @ stdcall RtlIpv4AddressToStringExA(ptr long ptr ptr)
diff --git a/dlls/ntdll/rtl.c b/dlls/ntdll/rtl.c
index f699cff..3e985d5 100644
--- a/dlls/ntdll/rtl.c
+++ b/dlls/ntdll/rtl.c
@@ -58,6 +58,16 @@ static RTL_CRITICAL_SECTION_DEBUG critsect_debug =
 };
 static RTL_CRITICAL_SECTION peb_lock = { &critsect_debug, -1, 0, 0, 0, 0 };
 
+#ifdef __i386__
+#define DEFINE_FASTCALL4_ENTRYPOINT( name ) \
+    __ASM_STDCALL_FUNC( name, 16, \
+                       "popl %eax\n\t" \
+                       "pushl %edx\n\t" \
+                       "pushl %ecx\n\t" \
+                       "pushl %eax\n\t" \
+                       "jmp " __ASM_NAME("__regs_") #name __ASM_STDCALL(16))
+#endif
+
 /* CRC polynomial 0xedb88320 */
 static const DWORD CRC_table[256] =
 {
@@ -1191,10 +1201,10 @@ PSLIST_ENTRY WINAPI RtlInterlockedPopEntrySList(PSLIST_HEADER list)
 }
 
 /*************************************************************************
- * RtlInterlockedPushListSList   [NTDLL.@]
+ * RtlInterlockedPushListSListEx   [NTDLL.@]
  */
-PSLIST_ENTRY WINAPI RtlInterlockedPushListSList(PSLIST_HEADER list, PSLIST_ENTRY first,
-                                                PSLIST_ENTRY last, ULONG count)
+PSLIST_ENTRY WINAPI RtlInterlockedPushListSListEx(PSLIST_HEADER list, PSLIST_ENTRY first,
+                                                  PSLIST_ENTRY last, ULONG count)
 {
     SLIST_HEADER old, new;
 
@@ -1222,6 +1232,21 @@ PSLIST_ENTRY WINAPI RtlInterlockedPushListSList(PSLIST_HEADER list, PSLIST_ENTRY
 #endif
 }
 
+/*************************************************************************
+ * RtlInterlockedPushListSList   [NTDLL.@]
+ */
+#ifdef DEFINE_FASTCALL4_ENTRYPOINT
+DEFINE_FASTCALL4_ENTRYPOINT(RtlInterlockedPushListSList)
+PSLIST_ENTRY WINAPI __regs_RtlInterlockedPushListSList(PSLIST_HEADER list, PSLIST_ENTRY first,
+                                                       PSLIST_ENTRY last, ULONG count)
+#else
+PSLIST_ENTRY WINAPI RtlInterlockedPushListSList(PSLIST_HEADER list, PSLIST_ENTRY first,
+                                                PSLIST_ENTRY last, ULONG count)
+#endif
+{
+    return RtlInterlockedPushListSListEx(list, first, last, count);
+}
+
 /******************************************************************************
  *  RtlGetCompressionWorkSpaceSize		[NTDLL.@]
  */
-- 
2.7.1



More information about the wine-patches mailing list