Wine-Devel
By thread
wine-devel@list.winehq.org
By month
Messages by month
- ----- 2026 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
November 2021
- 83 participants
- 2620 messages
Re: [PATCH v11 05/10] mshtml: Don't populate the props at all on IE9+ modes.
by Jacek Caban
Signed-off-by: Jacek Caban <jacek(a)codeweavers.com>
Nov. 30, 2021
Re: [PATCH v11 10/10] jscript: Return the correct string for Object.toString(null) in ES5+ modes.
by Jacek Caban
On 11/29/21 5:31 PM, Gabriel Ivăncescu wrote:
> + else if(function->proc == Object_toString && ctx->version >= SCRIPTLANGUAGEVERSION_ES5) {
> + jsstr_t *ret;
> + if(!r)
> + return S_OK;
> + ret = jsstr_alloc(L"[object Null]");
> + if(!ret)
> + return E_OUTOFMEMORY;
> + *r = jsval_string(ret);
> + return S_OK;
> + }
This is ugly. I think that what you observe is a change in how ES5
treats 'this' argument in builtin functions. It allows 'this' to be of
any type for builtin function. The conversion to object (or using a
global object in place of null) happens only when we enter JS function,
if I read it right. To support this properly, I'm afraid that we'd need
to pass 'this' as jsval to builtin functions. We wouldn't need any
special casing for toString() then.
Thanks,
Jacek
Nov. 30, 2021
Re: [PATCH v11 06/10] mshtml: Associate props with attributes for IE8 mode, but keep them stringified.
by Jacek Caban
Hi Gabriel,
On 11/29/21 5:31 PM, Gabriel Ivăncescu wrote:
> +static inline WCHAR *translate_attr_name(WCHAR *attr_name, compat_mode_t compat_mode)
> +{
> + WCHAR *ret = attr_name;
> +
> + if(compat_mode >= COMPAT_MODE_IE8 && !wcsicmp(attr_name, L"class"))
> + ret = (WCHAR*)L"className";
> + return ret;
> +}
Please avoid this cast.
> + if(get_dispid_type(dispid) == DISPEXPROP_BUILTIN) {
> + VariantClear(AttributeValue);
> + V_VT(AttributeValue) = VT_NULL;
> + return S_OK;
> + }
It's not right in general, see the attached test. I'm not expecting that
you implement all those IE8-specific things (in fact, I don't think we
need to care too much about it), but the patch in its current shape can
break things. Could you just remove this if() and live todo_wines?
Thanks,
Jacek
Nov. 30, 2021
[PATCH] kernel32: Use uppercase ntdll name in forwarded exports.
by Paul Gofman
Signed-off-by: Paul Gofman <pgofman(a)codeweavers.com>
---
SCP: Secret Laboratory game depends on that for correctly finding
export addresses.
dlls/kernel32/kernel32.spec | 204 ++++++++++++++++++------------------
1 file changed, 102 insertions(+), 102 deletions(-)
diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec
index fbaf9443934..015324f7677 100644
--- a/dlls/kernel32/kernel32.spec
+++ b/dlls/kernel32/kernel32.spec
@@ -79,20 +79,20 @@
69 stdcall -noname -i386 -private K32WOWGetVDMPointerUnfix(long) krnl386.exe16.K32WOWGetVDMPointerUnfix
70 stdcall -noname -i386 -private K32WOWGetDescriptor(long long) krnl386.exe16.K32WOWGetDescriptor
71 stub -noname -i386 IsThreadId
- 72 stdcall -noname -i386 -private -ret64 K32RtlLargeIntegerAdd(long long long long) ntdll.RtlLargeIntegerAdd
- 73 stdcall -noname -i386 -private -ret64 K32RtlEnlargedIntegerMultiply(long long) ntdll.RtlEnlargedIntegerMultiply
- 74 stdcall -noname -i386 -private -ret64 K32RtlEnlargedUnsignedMultiply(long long) ntdll.RtlEnlargedUnsignedMultiply
- 75 stdcall -noname -i386 -private K32RtlEnlargedUnsignedDivide(long long long ptr) ntdll.RtlEnlargedUnsignedDivide
- 76 stdcall -noname -i386 -private -ret64 K32RtlExtendedLargeIntegerDivide(long long long ptr) ntdll.RtlExtendedLargeIntegerDivide
- 77 stdcall -noname -i386 -private -ret64 K32RtlExtendedMagicDivide(long long long long long) ntdll.RtlExtendedMagicDivide
- 78 stdcall -noname -i386 -private -ret64 K32RtlExtendedIntegerMultiply(long long long) ntdll.RtlExtendedIntegerMultiply
- 79 stdcall -noname -i386 -private -ret64 K32RtlLargeIntegerShiftLeft(long long long) ntdll.RtlLargeIntegerShiftLeft
- 80 stdcall -noname -i386 -private -ret64 K32RtlLargeIntegerShiftRight(long long long) ntdll.RtlLargeIntegerShiftRight
- 81 stdcall -noname -i386 -private -ret64 K32RtlLargeIntegerArithmeticShift(long long long) ntdll.RtlLargeIntegerArithmeticShift
- 82 stdcall -noname -i386 -private -ret64 K32RtlLargeIntegerNegate(long long) ntdll.RtlLargeIntegerNegate
- 83 stdcall -noname -i386 -private -ret64 K32RtlLargeIntegerSubtract(long long long long) ntdll.RtlLargeIntegerSubtract
- 84 stdcall -noname -i386 -private -ret64 K32RtlConvertLongToLargeInteger(long) ntdll.RtlConvertLongToLargeInteger
- 85 stdcall -noname -i386 -private -ret64 K32RtlConvertUlongToLargeInteger(long) ntdll.RtlConvertUlongToLargeInteger
+ 72 stdcall -noname -i386 -private -ret64 K32RtlLargeIntegerAdd(long long long long) NTDLL.RtlLargeIntegerAdd
+ 73 stdcall -noname -i386 -private -ret64 K32RtlEnlargedIntegerMultiply(long long) NTDLL.RtlEnlargedIntegerMultiply
+ 74 stdcall -noname -i386 -private -ret64 K32RtlEnlargedUnsignedMultiply(long long) NTDLL.RtlEnlargedUnsignedMultiply
+ 75 stdcall -noname -i386 -private K32RtlEnlargedUnsignedDivide(long long long ptr) NTDLL.RtlEnlargedUnsignedDivide
+ 76 stdcall -noname -i386 -private -ret64 K32RtlExtendedLargeIntegerDivide(long long long ptr) NTDLL.RtlExtendedLargeIntegerDivide
+ 77 stdcall -noname -i386 -private -ret64 K32RtlExtendedMagicDivide(long long long long long) NTDLL.RtlExtendedMagicDivide
+ 78 stdcall -noname -i386 -private -ret64 K32RtlExtendedIntegerMultiply(long long long) NTDLL.RtlExtendedIntegerMultiply
+ 79 stdcall -noname -i386 -private -ret64 K32RtlLargeIntegerShiftLeft(long long long) NTDLL.RtlLargeIntegerShiftLeft
+ 80 stdcall -noname -i386 -private -ret64 K32RtlLargeIntegerShiftRight(long long long) NTDLL.RtlLargeIntegerShiftRight
+ 81 stdcall -noname -i386 -private -ret64 K32RtlLargeIntegerArithmeticShift(long long long) NTDLL.RtlLargeIntegerArithmeticShift
+ 82 stdcall -noname -i386 -private -ret64 K32RtlLargeIntegerNegate(long long) NTDLL.RtlLargeIntegerNegate
+ 83 stdcall -noname -i386 -private -ret64 K32RtlLargeIntegerSubtract(long long long long) NTDLL.RtlLargeIntegerSubtract
+ 84 stdcall -noname -i386 -private -ret64 K32RtlConvertLongToLargeInteger(long) NTDLL.RtlConvertLongToLargeInteger
+ 85 stdcall -noname -i386 -private -ret64 K32RtlConvertUlongToLargeInteger(long) NTDLL.RtlConvertUlongToLargeInteger
86 stdcall -i386 -private @(ptr) krnl386.exe16._KERNEL32_86
87 stdcall -noname -i386 -private SSOnBigStack() krnl386.exe16.SSOnBigStack
88 varargs -noname -i386 -private SSCall(long long ptr) krnl386.exe16.SSCall
@@ -133,8 +133,8 @@
# functions exported by name, ordinal doesn't matter
-@ stdcall AcquireSRWLockExclusive(ptr) ntdll.RtlAcquireSRWLockExclusive
-@ stdcall AcquireSRWLockShared(ptr) ntdll.RtlAcquireSRWLockShared
+@ stdcall AcquireSRWLockExclusive(ptr) NTDLL.RtlAcquireSRWLockExclusive
+@ stdcall AcquireSRWLockShared(ptr) NTDLL.RtlAcquireSRWLockShared
@ stdcall -import ActivateActCtx(ptr ptr)
@ stdcall AddAtomA(str)
@ stdcall AddAtomW(wstr)
@@ -147,8 +147,8 @@
@ stdcall -import AddRefActCtx(ptr)
# @ stub AddSIDToBoundaryDescriptor
# @ stub AddSecureMemoryCacheCallback
-@ stdcall AddVectoredContinueHandler(long ptr) ntdll.RtlAddVectoredContinueHandler
-@ stdcall AddVectoredExceptionHandler(long ptr) ntdll.RtlAddVectoredExceptionHandler
+@ stdcall AddVectoredContinueHandler(long ptr) NTDLL.RtlAddVectoredContinueHandler
+@ stdcall AddVectoredExceptionHandler(long ptr) NTDLL.RtlAddVectoredExceptionHandler
# @ stub AdjustCalendarDate
@ stdcall -import AllocConsole()
@ stub -i386 AllocLSCallback
@@ -210,7 +210,7 @@
@ stdcall -import CancelIo(long)
@ stdcall -import CancelIoEx(long ptr)
@ stdcall -import CancelSynchronousIo(long)
-@ stdcall CancelThreadpoolIo(ptr) ntdll.TpCancelAsyncIoOperation
+@ stdcall CancelThreadpoolIo(ptr) NTDLL.TpCancelAsyncIoOperation
@ stdcall CancelTimerQueueTimer(ptr ptr)
@ stdcall -import CancelWaitableTimer(long)
@ stdcall -import ChangeTimerQueueTimer(ptr ptr long long)
@@ -228,13 +228,13 @@
@ stdcall CloseProfileUserMapping()
@ stdcall -import ClosePseudoConsole(ptr)
@ stub CloseSystemHandle
-@ stdcall CloseThreadpool(ptr) ntdll.TpReleasePool
-@ stdcall CloseThreadpoolCleanupGroup(ptr) ntdll.TpReleaseCleanupGroup
-@ stdcall CloseThreadpoolCleanupGroupMembers(ptr long ptr) ntdll.TpReleaseCleanupGroupMembers
-@ stdcall CloseThreadpoolIo(ptr) ntdll.TpReleaseIoCompletion
-@ stdcall CloseThreadpoolTimer(ptr) ntdll.TpReleaseTimer
-@ stdcall CloseThreadpoolWait(ptr) ntdll.TpReleaseWait
-@ stdcall CloseThreadpoolWork(ptr) ntdll.TpReleaseWork
+@ stdcall CloseThreadpool(ptr) NTDLL.TpReleasePool
+@ stdcall CloseThreadpoolCleanupGroup(ptr) NTDLL.TpReleaseCleanupGroup
+@ stdcall CloseThreadpoolCleanupGroupMembers(ptr long ptr) NTDLL.TpReleaseCleanupGroupMembers
+@ stdcall CloseThreadpoolIo(ptr) NTDLL.TpReleaseIoCompletion
+@ stdcall CloseThreadpoolTimer(ptr) NTDLL.TpReleaseTimer
+@ stdcall CloseThreadpoolWait(ptr) NTDLL.TpReleaseWait
+@ stdcall CloseThreadpoolWork(ptr) NTDLL.TpReleaseWork
@ stdcall CmdBatNotification(long)
@ stdcall CommConfigDialogA(str long ptr)
@ stdcall CommConfigDialogW(wstr long ptr)
@@ -354,14 +354,14 @@
@ stdcall DebugBreak()
@ stdcall DebugBreakProcess(long)
@ stdcall DebugSetProcessKillOnExit(long)
-@ stdcall DecodePointer(ptr) ntdll.RtlDecodePointer
-@ stdcall DecodeSystemPointer(ptr) ntdll.RtlDecodeSystemPointer
+@ stdcall DecodePointer(ptr) NTDLL.RtlDecodePointer
+@ stdcall DecodeSystemPointer(ptr) NTDLL.RtlDecodeSystemPointer
@ stdcall DefineDosDeviceA(long str str)
@ stdcall -import DefineDosDeviceW(long wstr wstr)
@ stdcall -import DelayLoadFailureHook(str str)
@ stdcall DeleteAtom(long)
# @ stub DeleteBoundaryDescriptor
-@ stdcall DeleteCriticalSection(ptr) ntdll.RtlDeleteCriticalSection
+@ stdcall DeleteCriticalSection(ptr) NTDLL.RtlDeleteCriticalSection
@ stdcall -import DeleteFiber(ptr)
@ stdcall -import DeleteFileA(str)
# @ stub DeleteFileTransactedA
@@ -369,7 +369,7 @@
@ stdcall -import DeleteFileW(wstr)
@ stdcall -import DeleteProcThreadAttributeList(ptr)
# @ stub DisableThreadProfiling
-@ stdcall DisassociateCurrentThreadFromCallback(ptr) ntdll.TpDisassociateCallback
+@ stdcall DisassociateCurrentThreadFromCallback(ptr) NTDLL.TpDisassociateCallback
@ stdcall DeleteTimerQueue(long)
@ stdcall -import DeleteTimerQueueEx(long long)
@ stdcall -import DeleteTimerQueueTimer(long long long)
@@ -389,11 +389,11 @@
@ stdcall DuplicateConsoleHandle(long long long long)
@ stdcall -import DuplicateHandle(long long long ptr long long long)
# @ stub EnableThreadProfiling
-@ stdcall EncodePointer(ptr) ntdll.RtlEncodePointer
-@ stdcall EncodeSystemPointer(ptr) ntdll.RtlEncodeSystemPointer
+@ stdcall EncodePointer(ptr) NTDLL.RtlEncodePointer
+@ stdcall EncodeSystemPointer(ptr) NTDLL.RtlEncodeSystemPointer
@ stdcall EndUpdateResourceA(long long)
@ stdcall EndUpdateResourceW(long long)
-@ stdcall EnterCriticalSection(ptr) ntdll.RtlEnterCriticalSection
+@ stdcall EnterCriticalSection(ptr) NTDLL.RtlEnterCriticalSection
@ stdcall EnumCalendarInfoA(ptr long long long)
@ stdcall EnumCalendarInfoExA(ptr long long long)
@ stdcall -import EnumCalendarInfoExEx(ptr wstr long wstr long long)
@@ -439,7 +439,7 @@
@ stdcall -import EscapeCommFunction(long long)
@ stdcall -arch=x86_64 ExecuteUmsThread(ptr)
@ stdcall ExitProcess(long)
-@ stdcall ExitThread(long) ntdll.RtlExitUserThread
+@ stdcall ExitThread(long) NTDLL.RtlExitUserThread
@ stub ExitVDM
@ stdcall -import ExpandEnvironmentStringsA(str ptr long)
@ stdcall -import ExpandEnvironmentStringsW(wstr ptr long)
@@ -520,7 +520,7 @@
@ stdcall -import FlushConsoleInputBuffer(long)
@ stdcall -import FlushFileBuffers(long)
@ stdcall -import FlushInstructionCache(long long long)
-@ stdcall FlushProcessWriteBuffers() ntdll.NtFlushProcessWriteBuffers
+@ stdcall FlushProcessWriteBuffers() NTDLL.NtFlushProcessWriteBuffers
@ stdcall -import FlushViewOfFile(ptr long)
@ stdcall FoldStringA(long str long ptr long)
@ stdcall -import FoldStringW(long wstr long ptr long)
@@ -532,7 +532,7 @@
@ stub -i386 FreeLSCallback
@ stdcall -import FreeLibrary(long)
@ stdcall FreeLibraryAndExitThread(long long)
-@ stdcall FreeLibraryWhenCallbackReturns(ptr ptr) ntdll.TpCallbackUnloadDllOnCompletion
+@ stdcall FreeLibraryWhenCallbackReturns(ptr ptr) NTDLL.TpCallbackUnloadDllOnCompletion
@ stdcall -import FreeResource(long)
@ stdcall -i386 -private FreeSLCallback(long) krnl386.exe16.FreeSLCallback
@ stdcall -import FreeUserPhysicalPages(long ptr ptr)
@@ -634,8 +634,8 @@
@ stdcall GetCurrentPackagePath(ptr ptr) kernelbase.GetCurrentPackagePath
@ stdcall -norelay GetCurrentProcess() KERNEL32_GetCurrentProcess
@ stdcall -norelay GetCurrentProcessId() KERNEL32_GetCurrentProcessId
-@ stdcall GetCurrentProcessorNumber() ntdll.NtGetCurrentProcessorNumber
-@ stdcall GetCurrentProcessorNumberEx(ptr) ntdll.RtlGetCurrentProcessorNumberEx
+@ stdcall GetCurrentProcessorNumber() NTDLL.NtGetCurrentProcessorNumber
+@ stdcall GetCurrentProcessorNumberEx(ptr) NTDLL.RtlGetCurrentProcessorNumberEx
@ stdcall -norelay GetCurrentThread() KERNEL32_GetCurrentThread
@ stdcall -norelay GetCurrentThreadId() KERNEL32_GetCurrentThreadId
@ stdcall -import GetCurrentThreadStackLimits(ptr ptr)
@@ -926,7 +926,7 @@
@ stdcall Heap32ListFirst(long ptr)
@ stub Heap32ListNext
@ stub Heap32Next
-@ stdcall HeapAlloc(long long long) ntdll.RtlAllocateHeap
+@ stdcall HeapAlloc(long long long) NTDLL.RtlAllocateHeap
@ stdcall -import HeapCompact(long long)
@ stdcall HeapCreate(long long long)
@ stub HeapCreateTagsW
@@ -936,10 +936,10 @@
@ stdcall -import HeapLock(long)
@ stdcall -import HeapQueryInformation(long long ptr long ptr)
@ stub HeapQueryTagW
-@ stdcall HeapReAlloc(long long ptr long) ntdll.RtlReAllocateHeap
+@ stdcall HeapReAlloc(long long ptr long) NTDLL.RtlReAllocateHeap
@ stub HeapSetFlags
@ stdcall -import HeapSetInformation(ptr long ptr long)
-@ stdcall HeapSize(long long ptr) ntdll.RtlSizeHeap
+@ stdcall HeapSize(long long ptr) NTDLL.RtlSizeHeap
@ stub HeapSummary
@ stdcall -import HeapUnlock(long)
@ stub HeapUsage
@@ -952,27 +952,27 @@
@ stdcall InitOnceBeginInitialize(ptr long ptr ptr) kernelbase.InitOnceBeginInitialize
@ stdcall InitOnceComplete(ptr long ptr) kernelbase.InitOnceComplete
@ stdcall InitOnceExecuteOnce(ptr ptr ptr ptr) kernelbase.InitOnceExecuteOnce
-@ stdcall InitOnceInitialize(ptr) ntdll.RtlRunOnceInitialize
-@ stdcall InitializeConditionVariable(ptr) ntdll.RtlInitializeConditionVariable
+@ stdcall InitOnceInitialize(ptr) NTDLL.RtlRunOnceInitialize
+@ stdcall InitializeConditionVariable(ptr) NTDLL.RtlInitializeConditionVariable
@ stdcall -import -arch=i386,x86_64 InitializeContext(ptr long ptr ptr)
@ stdcall -import -arch=i386,x86_64 InitializeContext2(ptr long ptr ptr int64)
-@ stdcall InitializeCriticalSection(ptr) ntdll.RtlInitializeCriticalSection
+@ stdcall InitializeCriticalSection(ptr) NTDLL.RtlInitializeCriticalSection
@ stdcall -import InitializeCriticalSectionAndSpinCount(ptr long)
@ stdcall -import InitializeCriticalSectionEx(ptr long long)
@ stdcall -import InitializeProcThreadAttributeList(ptr long long ptr)
-@ stdcall InitializeSListHead(ptr) ntdll.RtlInitializeSListHead
-@ stdcall InitializeSRWLock(ptr) ntdll.RtlInitializeSRWLock
+@ stdcall InitializeSListHead(ptr) NTDLL.RtlInitializeSListHead
+@ stdcall InitializeSRWLock(ptr) NTDLL.RtlInitializeSRWLock
@ stdcall -arch=i386 InterlockedCompareExchange (ptr long long)
-@ stdcall -arch=i386 -ret64 InterlockedCompareExchange64(ptr int64 int64) ntdll.RtlInterlockedCompareExchange64
+@ stdcall -arch=i386 -ret64 InterlockedCompareExchange64(ptr int64 int64) NTDLL.RtlInterlockedCompareExchange64
@ stdcall -arch=i386 InterlockedDecrement(ptr)
@ stdcall -arch=i386 InterlockedExchange(ptr long)
@ stdcall -arch=i386 InterlockedExchangeAdd (ptr long )
-@ stdcall InterlockedFlushSList(ptr) ntdll.RtlInterlockedFlushSList
+@ stdcall InterlockedFlushSList(ptr) NTDLL.RtlInterlockedFlushSList
@ stdcall -arch=i386 InterlockedIncrement(ptr)
-@ stdcall InterlockedPopEntrySList(ptr) ntdll.RtlInterlockedPopEntrySList
-@ stdcall InterlockedPushEntrySList(ptr ptr) ntdll.RtlInterlockedPushEntrySList
-@ stdcall -fastcall InterlockedPushListSList(ptr ptr ptr long) ntdll.RtlInterlockedPushListSList
-@ stdcall InterlockedPushListSListEx(ptr ptr ptr long) ntdll.RtlInterlockedPushListSListEx
+@ stdcall InterlockedPopEntrySList(ptr) NTDLL.RtlInterlockedPopEntrySList
+@ stdcall InterlockedPushEntrySList(ptr ptr) NTDLL.RtlInterlockedPushEntrySList
+@ stdcall -fastcall InterlockedPushListSList(ptr ptr ptr long) NTDLL.RtlInterlockedPushListSList
+@ stdcall InterlockedPushListSListEx(ptr ptr ptr long) NTDLL.RtlInterlockedPushListSListEx
@ stub InvalidateConsoleDIBits
@ stdcall InvalidateNLSCache()
@ stdcall IsBadCodePtr(ptr)
@@ -996,7 +996,7 @@
@ stub -i386 IsSLCallback
@ stdcall IsSystemResumeAutomatic()
@ stdcall -import IsThreadAFiber()
-@ stdcall IsThreadpoolTimerSet(ptr) ntdll.TpIsTimerSet
+@ stdcall IsThreadpoolTimerSet(ptr) NTDLL.TpIsTimerSet
# @ stub IsTimeZoneRedirectionEnabled
# @ stub IsValidCalDateTime
@ stdcall -import IsValidCodePage(long)
@@ -1051,8 +1051,8 @@
@ stdcall LZRead(long ptr long)
@ stdcall LZSeek(long long long)
@ stdcall LZStart()
-@ stdcall LeaveCriticalSection(ptr) ntdll.RtlLeaveCriticalSection
-@ stdcall LeaveCriticalSectionWhenCallbackReturns(ptr ptr) ntdll.TpCallbackLeaveCriticalSectionOnCompletion
+@ stdcall LeaveCriticalSection(ptr) NTDLL.RtlLeaveCriticalSection
+@ stdcall LeaveCriticalSectionWhenCallbackReturns(ptr ptr) NTDLL.TpCallbackLeaveCriticalSectionOnCompletion
@ stdcall -import LoadAppInitDlls()
@ stdcall -import LoadLibraryA(str)
@ stdcall -import LoadLibraryExA( str long long)
@@ -1173,7 +1173,7 @@
@ stdcall -i386 -private -norelay QT_Thunk() krnl386.exe16.QT_Thunk
@ stdcall -import QueryActCtxSettingsW(long ptr wstr wstr ptr long ptr)
@ stdcall -import QueryActCtxW(long ptr ptr long ptr long ptr)
-@ stdcall QueryDepthSList(ptr) ntdll.RtlQueryDepthSList
+@ stdcall QueryDepthSList(ptr) NTDLL.RtlQueryDepthSList
@ stdcall QueryDosDeviceA(str ptr long)
@ stdcall -import QueryDosDeviceW(wstr ptr long)
@ stdcall -import QueryFullProcessImageNameA(ptr long ptr ptr)
@@ -1272,17 +1272,17 @@
@ stdcall ReinitializeCriticalSection(ptr)
@ stdcall -import ReleaseActCtx(ptr)
@ stdcall -import ReleaseMutex(long)
-@ stdcall ReleaseMutexWhenCallbackReturns(ptr long) ntdll.TpCallbackReleaseMutexOnCompletion
+@ stdcall ReleaseMutexWhenCallbackReturns(ptr long) NTDLL.TpCallbackReleaseMutexOnCompletion
@ stdcall -import ReleaseSemaphore(long long ptr)
-@ stdcall ReleaseSemaphoreWhenCallbackReturns(ptr long long) ntdll.TpCallbackReleaseSemaphoreOnCompletion
-@ stdcall ReleaseSRWLockExclusive(ptr) ntdll.RtlReleaseSRWLockExclusive
-@ stdcall ReleaseSRWLockShared(ptr) ntdll.RtlReleaseSRWLockShared
+@ stdcall ReleaseSemaphoreWhenCallbackReturns(ptr long long) NTDLL.TpCallbackReleaseSemaphoreOnCompletion
+@ stdcall ReleaseSRWLockExclusive(ptr) NTDLL.RtlReleaseSRWLockExclusive
+@ stdcall ReleaseSRWLockShared(ptr) NTDLL.RtlReleaseSRWLockShared
@ stdcall -import RemoveDirectoryA(str)
@ stdcall -import RemoveDirectoryW(wstr)
# @ stub RemoveLocalAlternateComputerNameA
# @ stub RemoveLocalAlternateComputerNameW
-@ stdcall RemoveVectoredContinueHandler(ptr) ntdll.RtlRemoveVectoredContinueHandler
-@ stdcall RemoveVectoredExceptionHandler(ptr) ntdll.RtlRemoveVectoredExceptionHandler
+@ stdcall RemoveVectoredContinueHandler(ptr) NTDLL.RtlRemoveVectoredContinueHandler
+@ stdcall RemoveVectoredExceptionHandler(ptr) NTDLL.RtlRemoveVectoredExceptionHandler
@ stdcall -import ReOpenFile(ptr long long long) ReOpenFile
@ stdcall -import ReplaceFile(wstr wstr wstr long ptr ptr) ReplaceFileW
@ stdcall ReplaceFileA(str str str long ptr ptr)
@@ -1297,27 +1297,27 @@
@ stdcall -import ResetEvent(long)
@ stdcall -import ResetWriteWatch(ptr long)
@ stdcall -import ResizePseudoConsole(ptr long)
-@ stdcall ResolveDelayLoadedAPI(ptr ptr ptr ptr ptr long) ntdll.LdrResolveDelayLoadedAPI
+@ stdcall ResolveDelayLoadedAPI(ptr ptr ptr ptr ptr long) NTDLL.LdrResolveDelayLoadedAPI
@ stdcall -import ResolveLocaleName(wstr ptr long)
-@ stdcall RestoreLastError(long) ntdll.RtlRestoreLastWin32Error
+@ stdcall RestoreLastError(long) NTDLL.RtlRestoreLastWin32Error
@ stdcall -import ResumeThread(long)
-@ cdecl -arch=arm,arm64,x86_64 RtlAddFunctionTable(ptr long long) ntdll.RtlAddFunctionTable
-@ stdcall -norelay RtlCaptureContext(ptr) ntdll.RtlCaptureContext
-@ stdcall RtlCaptureStackBackTrace(long long ptr ptr) ntdll.RtlCaptureStackBackTrace
-@ stdcall -arch=arm,arm64,x86_64 RtlCompareMemory(ptr ptr long) ntdll.RtlCompareMemory
-@ stdcall -arch=x86_64 RtlCopyMemory(ptr ptr long) ntdll.RtlCopyMemory
-@ cdecl -arch=arm,arm64,x86_64 RtlDeleteFunctionTable(ptr) ntdll.RtlDeleteFunctionTable
-@ stdcall RtlFillMemory(ptr long long) ntdll.RtlFillMemory
-@ cdecl -arch=arm,arm64,x86_64 RtlInstallFunctionTableCallback(long long long ptr ptr ptr) ntdll.RtlInstallFunctionTableCallback
-@ stdcall -arch=arm,arm64,x86_64 RtlLookupFunctionEntry(long ptr ptr) ntdll.RtlLookupFunctionEntry
-@ stdcall RtlMoveMemory(ptr ptr long) ntdll.RtlMoveMemory
-@ stdcall RtlPcToFileHeader(ptr ptr) ntdll.RtlPcToFileHeader
-@ stdcall -arch=arm,arm64,x86_64 -norelay RtlRaiseException(ptr) ntdll.RtlRaiseException
-@ cdecl -arch=arm,arm64,x86_64 RtlRestoreContext(ptr ptr) ntdll.RtlRestoreContext
-@ stdcall RtlUnwind(ptr ptr ptr long) ntdll.RtlUnwind
-@ stdcall -arch=arm,arm64,x86_64 RtlUnwindEx(long long ptr long ptr) ntdll.RtlUnwindEx
-@ stdcall -arch=arm,arm64,x86_64 RtlVirtualUnwind(long long long ptr ptr ptr ptr ptr) ntdll.RtlVirtualUnwind
-@ stdcall RtlZeroMemory(ptr long) ntdll.RtlZeroMemory
+@ cdecl -arch=arm,arm64,x86_64 RtlAddFunctionTable(ptr long long) NTDLL.RtlAddFunctionTable
+@ stdcall -norelay RtlCaptureContext(ptr) NTDLL.RtlCaptureContext
+@ stdcall RtlCaptureStackBackTrace(long long ptr ptr) NTDLL.RtlCaptureStackBackTrace
+@ stdcall -arch=arm,arm64,x86_64 RtlCompareMemory(ptr ptr long) NTDLL.RtlCompareMemory
+@ stdcall -arch=x86_64 RtlCopyMemory(ptr ptr long) NTDLL.RtlCopyMemory
+@ cdecl -arch=arm,arm64,x86_64 RtlDeleteFunctionTable(ptr) NTDLL.RtlDeleteFunctionTable
+@ stdcall RtlFillMemory(ptr long long) NTDLL.RtlFillMemory
+@ cdecl -arch=arm,arm64,x86_64 RtlInstallFunctionTableCallback(long long long ptr ptr ptr) NTDLL.RtlInstallFunctionTableCallback
+@ stdcall -arch=arm,arm64,x86_64 RtlLookupFunctionEntry(long ptr ptr) NTDLL.RtlLookupFunctionEntry
+@ stdcall RtlMoveMemory(ptr ptr long) NTDLL.RtlMoveMemory
+@ stdcall RtlPcToFileHeader(ptr ptr) NTDLL.RtlPcToFileHeader
+@ stdcall -arch=arm,arm64,x86_64 -norelay RtlRaiseException(ptr) NTDLL.RtlRaiseException
+@ cdecl -arch=arm,arm64,x86_64 RtlRestoreContext(ptr ptr) NTDLL.RtlRestoreContext
+@ stdcall RtlUnwind(ptr ptr ptr long) NTDLL.RtlUnwind
+@ stdcall -arch=arm,arm64,x86_64 RtlUnwindEx(long long ptr long ptr) NTDLL.RtlUnwindEx
+@ stdcall -arch=arm,arm64,x86_64 RtlVirtualUnwind(long long long ptr ptr ptr ptr ptr) NTDLL.RtlVirtualUnwind
+@ stdcall RtlZeroMemory(ptr long) NTDLL.RtlZeroMemory
@ stdcall -i386 -private -norelay SMapLS() krnl386.exe16.SMapLS
@ stdcall -i386 -private -norelay SMapLS_IP_EBP_12() krnl386.exe16.SMapLS_IP_EBP_12
@ stdcall -i386 -private -norelay SMapLS_IP_EBP_16() krnl386.exe16.SMapLS_IP_EBP_16
@@ -1388,7 +1388,7 @@
@ stdcall SetConsoleTitleA(str)
@ stdcall -import SetConsoleTitleW(wstr)
@ stdcall -import SetConsoleWindowInfo(long long ptr)
-@ stdcall SetCriticalSectionSpinCount(ptr long) ntdll.RtlSetCriticalSectionSpinCount
+@ stdcall SetCriticalSectionSpinCount(ptr long) NTDLL.RtlSetCriticalSectionSpinCount
@ stdcall SetCurrentConsoleFontEx(long long ptr)
@ stdcall -import SetCurrentDirectoryA(str)
@ stdcall -import SetCurrentDirectoryW(wstr)
@@ -1406,7 +1406,7 @@
@ stdcall -import SetEnvironmentVariableW(wstr wstr)
@ stdcall -import SetErrorMode(long)
@ stdcall -import SetEvent(long)
-@ stdcall SetEventWhenCallbackReturns(ptr long) ntdll.TpCallbackSetEventOnCompletion
+@ stdcall SetEventWhenCallbackReturns(ptr long) NTDLL.TpCallbackSetEventOnCompletion
@ stdcall -import SetFileApisToANSI()
@ stdcall -import SetFileApisToOEM()
@ stdcall -import SetFileAttributesA(str long)
@@ -1478,10 +1478,10 @@
# @ stub SetThreadToken
@ stdcall -import SetThreadUILanguage(long)
@ stdcall -import SetThreadpoolStackInformation(ptr ptr)
-@ stdcall SetThreadpoolThreadMaximum(ptr long) ntdll.TpSetPoolMaxThreads
-@ stdcall SetThreadpoolThreadMinimum(ptr long) ntdll.TpSetPoolMinThreads
-@ stdcall SetThreadpoolTimer(ptr ptr long long) ntdll.TpSetTimer
-@ stdcall SetThreadpoolWait(ptr long ptr) ntdll.TpSetWait
+@ stdcall SetThreadpoolThreadMaximum(ptr long) NTDLL.TpSetPoolMaxThreads
+@ stdcall SetThreadpoolThreadMinimum(ptr long) NTDLL.TpSetPoolMinThreads
+@ stdcall SetThreadpoolTimer(ptr ptr long long) NTDLL.TpSetTimer
+@ stdcall SetThreadpoolWait(ptr long ptr) NTDLL.TpSetWait
@ stdcall -import SetTimeZoneInformation(ptr)
@ stub SetTimerQueueTimer
@ stdcall -arch=x86_64 SetUmsThreadInformation(ptr long ptr long)
@@ -1506,8 +1506,8 @@
@ stdcall -import SleepEx(long long)
# @ stub SortCloseHandle
# @ stub SortGetHandle
-@ stdcall StartThreadpoolIo(ptr) ntdll.TpStartAsyncIoOperation
-@ stdcall SubmitThreadpoolWork(ptr) ntdll.TpPostWork
+@ stdcall StartThreadpoolIo(ptr) NTDLL.TpStartAsyncIoOperation
+@ stdcall SubmitThreadpoolWork(ptr) NTDLL.TpPostWork
@ stdcall -import SuspendThread(long)
@ stdcall -import SwitchToFiber(ptr)
@ stdcall -import SwitchToThread()
@@ -1531,9 +1531,9 @@
@ stdcall -import TransactNamedPipe(long ptr long ptr long ptr ptr)
@ stdcall -import TransmitCommChar(long long)
@ stub TrimVirtualBuffer
-@ stdcall TryAcquireSRWLockExclusive(ptr) ntdll.RtlTryAcquireSRWLockExclusive
-@ stdcall TryAcquireSRWLockShared(ptr) ntdll.RtlTryAcquireSRWLockShared
-@ stdcall TryEnterCriticalSection(ptr) ntdll.RtlTryEnterCriticalSection
+@ stdcall TryAcquireSRWLockExclusive(ptr) NTDLL.RtlTryAcquireSRWLockExclusive
+@ stdcall TryAcquireSRWLockShared(ptr) NTDLL.RtlTryAcquireSRWLockShared
+@ stdcall TryEnterCriticalSection(ptr) NTDLL.RtlTryEnterCriticalSection
@ stdcall -import TrySubmitThreadpoolCallback(ptr ptr ptr)
@ stdcall -import TzSpecificLocalTimeToSystemTime(ptr ptr ptr)
# @ stub TzSpecificLocalTimeToSystemTimeEx
@@ -1571,7 +1571,7 @@
@ stub ValidateLocale
@ stdcall -import VerLanguageNameA(long str long)
@ stdcall -import VerLanguageNameW(long wstr long)
-@ stdcall -ret64 VerSetConditionMask(long long long long) ntdll.VerSetConditionMask
+@ stdcall -ret64 VerSetConditionMask(long long long long) NTDLL.VerSetConditionMask
@ stdcall VerifyConsoleIoHandle(long)
# @ stub VerifyScripts
@ stdcall VerifyVersionInfoA(ptr long int64)
@@ -1595,14 +1595,14 @@
@ stdcall -import WaitForMultipleObjectsEx(long ptr long long long)
@ stdcall -import WaitForSingleObject(long long)
@ stdcall -import WaitForSingleObjectEx(long long long)
-@ stdcall WaitForThreadpoolIoCallbacks(ptr) ntdll.TpWaitForIoCompletion
-@ stdcall WaitForThreadpoolTimerCallbacks(ptr long) ntdll.TpWaitForTimer
-@ stdcall WaitForThreadpoolWaitCallbacks(ptr long) ntdll.TpWaitForWait
-@ stdcall WaitForThreadpoolWorkCallbacks(ptr long) ntdll.TpWaitForWork
+@ stdcall WaitForThreadpoolIoCallbacks(ptr) NTDLL.TpWaitForIoCompletion
+@ stdcall WaitForThreadpoolTimerCallbacks(ptr long) NTDLL.TpWaitForTimer
+@ stdcall WaitForThreadpoolWaitCallbacks(ptr long) NTDLL.TpWaitForWait
+@ stdcall WaitForThreadpoolWorkCallbacks(ptr long) NTDLL.TpWaitForWork
@ stdcall WaitNamedPipeA (str long)
@ stdcall -import WaitNamedPipeW (wstr long)
-@ stdcall WakeAllConditionVariable(ptr) ntdll.RtlWakeAllConditionVariable
-@ stdcall WakeConditionVariable(ptr) ntdll.RtlWakeConditionVariable
+@ stdcall WakeAllConditionVariable(ptr) NTDLL.RtlWakeAllConditionVariable
+@ stdcall WakeConditionVariable(ptr) NTDLL.RtlWakeConditionVariable
@ stdcall -import WerGetFlags(ptr ptr)
@ stdcall -import WerRegisterFile(wstr long long)
@ stdcall -import WerRegisterMemoryBlock(ptr long)
@@ -1653,8 +1653,8 @@
@ stdcall WriteProfileStringW(wstr wstr wstr)
@ stdcall WriteTapemark(ptr long long long)
@ stdcall -import ZombifyActCtx(ptr)
-@ stdcall -arch=x86_64 -private __C_specific_handler(ptr long ptr ptr) ntdll.__C_specific_handler
-@ cdecl -arch=arm,x86_64 -norelay __chkstk() ntdll.__chkstk
+@ stdcall -arch=x86_64 -private __C_specific_handler(ptr long ptr ptr) NTDLL.__C_specific_handler
+@ cdecl -arch=arm,x86_64 -norelay __chkstk() NTDLL.__chkstk
@ stub _DebugOut
@ stub _DebugPrintf
@ stdcall _hread(long ptr long)
@@ -1662,7 +1662,7 @@
@ stdcall _lclose(long)
@ stdcall _lcreat(str long)
@ stdcall _llseek(long long long)
-@ stdcall -arch=x86_64 -private _local_unwind(ptr ptr) ntdll._local_unwind
+@ stdcall -arch=x86_64 -private _local_unwind(ptr ptr) NTDLL._local_unwind
@ stdcall _lopen(str long)
@ stdcall _lread(long ptr long)
@ stdcall _lwrite(long ptr long)
--
2.33.1
Nov. 30, 2021
Re: [PATCH v3] ws2_32: hardcode optlen to 4 for setsockopt in the TCP_NODELAY case
by Marvin
Hi,
While running your changed tests, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at:
https://testbot.winehq.org/JobDetails.pl?Key=103013
Your paranoid android.
=== w7u_2qxl (32 bit report) ===
ws2_32:
sock.c:1315: Test failed: TCP_NODELAY should be 0
=== w7u_adm (32 bit report) ===
ws2_32:
sock.c:1315: Test failed: TCP_NODELAY should be 0
=== w7u_el (32 bit report) ===
ws2_32:
sock.c:1315: Test failed: TCP_NODELAY should be 0
=== w8 (32 bit report) ===
ws2_32:
sock.c:1315: Test failed: TCP_NODELAY should be 0
=== w8adm (32 bit report) ===
ws2_32:
sock.c:1315: Test failed: TCP_NODELAY should be 0
=== w864 (32 bit report) ===
ws2_32:
sock.c:1315: Test failed: TCP_NODELAY should be 0
=== w1064v1507 (32 bit report) ===
ws2_32:
sock.c:1315: Test failed: TCP_NODELAY should be 0
=== w1064v1809 (32 bit report) ===
ws2_32:
sock.c:1315: Test failed: TCP_NODELAY should be 0
=== w1064 (32 bit report) ===
ws2_32:
sock.c:1315: Test failed: TCP_NODELAY should be 0
=== w1064_tsign (32 bit report) ===
ws2_32:
sock.c:1315: Test failed: TCP_NODELAY should be 0
=== w10pro64 (32 bit report) ===
ws2_32:
sock.c:1297: Test failed: got -1 with 10055 (expected SOCKET_ERROR with WSAEFAULT)
sock.c:1315: Test failed: TCP_NODELAY should be 0
=== w864 (64 bit report) ===
ws2_32:
sock.c:1315: Test failed: TCP_NODELAY should be 0
=== w1064v1507 (64 bit report) ===
ws2_32:
sock.c:1315: Test failed: TCP_NODELAY should be 0
=== w1064v1809 (64 bit report) ===
ws2_32:
sock.c:1315: Test failed: TCP_NODELAY should be 0
=== w1064 (64 bit report) ===
ws2_32:
sock.c:1315: Test failed: TCP_NODELAY should be 0
=== w1064_2qxl (64 bit report) ===
ws2_32:
sock.c:1315: Test failed: TCP_NODELAY should be 0
=== w1064_tsign (64 bit report) ===
ws2_32:
sock.c:1315: Test failed: TCP_NODELAY should be 0
=== w10pro64 (64 bit report) ===
ws2_32:
sock.c:1297: Test failed: got -1 with 10055 (expected SOCKET_ERROR with WSAEFAULT)
sock.c:1315: Test failed: TCP_NODELAY should be 0
=== w10pro64_ar (64 bit report) ===
ws2_32:
sock.c:1297: Test failed: got -1 with 10055 (expected SOCKET_ERROR with WSAEFAULT)
sock.c:1315: Test failed: TCP_NODELAY should be 0
=== w10pro64_he (64 bit report) ===
ws2_32:
sock.c:1297: Test failed: got -1 with 10055 (expected SOCKET_ERROR with WSAEFAULT)
sock.c:1315: Test failed: TCP_NODELAY should be 0
=== w10pro64_ja (64 bit report) ===
ws2_32:
sock.c:1297: Test failed: got -1 with 10055 (expected SOCKET_ERROR with WSAEFAULT)
sock.c:1315: Test failed: TCP_NODELAY should be 0
=== w10pro64_zh_CN (64 bit report) ===
ws2_32:
sock.c:1297: Test failed: got -1 with 10055 (expected SOCKET_ERROR with WSAEFAULT)
sock.c:1315: Test failed: TCP_NODELAY should be 0
Nov. 30, 2021
[PATCH v3] ws2_32: hardcode optlen to 4 for setsockopt in the TCP_NODELAY case
by Bastien Orivel
According to MSDN [1], `TCP_NODELAY` parameter should be of type `BOOL`
which is 4 bytes. Due to a bug [2] in rustc passing a byte instead of an
int, any program written in rust that tries to set that option on a
socket will fail with a "Invalid parameter supplied" error.
Turns out that setsockopt on linux does not want optlen to be less than
4 bytes [3].
Windows' behavior is the following:
- For optlen <= 0, return SOCKET_ERROR and set last error to WSAEFAULT
- For optlen > 0, ignore the optlen value and set the TCP_NODELAY value
to one if the first byte of the given optvalue is not 0.
This will fix any rust program using the hyper library to do HTTP
requests.
[1]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-tcp-socket-o…
[2]: https://github.com/rust-lang/rust/blob/44593aeb1387b1be355aeaf0040d5927bd80…
[3]: https://github.com/torvalds/linux/blob/d58071a8a76d779eedab38033ae4c821c302…
Signed-off-by: Bastien Orivel <eijebong(a)bananium.fr>
---
dlls/ws2_32/socket.c | 10 ++++++--
dlls/ws2_32/tests/sock.c | 55 ++++++++++++++++++++++++++++++++++++++++
2 files changed, 63 insertions(+), 2 deletions(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index 2db441bee3c..5ac88c47b2e 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -2868,8 +2868,14 @@ int WINAPI setsockopt( SOCKET s, int level, int optname, const char *optval, int
switch(optname)
{
case TCP_NODELAY:
- return server_setsockopt( s, IOCTL_AFD_WINE_SET_TCP_NODELAY, optval, optlen );
-
+ {
+ INT nodelay = *optval;
+ if (optlen <= 0) {
+ SetLastError(WSAEFAULT);
+ return SOCKET_ERROR;
+ }
+ return server_setsockopt( s, IOCTL_AFD_WINE_SET_TCP_NODELAY, (char*)&nodelay, sizeof(nodelay) );
+ }
default:
FIXME("Unknown IPPROTO_TCP optname 0x%08x\n", optname);
SetLastError(WSAENOPROTOOPT);
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index 02713a7c625..e272ed3f303 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -1259,6 +1259,61 @@ static void test_set_getsockopt(void)
ok(err == SOCKET_ERROR && WSAGetLastError() == WSAEFAULT,
"got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", err, WSAGetLastError());
+ /* TCP_NODELAY: optlen doesn't matter on windows, it should work with any value */
+ size = sizeof(value);
+
+ value = 1;
+ err = setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char*)&value, 1);
+ ok (!err, "setsockopt TCP_NODELAY failed with optlen == 1\n");
+ err = getsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char*)&value, &size);
+ ok(!err, "getsockopt TCP_NODELAY failed\n");
+ ok(value == 1, "TCP_NODELAY should be 1\n");
+ value = 0;
+ err = setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char*)&value, sizeof(value));
+ ok(!err, "Failed to reset TCP_NODELAY to 0\n");
+
+ value = 1;
+ err = setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char*)&value, 4);
+ ok (!err, "setsockopt TCP_NODELAY failed with optlen == 4\n");
+ err = getsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char*)&value, &size);
+ ok(!err, "getsockopt TCP_NODELAY failed\n");
+ ok(value == 1, "TCP_NODELAY should be 1\n");
+ value = 0;
+ err = setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char*)&value, sizeof(value));
+ ok(!err, "Failed to reset TCP_NODELAY to 0\n");
+
+ value = 1;
+ err = setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char*)&value, 42);
+ ok (!err, "setsockopt TCP_NODELAY failed with optlen == 42\n");
+ err = getsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char*)&value, &size);
+ ok(!err, "getsockopt TCP_NODELAY failed\n");
+ ok(value == 1, "TCP_NODELAY should be 1\n");
+ value = 0;
+ err = setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char*)&value, sizeof(value));
+ ok(!err, "Failed to reset TCP_NODELAY to 0\n");
+
+ value = 1;
+ err = setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char*)&value, -1);
+ ok(err == SOCKET_ERROR && WSAGetLastError() == WSAEFAULT,
+ "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", err, WSAGetLastError());
+ err = getsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char*)&value, &size);
+ ok(!err, "getsockopt TCP_NODELAY failed\n");
+ ok(!value, "TCP_NODELAY should be 0\n");
+
+ err = setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char*)&value, 0);
+ ok(err == SOCKET_ERROR && WSAGetLastError() == WSAEFAULT,
+ "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", err, WSAGetLastError());
+ err = getsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char*)&value, &size);
+ ok(!err, "getsockopt TCP_NODELAY failed\n");
+ ok(!value, "TCP_NODELAY should be 0\n");
+
+ value = 0x100;
+ err = setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char*)&value, 4);
+ ok (!err, "setsockopt TCP_NODELAY failed with optlen == 4 and optvalue = 0x100\n");
+ err = getsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char*)&value, &size);
+ ok(!err, "getsockopt TCP_NODELAY failed\n");
+ ok(!value, "TCP_NODELAY should be 0\n");
+
/* Test for erroneously passing a value instead of a pointer as optval */
size = sizeof(char);
err = setsockopt(s, SOL_SOCKET, SO_DONTROUTE, (char *)1, size);
--
2.34.0
Nov. 30, 2021
[PATCH] msvcr100: Add _Timer class implementation.
by Piotr Caban
Signed-off-by: Piotr Caban <piotr(a)codeweavers.com>
---
dlls/concrt140/concrt140.spec | 24 ++---
dlls/concrt140/tests/concrt140.c | 145 ++++++++++++++++++++++++++++
dlls/msvcr100/msvcr100.spec | 16 +--
dlls/msvcr110/msvcr110.spec | 24 ++---
dlls/msvcr120/msvcr120.spec | 24 ++---
dlls/msvcr120_app/msvcr120_app.spec | 24 ++---
dlls/msvcrt/concurrency.c | 102 +++++++++++++++++++
7 files changed, 303 insertions(+), 56 deletions(-)
Nov. 30, 2021
Re: [PATCH vkd3d v8 2/4] vkd3d-shader/hlsl: Handle conditionals in copy propagation.
by Zebediah Figura
So this is failing to optimize the following program, and I can't see why:
uniform int i;
float main() : sv_target
{
float x = 0;
if (0){}
return x;
}
It generates the following code:
2: float | 0.00000000e+00
3: | = (x.x @2)
4: int | 0
5: | if (@4) {
} else {
}
6: float | x
7: | = (<retval-0x5620633a6280>.x @6)
8: | return
9: uint | 0
10: float | <retval-0x5620633a6280>[@9]
11: | = (<output-sv_target0>.x @10)
I'd expect @6 to be rewritten to @2.x, but that doesn't happen. Do you
know why?
Nov. 30, 2021
Re: [PATCH vkd3d v3 2/7] vkd3d-shader/hlsl: Make pre/post decrement generate a signed one.
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
Nov. 30, 2021
Re: [PATCH] ntdll: Set rcx and r11 on exit from syscall dispatcher on x64.
by Paul Gofman
Thanks for testing this. First of all, I did not try to simulate every
bit of volatile registers clobbering performed by the kernel. Maybe my
mistake here is rather touching r11 at all (while I mostly care about
rcx now) or at least making those changes in a single patch. Yet your
analysis might be quite helpful, although I can't say I could follow
completely. My questions are inline.
On 11/30/21 19:56, Jinoh Kang wrote:
> After some testing I found out that the patch's behaviour is inaccurate.
>
> The attached test program does the following:
>
> 1. Set R10 to 0xdeadbeef5a5a5a5a and R11 to 0x0123456789ABCDEF.
> 2. Generate a page fault.
By page fault do you mean exactly page fault per se (transparently
handled by kernel) or access violation? If that's the first not sure
what exactly is it supposed to influence?
> 3. Set R10 to 0xcafebabea5a5a5a5 and R11 to 0xfedcba9876543210.
Set where? If p. 2., concerns access violoation, do you mean in vectored
handle? Or maybe I am not following completely.
> 4. Issue a system call that pauses the current thread.
Which exactly do you mean, to be sure?
> 5. Switch to another thread, and dump the previous thread's registers.
> 6. Set all bits in EFLAGS to 1. (0xffffffffffffffff)
> 7. Dump the previous thread's registers again.
Basically I think it would be much easier to follow if that was
expressed in some sort of pseudocode naming specific functions / seh
handlers etc.
> Its output on Windows 10 (20H2) is:
>
>> SharedUserData.SystemCall = 0000000000
>>
>> Before set context:
>> EFlags = 0x0000000000000246 R11 = 0x0123456789abcdef
>> RIP = 0x00007ffa09e504d4 RCX = 0x0000000000000088
>> RSP = 0x0000000000ccfef8 R10 = 0xdeadbeef5a5a5a5a
>>
>> After set context:
>> EFlags = 0x0000000000210fd5 R11 = 0x0123456789abcdef
>> RIP = 0x00007ffa09e504d4 RCX = 0x0000000000000088
>> RSP = 0x0000000000ccfef8 R10 = 0xdeadbeef5a5a5a5a
> From this we can observe the following:
>
> A. KiFastSystemCall doesn't clear bit 1 in R11 by itself.
> Rather, it's the job of NtSetContextThread.
Yeah, regardless of how this is concluded from a test it looks like
cleaner way to do it to me.
>
> B. KiFastSystemCall ignores registers clobbered by the SYSCALL instruction.
> It does try to pretend that the 1st argument is being passed to RCX,
> which leaves the actual 1st argument register (R11) unmodified in CONTEXT.
> (Also note that this implies the presence of a flag in the real kernel
> that records whether R10/R11 are set to valid values or not. Otherwise,
> the kernel would be unable to use SYSRET since R11 != RFLAGS, etc.)
> C. Other entrances to kernel (e.g. a page fault) do record all registers.
> These values are preserved until the next time the thread switches to
> kernel mode.
>
Again, it would be better to clarify what is meant by page fault but
from this context I suspect you mean access violation (or other
exception)? In Wine this is handled separately, the syscall_dispatcher()
is not involved neither for entering the Unix part (that is done from
signal) nor from continuing to user mode (that is done by setting
registers from the signal handler and returning right to user mode ntdll
entry point). Do you mean your test suggest some modifications to this
part? That might be interesting to know but I didn't have an intention
to cover all of that at once.
Nov. 30, 2021