Skip to content

Commit 8b84a46

Browse files
committed
[ANSI-SYNC-HACKS][NFSD] Small library to winesync ANSI code without
kernel32_vista
1 parent a20a359 commit 8b84a46

4 files changed

Lines changed: 185 additions & 2 deletions

File tree

base/services/nfsd/CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,10 @@ if(CMAKE_C_COMPILER_ID STREQUAL "Clang")
5959
target_compile_options(nfsd PRIVATE -Wno-incompatible-function-pointer-types)
6060
endif()
6161

62-
target_link_libraries(nfsd oldnames)
62+
target_link_libraries(nfsd ansi_sync_hacks oldnames)
6363

6464
set_module_type(nfsd win32cui)
65-
add_importlibs(nfsd advapi32 iphlpapi kernel32_vista libtirpc msvcrt shell32 ws2_32 wldap32 kernel32 ntdll)
65+
add_importlibs(nfsd advapi32 iphlpapi libtirpc msvcrt shell32 ws2_32 wldap32 kernel32 ntdll_vista ntdll)
6666
add_pch(nfsd precomp.h SOURCE)
6767

6868
add_cd_file(TARGET nfsd DESTINATION reactos/system32 FOR all)

sdk/lib/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ add_subdirectory(inflib)
66
if(CMAKE_CROSSCOMPILING)
77

