Wine-devel
Threads by month
- ----- 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
July 2021
- 86 participants
- 642 discussions
[PATCH v2] oleaut32/tests: Report the error when VarParseNumFromStr() fails.
by Francois Gouget 20 Jul '21
by Francois Gouget 20 Jul '21
20 Jul '21
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
v2: Duplicate the check in ok() and if ().
An alternative would be to put an else ok(0, ...) instead.
---
dlls/oleaut32/tests/vartest.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/dlls/oleaut32/tests/vartest.c b/dlls/oleaut32/tests/vartest.c
index b18e6e3f3a0..136d2ddd521 100644
--- a/dlls/oleaut32/tests/vartest.c
+++ b/dlls/oleaut32/tests/vartest.c
@@ -1288,6 +1288,7 @@ static HRESULT convert_str( const char *str, INT dig, ULONG flags,
static void expect_NumFromStr( int line, HRESULT hres, NUMPARSE *np, INT a, ULONG b, ULONG c,
INT d, INT e, INT f )
{
+ ok_(__FILE__,line)(hres == (HRESULT)S_OK, "returned %08x\n", hres);
if (hres == (HRESULT)S_OK)
{
ok_(__FILE__,line)(np->cDig == a, "Expected cDig = %d, got %d\n", a, np->cDig);
--
2.20.1
2
1
[PATCH 1/2] oleaut32: Fix VarParseNumFromStr()'s support for two-character currencies.
by Francois Gouget 20 Jul '21
by Francois Gouget 20 Jul '21
20 Jul '21
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51452
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
This is only a partial fix for bug 51452: two character currencies
should now work but longer currencies still fail.
---
dlls/oleaut32/tests/vartest.c | 7 +++----
dlls/oleaut32/variant.c | 4 ++--
2 files changed, 5 insertions(+), 6 deletions(-)
diff --git a/dlls/oleaut32/tests/vartest.c b/dlls/oleaut32/tests/vartest.c
index 136d2ddd521..52a27750f45 100644
--- a/dlls/oleaut32/tests/vartest.c
+++ b/dlls/oleaut32/tests/vartest.c
@@ -2154,14 +2154,13 @@ static void test_VarParseNumFromStrMisc(void)
/* 2 Polish zloty */
lcid = MAKELCID(MAKELANGID(LANG_POLISH,SUBLANG_POLISH_POLAND),SORT_DEFAULT);
WCONVERT(L"z\x142\x32", NUMPRS_CURRENCY|NUMPRS_USE_ALL);
- todo_wine EXPECT(1,NUMPRS_CURRENCY|NUMPRS_USE_ALL,NUMPRS_CURRENCY,3,0,0);
- todo_wine EXPECT2(2,FAILDIG);
+ EXPECT(1,NUMPRS_CURRENCY|NUMPRS_USE_ALL,NUMPRS_CURRENCY,3,0,0);
+ EXPECT2(2,FAILDIG);
/* Multi-character currencies can be repeated too "zl2zlzl" */
WCONVERT(L"z\x142\x32z\x142z\x142", NUMPRS_CURRENCY|NUMPRS_USE_ALL);
todo_wine EXPECT(1,NUMPRS_CURRENCY|NUMPRS_USE_ALL,NUMPRS_CURRENCY,7,0,0);
- todo_wine EXPECTRGB(0,2);
- EXPECTRGB(1,FAILDIG);
+ EXPECT2(2,FAILDIG);
lcid = MAKELCID(MAKELANGID(LANG_FRENCH,SUBLANG_FRENCH_SWISS),SORT_DEFAULT);
WCONVERT(L"3CHF", NUMPRS_CURRENCY|NUMPRS_USE_ALL);
diff --git a/dlls/oleaut32/variant.c b/dlls/oleaut32/variant.c
index fdc402c7a62..71c3204e0a0 100644
--- a/dlls/oleaut32/variant.c
+++ b/dlls/oleaut32/variant.c
@@ -1669,8 +1669,8 @@ HRESULT WINAPI VarParseNumFromStr(const OLECHAR *lpszStr, LCID lcid, ULONG dwFla
(!chars.cCurrencyLocal2 || lpszStr[1] == chars.cCurrencyLocal2))
{
pNumprs->dwOutFlags |= NUMPRS_CURRENCY;
- cchUsed++;
- lpszStr++;
+ cchUsed += chars.cCurrencyLocal2 ? 2 : 1;
+ lpszStr += chars.cCurrencyLocal2 ? 2 : 1;
/* Only accept currency characters */
chars.cDecimalPoint = chars.cCurrencyDecimalPoint;
chars.cDigitSeparator = chars.cCurrencyDigitSeparator;
--
2.20.1
1
1
Signed-off-by: Paul Gofman <pgofman(a)codeweavers.com>
---
v2:
- fix port test.
Those are supposed to be syscalls and having them as a regular functions is wrong.
In the not much likely case the presence of some of these stubs helped some
applications those can be added back as -syscall function stubs.
dlls/ntdll/ntdll.spec | 188 ++++++++++++++++++++--------------------
dlls/ntdll/tests/port.c | 4 +-
2 files changed, 96 insertions(+), 96 deletions(-)
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
index ccd825ff58e..aad7bd89d14 100644
--- a/dlls/ntdll/ntdll.spec
+++ b/dlls/ntdll/ntdll.spec
@@ -145,7 +145,7 @@
@ stdcall -syscall NtAllocateVirtualMemoryEx(long ptr ptr long long ptr long)
@ stdcall -syscall NtAreMappedFilesTheSame(ptr ptr)
@ stdcall -syscall NtAssignProcessToJobObject(long long)
-@ stub NtCallbackReturn
+# @ stub NtCallbackReturn
# @ stub NtCancelDeviceWakeupRequest
@ stdcall -syscall NtCancelIoFile(long ptr)
@ stdcall -syscall NtCancelIoFileEx(long ptr ptr)
@@ -153,7 +153,7 @@
@ stdcall -syscall NtClearEvent(long)
@ stdcall -syscall NtClearPowerRequest(long long)
@ stdcall -syscall NtClose(long)
-@ stub NtCloseObjectAuditAlarm
+# @ stub NtCloseObjectAuditAlarm
# @ stub NtCompactKeys
# @ stub NtCompareTokens
@ stdcall -syscall NtCompleteConnectPort(ptr)
@@ -163,7 +163,7 @@
@ stdcall -syscall NtCreateDebugObject(ptr long ptr long)
@ stdcall -syscall NtCreateDirectoryObject(ptr long ptr)
@ stdcall -syscall NtCreateEvent(ptr long ptr long long)
-@ stub NtCreateEventPair
+# @ stub NtCreateEventPair
@ stdcall -syscall NtCreateFile(ptr long ptr ptr ptr long long long long ptr long)
@ stdcall -syscall NtCreateIoCompletion(ptr long ptr long)
@ stdcall -syscall NtCreateJobObject(ptr long ptr)
@@ -178,16 +178,16 @@
@ stdcall -syscall NtCreatePagingFile(ptr ptr ptr ptr)
@ stdcall -syscall NtCreatePort(ptr ptr long long ptr)
@ stdcall -syscall NtCreatePowerRequest(ptr ptr)
-@ stub NtCreateProcess
+# @ stub NtCreateProcess
# @ stub NtCreateProcessEx
-@ stub NtCreateProfile
+# @ stub NtCreateProfile
@ stdcall -syscall NtCreateSection(ptr long ptr ptr long long long)
@ stdcall -syscall NtCreateSemaphore(ptr long ptr long long)
@ stdcall -syscall NtCreateSymbolicLinkObject(ptr long ptr ptr)
@ stdcall -syscall NtCreateThread(ptr long ptr long ptr ptr ptr long)
@ stdcall -syscall NtCreateThreadEx(ptr long ptr long ptr ptr long long long long ptr)
@ stdcall -syscall NtCreateTimer(ptr long ptr long)
-@ stub NtCreateToken
+# @ stub NtCreateToken
@ stdcall -syscall NtCreateUserProcess(ptr ptr long long ptr ptr long long ptr ptr ptr)
# @ stub NtCreateWaitablePort
@ stdcall -arch=i386,arm64 NtCurrentTeb()
@@ -205,11 +205,11 @@
@ stdcall -syscall NtDuplicateObject(long long long ptr long long long)
@ stdcall -syscall NtDuplicateToken(long long ptr long long ptr)
# @ stub NtEnumerateBootEntries
-@ stub NtEnumerateBus
+# @ stub NtEnumerateBus
@ stdcall -syscall NtEnumerateKey(long long long ptr long ptr)
# @ stub NtEnumerateSystemEnvironmentValuesEx
@ stdcall -syscall NtEnumerateValueKey(long long long ptr long ptr)
-@ stub NtExtendSection
+# @ stub NtExtendSection
@ stdcall -syscall NtFilterToken(long long ptr ptr ptr ptr)
@ stdcall -syscall NtFindAtom(ptr long ptr)
@ stdcall -syscall NtFlushBuffersFile(long ptr)
@@ -217,7 +217,7 @@
@ stdcall -syscall NtFlushKey(long)
@ stdcall -syscall NtFlushProcessWriteBuffers()
@ stdcall -syscall NtFlushVirtualMemory(long ptr ptr long)
-@ stub NtFlushWriteBuffer
+# @ stub NtFlushWriteBuffer
# @ stub NtFreeUserPhysicalPages
@ stdcall -syscall NtFreeVirtualMemory(long ptr ptr long)
@ stdcall -syscall NtFsControlFile(long long ptr ptr ptr long ptr long ptr long)
@@ -226,13 +226,13 @@
# @ stub NtGetDevicePowerState
@ stdcall -syscall NtGetNextThread(ptr ptr long long long ptr)
@ stdcall -syscall NtGetNlsSectionPtr(long long long ptr ptr)
-@ stub NtGetPlugPlayEvent
+# @ stub NtGetPlugPlayEvent
@ stdcall NtGetTickCount()
@ stdcall -syscall NtGetWriteWatch(long long ptr long ptr ptr ptr)
@ stdcall -syscall NtImpersonateAnonymousToken(long)
-@ stub NtImpersonateClientOfPort
-@ stub NtImpersonateThread
-@ stub NtInitializeRegistry
+# @ stub NtImpersonateClientOfPort
+# @ stub NtImpersonateThread
+# @ stub NtInitializeRegistry
@ stdcall -syscall NtInitiatePowerAction (long long long long)
@ stdcall -syscall NtIsProcessInJob(long long)
# @ stub NtIsSystemResumeAutomatic
@@ -255,7 +255,7 @@
@ stdcall -syscall NtNotifyChangeMultipleKeys(long long ptr long ptr ptr ptr long long ptr long long)
@ stdcall -syscall NtOpenDirectoryObject(ptr long ptr)
@ stdcall -syscall NtOpenEvent(ptr long ptr)
-@ stub NtOpenEventPair
+# @ stub NtOpenEventPair
@ stdcall -syscall NtOpenFile(ptr long ptr ptr long long)
@ stdcall -syscall NtOpenIoCompletion(ptr long ptr)
@ stdcall -syscall NtOpenJobObject(ptr long ptr)
@@ -265,7 +265,7 @@
@ stdcall -syscall NtOpenKeyTransactedEx(ptr long ptr long long)
@ stdcall -syscall NtOpenKeyedEvent(ptr long ptr)
@ stdcall -syscall NtOpenMutant(ptr long ptr)
-@ stub NtOpenObjectAuditAlarm
+# @ stub NtOpenObjectAuditAlarm
@ stdcall -syscall NtOpenProcess(ptr long ptr ptr)
@ stdcall -syscall NtOpenProcessToken(long long ptr)
@ stdcall -syscall NtOpenProcessTokenEx(long long long ptr)
@@ -276,11 +276,11 @@
@ stdcall -syscall NtOpenThreadToken(long long long ptr)
@ stdcall -syscall NtOpenThreadTokenEx(long long long long ptr)
@ stdcall -syscall NtOpenTimer(ptr long ptr)
-@ stub NtPlugPlayControl
+# @ stub NtPlugPlayControl
@ stdcall -syscall NtPowerInformation(long ptr long ptr long)
@ stdcall -syscall NtPrivilegeCheck(ptr ptr ptr)
-@ stub NtPrivilegeObjectAuditAlarm
-@ stub NtPrivilegedServiceAuditAlarm
+# @ stub NtPrivilegeObjectAuditAlarm
+# @ stub NtPrivilegedServiceAuditAlarm
@ stdcall -syscall NtProtectVirtualMemory(long ptr ptr long ptr)
@ stdcall -syscall NtPulseEvent(long ptr)
@ stdcall -syscall NtQueryAttributesFile(ptr ptr)
@@ -297,19 +297,19 @@
@ stdcall -syscall NtQueryInformationAtom(long long ptr long ptr)
@ stdcall -syscall NtQueryInformationFile(long ptr ptr long long)
@ stdcall -syscall NtQueryInformationJobObject(long long ptr long ptr)
-@ stub NtQueryInformationPort
+# @ stub NtQueryInformationPort
@ stdcall -syscall NtQueryInformationProcess(long long ptr long ptr)
@ stdcall -syscall NtQueryInformationThread(long long ptr long ptr)
@ stdcall -syscall NtQueryInformationToken(long long ptr long ptr)
@ stdcall -syscall NtQueryInstallUILanguage(ptr)
-@ stub NtQueryIntervalProfile
+# @ stub NtQueryIntervalProfile
@ stdcall -syscall NtQueryIoCompletion(long long ptr long ptr)
@ stdcall -syscall NtQueryKey(long long ptr long ptr)
@ stdcall -syscall NtQueryLicenseValue(ptr ptr ptr long ptr)
@ stdcall -syscall NtQueryMultipleValueKey(long ptr long ptr long ptr)
@ stdcall -syscall NtQueryMutant(long long ptr long ptr)
@ stdcall -syscall NtQueryObject(long long ptr long ptr)
-@ stub NtQueryOpenSubKeys
+# @ stub NtQueryOpenSubKeys
@ stdcall -syscall NtQueryPerformanceCounter(ptr ptr)
# @ stub NtQueryPortInformationProcess
# @ stub NtQueryQuotaInformationFile
@@ -332,25 +332,25 @@
@ stdcall -syscall NtRaiseHardError(long long ptr ptr long ptr)
@ stdcall -syscall NtReadFile(long long ptr ptr ptr ptr long ptr ptr)
@ stdcall -syscall NtReadFileScatter(long long ptr ptr ptr ptr long ptr ptr)
-@ stub NtReadRequestData
+# @ stub NtReadRequestData
@ stdcall -syscall NtReadVirtualMemory(long ptr ptr long ptr)
-@ stub NtRegisterNewDevice
+# @ stub NtRegisterNewDevice
@ stdcall -syscall NtRegisterThreadTerminatePort(ptr)
@ stdcall -syscall NtReleaseKeyedEvent(long ptr long ptr)
@ stdcall -syscall NtReleaseMutant(long ptr)
-@ stub NtReleaseProcessMutant
+# @ stub NtReleaseProcessMutant
@ stdcall -syscall NtReleaseSemaphore(long long ptr)
@ stdcall -syscall NtRemoveIoCompletion(ptr ptr ptr ptr ptr)
@ stdcall -syscall NtRemoveIoCompletionEx(ptr ptr long ptr ptr long)
@ stdcall -syscall NtRemoveProcessDebug(long long)
@ stdcall -syscall NtRenameKey(long ptr)
@ stdcall -syscall NtReplaceKey(ptr long ptr)
-@ stub NtReplyPort
+# @ stub NtReplyPort
@ stdcall -syscall NtReplyWaitReceivePort(ptr ptr ptr ptr)
-@ stub NtReplyWaitReceivePortEx
-@ stub NtReplyWaitReplyPort
+# @ stub NtReplyWaitReceivePortEx
+# @ stub NtReplyWaitReplyPort
# @ stub NtRequestDeviceWakeup
-@ stub NtRequestPort
+# @ stub NtRequestPort
@ stdcall -syscall NtRequestWaitReplyPort(ptr ptr ptr)
# @ stub NtRequestWakeupLatency
@ stdcall -syscall NtResetEvent(long ptr)
@@ -365,16 +365,16 @@
# @ stub NtSetBootEntryOrder
# @ stub NtSetBootOptions
@ stdcall -syscall NtSetContextThread(long ptr)
-@ stub NtSetDebugFilterState
-@ stub NtSetDefaultHardErrorPort
+# @ stub NtSetDebugFilterState
+# @ stub NtSetDefaultHardErrorPort
@ stdcall -syscall NtSetDefaultLocale(long long)
@ stdcall -syscall NtSetDefaultUILanguage(long)
@ stdcall -syscall NtSetEaFile(long ptr ptr long)
@ stdcall -syscall NtSetEvent(long ptr)
# @ stub NtSetEventBoostPriority
-@ stub NtSetHighEventPair
-@ stub NtSetHighWaitLowEventPair
-@ stub NtSetHighWaitLowThread
+# @ stub NtSetHighEventPair
+# @ stub NtSetHighWaitLowEventPair
+# @ stub NtSetHighWaitLowThread
@ stdcall -syscall NtSetInformationDebugObject(long long ptr long ptr)
@ stdcall -syscall NtSetInformationFile(long ptr ptr long long)
@ stdcall -syscall NtSetInformationJobObject(long long ptr long)
@@ -386,16 +386,16 @@
@ stdcall -syscall NtSetIntervalProfile(long long)
@ stdcall -syscall NtSetIoCompletion(ptr long long long long)
@ stdcall -syscall NtSetLdtEntries(long int64 long int64)
-@ stub NtSetLowEventPair
-@ stub NtSetLowWaitHighEventPair
-@ stub NtSetLowWaitHighThread
+# @ stub NtSetLowEventPair
+# @ stub NtSetLowWaitHighEventPair
+# @ stub NtSetLowWaitHighThread
@ stdcall -syscall NtSetPowerRequest(long long)
# @ stub NtSetQuotaInformationFile
@ stdcall -syscall NtSetSecurityObject(long long ptr)
-@ stub NtSetSystemEnvironmentValue
+# @ stub NtSetSystemEnvironmentValue
# @ stub NtSetSystemEnvironmentValueEx
@ stdcall -syscall NtSetSystemInformation(long ptr long)
-@ stub NtSetSystemPowerState
+# @ stub NtSetSystemPowerState
@ stdcall -syscall NtSetSystemTime(ptr ptr)
@ stdcall -syscall NtSetThreadExecutionState(long ptr)
@ stdcall -syscall NtSetTimer(long ptr ptr ptr long long ptr)
@@ -405,8 +405,8 @@
@ stdcall -syscall NtSetVolumeInformationFile(long ptr ptr long long)
@ stdcall -syscall NtShutdownSystem(long)
@ stdcall -syscall NtSignalAndWaitForSingleObject(long long long ptr)
-@ stub NtStartProfile
-@ stub NtStopProfile
+# @ stub NtStartProfile
+# @ stub NtStopProfile
@ stdcall -syscall NtSuspendProcess(long)
@ stdcall -syscall NtSuspendThread(long ptr)
@ stdcall -syscall NtSystemDebugControl(long ptr long ptr long ptr)
@@ -418,26 +418,26 @@
# @ stub NtTranslateFilePath
@ stdcall -syscall NtUnloadDriver(ptr)
@ stdcall -syscall NtUnloadKey(ptr)
-@ stub NtUnloadKeyEx
+# @ stub NtUnloadKeyEx
@ stdcall -syscall NtUnlockFile(long ptr ptr ptr ptr)
@ stdcall -syscall NtUnlockVirtualMemory(long ptr ptr long)
@ stdcall -syscall NtUnmapViewOfSection(long ptr)
-@ stub NtVdmControl
-@ stub NtW32Call
+# @ stub NtVdmControl
+# @ stub NtW32Call
@ stdcall -syscall NtWaitForDebugEvent(long long ptr ptr)
@ stdcall -syscall NtWaitForKeyedEvent(long ptr long ptr)
@ stdcall -syscall NtWaitForMultipleObjects(long ptr long long ptr)
-@ stub NtWaitForProcessMutant
+# @ stub NtWaitForProcessMutant
@ stdcall -syscall NtWaitForSingleObject(long long ptr)
-@ stub NtWaitHighEventPair
-@ stub NtWaitLowEventPair
+# @ stub NtWaitHighEventPair
+# @ stub NtWaitLowEventPair
@ stdcall -syscall -arch=win32 NtWow64AllocateVirtualMemory64(long ptr int64 ptr long long)
@ stdcall -syscall -arch=win32 NtWow64GetNativeSystemInformation(long ptr long ptr)
@ stdcall -syscall -arch=win32 NtWow64ReadVirtualMemory64(long int64 ptr int64 ptr)
@ stdcall -syscall -arch=win32 NtWow64WriteVirtualMemory64(long int64 ptr int64 ptr)
@ stdcall -syscall NtWriteFile(long long ptr ptr ptr ptr long ptr ptr)
@ stdcall -syscall NtWriteFileGather(long long ptr ptr ptr ptr long ptr ptr)
-@ stub NtWriteRequestData
+# @ stub NtWriteRequestData
@ stdcall -syscall NtWriteVirtualMemory(long ptr ptr long ptr)
@ stdcall -syscall NtYieldExecution()
@ stub PfxFindPrefix
@@ -1168,7 +1168,7 @@
@ stdcall -private -syscall ZwAllocateVirtualMemoryEx(long ptr ptr long long ptr long) NtAllocateVirtualMemoryEx
@ stdcall -private -syscall ZwAreMappedFilesTheSame(ptr ptr) NtAreMappedFilesTheSame
@ stdcall -private -syscall ZwAssignProcessToJobObject(long long) NtAssignProcessToJobObject
-@ stub ZwCallbackReturn
+# @ stub ZwCallbackReturn
# @ stub ZwCancelDeviceWakeupRequest
@ stdcall -private -syscall ZwCancelIoFile(long ptr) NtCancelIoFile
@ stdcall -private -syscall ZwCancelIoFileEx(long ptr ptr) NtCancelIoFileEx
@@ -1176,7 +1176,7 @@
@ stdcall -private -syscall ZwClearEvent(long) NtClearEvent
@ stdcall -private -syscall ZwClearPowerRequest(long long) NtClearPowerRequest
@ stdcall -private -syscall ZwClose(long) NtClose
-@ stub ZwCloseObjectAuditAlarm
+# @ stub ZwCloseObjectAuditAlarm
# @ stub ZwCompactKeys
# @ stub ZwCompareTokens
@ stdcall -private -syscall ZwCompleteConnectPort(ptr) NtCompleteConnectPort
@@ -1186,7 +1186,7 @@
# @ stub ZwCreateDebugObject
@ stdcall -private -syscall ZwCreateDirectoryObject(ptr long ptr) NtCreateDirectoryObject
@ stdcall -private -syscall ZwCreateEvent(ptr long ptr long long) NtCreateEvent
-@ stub ZwCreateEventPair
+# @ stub ZwCreateEventPair
@ stdcall -private -syscall ZwCreateFile(ptr long ptr ptr ptr long long long long ptr long) NtCreateFile
@ stdcall -private -syscall ZwCreateIoCompletion(ptr long ptr long) NtCreateIoCompletion
@ stdcall -private -syscall ZwCreateJobObject(ptr long ptr) NtCreateJobObject
@@ -1201,16 +1201,16 @@
@ stdcall -private -syscall ZwCreatePagingFile(ptr ptr ptr ptr) NtCreatePagingFile
@ stdcall -private -syscall ZwCreatePort(ptr ptr long long ptr) NtCreatePort
@ stdcall -private -syscall ZwCreatePowerRequest(ptr ptr) NtCreatePowerRequest
-@ stub ZwCreateProcess
+# @ stub ZwCreateProcess
# @ stub ZwCreateProcessEx
-@ stub ZwCreateProfile
+# @ stub ZwCreateProfile
@ stdcall -private -syscall ZwCreateSection(ptr long ptr ptr long long long) NtCreateSection
@ stdcall -private -syscall ZwCreateSemaphore(ptr long ptr long long) NtCreateSemaphore
@ stdcall -private -syscall ZwCreateSymbolicLinkObject(ptr long ptr ptr) NtCreateSymbolicLinkObject
@ stdcall -private -syscall ZwCreateThread(ptr long ptr long ptr ptr ptr long) NtCreateThread
@ stdcall -private -syscall ZwCreateThreadEx(ptr long ptr long ptr ptr long long long long ptr) NtCreateThreadEx
@ stdcall -private -syscall ZwCreateTimer(ptr long ptr long) NtCreateTimer
-@ stub ZwCreateToken
+# @ stub ZwCreateToken
@ stdcall -private -syscall ZwCreateUserProcess(ptr ptr long long ptr ptr long long ptr ptr ptr) NtCreateUserProcess
# @ stub ZwCreateWaitablePort
@ stdcall -private -syscall ZwDebugActiveProcess(long long) NtDebugActiveProcess
@@ -1227,11 +1227,11 @@
@ stdcall -private -syscall ZwDuplicateObject(long long long ptr long long long) NtDuplicateObject
@ stdcall -private -syscall ZwDuplicateToken(long long ptr long long ptr) NtDuplicateToken
# @ stub ZwEnumerateBootEntries
-@ stub ZwEnumerateBus
+# @ stub ZwEnumerateBus
@ stdcall -private -syscall ZwEnumerateKey(long long long ptr long ptr) NtEnumerateKey
# @ stub ZwEnumerateSystemEnvironmentValuesEx
@ stdcall -private -syscall ZwEnumerateValueKey(long long long ptr long ptr) NtEnumerateValueKey
-@ stub ZwExtendSection
+# @ stub ZwExtendSection
@ stdcall -private -syscall ZwFilterToken(long long ptr ptr ptr ptr) NtFilterToken
@ stdcall -private -syscall ZwFindAtom(ptr long ptr) NtFindAtom
@ stdcall -private -syscall ZwFlushBuffersFile(long ptr) NtFlushBuffersFile
@@ -1239,7 +1239,7 @@
@ stdcall -private -syscall ZwFlushKey(long) NtFlushKey
@ stdcall -private -syscall ZwFlushProcessWriteBuffers() NtFlushProcessWriteBuffers
@ stdcall -private -syscall ZwFlushVirtualMemory(long ptr ptr long) NtFlushVirtualMemory
-@ stub ZwFlushWriteBuffer
+# @ stub ZwFlushWriteBuffer
# @ stub ZwFreeUserPhysicalPages
@ stdcall -private -syscall ZwFreeVirtualMemory(long ptr ptr long) NtFreeVirtualMemory
@ stdcall -private -syscall ZwFsControlFile(long long ptr ptr ptr long ptr long ptr long) NtFsControlFile
@@ -1247,13 +1247,13 @@
@ stdcall -private -syscall ZwGetCurrentProcessorNumber() NtGetCurrentProcessorNumber
# @ stub ZwGetDevicePowerState
@ stdcall -private -syscall ZwGetNlsSectionPtr(long long long ptr ptr) NtGetNlsSectionPtr
-@ stub ZwGetPlugPlayEvent
+# @ stub ZwGetPlugPlayEvent
@ stdcall -private ZwGetTickCount() NtGetTickCount
@ stdcall -private -syscall ZwGetWriteWatch(long long ptr long ptr ptr ptr) NtGetWriteWatch
@ stdcall -private -syscall ZwImpersonateAnonymousToken(long) NtImpersonateAnonymousToken
-@ stub ZwImpersonateClientOfPort
-@ stub ZwImpersonateThread
-@ stub ZwInitializeRegistry
+# @ stub ZwImpersonateClientOfPort
+# @ stub ZwImpersonateThread
+# @ stub ZwInitializeRegistry
@ stdcall -private -syscall ZwInitiatePowerAction(long long long long) NtInitiatePowerAction
@ stdcall -private -syscall ZwIsProcessInJob(long long) NtIsProcessInJob
# @ stub ZwIsSystemResumeAutomatic
@@ -1276,7 +1276,7 @@
@ stdcall -private -syscall ZwNotifyChangeMultipleKeys(long long ptr long ptr ptr ptr long long ptr long long) NtNotifyChangeMultipleKeys
@ stdcall -private -syscall ZwOpenDirectoryObject(ptr long ptr) NtOpenDirectoryObject
@ stdcall -private -syscall ZwOpenEvent(ptr long ptr) NtOpenEvent
-@ stub ZwOpenEventPair
+# @ stub ZwOpenEventPair
@ stdcall -private -syscall ZwOpenFile(ptr long ptr ptr long long) NtOpenFile
@ stdcall -private -syscall ZwOpenIoCompletion(ptr long ptr) NtOpenIoCompletion
@ stdcall -private -syscall ZwOpenJobObject(ptr long ptr) NtOpenJobObject
@@ -1286,7 +1286,7 @@
@ stdcall -private -syscall ZwOpenKeyTransactedEx(ptr long ptr long long) NtOpenKeyTransactedEx
@ stdcall -private -syscall ZwOpenKeyedEvent(ptr long ptr) NtOpenKeyedEvent
@ stdcall -private -syscall ZwOpenMutant(ptr long ptr) NtOpenMutant
-@ stub ZwOpenObjectAuditAlarm
+# @ stub ZwOpenObjectAuditAlarm
@ stdcall -private -syscall ZwOpenProcess(ptr long ptr ptr) NtOpenProcess
@ stdcall -private -syscall ZwOpenProcessToken(long long ptr) NtOpenProcessToken
@ stdcall -private -syscall ZwOpenProcessTokenEx(long long long ptr) NtOpenProcessTokenEx
@@ -1297,11 +1297,11 @@
@ stdcall -private -syscall ZwOpenThreadToken(long long long ptr) NtOpenThreadToken
@ stdcall -private -syscall ZwOpenThreadTokenEx(long long long long ptr) NtOpenThreadTokenEx
@ stdcall -private -syscall ZwOpenTimer(ptr long ptr) NtOpenTimer
-@ stub ZwPlugPlayControl
+# @ stub ZwPlugPlayControl
@ stdcall -private -syscall ZwPowerInformation(long ptr long ptr long) NtPowerInformation
@ stdcall -private -syscall ZwPrivilegeCheck(ptr ptr ptr) NtPrivilegeCheck
-@ stub ZwPrivilegeObjectAuditAlarm
-@ stub ZwPrivilegedServiceAuditAlarm
+# @ stub ZwPrivilegeObjectAuditAlarm
+# @ stub ZwPrivilegedServiceAuditAlarm
@ stdcall -private -syscall ZwProtectVirtualMemory(long ptr ptr long ptr) NtProtectVirtualMemory
@ stdcall -private -syscall ZwPulseEvent(long ptr) NtPulseEvent
@ stdcall -private -syscall ZwQueryAttributesFile(ptr ptr) NtQueryAttributesFile
@@ -1318,19 +1318,19 @@
@ stdcall -private -syscall ZwQueryInformationAtom(long long ptr long ptr) NtQueryInformationAtom
@ stdcall -private -syscall ZwQueryInformationFile(long ptr ptr long long) NtQueryInformationFile
@ stdcall -private -syscall ZwQueryInformationJobObject(long long ptr long ptr) NtQueryInformationJobObject
-@ stub ZwQueryInformationPort
+# @ stub ZwQueryInformationPort
@ stdcall -private -syscall ZwQueryInformationProcess(long long ptr long ptr) NtQueryInformationProcess
@ stdcall -private -syscall ZwQueryInformationThread(long long ptr long ptr) NtQueryInformationThread
@ stdcall -private -syscall ZwQueryInformationToken(long long ptr long ptr) NtQueryInformationToken
@ stdcall -private -syscall ZwQueryInstallUILanguage(ptr) NtQueryInstallUILanguage
-@ stub ZwQueryIntervalProfile
+# @ stub ZwQueryIntervalProfile
@ stdcall -private -syscall ZwQueryIoCompletion(long long ptr long ptr) NtQueryIoCompletion
@ stdcall -private -syscall ZwQueryKey(long long ptr long ptr) NtQueryKey
@ stdcall -private -syscall ZwQueryLicenseValue(ptr ptr ptr long ptr) NtQueryLicenseValue
@ stdcall -private -syscall ZwQueryMultipleValueKey(long ptr long ptr long ptr) NtQueryMultipleValueKey
@ stdcall -private -syscall ZwQueryMutant(long long ptr long ptr) NtQueryMutant
@ stdcall -private -syscall ZwQueryObject(long long ptr long ptr) NtQueryObject
-@ stub ZwQueryOpenSubKeys
+# @ stub ZwQueryOpenSubKeys
@ stdcall -private -syscall ZwQueryPerformanceCounter(ptr ptr) NtQueryPerformanceCounter
# @ stub ZwQueryPortInformationProcess
# @ stub ZwQueryQuotaInformationFile
@@ -1353,25 +1353,25 @@
@ stdcall -private -syscall ZwRaiseHardError(long long ptr ptr long ptr) NtRaiseHardError
@ stdcall -private -syscall ZwReadFile(long long ptr ptr ptr ptr long ptr ptr) NtReadFile
@ stdcall -private -syscall ZwReadFileScatter(long long ptr ptr ptr ptr long ptr ptr) NtReadFileScatter
-@ stub ZwReadRequestData
+# @ stub ZwReadRequestData
@ stdcall -private -syscall ZwReadVirtualMemory(long ptr ptr long ptr) NtReadVirtualMemory
-@ stub ZwRegisterNewDevice
+# @ stub ZwRegisterNewDevice
@ stdcall -private -syscall ZwRegisterThreadTerminatePort(ptr) NtRegisterThreadTerminatePort
@ stdcall -private -syscall ZwReleaseKeyedEvent(long ptr long ptr) NtReleaseKeyedEvent
@ stdcall -private -syscall ZwReleaseMutant(long ptr) NtReleaseMutant
-@ stub ZwReleaseProcessMutant
+# @ stub ZwReleaseProcessMutant
@ stdcall -private -syscall ZwReleaseSemaphore(long long ptr) NtReleaseSemaphore
@ stdcall -private -syscall ZwRemoveIoCompletion(ptr ptr ptr ptr ptr) NtRemoveIoCompletion
@ stdcall -private -syscall ZwRemoveIoCompletionEx(ptr ptr long ptr ptr long) NtRemoveIoCompletionEx
@ stdcall -private -syscall ZwRemoveProcessDebug(long long) NtRemoveProcessDebug
@ stdcall -private -syscall ZwRenameKey(long ptr) NtRenameKey
@ stdcall -private -syscall ZwReplaceKey(ptr long ptr) NtReplaceKey
-@ stub ZwReplyPort
+# @ stub ZwReplyPort
@ stdcall -private -syscall ZwReplyWaitReceivePort(ptr ptr ptr ptr) NtReplyWaitReceivePort
-@ stub ZwReplyWaitReceivePortEx
-@ stub ZwReplyWaitReplyPort
+# @ stub ZwReplyWaitReceivePortEx
+# @ stub ZwReplyWaitReplyPort
# @ stub ZwRequestDeviceWakeup
-@ stub ZwRequestPort
+# @ stub ZwRequestPort
@ stdcall -private -syscall ZwRequestWaitReplyPort(ptr ptr ptr) NtRequestWaitReplyPort
# @ stub ZwRequestWakeupLatency
@ stdcall -private -syscall ZwResetEvent(long ptr) NtResetEvent
@@ -1386,16 +1386,16 @@
# @ stub ZwSetBootEntryOrder
# @ stub ZwSetBootOptions
@ stdcall -private -syscall ZwSetContextThread(long ptr) NtSetContextThread
-@ stub ZwSetDebugFilterState
-@ stub ZwSetDefaultHardErrorPort
+# @ stub ZwSetDebugFilterState
+# @ stub ZwSetDefaultHardErrorPort
@ stdcall -private -syscall ZwSetDefaultLocale(long long) NtSetDefaultLocale
@ stdcall -private -syscall ZwSetDefaultUILanguage(long) NtSetDefaultUILanguage
@ stdcall -private -syscall ZwSetEaFile(long ptr ptr long) NtSetEaFile
@ stdcall -private -syscall ZwSetEvent(long ptr) NtSetEvent
# @ stub ZwSetEventBoostPriority
-@ stub ZwSetHighEventPair
-@ stub ZwSetHighWaitLowEventPair
-@ stub ZwSetHighWaitLowThread
+# @ stub ZwSetHighEventPair
+# @ stub ZwSetHighWaitLowEventPair
+# @ stub ZwSetHighWaitLowThread
@ stdcall -private -syscall ZwSetInformationDebugObject(long long ptr long ptr) NtSetInformationDebugObject
@ stdcall -private -syscall ZwSetInformationFile(long ptr ptr long long) NtSetInformationFile
@ stdcall -private -syscall ZwSetInformationJobObject(long long ptr long) NtSetInformationJobObject
@@ -1407,16 +1407,16 @@
@ stdcall -private -syscall ZwSetIntervalProfile(long long) NtSetIntervalProfile
@ stdcall -private -syscall ZwSetIoCompletion(ptr long long long long) NtSetIoCompletion
@ stdcall -private -syscall ZwSetLdtEntries(long int64 long int64) NtSetLdtEntries
-@ stub ZwSetLowEventPair
-@ stub ZwSetLowWaitHighEventPair
-@ stub ZwSetLowWaitHighThread
+# @ stub ZwSetLowEventPair
+# @ stub ZwSetLowWaitHighEventPair
+# @ stub ZwSetLowWaitHighThread
@ stdcall -private -syscall ZwSetPowerRequest(long long) NtSetPowerRequest
# @ stub ZwSetQuotaInformationFile
@ stdcall -private -syscall ZwSetSecurityObject(long long ptr) NtSetSecurityObject
-@ stub ZwSetSystemEnvironmentValue
+# @ stub ZwSetSystemEnvironmentValue
# @ stub ZwSetSystemEnvironmentValueEx
@ stdcall -private -syscall ZwSetSystemInformation(long ptr long) NtSetSystemInformation
-@ stub ZwSetSystemPowerState
+# @ stub ZwSetSystemPowerState
@ stdcall -private -syscall ZwSetSystemTime(ptr ptr) NtSetSystemTime
@ stdcall -private -syscall ZwSetThreadExecutionState(long ptr) NtSetThreadExecutionState
@ stdcall -private -syscall ZwSetTimer(long ptr ptr ptr long long ptr) NtSetTimer
@@ -1426,8 +1426,8 @@
@ stdcall -private -syscall ZwSetVolumeInformationFile(long ptr ptr long long) NtSetVolumeInformationFile
@ stdcall -private -syscall ZwShutdownSystem(long) NtShutdownSystem
@ stdcall -private -syscall ZwSignalAndWaitForSingleObject(long long long ptr) NtSignalAndWaitForSingleObject
-@ stub ZwStartProfile
-@ stub ZwStopProfile
+# @ stub ZwStartProfile
+# @ stub ZwStopProfile
@ stdcall -private -syscall ZwSuspendProcess(long) NtSuspendProcess
@ stdcall -private -syscall ZwSuspendThread(long ptr) NtSuspendThread
@ stdcall -private -syscall ZwSystemDebugControl(long ptr long ptr long ptr) NtSystemDebugControl
@@ -1439,26 +1439,26 @@
# @ stub ZwTranslateFilePath
@ stdcall -private -syscall ZwUnloadDriver(ptr) NtUnloadDriver
@ stdcall -private -syscall ZwUnloadKey(ptr) NtUnloadKey
-@ stub ZwUnloadKeyEx
+# @ stub ZwUnloadKeyEx
@ stdcall -private -syscall ZwUnlockFile(long ptr ptr ptr ptr) NtUnlockFile
@ stdcall -private -syscall ZwUnlockVirtualMemory(long ptr ptr long) NtUnlockVirtualMemory
@ stdcall -private -syscall ZwUnmapViewOfSection(long ptr) NtUnmapViewOfSection
-@ stub ZwVdmControl
-@ stub ZwW32Call
+# @ stub ZwVdmControl
+# @ stub ZwW32Call
@ stdcall -private -syscall ZwWaitForDebugEvent(long long ptr ptr) NtWaitForDebugEvent
@ stdcall -private -syscall ZwWaitForKeyedEvent(long ptr long ptr) NtWaitForKeyedEvent
@ stdcall -private -syscall ZwWaitForMultipleObjects(long ptr long long ptr) NtWaitForMultipleObjects
-@ stub ZwWaitForProcessMutant
+# @ stub ZwWaitForProcessMutant
@ stdcall -private -syscall ZwWaitForSingleObject(long long ptr) NtWaitForSingleObject
-@ stub ZwWaitHighEventPair
-@ stub ZwWaitLowEventPair
+# @ stub ZwWaitHighEventPair
+# @ stub ZwWaitLowEventPair
@ stdcall -syscall -arch=win32 ZwWow64AllocateVirtualMemory64(long ptr int64 ptr long long) NtWow64AllocateVirtualMemory64
@ stdcall -syscall -arch=win32 ZwWow64GetNativeSystemInformation(long ptr long ptr) NtWow64GetNativeSystemInformation
@ stdcall -syscall -arch=win32 ZwWow64ReadVirtualMemory64(long int64 ptr int64 ptr) NtWow64ReadVirtualMemory64
@ stdcall -syscall -arch=win32 ZwWow64WriteVirtualMemory64(long int64 ptr int64 ptr) NtWow64WriteVirtualMemory64
@ stdcall -private -syscall ZwWriteFile(long long ptr ptr ptr ptr long ptr ptr) NtWriteFile
@ stdcall -private -syscall ZwWriteFileGather(long long ptr ptr ptr ptr long ptr ptr) NtWriteFileGather
-@ stub ZwWriteRequestData
+# @ stub ZwWriteRequestData
@ stdcall -private -syscall ZwWriteVirtualMemory(long ptr ptr long ptr) NtWriteVirtualMemory
@ stdcall -private -syscall ZwYieldExecution() NtYieldExecution
@ cdecl -private -arch=i386 _CIcos()
diff --git a/dlls/ntdll/tests/port.c b/dlls/ntdll/tests/port.c
index 9525232ade5..2406a63d8f1 100644
--- a/dlls/ntdll/tests/port.c
+++ b/dlls/ntdll/tests/port.c
@@ -155,7 +155,7 @@ static BOOL init_function_ptrs(void)
!pNtRequestPort || !pNtRegisterThreadTerminatePort ||
!pNtConnectPort || !pRtlInitUnicodeString)
{
- win_skip("Needed port functions are not available\n");
+ skip("Needed port functions are not available\n");
FreeLibrary(hntdll);
return FALSE;
}
@@ -384,7 +384,7 @@ START_TEST(port)
status = pNtCreatePort(&port_handle, &obj, 100, 100, 0);
if (status == STATUS_ACCESS_DENIED) skip("Not enough rights\n");
- else todo_wine ok(status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %d\n", status);
+ else ok(status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %d\n", status);
if (status == STATUS_SUCCESS)
{
--
2.31.1
2
1
Signed-off-by: Paul Gofman <pgofman(a)codeweavers.com>
---
Those are supposed to be syscalls and having them as a regular functions is wrong.
In the not much likely case the presence of some of these stubs helped some
applications those can be added back as -syscall function stubs.
dlls/ntdll/ntdll.spec | 188 +++++++++++++++++++++---------------------
1 file changed, 94 insertions(+), 94 deletions(-)
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
index ccd825ff58e..aad7bd89d14 100644
--- a/dlls/ntdll/ntdll.spec
+++ b/dlls/ntdll/ntdll.spec
@@ -145,7 +145,7 @@
@ stdcall -syscall NtAllocateVirtualMemoryEx(long ptr ptr long long ptr long)
@ stdcall -syscall NtAreMappedFilesTheSame(ptr ptr)
@ stdcall -syscall NtAssignProcessToJobObject(long long)
-@ stub NtCallbackReturn
+# @ stub NtCallbackReturn
# @ stub NtCancelDeviceWakeupRequest
@ stdcall -syscall NtCancelIoFile(long ptr)
@ stdcall -syscall NtCancelIoFileEx(long ptr ptr)
@@ -153,7 +153,7 @@
@ stdcall -syscall NtClearEvent(long)
@ stdcall -syscall NtClearPowerRequest(long long)
@ stdcall -syscall NtClose(long)
-@ stub NtCloseObjectAuditAlarm
+# @ stub NtCloseObjectAuditAlarm
# @ stub NtCompactKeys
# @ stub NtCompareTokens
@ stdcall -syscall NtCompleteConnectPort(ptr)
@@ -163,7 +163,7 @@
@ stdcall -syscall NtCreateDebugObject(ptr long ptr long)
@ stdcall -syscall NtCreateDirectoryObject(ptr long ptr)
@ stdcall -syscall NtCreateEvent(ptr long ptr long long)
-@ stub NtCreateEventPair
+# @ stub NtCreateEventPair
@ stdcall -syscall NtCreateFile(ptr long ptr ptr ptr long long long long ptr long)
@ stdcall -syscall NtCreateIoCompletion(ptr long ptr long)
@ stdcall -syscall NtCreateJobObject(ptr long ptr)
@@ -178,16 +178,16 @@
@ stdcall -syscall NtCreatePagingFile(ptr ptr ptr ptr)
@ stdcall -syscall NtCreatePort(ptr ptr long long ptr)
@ stdcall -syscall NtCreatePowerRequest(ptr ptr)
-@ stub NtCreateProcess
+# @ stub NtCreateProcess
# @ stub NtCreateProcessEx
-@ stub NtCreateProfile
+# @ stub NtCreateProfile
@ stdcall -syscall NtCreateSection(ptr long ptr ptr long long long)
@ stdcall -syscall NtCreateSemaphore(ptr long ptr long long)
@ stdcall -syscall NtCreateSymbolicLinkObject(ptr long ptr ptr)
@ stdcall -syscall NtCreateThread(ptr long ptr long ptr ptr ptr long)
@ stdcall -syscall NtCreateThreadEx(ptr long ptr long ptr ptr long long long long ptr)
@ stdcall -syscall NtCreateTimer(ptr long ptr long)
-@ stub NtCreateToken
+# @ stub NtCreateToken
@ stdcall -syscall NtCreateUserProcess(ptr ptr long long ptr ptr long long ptr ptr ptr)
# @ stub NtCreateWaitablePort
@ stdcall -arch=i386,arm64 NtCurrentTeb()
@@ -205,11 +205,11 @@
@ stdcall -syscall NtDuplicateObject(long long long ptr long long long)
@ stdcall -syscall NtDuplicateToken(long long ptr long long ptr)
# @ stub NtEnumerateBootEntries
-@ stub NtEnumerateBus
+# @ stub NtEnumerateBus
@ stdcall -syscall NtEnumerateKey(long long long ptr long ptr)
# @ stub NtEnumerateSystemEnvironmentValuesEx
@ stdcall -syscall NtEnumerateValueKey(long long long ptr long ptr)
-@ stub NtExtendSection
+# @ stub NtExtendSection
@ stdcall -syscall NtFilterToken(long long ptr ptr ptr ptr)
@ stdcall -syscall NtFindAtom(ptr long ptr)
@ stdcall -syscall NtFlushBuffersFile(long ptr)
@@ -217,7 +217,7 @@
@ stdcall -syscall NtFlushKey(long)
@ stdcall -syscall NtFlushProcessWriteBuffers()
@ stdcall -syscall NtFlushVirtualMemory(long ptr ptr long)
-@ stub NtFlushWriteBuffer
+# @ stub NtFlushWriteBuffer
# @ stub NtFreeUserPhysicalPages
@ stdcall -syscall NtFreeVirtualMemory(long ptr ptr long)
@ stdcall -syscall NtFsControlFile(long long ptr ptr ptr long ptr long ptr long)
@@ -226,13 +226,13 @@
# @ stub NtGetDevicePowerState
@ stdcall -syscall NtGetNextThread(ptr ptr long long long ptr)
@ stdcall -syscall NtGetNlsSectionPtr(long long long ptr ptr)
-@ stub NtGetPlugPlayEvent
+# @ stub NtGetPlugPlayEvent
@ stdcall NtGetTickCount()
@ stdcall -syscall NtGetWriteWatch(long long ptr long ptr ptr ptr)
@ stdcall -syscall NtImpersonateAnonymousToken(long)
-@ stub NtImpersonateClientOfPort
-@ stub NtImpersonateThread
-@ stub NtInitializeRegistry
+# @ stub NtImpersonateClientOfPort
+# @ stub NtImpersonateThread
+# @ stub NtInitializeRegistry
@ stdcall -syscall NtInitiatePowerAction (long long long long)
@ stdcall -syscall NtIsProcessInJob(long long)
# @ stub NtIsSystemResumeAutomatic
@@ -255,7 +255,7 @@
@ stdcall -syscall NtNotifyChangeMultipleKeys(long long ptr long ptr ptr ptr long long ptr long long)
@ stdcall -syscall NtOpenDirectoryObject(ptr long ptr)
@ stdcall -syscall NtOpenEvent(ptr long ptr)
-@ stub NtOpenEventPair
+# @ stub NtOpenEventPair
@ stdcall -syscall NtOpenFile(ptr long ptr ptr long long)
@ stdcall -syscall NtOpenIoCompletion(ptr long ptr)
@ stdcall -syscall NtOpenJobObject(ptr long ptr)
@@ -265,7 +265,7 @@
@ stdcall -syscall NtOpenKeyTransactedEx(ptr long ptr long long)
@ stdcall -syscall NtOpenKeyedEvent(ptr long ptr)
@ stdcall -syscall NtOpenMutant(ptr long ptr)
-@ stub NtOpenObjectAuditAlarm
+# @ stub NtOpenObjectAuditAlarm
@ stdcall -syscall NtOpenProcess(ptr long ptr ptr)
@ stdcall -syscall NtOpenProcessToken(long long ptr)
@ stdcall -syscall NtOpenProcessTokenEx(long long long ptr)
@@ -276,11 +276,11 @@
@ stdcall -syscall NtOpenThreadToken(long long long ptr)
@ stdcall -syscall NtOpenThreadTokenEx(long long long long ptr)
@ stdcall -syscall NtOpenTimer(ptr long ptr)
-@ stub NtPlugPlayControl
+# @ stub NtPlugPlayControl
@ stdcall -syscall NtPowerInformation(long ptr long ptr long)
@ stdcall -syscall NtPrivilegeCheck(ptr ptr ptr)
-@ stub NtPrivilegeObjectAuditAlarm
-@ stub NtPrivilegedServiceAuditAlarm
+# @ stub NtPrivilegeObjectAuditAlarm
+# @ stub NtPrivilegedServiceAuditAlarm
@ stdcall -syscall NtProtectVirtualMemory(long ptr ptr long ptr)
@ stdcall -syscall NtPulseEvent(long ptr)
@ stdcall -syscall NtQueryAttributesFile(ptr ptr)
@@ -297,19 +297,19 @@
@ stdcall -syscall NtQueryInformationAtom(long long ptr long ptr)
@ stdcall -syscall NtQueryInformationFile(long ptr ptr long long)
@ stdcall -syscall NtQueryInformationJobObject(long long ptr long ptr)
-@ stub NtQueryInformationPort
+# @ stub NtQueryInformationPort
@ stdcall -syscall NtQueryInformationProcess(long long ptr long ptr)
@ stdcall -syscall NtQueryInformationThread(long long ptr long ptr)
@ stdcall -syscall NtQueryInformationToken(long long ptr long ptr)
@ stdcall -syscall NtQueryInstallUILanguage(ptr)
-@ stub NtQueryIntervalProfile
+# @ stub NtQueryIntervalProfile
@ stdcall -syscall NtQueryIoCompletion(long long ptr long ptr)
@ stdcall -syscall NtQueryKey(long long ptr long ptr)
@ stdcall -syscall NtQueryLicenseValue(ptr ptr ptr long ptr)
@ stdcall -syscall NtQueryMultipleValueKey(long ptr long ptr long ptr)
@ stdcall -syscall NtQueryMutant(long long ptr long ptr)
@ stdcall -syscall NtQueryObject(long long ptr long ptr)
-@ stub NtQueryOpenSubKeys
+# @ stub NtQueryOpenSubKeys
@ stdcall -syscall NtQueryPerformanceCounter(ptr ptr)
# @ stub NtQueryPortInformationProcess
# @ stub NtQueryQuotaInformationFile
@@ -332,25 +332,25 @@
@ stdcall -syscall NtRaiseHardError(long long ptr ptr long ptr)
@ stdcall -syscall NtReadFile(long long ptr ptr ptr ptr long ptr ptr)
@ stdcall -syscall NtReadFileScatter(long long ptr ptr ptr ptr long ptr ptr)
-@ stub NtReadRequestData
+# @ stub NtReadRequestData
@ stdcall -syscall NtReadVirtualMemory(long ptr ptr long ptr)
-@ stub NtRegisterNewDevice
+# @ stub NtRegisterNewDevice
@ stdcall -syscall NtRegisterThreadTerminatePort(ptr)
@ stdcall -syscall NtReleaseKeyedEvent(long ptr long ptr)
@ stdcall -syscall NtReleaseMutant(long ptr)
-@ stub NtReleaseProcessMutant
+# @ stub NtReleaseProcessMutant
@ stdcall -syscall NtReleaseSemaphore(long long ptr)
@ stdcall -syscall NtRemoveIoCompletion(ptr ptr ptr ptr ptr)
@ stdcall -syscall NtRemoveIoCompletionEx(ptr ptr long ptr ptr long)
@ stdcall -syscall NtRemoveProcessDebug(long long)
@ stdcall -syscall NtRenameKey(long ptr)
@ stdcall -syscall NtReplaceKey(ptr long ptr)
-@ stub NtReplyPort
+# @ stub NtReplyPort
@ stdcall -syscall NtReplyWaitReceivePort(ptr ptr ptr ptr)
-@ stub NtReplyWaitReceivePortEx
-@ stub NtReplyWaitReplyPort
+# @ stub NtReplyWaitReceivePortEx
+# @ stub NtReplyWaitReplyPort
# @ stub NtRequestDeviceWakeup
-@ stub NtRequestPort
+# @ stub NtRequestPort
@ stdcall -syscall NtRequestWaitReplyPort(ptr ptr ptr)
# @ stub NtRequestWakeupLatency
@ stdcall -syscall NtResetEvent(long ptr)
@@ -365,16 +365,16 @@
# @ stub NtSetBootEntryOrder
# @ stub NtSetBootOptions
@ stdcall -syscall NtSetContextThread(long ptr)
-@ stub NtSetDebugFilterState
-@ stub NtSetDefaultHardErrorPort
+# @ stub NtSetDebugFilterState
+# @ stub NtSetDefaultHardErrorPort
@ stdcall -syscall NtSetDefaultLocale(long long)
@ stdcall -syscall NtSetDefaultUILanguage(long)
@ stdcall -syscall NtSetEaFile(long ptr ptr long)
@ stdcall -syscall NtSetEvent(long ptr)
# @ stub NtSetEventBoostPriority
-@ stub NtSetHighEventPair
-@ stub NtSetHighWaitLowEventPair
-@ stub NtSetHighWaitLowThread
+# @ stub NtSetHighEventPair
+# @ stub NtSetHighWaitLowEventPair
+# @ stub NtSetHighWaitLowThread
@ stdcall -syscall NtSetInformationDebugObject(long long ptr long ptr)
@ stdcall -syscall NtSetInformationFile(long ptr ptr long long)
@ stdcall -syscall NtSetInformationJobObject(long long ptr long)
@@ -386,16 +386,16 @@
@ stdcall -syscall NtSetIntervalProfile(long long)
@ stdcall -syscall NtSetIoCompletion(ptr long long long long)
@ stdcall -syscall NtSetLdtEntries(long int64 long int64)
-@ stub NtSetLowEventPair
-@ stub NtSetLowWaitHighEventPair
-@ stub NtSetLowWaitHighThread
+# @ stub NtSetLowEventPair
+# @ stub NtSetLowWaitHighEventPair
+# @ stub NtSetLowWaitHighThread
@ stdcall -syscall NtSetPowerRequest(long long)
# @ stub NtSetQuotaInformationFile
@ stdcall -syscall NtSetSecurityObject(long long ptr)
-@ stub NtSetSystemEnvironmentValue
+# @ stub NtSetSystemEnvironmentValue
# @ stub NtSetSystemEnvironmentValueEx
@ stdcall -syscall NtSetSystemInformation(long ptr long)
-@ stub NtSetSystemPowerState
+# @ stub NtSetSystemPowerState
@ stdcall -syscall NtSetSystemTime(ptr ptr)
@ stdcall -syscall NtSetThreadExecutionState(long ptr)
@ stdcall -syscall NtSetTimer(long ptr ptr ptr long long ptr)
@@ -405,8 +405,8 @@
@ stdcall -syscall NtSetVolumeInformationFile(long ptr ptr long long)
@ stdcall -syscall NtShutdownSystem(long)
@ stdcall -syscall NtSignalAndWaitForSingleObject(long long long ptr)
-@ stub NtStartProfile
-@ stub NtStopProfile
+# @ stub NtStartProfile
+# @ stub NtStopProfile
@ stdcall -syscall NtSuspendProcess(long)
@ stdcall -syscall NtSuspendThread(long ptr)
@ stdcall -syscall NtSystemDebugControl(long ptr long ptr long ptr)
@@ -418,26 +418,26 @@
# @ stub NtTranslateFilePath
@ stdcall -syscall NtUnloadDriver(ptr)
@ stdcall -syscall NtUnloadKey(ptr)
-@ stub NtUnloadKeyEx
+# @ stub NtUnloadKeyEx
@ stdcall -syscall NtUnlockFile(long ptr ptr ptr ptr)
@ stdcall -syscall NtUnlockVirtualMemory(long ptr ptr long)
@ stdcall -syscall NtUnmapViewOfSection(long ptr)
-@ stub NtVdmControl
-@ stub NtW32Call
+# @ stub NtVdmControl
+# @ stub NtW32Call
@ stdcall -syscall NtWaitForDebugEvent(long long ptr ptr)
@ stdcall -syscall NtWaitForKeyedEvent(long ptr long ptr)
@ stdcall -syscall NtWaitForMultipleObjects(long ptr long long ptr)
-@ stub NtWaitForProcessMutant
+# @ stub NtWaitForProcessMutant
@ stdcall -syscall NtWaitForSingleObject(long long ptr)
-@ stub NtWaitHighEventPair
-@ stub NtWaitLowEventPair
+# @ stub NtWaitHighEventPair
+# @ stub NtWaitLowEventPair
@ stdcall -syscall -arch=win32 NtWow64AllocateVirtualMemory64(long ptr int64 ptr long long)
@ stdcall -syscall -arch=win32 NtWow64GetNativeSystemInformation(long ptr long ptr)
@ stdcall -syscall -arch=win32 NtWow64ReadVirtualMemory64(long int64 ptr int64 ptr)
@ stdcall -syscall -arch=win32 NtWow64WriteVirtualMemory64(long int64 ptr int64 ptr)
@ stdcall -syscall NtWriteFile(long long ptr ptr ptr ptr long ptr ptr)
@ stdcall -syscall NtWriteFileGather(long long ptr ptr ptr ptr long ptr ptr)
-@ stub NtWriteRequestData
+# @ stub NtWriteRequestData
@ stdcall -syscall NtWriteVirtualMemory(long ptr ptr long ptr)
@ stdcall -syscall NtYieldExecution()
@ stub PfxFindPrefix
@@ -1168,7 +1168,7 @@
@ stdcall -private -syscall ZwAllocateVirtualMemoryEx(long ptr ptr long long ptr long) NtAllocateVirtualMemoryEx
@ stdcall -private -syscall ZwAreMappedFilesTheSame(ptr ptr) NtAreMappedFilesTheSame
@ stdcall -private -syscall ZwAssignProcessToJobObject(long long) NtAssignProcessToJobObject
-@ stub ZwCallbackReturn
+# @ stub ZwCallbackReturn
# @ stub ZwCancelDeviceWakeupRequest
@ stdcall -private -syscall ZwCancelIoFile(long ptr) NtCancelIoFile
@ stdcall -private -syscall ZwCancelIoFileEx(long ptr ptr) NtCancelIoFileEx
@@ -1176,7 +1176,7 @@
@ stdcall -private -syscall ZwClearEvent(long) NtClearEvent
@ stdcall -private -syscall ZwClearPowerRequest(long long) NtClearPowerRequest
@ stdcall -private -syscall ZwClose(long) NtClose
-@ stub ZwCloseObjectAuditAlarm
+# @ stub ZwCloseObjectAuditAlarm
# @ stub ZwCompactKeys
# @ stub ZwCompareTokens
@ stdcall -private -syscall ZwCompleteConnectPort(ptr) NtCompleteConnectPort
@@ -1186,7 +1186,7 @@
# @ stub ZwCreateDebugObject
@ stdcall -private -syscall ZwCreateDirectoryObject(ptr long ptr) NtCreateDirectoryObject
@ stdcall -private -syscall ZwCreateEvent(ptr long ptr long long) NtCreateEvent
-@ stub ZwCreateEventPair
+# @ stub ZwCreateEventPair
@ stdcall -private -syscall ZwCreateFile(ptr long ptr ptr ptr long long long long ptr long) NtCreateFile
@ stdcall -private -syscall ZwCreateIoCompletion(ptr long ptr long) NtCreateIoCompletion
@ stdcall -private -syscall ZwCreateJobObject(ptr long ptr) NtCreateJobObject
@@ -1201,16 +1201,16 @@
@ stdcall -private -syscall ZwCreatePagingFile(ptr ptr ptr ptr) NtCreatePagingFile
@ stdcall -private -syscall ZwCreatePort(ptr ptr long long ptr) NtCreatePort
@ stdcall -private -syscall ZwCreatePowerRequest(ptr ptr) NtCreatePowerRequest
-@ stub ZwCreateProcess
+# @ stub ZwCreateProcess
# @ stub ZwCreateProcessEx
-@ stub ZwCreateProfile
+# @ stub ZwCreateProfile
@ stdcall -private -syscall ZwCreateSection(ptr long ptr ptr long long long) NtCreateSection
@ stdcall -private -syscall ZwCreateSemaphore(ptr long ptr long long) NtCreateSemaphore
@ stdcall -private -syscall ZwCreateSymbolicLinkObject(ptr long ptr ptr) NtCreateSymbolicLinkObject
@ stdcall -private -syscall ZwCreateThread(ptr long ptr long ptr ptr ptr long) NtCreateThread
@ stdcall -private -syscall ZwCreateThreadEx(ptr long ptr long ptr ptr long long long long ptr) NtCreateThreadEx
@ stdcall -private -syscall ZwCreateTimer(ptr long ptr long) NtCreateTimer
-@ stub ZwCreateToken
+# @ stub ZwCreateToken
@ stdcall -private -syscall ZwCreateUserProcess(ptr ptr long long ptr ptr long long ptr ptr ptr) NtCreateUserProcess
# @ stub ZwCreateWaitablePort
@ stdcall -private -syscall ZwDebugActiveProcess(long long) NtDebugActiveProcess
@@ -1227,11 +1227,11 @@
@ stdcall -private -syscall ZwDuplicateObject(long long long ptr long long long) NtDuplicateObject
@ stdcall -private -syscall ZwDuplicateToken(long long ptr long long ptr) NtDuplicateToken
# @ stub ZwEnumerateBootEntries
-@ stub ZwEnumerateBus
+# @ stub ZwEnumerateBus
@ stdcall -private -syscall ZwEnumerateKey(long long long ptr long ptr) NtEnumerateKey
# @ stub ZwEnumerateSystemEnvironmentValuesEx
@ stdcall -private -syscall ZwEnumerateValueKey(long long long ptr long ptr) NtEnumerateValueKey
-@ stub ZwExtendSection
+# @ stub ZwExtendSection
@ stdcall -private -syscall ZwFilterToken(long long ptr ptr ptr ptr) NtFilterToken
@ stdcall -private -syscall ZwFindAtom(ptr long ptr) NtFindAtom
@ stdcall -private -syscall ZwFlushBuffersFile(long ptr) NtFlushBuffersFile
@@ -1239,7 +1239,7 @@
@ stdcall -private -syscall ZwFlushKey(long) NtFlushKey
@ stdcall -private -syscall ZwFlushProcessWriteBuffers() NtFlushProcessWriteBuffers
@ stdcall -private -syscall ZwFlushVirtualMemory(long ptr ptr long) NtFlushVirtualMemory
-@ stub ZwFlushWriteBuffer
+# @ stub ZwFlushWriteBuffer
# @ stub ZwFreeUserPhysicalPages
@ stdcall -private -syscall ZwFreeVirtualMemory(long ptr ptr long) NtFreeVirtualMemory
@ stdcall -private -syscall ZwFsControlFile(long long ptr ptr ptr long ptr long ptr long) NtFsControlFile
@@ -1247,13 +1247,13 @@
@ stdcall -private -syscall ZwGetCurrentProcessorNumber() NtGetCurrentProcessorNumber
# @ stub ZwGetDevicePowerState
@ stdcall -private -syscall ZwGetNlsSectionPtr(long long long ptr ptr) NtGetNlsSectionPtr
-@ stub ZwGetPlugPlayEvent
+# @ stub ZwGetPlugPlayEvent
@ stdcall -private ZwGetTickCount() NtGetTickCount
@ stdcall -private -syscall ZwGetWriteWatch(long long ptr long ptr ptr ptr) NtGetWriteWatch
@ stdcall -private -syscall ZwImpersonateAnonymousToken(long) NtImpersonateAnonymousToken
-@ stub ZwImpersonateClientOfPort
-@ stub ZwImpersonateThread
-@ stub ZwInitializeRegistry
+# @ stub ZwImpersonateClientOfPort
+# @ stub ZwImpersonateThread
+# @ stub ZwInitializeRegistry
@ stdcall -private -syscall ZwInitiatePowerAction(long long long long) NtInitiatePowerAction
@ stdcall -private -syscall ZwIsProcessInJob(long long) NtIsProcessInJob
# @ stub ZwIsSystemResumeAutomatic
@@ -1276,7 +1276,7 @@
@ stdcall -private -syscall ZwNotifyChangeMultipleKeys(long long ptr long ptr ptr ptr long long ptr long long) NtNotifyChangeMultipleKeys
@ stdcall -private -syscall ZwOpenDirectoryObject(ptr long ptr) NtOpenDirectoryObject
@ stdcall -private -syscall ZwOpenEvent(ptr long ptr) NtOpenEvent
-@ stub ZwOpenEventPair
+# @ stub ZwOpenEventPair
@ stdcall -private -syscall ZwOpenFile(ptr long ptr ptr long long) NtOpenFile
@ stdcall -private -syscall ZwOpenIoCompletion(ptr long ptr) NtOpenIoCompletion
@ stdcall -private -syscall ZwOpenJobObject(ptr long ptr) NtOpenJobObject
@@ -1286,7 +1286,7 @@
@ stdcall -private -syscall ZwOpenKeyTransactedEx(ptr long ptr long long) NtOpenKeyTransactedEx
@ stdcall -private -syscall ZwOpenKeyedEvent(ptr long ptr) NtOpenKeyedEvent
@ stdcall -private -syscall ZwOpenMutant(ptr long ptr) NtOpenMutant
-@ stub ZwOpenObjectAuditAlarm
+# @ stub ZwOpenObjectAuditAlarm
@ stdcall -private -syscall ZwOpenProcess(ptr long ptr ptr) NtOpenProcess
@ stdcall -private -syscall ZwOpenProcessToken(long long ptr) NtOpenProcessToken
@ stdcall -private -syscall ZwOpenProcessTokenEx(long long long ptr) NtOpenProcessTokenEx
@@ -1297,11 +1297,11 @@
@ stdcall -private -syscall ZwOpenThreadToken(long long long ptr) NtOpenThreadToken
@ stdcall -private -syscall ZwOpenThreadTokenEx(long long long long ptr) NtOpenThreadTokenEx
@ stdcall -private -syscall ZwOpenTimer(ptr long ptr) NtOpenTimer
-@ stub ZwPlugPlayControl
+# @ stub ZwPlugPlayControl
@ stdcall -private -syscall ZwPowerInformation(long ptr long ptr long) NtPowerInformation
@ stdcall -private -syscall ZwPrivilegeCheck(ptr ptr ptr) NtPrivilegeCheck
-@ stub ZwPrivilegeObjectAuditAlarm
-@ stub ZwPrivilegedServiceAuditAlarm
+# @ stub ZwPrivilegeObjectAuditAlarm
+# @ stub ZwPrivilegedServiceAuditAlarm
@ stdcall -private -syscall ZwProtectVirtualMemory(long ptr ptr long ptr) NtProtectVirtualMemory
@ stdcall -private -syscall ZwPulseEvent(long ptr) NtPulseEvent
@ stdcall -private -syscall ZwQueryAttributesFile(ptr ptr) NtQueryAttributesFile
@@ -1318,19 +1318,19 @@
@ stdcall -private -syscall ZwQueryInformationAtom(long long ptr long ptr) NtQueryInformationAtom
@ stdcall -private -syscall ZwQueryInformationFile(long ptr ptr long long) NtQueryInformationFile
@ stdcall -private -syscall ZwQueryInformationJobObject(long long ptr long ptr) NtQueryInformationJobObject
-@ stub ZwQueryInformationPort
+# @ stub ZwQueryInformationPort
@ stdcall -private -syscall ZwQueryInformationProcess(long long ptr long ptr) NtQueryInformationProcess
@ stdcall -private -syscall ZwQueryInformationThread(long long ptr long ptr) NtQueryInformationThread
@ stdcall -private -syscall ZwQueryInformationToken(long long ptr long ptr) NtQueryInformationToken
@ stdcall -private -syscall ZwQueryInstallUILanguage(ptr) NtQueryInstallUILanguage
-@ stub ZwQueryIntervalProfile
+# @ stub ZwQueryIntervalProfile
@ stdcall -private -syscall ZwQueryIoCompletion(long long ptr long ptr) NtQueryIoCompletion
@ stdcall -private -syscall ZwQueryKey(long long ptr long ptr) NtQueryKey
@ stdcall -private -syscall ZwQueryLicenseValue(ptr ptr ptr long ptr) NtQueryLicenseValue
@ stdcall -private -syscall ZwQueryMultipleValueKey(long ptr long ptr long ptr) NtQueryMultipleValueKey
@ stdcall -private -syscall ZwQueryMutant(long long ptr long ptr) NtQueryMutant
@ stdcall -private -syscall ZwQueryObject(long long ptr long ptr) NtQueryObject
-@ stub ZwQueryOpenSubKeys
+# @ stub ZwQueryOpenSubKeys
@ stdcall -private -syscall ZwQueryPerformanceCounter(ptr ptr) NtQueryPerformanceCounter
# @ stub ZwQueryPortInformationProcess
# @ stub ZwQueryQuotaInformationFile
@@ -1353,25 +1353,25 @@
@ stdcall -private -syscall ZwRaiseHardError(long long ptr ptr long ptr) NtRaiseHardError
@ stdcall -private -syscall ZwReadFile(long long ptr ptr ptr ptr long ptr ptr) NtReadFile
@ stdcall -private -syscall ZwReadFileScatter(long long ptr ptr ptr ptr long ptr ptr) NtReadFileScatter
-@ stub ZwReadRequestData
+# @ stub ZwReadRequestData
@ stdcall -private -syscall ZwReadVirtualMemory(long ptr ptr long ptr) NtReadVirtualMemory
-@ stub ZwRegisterNewDevice
+# @ stub ZwRegisterNewDevice
@ stdcall -private -syscall ZwRegisterThreadTerminatePort(ptr) NtRegisterThreadTerminatePort
@ stdcall -private -syscall ZwReleaseKeyedEvent(long ptr long ptr) NtReleaseKeyedEvent
@ stdcall -private -syscall ZwReleaseMutant(long ptr) NtReleaseMutant
-@ stub ZwReleaseProcessMutant
+# @ stub ZwReleaseProcessMutant
@ stdcall -private -syscall ZwReleaseSemaphore(long long ptr) NtReleaseSemaphore
@ stdcall -private -syscall ZwRemoveIoCompletion(ptr ptr ptr ptr ptr) NtRemoveIoCompletion
@ stdcall -private -syscall ZwRemoveIoCompletionEx(ptr ptr long ptr ptr long) NtRemoveIoCompletionEx
@ stdcall -private -syscall ZwRemoveProcessDebug(long long) NtRemoveProcessDebug
@ stdcall -private -syscall ZwRenameKey(long ptr) NtRenameKey
@ stdcall -private -syscall ZwReplaceKey(ptr long ptr) NtReplaceKey
-@ stub ZwReplyPort
+# @ stub ZwReplyPort
@ stdcall -private -syscall ZwReplyWaitReceivePort(ptr ptr ptr ptr) NtReplyWaitReceivePort
-@ stub ZwReplyWaitReceivePortEx
-@ stub ZwReplyWaitReplyPort
+# @ stub ZwReplyWaitReceivePortEx
+# @ stub ZwReplyWaitReplyPort
# @ stub ZwRequestDeviceWakeup
-@ stub ZwRequestPort
+# @ stub ZwRequestPort
@ stdcall -private -syscall ZwRequestWaitReplyPort(ptr ptr ptr) NtRequestWaitReplyPort
# @ stub ZwRequestWakeupLatency
@ stdcall -private -syscall ZwResetEvent(long ptr) NtResetEvent
@@ -1386,16 +1386,16 @@
# @ stub ZwSetBootEntryOrder
# @ stub ZwSetBootOptions
@ stdcall -private -syscall ZwSetContextThread(long ptr) NtSetContextThread
-@ stub ZwSetDebugFilterState
-@ stub ZwSetDefaultHardErrorPort
+# @ stub ZwSetDebugFilterState
+# @ stub ZwSetDefaultHardErrorPort
@ stdcall -private -syscall ZwSetDefaultLocale(long long) NtSetDefaultLocale
@ stdcall -private -syscall ZwSetDefaultUILanguage(long) NtSetDefaultUILanguage
@ stdcall -private -syscall ZwSetEaFile(long ptr ptr long) NtSetEaFile
@ stdcall -private -syscall ZwSetEvent(long ptr) NtSetEvent
# @ stub ZwSetEventBoostPriority
-@ stub ZwSetHighEventPair
-@ stub ZwSetHighWaitLowEventPair
-@ stub ZwSetHighWaitLowThread
+# @ stub ZwSetHighEventPair
+# @ stub ZwSetHighWaitLowEventPair
+# @ stub ZwSetHighWaitLowThread
@ stdcall -private -syscall ZwSetInformationDebugObject(long long ptr long ptr) NtSetInformationDebugObject
@ stdcall -private -syscall ZwSetInformationFile(long ptr ptr long long) NtSetInformationFile
@ stdcall -private -syscall ZwSetInformationJobObject(long long ptr long) NtSetInformationJobObject
@@ -1407,16 +1407,16 @@
@ stdcall -private -syscall ZwSetIntervalProfile(long long) NtSetIntervalProfile
@ stdcall -private -syscall ZwSetIoCompletion(ptr long long long long) NtSetIoCompletion
@ stdcall -private -syscall ZwSetLdtEntries(long int64 long int64) NtSetLdtEntries
-@ stub ZwSetLowEventPair
-@ stub ZwSetLowWaitHighEventPair
-@ stub ZwSetLowWaitHighThread
+# @ stub ZwSetLowEventPair
+# @ stub ZwSetLowWaitHighEventPair
+# @ stub ZwSetLowWaitHighThread
@ stdcall -private -syscall ZwSetPowerRequest(long long) NtSetPowerRequest
# @ stub ZwSetQuotaInformationFile
@ stdcall -private -syscall ZwSetSecurityObject(long long ptr) NtSetSecurityObject
-@ stub ZwSetSystemEnvironmentValue
+# @ stub ZwSetSystemEnvironmentValue
# @ stub ZwSetSystemEnvironmentValueEx
@ stdcall -private -syscall ZwSetSystemInformation(long ptr long) NtSetSystemInformation
-@ stub ZwSetSystemPowerState
+# @ stub ZwSetSystemPowerState
@ stdcall -private -syscall ZwSetSystemTime(ptr ptr) NtSetSystemTime
@ stdcall -private -syscall ZwSetThreadExecutionState(long ptr) NtSetThreadExecutionState
@ stdcall -private -syscall ZwSetTimer(long ptr ptr ptr long long ptr) NtSetTimer
@@ -1426,8 +1426,8 @@
@ stdcall -private -syscall ZwSetVolumeInformationFile(long ptr ptr long long) NtSetVolumeInformationFile
@ stdcall -private -syscall ZwShutdownSystem(long) NtShutdownSystem
@ stdcall -private -syscall ZwSignalAndWaitForSingleObject(long long long ptr) NtSignalAndWaitForSingleObject
-@ stub ZwStartProfile
-@ stub ZwStopProfile
+# @ stub ZwStartProfile
+# @ stub ZwStopProfile
@ stdcall -private -syscall ZwSuspendProcess(long) NtSuspendProcess
@ stdcall -private -syscall ZwSuspendThread(long ptr) NtSuspendThread
@ stdcall -private -syscall ZwSystemDebugControl(long ptr long ptr long ptr) NtSystemDebugControl
@@ -1439,26 +1439,26 @@
# @ stub ZwTranslateFilePath
@ stdcall -private -syscall ZwUnloadDriver(ptr) NtUnloadDriver
@ stdcall -private -syscall ZwUnloadKey(ptr) NtUnloadKey
-@ stub ZwUnloadKeyEx
+# @ stub ZwUnloadKeyEx
@ stdcall -private -syscall ZwUnlockFile(long ptr ptr ptr ptr) NtUnlockFile
@ stdcall -private -syscall ZwUnlockVirtualMemory(long ptr ptr long) NtUnlockVirtualMemory
@ stdcall -private -syscall ZwUnmapViewOfSection(long ptr) NtUnmapViewOfSection
-@ stub ZwVdmControl
-@ stub ZwW32Call
+# @ stub ZwVdmControl
+# @ stub ZwW32Call
@ stdcall -private -syscall ZwWaitForDebugEvent(long long ptr ptr) NtWaitForDebugEvent
@ stdcall -private -syscall ZwWaitForKeyedEvent(long ptr long ptr) NtWaitForKeyedEvent
@ stdcall -private -syscall ZwWaitForMultipleObjects(long ptr long long ptr) NtWaitForMultipleObjects
-@ stub ZwWaitForProcessMutant
+# @ stub ZwWaitForProcessMutant
@ stdcall -private -syscall ZwWaitForSingleObject(long long ptr) NtWaitForSingleObject
-@ stub ZwWaitHighEventPair
-@ stub ZwWaitLowEventPair
+# @ stub ZwWaitHighEventPair
+# @ stub ZwWaitLowEventPair
@ stdcall -syscall -arch=win32 ZwWow64AllocateVirtualMemory64(long ptr int64 ptr long long) NtWow64AllocateVirtualMemory64
@ stdcall -syscall -arch=win32 ZwWow64GetNativeSystemInformation(long ptr long ptr) NtWow64GetNativeSystemInformation
@ stdcall -syscall -arch=win32 ZwWow64ReadVirtualMemory64(long int64 ptr int64 ptr) NtWow64ReadVirtualMemory64
@ stdcall -syscall -arch=win32 ZwWow64WriteVirtualMemory64(long int64 ptr int64 ptr) NtWow64WriteVirtualMemory64
@ stdcall -private -syscall ZwWriteFile(long long ptr ptr ptr ptr long ptr ptr) NtWriteFile
@ stdcall -private -syscall ZwWriteFileGather(long long ptr ptr ptr ptr long ptr ptr) NtWriteFileGather
-@ stub ZwWriteRequestData
+# @ stub ZwWriteRequestData
@ stdcall -private -syscall ZwWriteVirtualMemory(long ptr ptr long ptr) NtWriteVirtualMemory
@ stdcall -private -syscall ZwYieldExecution() NtYieldExecution
@ cdecl -private -arch=i386 _CIcos()
--
2.31.1
2
1
20 Jul '21
Fixes a regression introduced in b8aaf86b2dbb8ecb3f7094cc40a0df89bb2add27
Partial revert the pull_timeout function, which now return -1 and sets the
transport error to try again.
Wine-bug: https://bugs.winehq.org/show_bug.cgi?id=51440
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com>
---
dlls/secur32/schannel_gnutls.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/dlls/secur32/schannel_gnutls.c b/dlls/secur32/schannel_gnutls.c
index bcf38e3f23f..4d8109721ce 100644
--- a/dlls/secur32/schannel_gnutls.c
+++ b/dlls/secur32/schannel_gnutls.c
@@ -292,7 +292,15 @@ static DWORD CDECL schan_get_enabled_protocols(void)
static int pull_timeout(gnutls_transport_ptr_t transport, unsigned int timeout)
{
- return 0;
+ struct schan_transport *t = (struct schan_transport*)transport;
+ gnutls_session_t s = (gnutls_session_t)callbacks->get_session_for_transport(t);
+ SIZE_T count = 0;
+
+ TRACE("\n");
+
+ if (callbacks->get_buffer(t, &t->in, &count)) return 1;
+ pgnutls_transport_set_errno(s, EAGAIN);
+ return -1;
}
static BOOL CDECL schan_create_session(schan_session *session, schan_credentials *cred)
--
2.30.2
2
1
20 Jul '21
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
dlls/netapi32/unixlib.c | 18 +++++++++++-------
1 file changed, 11 insertions(+), 7 deletions(-)
diff --git a/dlls/netapi32/unixlib.c b/dlls/netapi32/unixlib.c
index 6a8999a6de4..cd04a1116ce 100644
--- a/dlls/netapi32/unixlib.c
+++ b/dlls/netapi32/unixlib.c
@@ -68,9 +68,9 @@ static NET_API_STATUS (*pNetShareDel)( const char *, const char *, unsigned int
static NET_API_STATUS (*pNetWkstaGetInfo)( const char *, unsigned int, unsigned char ** );
static CPTABLEINFO unix_cptable;
-static ULONG unix_cp;
+static ULONG unix_cp = CP_UTF8;
-static BOOL get_unix_codepage(void)
+static DWORD WINAPI get_unix_codepage_once( RTL_RUN_ONCE *once, void *param, void **context )
{
static const WCHAR wineunixcpW[] = {'W','I','N','E','U','N','I','X','C','P',0};
UNICODE_STRING name, value;
@@ -78,19 +78,23 @@ static BOOL get_unix_codepage(void)
SIZE_T size;
void *ptr;
- if (unix_cp) return TRUE;
-
RtlInitUnicodeString( &name, wineunixcpW );
value.Buffer = value_buffer;
value.MaximumLength = sizeof(value_buffer);
if (!RtlQueryEnvironmentVariable_U( NULL, &name, &value ))
RtlUnicodeStringToInteger( &value, 10, &unix_cp );
- if (NtGetNlsSectionPtr( 11, unix_cp, NULL, &ptr, &size ))
- return FALSE;
- RtlInitCodePageTable( ptr, &unix_cptable );
+ if (unix_cp != CP_UTF8 && !NtGetNlsSectionPtr( 11, unix_cp, NULL, &ptr, &size ))
+ RtlInitCodePageTable( ptr, &unix_cptable );
return TRUE;
}
+static BOOL get_unix_codepage( void )
+{
+ static RTL_RUN_ONCE once = RTL_RUN_ONCE_INIT;
+
+ return !RtlRunOnceExecuteOnce( &once, get_unix_codepage_once, NULL, NULL );
+}
+
static DWORD netapi_wcstoumbs( const WCHAR *src, char *dst, DWORD dstlen )
{
DWORD srclen = (strlenW( src ) + 1) * sizeof(WCHAR);
--
2.23.0
1
0
20 Jul '21
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
dlls/iphlpapi/iphlpapi_main.c | 87 +++++++++++++---------------------
dlls/iphlpapi/tests/iphlpapi.c | 4 +-
2 files changed, 35 insertions(+), 56 deletions(-)
diff --git a/dlls/iphlpapi/iphlpapi_main.c b/dlls/iphlpapi/iphlpapi_main.c
index f4e6ea1a504..93d9b0440dd 100644
--- a/dlls/iphlpapi/iphlpapi_main.c
+++ b/dlls/iphlpapi/iphlpapi_main.c
@@ -2696,69 +2696,48 @@ static void unicast_row_fill( MIB_UNICASTIPADDRESS_ROW *row, USHORT fam, void *k
DWORD WINAPI GetUnicastIpAddressEntry(MIB_UNICASTIPADDRESS_ROW *row)
{
- IP_ADAPTER_ADDRESSES *aa, *ptr;
- ULONG size = 0;
- DWORD ret;
+ struct nsi_ipv4_unicast_key key4;
+ struct nsi_ipv6_unicast_key key6;
+ struct nsi_ip_unicast_rw rw;
+ struct nsi_ip_unicast_dynamic dyn;
+ struct nsi_ip_unicast_static stat;
+ const NPI_MODULEID *mod;
+ DWORD err, key_size;
+ void *key;
- TRACE("%p\n", row);
+ TRACE( "%p\n", row );
- if (!row)
- return ERROR_INVALID_PARAMETER;
+ if (!row) return ERROR_INVALID_PARAMETER;
+ mod = ip_module_id( row->Address.si_family );
+ if (!mod) return ERROR_INVALID_PARAMETER;
- ret = GetAdaptersAddresses(row->Address.si_family, 0, NULL, NULL, &size);
- if (ret != ERROR_BUFFER_OVERFLOW)
- return ret;
- if (!(ptr = HeapAlloc(GetProcessHeap(), 0, size)))
- return ERROR_OUTOFMEMORY;
- if ((ret = GetAdaptersAddresses(row->Address.si_family, 0, NULL, ptr, &size)))
+ if (!row->InterfaceLuid.Value)
{
- HeapFree(GetProcessHeap(), 0, ptr);
- return ret;
+ err = ConvertInterfaceIndexToLuid( row->InterfaceIndex, &row->InterfaceLuid );
+ if (err) return err;
}
- ret = ERROR_FILE_NOT_FOUND;
- for (aa = ptr; aa; aa = aa->Next)
+ if (row->Address.si_family == WS_AF_INET)
{
- IP_ADAPTER_UNICAST_ADDRESS *ua;
-
- if (aa->u.s.IfIndex != row->InterfaceIndex &&
- memcmp(&aa->Luid, &row->InterfaceLuid, sizeof(row->InterfaceLuid)))
- continue;
- ret = ERROR_NOT_FOUND;
-
- ua = aa->FirstUnicastAddress;
- while (ua)
- {
- SOCKADDR_INET *uaaddr = (SOCKADDR_INET *)ua->Address.lpSockaddr;
-
- if ((row->Address.si_family == WS_AF_INET6 &&
- !memcmp(&row->Address.Ipv6.sin6_addr, &uaaddr->Ipv6.sin6_addr, sizeof(uaaddr->Ipv6.sin6_addr))) ||
- (row->Address.si_family == WS_AF_INET &&
- row->Address.Ipv4.sin_addr.S_un.S_addr == uaaddr->Ipv4.sin_addr.S_un.S_addr))
- {
- memcpy(&row->InterfaceLuid, &aa->Luid, sizeof(aa->Luid));
- row->InterfaceIndex = aa->u.s.IfIndex;
- row->PrefixOrigin = ua->PrefixOrigin;
- row->SuffixOrigin = ua->SuffixOrigin;
- row->ValidLifetime = ua->ValidLifetime;
- row->PreferredLifetime = ua->PreferredLifetime;
- row->OnLinkPrefixLength = ua->OnLinkPrefixLength;
- row->SkipAsSource = 0;
- row->DadState = ua->DadState;
- if (row->Address.si_family == WS_AF_INET6)
- row->ScopeId.u.Value = row->Address.Ipv6.sin6_scope_id;
- else
- row->ScopeId.u.Value = 0;
- NtQuerySystemTime(&row->CreationTimeStamp);
- HeapFree(GetProcessHeap(), 0, ptr);
- return NO_ERROR;
- }
- ua = ua->Next;
- }
+ key4.luid = row->InterfaceLuid;
+ key4.addr = row->Address.Ipv4.sin_addr;
+ key4.pad = 0;
+ key = &key4;
+ key_size = sizeof(key4);
}
- HeapFree(GetProcessHeap(), 0, ptr);
+ else if (row->Address.si_family == WS_AF_INET6)
+ {
+ key6.luid = row->InterfaceLuid;
+ key6.addr = row->Address.Ipv6.sin6_addr;
+ key = &key6;
+ key_size = sizeof(key6);
+ }
+ else return ERROR_INVALID_PARAMETER;
- return ret;
+ err = NsiGetAllParameters( 1, mod, NSI_IP_UNICAST_TABLE, key, key_size, &rw, sizeof(rw),
+ &dyn, sizeof(dyn), &stat, sizeof(stat) );
+ if (!err) unicast_row_fill( row, row->Address.si_family, key, &rw, &dyn, &stat );
+ return err;
}
DWORD WINAPI GetUnicastIpAddressTable(ADDRESS_FAMILY family, MIB_UNICASTIPADDRESS_TABLE **table)
diff --git a/dlls/iphlpapi/tests/iphlpapi.c b/dlls/iphlpapi/tests/iphlpapi.c
index 893d6041287..1deac9b64f1 100644
--- a/dlls/iphlpapi/tests/iphlpapi.c
+++ b/dlls/iphlpapi/tests/iphlpapi.c
@@ -1962,7 +1962,7 @@ static void test_GetUnicastIpAddressEntry(void)
memset( &row, 0, sizeof(row) );
ret = pGetUnicastIpAddressEntry( &row );
- todo_wine ok( ret == ERROR_INVALID_PARAMETER, "got %u\n", ret );
+ ok( ret == ERROR_INVALID_PARAMETER, "got %u\n", ret );
memset( &row, 0, sizeof(row) );
row.Address.Ipv4.sin_family = AF_INET;
@@ -1974,7 +1974,7 @@ static void test_GetUnicastIpAddressEntry(void)
memset( &row, 0, sizeof(row) );
row.InterfaceIndex = 123;
ret = pGetUnicastIpAddressEntry( &row );
- todo_wine ok( ret == ERROR_INVALID_PARAMETER, "got %u\n", ret );
+ ok( ret == ERROR_INVALID_PARAMETER, "got %u\n", ret );
memset( &row, 0, sizeof(row) );
row.InterfaceIndex = get_interface_index();
--
2.23.0
1
0
20 Jul '21
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
dlls/iphlpapi/iphlpapi_main.c | 132 +++++++++++++++++++---------------
dlls/nsi/tests/nsi.c | 1 -
2 files changed, 76 insertions(+), 57 deletions(-)
diff --git a/dlls/iphlpapi/iphlpapi_main.c b/dlls/iphlpapi/iphlpapi_main.c
index 4ff9feb57f2..f4e6ea1a504 100644
--- a/dlls/iphlpapi/iphlpapi_main.c
+++ b/dlls/iphlpapi/iphlpapi_main.c
@@ -77,6 +77,13 @@ WINE_DEFAULT_DEBUG_CHANNEL(iphlpapi);
DWORD WINAPI AllocateAndGetIfTableFromStack( MIB_IFTABLE **table, BOOL sort, HANDLE heap, DWORD flags );
+static const NPI_MODULEID *ip_module_id( USHORT family )
+{
+ if (family == WS_AF_INET) return &NPI_MS_IPV4_MODULEID;
+ if (family == WS_AF_INET6) return &NPI_MS_IPV6_MODULEID;
+ return NULL;
+}
+
DWORD WINAPI ConvertGuidToStringA( const GUID *guid, char *str, DWORD len )
{
if (len < CHARS_IN_GUID) return ERROR_INSUFFICIENT_BUFFER;
@@ -2651,6 +2658,42 @@ DWORD WINAPI GetExtendedUdpTable(PVOID pUdpTable, PDWORD pdwSize, BOOL bOrder,
return ret;
}
+static void unicast_row_fill( MIB_UNICASTIPADDRESS_ROW *row, USHORT fam, void *key, struct nsi_ip_unicast_rw *rw,
+ struct nsi_ip_unicast_dynamic *dyn, struct nsi_ip_unicast_static *stat )
+{
+ struct nsi_ipv4_unicast_key *key4 = (struct nsi_ipv4_unicast_key *)key;
+ struct nsi_ipv6_unicast_key *key6 = (struct nsi_ipv6_unicast_key *)key;
+
+ if (fam == WS_AF_INET)
+ {
+ row->Address.Ipv4.sin_family = fam;
+ row->Address.Ipv4.sin_port = 0;
+ row->Address.Ipv4.sin_addr = key4->addr;
+ memset( row->Address.Ipv4.sin_zero, 0, sizeof(row->Address.Ipv4.sin_zero) );
+ row->InterfaceLuid.Value = key4->luid.Value;
+ }
+ else
+ {
+ row->Address.Ipv6.sin6_family = fam;
+ row->Address.Ipv6.sin6_port = 0;
+ row->Address.Ipv6.sin6_flowinfo = 0;
+ row->Address.Ipv6.sin6_addr = key6->addr;
+ row->Address.Ipv6.sin6_scope_id = dyn->scope_id;
+ row->InterfaceLuid.Value = key6->luid.Value;
+ }
+
+ ConvertInterfaceLuidToIndex( &row->InterfaceLuid, &row->InterfaceIndex );
+ row->PrefixOrigin = rw->prefix_origin;
+ row->SuffixOrigin = rw->suffix_origin;
+ row->ValidLifetime = rw->valid_lifetime;
+ row->PreferredLifetime = rw->preferred_lifetime;
+ row->OnLinkPrefixLength = rw->on_link_prefix;
+ row->SkipAsSource = 0;
+ row->DadState = dyn->dad_state;
+ row->ScopeId.u.Value = dyn->scope_id;
+ row->CreationTimeStamp.QuadPart = stat->creation_time;
+}
+
DWORD WINAPI GetUnicastIpAddressEntry(MIB_UNICASTIPADDRESS_ROW *row)
{
IP_ADAPTER_ADDRESSES *aa, *ptr;
@@ -2720,80 +2763,57 @@ DWORD WINAPI GetUnicastIpAddressEntry(MIB_UNICASTIPADDRESS_ROW *row)
DWORD WINAPI GetUnicastIpAddressTable(ADDRESS_FAMILY family, MIB_UNICASTIPADDRESS_TABLE **table)
{
- IP_ADAPTER_ADDRESSES *aa, *ptr;
- MIB_UNICASTIPADDRESS_TABLE *data;
- DWORD ret, count = 0;
- ULONG size, flags;
+ void *key[2] = { NULL, NULL };
+ struct nsi_ip_unicast_rw *rw[2] = { NULL, NULL };
+ struct nsi_ip_unicast_dynamic *dyn[2] = { NULL, NULL };
+ struct nsi_ip_unicast_static *stat[2] = { NULL, NULL };
+ static const USHORT fam[2] = { WS_AF_INET, WS_AF_INET6 };
+ static const DWORD key_size[2] = { sizeof(struct nsi_ipv4_unicast_key), sizeof(struct nsi_ipv6_unicast_key) };
+ DWORD err, i, size, count[2] = { 0, 0 };
- TRACE("%u, %p\n", family, table);
+ TRACE( "%u, %p\n", family, table );
if (!table || (family != WS_AF_INET && family != WS_AF_INET6 && family != WS_AF_UNSPEC))
return ERROR_INVALID_PARAMETER;
- flags = GAA_FLAG_SKIP_ANYCAST |
- GAA_FLAG_SKIP_MULTICAST |
- GAA_FLAG_SKIP_DNS_SERVER |
- GAA_FLAG_SKIP_FRIENDLY_NAME;
-
- ret = GetAdaptersAddresses(family, flags, NULL, NULL, &size);
- if (ret != ERROR_BUFFER_OVERFLOW)
- return ret;
- if (!(ptr = HeapAlloc(GetProcessHeap(), 0, size)))
- return ERROR_OUTOFMEMORY;
- if ((ret = GetAdaptersAddresses(family, flags, NULL, ptr, &size)))
+ for (i = 0; i < 2; i++)
{
- HeapFree(GetProcessHeap(), 0, ptr);
- return ret;
+ if (family != WS_AF_UNSPEC && family != fam[i]) continue;
+
+ err = NsiAllocateAndGetTable( 1, ip_module_id( fam[i] ), NSI_IP_UNICAST_TABLE, key + i, key_size[i],
+ (void **)rw + i, sizeof(**rw), (void **)dyn + i, sizeof(**dyn),
+ (void **)stat + i, sizeof(**stat), count + i, 0 );
+ if (err) goto err;
}
- for (aa = ptr; aa; aa = aa->Next)
+ size = FIELD_OFFSET(MIB_UNICASTIPADDRESS_TABLE, Table[ count[0] + count[1] ]);
+ *table = heap_alloc( size );
+ if (!*table)
{
- IP_ADAPTER_UNICAST_ADDRESS *ua = aa->FirstUnicastAddress;
- while (ua)
- {
- count++;
- ua = ua->Next;
- }
+ err = ERROR_NOT_ENOUGH_MEMORY;
+ goto err;
}
- if (!(data = HeapAlloc(GetProcessHeap(), 0, sizeof(*data) + (count - 1) * sizeof(data->Table[0]))))
+ (*table)->NumEntries = count[0] + count[1];
+ for (i = 0; i < count[0]; i++)
{
- HeapFree(GetProcessHeap(), 0, ptr);
- return ERROR_OUTOFMEMORY;
+ MIB_UNICASTIPADDRESS_ROW *row = (*table)->Table + i;
+ struct nsi_ipv4_unicast_key *key4 = (struct nsi_ipv4_unicast_key *)key[0];
+
+ unicast_row_fill( row, fam[0], (void *)(key4 + i), rw[0] + i, dyn[0] + i, stat[0] + i );
}
- data->NumEntries = 0;
- for (aa = ptr; aa; aa = aa->Next)
+ for (i = 0; i < count[1]; i++)
{
- IP_ADAPTER_UNICAST_ADDRESS *ua = aa->FirstUnicastAddress;
- while (ua)
- {
- MIB_UNICASTIPADDRESS_ROW *row = &data->Table[data->NumEntries];
- memcpy(&row->Address, ua->Address.lpSockaddr, ua->Address.iSockaddrLength);
- memcpy(&row->InterfaceLuid, &aa->Luid, sizeof(aa->Luid));
- row->InterfaceIndex = aa->u.s.IfIndex;
- row->PrefixOrigin = ua->PrefixOrigin;
- row->SuffixOrigin = ua->SuffixOrigin;
- row->ValidLifetime = ua->ValidLifetime;
- row->PreferredLifetime = ua->PreferredLifetime;
- row->OnLinkPrefixLength = ua->OnLinkPrefixLength;
- row->SkipAsSource = 0;
- row->DadState = ua->DadState;
- if (row->Address.si_family == WS_AF_INET6)
- row->ScopeId.u.Value = row->Address.Ipv6.sin6_scope_id;
- else
- row->ScopeId.u.Value = 0;
- NtQuerySystemTime(&row->CreationTimeStamp);
+ MIB_UNICASTIPADDRESS_ROW *row = (*table)->Table + count[0] + i;
+ struct nsi_ipv6_unicast_key *key6 = (struct nsi_ipv6_unicast_key *)key[1];
- data->NumEntries++;
- ua = ua->Next;
- }
+ unicast_row_fill( row, fam[1], (void *)(key6 + i), rw[1] + i, dyn[1] + i, stat[1] + i );
}
- HeapFree(GetProcessHeap(), 0, ptr);
-
- *table = data;
- return ret;
+err:
+ for (i = 0; i < 2; i++) NsiFreeTable( key[i], rw[i], dyn[i], stat[i] );
+ return err;
}
/******************************************************************
diff --git a/dlls/nsi/tests/nsi.c b/dlls/nsi/tests/nsi.c
index c07653c2ede..869fa255bb2 100644
--- a/dlls/nsi/tests/nsi.c
+++ b/dlls/nsi/tests/nsi.c
@@ -470,7 +470,6 @@ static void test_ip_unicast( int family )
/* SkipAsSource */
ok( row->DadState == dyn->dad_state, "mismatch\n" );
ok( row->ScopeId.Value == dyn->scope_id, "mismatch\n" );
-todo_wine
ok( row->CreationTimeStamp.QuadPart == stat->creation_time, "mismatch\n" );
winetest_pop_context();
}
--
2.23.0
1
0
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
dlls/nsi/tests/nsi.c | 14 +++++++---
dlls/nsiproxy.sys/ip.c | 39 +++++++++++++++++++++++++++
dlls/nsiproxy.sys/main.o | Bin 0 -> 37448 bytes
dlls/nsiproxy.sys/ndis.c | 21 +++++++++++++++
dlls/nsiproxy.sys/nsiproxy_private.h | 1 +
5 files changed, 71 insertions(+), 4 deletions(-)
create mode 100644 dlls/nsiproxy.sys/main.o
diff --git a/dlls/nsi/tests/nsi.c b/dlls/nsi/tests/nsi.c
index 3408dfae58f..c07653c2ede 100644
--- a/dlls/nsi/tests/nsi.c
+++ b/dlls/nsi/tests/nsi.c
@@ -415,11 +415,11 @@ static void test_ip_unicast( int family )
{
DWORD rw_sizes[] = { FIELD_OFFSET(struct nsi_ip_unicast_rw, unk[0]), FIELD_OFFSET(struct nsi_ip_unicast_rw, unk[1]),
sizeof(struct nsi_ip_unicast_rw) };
- struct nsi_ipv4_unicast_key *key_tbl, *key4;
+ struct nsi_ipv4_unicast_key *key_tbl, *key4, get_key;
struct nsi_ipv6_unicast_key *key6;
- struct nsi_ip_unicast_rw *rw_tbl, *rw;
- struct nsi_ip_unicast_dynamic *dyn_tbl, *dyn;
- struct nsi_ip_unicast_static *stat_tbl, *stat;
+ struct nsi_ip_unicast_rw *rw_tbl, *rw, get_rw;
+ struct nsi_ip_unicast_dynamic *dyn_tbl, *dyn, get_dyn;
+ struct nsi_ip_unicast_static *stat_tbl, *stat, get_stat;
MIB_UNICASTIPADDRESS_TABLE *table;
const NPI_MODULEID *mod = (family == AF_INET) ? &NPI_MS_IPV4_MODULEID : &NPI_MS_IPV6_MODULEID;
DWORD err, count, i, rw_size, key_size = (family == AF_INET) ? sizeof(*key4) : sizeof(*key6);
@@ -475,6 +475,12 @@ todo_wine
winetest_pop_context();
}
+ get_key.luid.Value = ~0u;
+ get_key.addr.s_addr = 0;
+ err = NsiGetAllParameters( 1, &NPI_MS_IPV4_MODULEID, NSI_IP_UNICAST_TABLE, &get_key, sizeof(get_key),
+ &get_rw, rw_size, &get_dyn, sizeof(get_dyn), &get_stat, sizeof(get_stat) );
+ ok( err == ERROR_NOT_FOUND, "got %d\n", err );
+
FreeMibTable( table );
NsiFreeTable( key_tbl, rw_tbl, dyn_tbl, stat_tbl );
winetest_pop_context();
diff --git a/dlls/nsiproxy.sys/ip.c b/dlls/nsiproxy.sys/ip.c
index d5fcc689fc4..ab1b6294bea 100644
--- a/dlls/nsiproxy.sys/ip.c
+++ b/dlls/nsiproxy.sys/ip.c
@@ -180,6 +180,43 @@ static NTSTATUS ip_unicast_enumerate_all( void *key_data, DWORD key_size, void *
return status;
}
+static NTSTATUS ip_unicast_get_all_parameters( const void *key, DWORD key_size, void *rw_data, DWORD rw_size,
+ void *dynamic_data, DWORD dynamic_size,
+ void *static_data, DWORD static_size )
+{
+ int family = (key_size == sizeof(struct nsi_ipv4_unicast_key)) ? AF_INET : AF_INET6;
+ NTSTATUS status = STATUS_NOT_FOUND;
+ const struct nsi_ipv6_unicast_key *key6 = key;
+ const struct nsi_ipv4_unicast_key *key4 = key;
+ struct ifaddrs *addrs, *entry;
+ const char *unix_name;
+
+ TRACE( "%p %d %p %d %p %d %p %d\n", key, key_size, rw_data, rw_size, dynamic_data, dynamic_size,
+ static_data, static_size );
+
+ if (!convert_luid_to_unix_name( &key6->luid, &unix_name )) return STATUS_NOT_FOUND;
+
+ if (getifaddrs( &addrs )) return STATUS_NO_MORE_ENTRIES;
+
+ for (entry = addrs; entry; entry = entry->ifa_next)
+ {
+ if (!entry->ifa_addr || entry->ifa_addr->sa_family != family) continue;
+ if (strcmp( entry->ifa_name, unix_name )) continue;
+
+ if (family == AF_INET &&
+ memcmp( &key4->addr, &((struct sockaddr_in *)entry->ifa_addr)->sin_addr, sizeof(key4->addr) )) continue;
+ if (family == AF_INET6 &&
+ memcmp( &key6->addr, &((struct sockaddr_in6 *)entry->ifa_addr)->sin6_addr, sizeof(key6->addr) )) continue;
+
+ unicast_fill_entry( entry, NULL, rw_data, dynamic_data, static_data );
+ status = STATUS_SUCCESS;
+ break;
+ }
+
+ freeifaddrs( addrs );
+ return status;
+}
+
static struct module_table ipv4_tables[] =
{
{
@@ -189,6 +226,7 @@ static struct module_table ipv4_tables[] =
sizeof(struct nsi_ip_unicast_dynamic), sizeof(struct nsi_ip_unicast_static)
},
ip_unicast_enumerate_all,
+ ip_unicast_get_all_parameters,
},
{
~0u
@@ -210,6 +248,7 @@ static struct module_table ipv6_tables[] =
sizeof(struct nsi_ip_unicast_dynamic), sizeof(struct nsi_ip_unicast_static)
},
ip_unicast_enumerate_all,
+ ip_unicast_get_all_parameters,
},
{
~0u
diff --git a/dlls/nsiproxy.sys/main.o b/dlls/nsiproxy.sys/main.o
new file mode 100644
index 0000000000000000000000000000000000000000..6e44033ff5a72e170a1e300ace272de5ba9b0b3f
GIT binary patch
literal 37448
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
literal 0
HcmV?d00001
diff --git a/dlls/nsiproxy.sys/ndis.c b/dlls/nsiproxy.sys/ndis.c
index c40dba7a01a..885915e5b1d 100644
--- a/dlls/nsiproxy.sys/ndis.c
+++ b/dlls/nsiproxy.sys/ndis.c
@@ -634,6 +634,27 @@ BOOL convert_unix_name_to_luid( const char *unix_name, NET_LUID *luid )
return ret;
}
+BOOL convert_luid_to_unix_name( const NET_LUID *luid, const char **unix_name )
+{
+ struct if_entry *entry;
+ BOOL ret = FALSE;;
+
+ EnterCriticalSection( &if_list_cs );
+
+ update_if_table();
+
+ LIST_FOR_EACH_ENTRY( entry, &if_list, struct if_entry, entry )
+ if (entry->if_luid.Value == luid->Value)
+ {
+ *unix_name = entry->if_unix_name;
+ ret = TRUE;
+
+ }
+ LeaveCriticalSection( &if_list_cs );
+
+ return ret;
+}
+
static const struct module_table tables[] =
{
{
diff --git a/dlls/nsiproxy.sys/nsiproxy_private.h b/dlls/nsiproxy.sys/nsiproxy_private.h
index 1c62a3df038..0f6e7b05c59 100644
--- a/dlls/nsiproxy.sys/nsiproxy_private.h
+++ b/dlls/nsiproxy.sys/nsiproxy_private.h
@@ -22,6 +22,7 @@ NTSTATUS nsi_enumerate_all_ex( struct nsi_enumerate_all_ex *params ) DECLSPEC_HI
NTSTATUS nsi_get_all_parameters_ex( struct nsi_get_all_parameters_ex *params ) DECLSPEC_HIDDEN;
NTSTATUS nsi_get_parameter_ex( struct nsi_get_parameter_ex *params ) DECLSPEC_HIDDEN;
+BOOL convert_luid_to_unix_name( const NET_LUID *luid, const char **unix_name ) DECLSPEC_HIDDEN;
BOOL convert_unix_name_to_luid( const char *unix_name, NET_LUID *luid ) DECLSPEC_HIDDEN;
struct module_table
--
2.23.0
1
0
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
dlls/nsi/tests/nsi.c | 72 +++++++++
dlls/nsiproxy.sys/Makefile.in | 1 +
dlls/nsiproxy.sys/ip.c | 223 +++++++++++++++++++++++++++
dlls/nsiproxy.sys/ndis.c | 21 +++
dlls/nsiproxy.sys/nsi.c | 2 +
dlls/nsiproxy.sys/nsiproxy_private.h | 4 +
include/netioapi.h | 1 +
include/wine/nsi.h | 39 +++++
8 files changed, 363 insertions(+)
create mode 100644 dlls/nsiproxy.sys/ip.c
diff --git a/dlls/nsi/tests/nsi.c b/dlls/nsi/tests/nsi.c
index cefd42983d4..3408dfae58f 100644
--- a/dlls/nsi/tests/nsi.c
+++ b/dlls/nsi/tests/nsi.c
@@ -411,10 +411,82 @@ static void test_ndis_index_luid( void )
ok( err == ERROR_FILE_NOT_FOUND, "got %d\n", err );
}
+static void test_ip_unicast( int family )
+{
+ DWORD rw_sizes[] = { FIELD_OFFSET(struct nsi_ip_unicast_rw, unk[0]), FIELD_OFFSET(struct nsi_ip_unicast_rw, unk[1]),
+ sizeof(struct nsi_ip_unicast_rw) };
+ struct nsi_ipv4_unicast_key *key_tbl, *key4;
+ struct nsi_ipv6_unicast_key *key6;
+ struct nsi_ip_unicast_rw *rw_tbl, *rw;
+ struct nsi_ip_unicast_dynamic *dyn_tbl, *dyn;
+ struct nsi_ip_unicast_static *stat_tbl, *stat;
+ MIB_UNICASTIPADDRESS_TABLE *table;
+ const NPI_MODULEID *mod = (family == AF_INET) ? &NPI_MS_IPV4_MODULEID : &NPI_MS_IPV6_MODULEID;
+ DWORD err, count, i, rw_size, key_size = (family == AF_INET) ? sizeof(*key4) : sizeof(*key6);
+
+ winetest_push_context( family == AF_INET ? "AF_INET" : "AF_INET6" );
+
+ for (i = 0; i < ARRAY_SIZE(rw_sizes); i++)
+ {
+ err = NsiAllocateAndGetTable( 1, mod, NSI_IP_UNICAST_TABLE, (void **)&key_tbl, key_size,
+ (void **)&rw_tbl, rw_sizes[i], (void **)&dyn_tbl, sizeof(*dyn_tbl),
+ (void **)&stat_tbl, sizeof(*stat_tbl), &count, 0 );
+ if (!err) break;
+ }
+ ok( !err, "got %d\n", err );
+ rw_size = rw_sizes[i];
+
+ err = GetUnicastIpAddressTable( family, &table );
+ ok( !err, "got %d\n", err );
+ ok( table->NumEntries == count, "table entries %d count %d\n", table->NumEntries, count );
+
+ for (i = 0; i < count; i++)
+ {
+ MIB_UNICASTIPADDRESS_ROW *row = table->Table + i;
+ rw = (struct nsi_ip_unicast_rw *)((BYTE *)rw_tbl + i * rw_size);
+ dyn = dyn_tbl + i;
+ stat = stat_tbl + i;
+ winetest_push_context( "%d", i );
+
+ ok( row->Address.si_family == family, "mismatch\n" );
+
+ if (family == AF_INET)
+ {
+ key4 = key_tbl + i;
+ ok( !memcmp( &row->Address.Ipv4.sin_addr, &key4->addr, sizeof(struct in_addr) ), "mismatch\n" );
+ ok( row->InterfaceLuid.Value == key4->luid.Value, "mismatch\n" );
+ }
+ else
+ {
+ key6 = (struct nsi_ipv6_unicast_key *)key_tbl + i;
+ ok( !memcmp( &row->Address.Ipv6.sin6_addr, &key6->addr, sizeof(struct in6_addr) ), "mismatch\n" );
+ ok( row->InterfaceLuid.Value == key6->luid.Value, "mismatch\n" );
+ }
+ ok( row->PrefixOrigin == rw->prefix_origin, "mismatch\n" );
+ ok( row->SuffixOrigin == rw->suffix_origin, "mismatch\n" );
+ ok( row->ValidLifetime == rw->valid_lifetime, "mismatch\n" );
+ ok( row->PreferredLifetime == rw->preferred_lifetime, "mismatch\n" );
+ ok( row->OnLinkPrefixLength == rw->on_link_prefix, "mismatch\n" );
+ /* SkipAsSource */
+ ok( row->DadState == dyn->dad_state, "mismatch\n" );
+ ok( row->ScopeId.Value == dyn->scope_id, "mismatch\n" );
+todo_wine
+ ok( row->CreationTimeStamp.QuadPart == stat->creation_time, "mismatch\n" );
+ winetest_pop_context();
+ }
+
+ FreeMibTable( table );
+ NsiFreeTable( key_tbl, rw_tbl, dyn_tbl, stat_tbl );
+ winetest_pop_context();
+}
+
START_TEST( nsi )
{
test_nsi_api();
test_ndis_ifinfo();
test_ndis_index_luid();
+
+ test_ip_unicast( AF_INET );
+ test_ip_unicast( AF_INET6 );
}
diff --git a/dlls/nsiproxy.sys/Makefile.in b/dlls/nsiproxy.sys/Makefile.in
index e44aacf5b54..07c2738e55b 100644
--- a/dlls/nsiproxy.sys/Makefile.in
+++ b/dlls/nsiproxy.sys/Makefile.in
@@ -4,5 +4,6 @@ EXTRADLLFLAGS = -Wl,--subsystem,native
C_SRCS = \
device.c \
+ ip.c \
ndis.c \
nsi.c
diff --git a/dlls/nsiproxy.sys/ip.c b/dlls/nsiproxy.sys/ip.c
new file mode 100644
index 00000000000..d5fcc689fc4
--- /dev/null
+++ b/dlls/nsiproxy.sys/ip.c
@@ -0,0 +1,223 @@
+/*
+ * nsiproxy.sys ipv4 and ipv6 modules
+ *
+ * Copyright 2003, 2006, 2011 Juan Lang
+ * Copyright 2021 Huw Davies
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+#include "config.h"
+#include <stdarg.h>
+
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+
+#ifdef HAVE_IFADDRS_H
+#include <ifaddrs.h>
+#endif
+
+#include "ntstatus.h"
+#define WIN32_NO_STATUS
+#include "windef.h"
+#include "winbase.h"
+#include "winternl.h"
+#include "winioctl.h"
+#define USE_WS_PREFIX
+#include "winsock2.h"
+#include "ws2ipdef.h"
+#include "nldef.h"
+#include "ifdef.h"
+#include "netiodef.h"
+#include "wine/nsi.h"
+#include "wine/debug.h"
+
+#include "nsiproxy_private.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(nsi);
+
+static inline DWORD nsi_popcount( DWORD m )
+{
+#ifdef HAVE___BUILTIN_POPCOUNT
+ return __builtin_popcount( m );
+#else
+ m -= m >> 1 & 0x55555555;
+ m = (m & 0x33333333) + (m >> 2 & 0x33333333);
+ return ((m + (m >> 4)) & 0x0f0f0f0f) * 0x01010101 >> 24;
+#endif
+}
+
+static DWORD mask_v4_to_prefix( struct in_addr *addr )
+{
+ return nsi_popcount( addr->s_addr );
+}
+
+static DWORD mask_v6_to_prefix( struct in6_addr *addr )
+{
+ DWORD ret;
+
+ ret = nsi_popcount( *(DWORD *)addr->s6_addr );
+ ret += nsi_popcount( *(DWORD *)(addr->s6_addr + 4) );
+ ret += nsi_popcount( *(DWORD *)(addr->s6_addr + 8) );
+ ret += nsi_popcount( *(DWORD *)(addr->s6_addr + 12) );
+ return ret;
+}
+
+static ULONG64 get_boot_time( void )
+{
+ SYSTEM_TIMEOFDAY_INFORMATION ti;
+
+ NtQuerySystemInformation( SystemTimeOfDayInformation, &ti, sizeof(ti), NULL );
+ return ti.BootTime.QuadPart;
+}
+
+static void unicast_fill_entry( struct ifaddrs *entry, void *key, struct nsi_ip_unicast_rw *rw,
+ struct nsi_ip_unicast_dynamic *dyn, struct nsi_ip_unicast_static *stat )
+{
+ struct nsi_ipv6_unicast_key placeholder, *key6 = key;
+ struct nsi_ipv4_unicast_key *key4 = key;
+ DWORD scope_id = 0;
+
+ if (!key)
+ {
+ key6 = &placeholder;
+ key4 = (struct nsi_ipv4_unicast_key *)&placeholder;
+ }
+
+ convert_unix_name_to_luid( entry->ifa_name, &key6->luid );
+
+ if (entry->ifa_addr->sa_family == AF_INET)
+ {
+ memcpy( &key4->addr, &((struct sockaddr_in *)entry->ifa_addr)->sin_addr, sizeof(key4->addr) );
+ key4->pad = 0;
+ }
+ else if (entry->ifa_addr->sa_family == AF_INET6)
+ {
+ memcpy( &key6->addr, &((struct sockaddr_in6 *)entry->ifa_addr)->sin6_addr, sizeof(key6->addr) );
+ scope_id = ((struct sockaddr_in6 *)entry->ifa_addr)->sin6_scope_id;
+ }
+
+ if (rw)
+ {
+ rw->preferred_lifetime = 60000;
+ rw->valid_lifetime = 60000;
+
+ if (key6->luid.Info.IfType != IF_TYPE_SOFTWARE_LOOPBACK)
+ {
+ rw->prefix_origin = IpPrefixOriginDhcp;
+ rw->suffix_origin = IpSuffixOriginDhcp;
+ }
+ else
+ {
+ rw->prefix_origin = IpPrefixOriginManual;
+ rw->suffix_origin = IpSuffixOriginManual;
+ }
+ if (entry->ifa_netmask && entry->ifa_netmask->sa_family == AF_INET)
+ rw->on_link_prefix = mask_v4_to_prefix( &((struct sockaddr_in *)entry->ifa_netmask)->sin_addr );
+ else if (entry->ifa_netmask && entry->ifa_netmask->sa_family == AF_INET6)
+ rw->on_link_prefix = mask_v6_to_prefix( &((struct sockaddr_in6 *)entry->ifa_netmask)->sin6_addr );
+ else rw->on_link_prefix = 0;
+ rw->unk[0] = 0;
+ rw->unk[1] = 0;
+ }
+
+ if (dyn)
+ {
+ dyn->scope_id = scope_id;
+ dyn->dad_state = IpDadStatePreferred;
+ }
+
+ if (stat) stat->creation_time = get_boot_time();
+}
+
+static NTSTATUS ip_unicast_enumerate_all( void *key_data, DWORD key_size, void *rw_data, DWORD rw_size,
+ void *dynamic_data, DWORD dynamic_size,
+ void *static_data, DWORD static_size, DWORD_PTR *count )
+{
+ DWORD num = 0;
+ NTSTATUS status = STATUS_SUCCESS;
+ BOOL want_data = key_size || rw_size || dynamic_size || static_size;
+ struct ifaddrs *addrs, *entry;
+ int family = (key_size == sizeof(struct nsi_ipv4_unicast_key)) ? AF_INET : AF_INET6;
+
+ TRACE( "%p %d %p %d %p %d %p %d %p\n", key_data, key_size, rw_data, rw_size,
+ dynamic_data, dynamic_size, static_data, static_size, count );
+
+ if (getifaddrs( &addrs )) return STATUS_NO_MORE_ENTRIES;
+
+ for (entry = addrs; entry; entry = entry->ifa_next)
+ {
+ if (!entry->ifa_addr || entry->ifa_addr->sa_family != family) continue;
+
+ if (num < *count)
+ {
+ unicast_fill_entry( entry, key_data, rw_data, dynamic_data, static_data );
+ key_data = (BYTE *)key_data + key_size;
+ rw_data = (BYTE *)rw_data + rw_size;
+ dynamic_data = (BYTE *)dynamic_data + dynamic_size;
+ static_data = (BYTE *)static_data + static_size;
+ }
+ num++;
+ }
+
+ freeifaddrs( addrs );
+
+ if (!want_data || num <= *count) *count = num;
+ else status = STATUS_MORE_ENTRIES;
+
+ return status;
+}
+
+static struct module_table ipv4_tables[] =
+{
+ {
+ NSI_IP_UNICAST_TABLE,
+ {
+ sizeof(struct nsi_ipv4_unicast_key), sizeof(struct nsi_ip_unicast_rw),
+ sizeof(struct nsi_ip_unicast_dynamic), sizeof(struct nsi_ip_unicast_static)
+ },
+ ip_unicast_enumerate_all,
+ },
+ {
+ ~0u
+ }
+};
+
+const struct module ipv4_module =
+{
+ &NPI_MS_IPV4_MODULEID,
+ ipv4_tables
+};
+
+static struct module_table ipv6_tables[] =
+{
+ {
+ NSI_IP_UNICAST_TABLE,
+ {
+ sizeof(struct nsi_ipv6_unicast_key), sizeof(struct nsi_ip_unicast_rw),
+ sizeof(struct nsi_ip_unicast_dynamic), sizeof(struct nsi_ip_unicast_static)
+ },
+ ip_unicast_enumerate_all,
+ },
+ {
+ ~0u
+ }
+};
+
+const struct module ipv6_module =
+{
+ &NPI_MS_IPV6_MODULEID,
+ ipv6_tables
+};
diff --git a/dlls/nsiproxy.sys/ndis.c b/dlls/nsiproxy.sys/ndis.c
index 332df7159b9..c40dba7a01a 100644
--- a/dlls/nsiproxy.sys/ndis.c
+++ b/dlls/nsiproxy.sys/ndis.c
@@ -613,6 +613,27 @@ static NTSTATUS index_luid_get_parameter( const void *key, DWORD key_size, DWORD
return status;
}
+BOOL convert_unix_name_to_luid( const char *unix_name, NET_LUID *luid )
+{
+ struct if_entry *entry;
+ BOOL ret = FALSE;;
+
+ EnterCriticalSection( &if_list_cs );
+
+ update_if_table();
+
+ LIST_FOR_EACH_ENTRY( entry, &if_list, struct if_entry, entry )
+ if (!strcmp( entry->if_unix_name, unix_name ))
+ {
+ *luid = entry->if_luid;
+ ret = TRUE;
+ break;
+ }
+ LeaveCriticalSection( &if_list_cs );
+
+ return ret;
+}
+
static const struct module_table tables[] =
{
{
diff --git a/dlls/nsiproxy.sys/nsi.c b/dlls/nsiproxy.sys/nsi.c
index e4286b5fc93..8e084a076fd 100644
--- a/dlls/nsiproxy.sys/nsi.c
+++ b/dlls/nsiproxy.sys/nsi.c
@@ -38,6 +38,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(nsi);
static const struct module *modules[] =
{
&ndis_module,
+ &ipv4_module,
+ &ipv6_module,
};
static const struct module_table *get_module_table( const NPI_MODULEID *id, DWORD table )
diff --git a/dlls/nsiproxy.sys/nsiproxy_private.h b/dlls/nsiproxy.sys/nsiproxy_private.h
index 0cd2a79d59f..1c62a3df038 100644
--- a/dlls/nsiproxy.sys/nsiproxy_private.h
+++ b/dlls/nsiproxy.sys/nsiproxy_private.h
@@ -22,6 +22,8 @@ NTSTATUS nsi_enumerate_all_ex( struct nsi_enumerate_all_ex *params ) DECLSPEC_HI
NTSTATUS nsi_get_all_parameters_ex( struct nsi_get_all_parameters_ex *params ) DECLSPEC_HIDDEN;
NTSTATUS nsi_get_parameter_ex( struct nsi_get_parameter_ex *params ) DECLSPEC_HIDDEN;
+BOOL convert_unix_name_to_luid( const char *unix_name, NET_LUID *luid ) DECLSPEC_HIDDEN;
+
struct module_table
{
DWORD table;
@@ -43,3 +45,5 @@ struct module
};
extern const struct module ndis_module DECLSPEC_HIDDEN;
+extern const struct module ipv4_module DECLSPEC_HIDDEN;
+extern const struct module ipv6_module DECLSPEC_HIDDEN;
diff --git a/include/netioapi.h b/include/netioapi.h
index bbd203fc9b3..4735620dedb 100644
--- a/include/netioapi.h
+++ b/include/netioapi.h
@@ -256,6 +256,7 @@ DWORD WINAPI GetIfTable2(MIB_IF_TABLE2**);
DWORD WINAPI GetIfTable2Ex(MIB_IF_TABLE_LEVEL,MIB_IF_TABLE2**);
DWORD WINAPI GetIpInterfaceTable(ADDRESS_FAMILY,MIB_IPINTERFACE_TABLE**);
DWORD WINAPI GetUnicastIpAddressEntry(MIB_UNICASTIPADDRESS_ROW*);
+DWORD WINAPI GetUnicastIpAddressTable(ADDRESS_FAMILY,MIB_UNICASTIPADDRESS_TABLE**);
PCHAR WINAPI if_indextoname(NET_IFINDEX,PCHAR);
NET_IFINDEX WINAPI if_nametoindex(PCSTR);
diff --git a/include/wine/nsi.h b/include/wine/nsi.h
index 3327b1f7403..bba5be11e50 100644
--- a/include/wine/nsi.h
+++ b/include/wine/nsi.h
@@ -19,6 +19,8 @@
#ifndef __WINE_NSI_H
#define __WINE_NSI_H
+#include "inaddr.h"
+#include "in6addr.h"
#include "winioctl.h"
/* Undocumented NSI NDIS tables */
@@ -94,6 +96,43 @@ struct nsi_ndis_ifinfo_static
DWORD phys_medium_type;
};
+/* Undocumented NSI IP tables */
+#define NSI_IP_UNICAST_TABLE 10
+
+struct nsi_ipv4_unicast_key
+{
+ NET_LUID luid;
+ IN_ADDR addr;
+ DWORD pad;
+};
+
+struct nsi_ipv6_unicast_key
+{
+ NET_LUID luid;
+ IN6_ADDR addr;
+};
+
+struct nsi_ip_unicast_rw
+{
+ DWORD preferred_lifetime;
+ DWORD valid_lifetime;
+ DWORD prefix_origin;
+ DWORD suffix_origin;
+ DWORD on_link_prefix;
+ DWORD unk[2];
+};
+
+struct nsi_ip_unicast_dynamic
+{
+ DWORD scope_id;
+ DWORD dad_state;
+};
+
+struct nsi_ip_unicast_static
+{
+ ULONG64 creation_time;
+};
+
/* Wine specific ioctl interface */
#define IOCTL_NSIPROXY_WINE_ENUMERATE_ALL CTL_CODE(FILE_DEVICE_NETWORK, 0x400, METHOD_BUFFERED, 0)
--
2.23.0
1
0