88
add_subdirectory(3rdparty)
9+
add_subdirectory(ansi_sync_hacks)
910
add_subdirectory(apisets)
1011
add_subdirectory(comsupp)
1112
add_subdirectory(conutils)
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
2+
# This exists purely for syncing code that is compiled as an ANSI exe but depends on
3+
# Vista+ functionality, Eventually we won't need to maintain a 0x502 build and this
4+
# will be removed.
5+
6+
remove_definitions(-D_WIN32_WINNT=0x502 -DWINVER=0x502)
7+
add_definitions(-D_WIN32_WINNT=0x600 -DWINVER=0x600)
8+
9+
list(APPEND SOURCE
10+
sync_hacks.c)
11+
12+
add_library(ansi_sync_hacks STATIC ${SOURCE})
13+
add_dependencies(ansi_sync_hacks psdk)
Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
/*
2+
* This file exists due to some apps (e.g) nfsd.exe not suporting
3+
* UNICODE This provides all the needed ANSI NT6 support while still allowing it to build on
4+
* NT5.x builds.
5+
*/
6+
#define _KERNEL32_
7+
8+
/* PSDK/NDK Headers */
9+
#define WIN32_NO_STATUS
10+
#include <windef.h>
11+
#include <winbase.h>
12+
13+
/* Redefine NTDDI_VERSION to 2K3 SP1 to get correct NDK definitions */
14+
#undef NTDDI_VERSION
15+
#define NTDDI_VERSION NTDDI_WS03SP1
16+
17+
#define NTOS_MODE_USER
18+
#include <ndk/iofuncs.h>
19+
#include <ndk/kefuncs.h>
20+
#include <ndk/obfuncs.h>
21+
#include <ndk/psfuncs.h>
22+
#include <ndk/rtlfuncs.h>
23+
24+
#define NDEBUG
25+
#include <debug.h>
26+
27+
VOID
28+
WINAPI
29+
AcquireSRWLockExclusive(PSRWLOCK Lock)
30+
{
31+
RtlAcquireSRWLockExclusive((PRTL_SRWLOCK)Lock);
32+
}
33+
34+
VOID
35+
WINAPI
36+
AcquireSRWLockShared(PSRWLOCK Lock)
37+
{
38+
RtlAcquireSRWLockShared((PRTL_SRWLOCK)Lock);
39+
}
40+
41+
VOID
42+
WINAPI
43+
InitializeConditionVariable(PCONDITION_VARIABLE ConditionVariable)
44+
{
45+
RtlInitializeConditionVariable((PRTL_CONDITION_VARIABLE)ConditionVariable);
46+
}
47+
48+
VOID
49+
WINAPI
50+
InitializeSRWLock(PSRWLOCK Lock)
51+
{
52+
RtlInitializeSRWLock((PRTL_SRWLOCK)Lock);
53+
}
54+
55+
VOID
56+
WINAPI
57+
ReleaseSRWLockExclusive(PSRWLOCK Lock)
58+
{
59+
RtlReleaseSRWLockExclusive((PRTL_SRWLOCK)Lock);
60+
}
61+
62+
VOID
63+
WINAPI
64+
ReleaseSRWLockShared(PSRWLOCK Lock)
65+
{
66+
RtlReleaseSRWLockShared((PRTL_SRWLOCK)Lock);
67+
}
68+
69+
FORCEINLINE
70+
PLARGE_INTEGER
71+
GetNtTimeout(PLARGE_INTEGER Time, DWORD Timeout)
72+
{
73+
if (Timeout == INFINITE) return NULL;
74+
Time->QuadPart = (ULONGLONG)Timeout * -10000;
75+
return Time;
76+
}
77+
78+
BOOL
79+
WINAPI
80+
SleepConditionVariableCS(PCONDITION_VARIABLE ConditionVariable, PCRITICAL_SECTION CriticalSection, DWORD Timeout)
81+
{
82+
NTSTATUS Status;
83+
LARGE_INTEGER Time;
84+
85+
Status = RtlSleepConditionVariableCS(ConditionVariable, (PRTL_CRITICAL_SECTION)CriticalSection, GetNtTimeout(&Time, Timeout));
86+
if (!NT_SUCCESS(Status) || Status == STATUS_TIMEOUT)
87+
{
88+
SetLastError(RtlNtStatusToDosError(Status));
89+
return FALSE;
90+
}
91+
return TRUE;
92+
}
93+
94+
BOOL
95+
WINAPI
96+
SleepConditionVariableSRW(PCONDITION_VARIABLE ConditionVariable, PSRWLOCK Lock, DWORD Timeout, ULONG Flags)
97+
{
98+
NTSTATUS Status;
99+
LARGE_INTEGER Time;
100+
101+
Status = RtlSleepConditionVariableSRW(ConditionVariable, Lock, GetNtTimeout(&Time, Timeout), Flags);
102+
if (!NT_SUCCESS(Status) || Status == STATUS_TIMEOUT)
103+
{
104+
SetLastError(RtlNtStatusToDosError(Status));
105+
return FALSE;
106+
}
107+
return TRUE;
108+
}
109+
110+
VOID
111+
WINAPI
112+
WakeAllConditionVariable(PCONDITION_VARIABLE ConditionVariable)
113+
{
114+
RtlWakeAllConditionVariable((PRTL_CONDITION_VARIABLE)ConditionVariable);
115+
}
116+
117+
VOID
118+
WINAPI
119+
WakeConditionVariable(PCONDITION_VARIABLE ConditionVariable)
120+
{
121+
RtlWakeConditionVariable((PRTL_CONDITION_VARIABLE)ConditionVariable);
122+
}
123+
124+
125+
/*
126+
* @implemented
127+
*/
128+
BOOL WINAPI InitializeCriticalSectionEx(OUT LPCRITICAL_SECTION lpCriticalSection,
129+
IN DWORD dwSpinCount,
130+
IN DWORD flags)
131+
{
132+
NTSTATUS Status;
133+
134+
/* FIXME: Flags ignored */
135+
136+
/* Initialize the critical section */
137+
Status = RtlInitializeCriticalSectionAndSpinCount(
138+
(PRTL_CRITICAL_SECTION)lpCriticalSection,
139+
dwSpinCount);
140+
if (!NT_SUCCESS(Status))
141+
{
142+
/* Set failure code */
143+
SetLastError(RtlNtStatusToDosError(Status));
144+
return FALSE;
145+
}
146+
147+
/* Success */
148+
return TRUE;
149+
}
150+
151+
ULONGLONG
152+
WINAPI
153+
GetTickCount64(VOID)
154+
{
155+
ULARGE_INTEGER TickCount;
156+
157+
while (TRUE)
158+
{
159+
TickCount.HighPart = (ULONG)SharedUserData->TickCount.High1Time;
160+
TickCount.LowPart = SharedUserData->TickCount.LowPart;
161+
162+
if (TickCount.HighPart == (ULONG)SharedUserData->TickCount.High2Time) break;
163+
164+
YieldProcessor();
165+
}
166+
167+
return (UInt32x32To64(TickCount.LowPart, SharedUserData->TickCountMultiplier) >> 24) +
168+
(UInt32x32To64(TickCount.HighPart, SharedUserData->TickCountMultiplier) << 8);
169+
}

0 commit comments

Comments
 (0)