Index: subsystems/win/basesrv/dosdev.c =================================================================== --- subsystems/win/basesrv/dosdev.c (revision 60201) +++ subsystems/win/basesrv/dosdev.c (working copy) @@ -169,7 +169,7 @@ Status == STATUS_BUFFER_TOO_SMALL) { LinkTarget.Length = 0; - LinkTarget.MaximumLength = Length; + LinkTarget.MaximumLength = (USHORT)Length; LinkTarget.Buffer = (PWSTR) RtlAllocateHeap(BaseSrvHeap, HEAP_ZERO_MEMORY, Index: win32ss/user/winsrv/CMakeLists.txt =================================================================== --- win32ss/user/winsrv/CMakeLists.txt (revision 60201) +++ win32ss/user/winsrv/CMakeLists.txt (working copy) @@ -27,7 +27,7 @@ target_link_libraries(winsrv win32ksys libcntpr ${PSEH_LIB} ${CONSRV_TARGET_LINK_LIBS}) add_delay_importlibs(winsrv advapi32 gdi32 user32 ${CONSRV_DELAY_IMPORT_LIBS}) -add_importlibs(winsrv csrsrv kernel32 ntdll ${CONSRV_IMPORT_LIBS}) +add_importlibs(winsrv csrsrv basesrv kernel32 ntdll ${CONSRV_IMPORT_LIBS}) add_dependencies(winsrv bugcodes) add_cd_file(TARGET winsrv DESTINATION reactos/system32 FOR all) Index: win32ss/user/winsrv/usersrv/init.c =================================================================== --- win32ss/user/winsrv/usersrv/init.c (revision 60201) +++ win32ss/user/winsrv/usersrv/init.c (working copy) @@ -18,6 +18,12 @@ /* GLOBALS ********************************************************************/ HINSTANCE UserServerDllInstance = NULL; +HANDLE WinSrvApiPort; +ULONG gSessionId; +BOOL gLUIDDeviceMapsEnabled; +USHORT gDispatchTableValues[2] = {663, 2123}; HANDLE ghPowerRequestEvent; HANDLE ghMediaRequestEvent; /* Memory */ HANDLE UserServerHeap = NULL; // Our own heap. @@ -269,6 +275,128 @@ return STATUS_NOT_IMPLEMENTED; } +NTSTATUS +NTAPI +UserClientConnect( + _Inout_ PCSR_PROCESS CsrProcess, + _In_ PVOID ConnectionInfo, + _In_ PULONG ConnectionInfoSize) +{ + PUSERCONNECT UserConnectionInfo = ConnectionInfo; + NTSTATUS Status; + DPRINT("UserClientConnect()\n"); + + /* Check if we don't have an API port yet */ + if (WinSrvApiPort == NULL) + { + /* Query the API port and save it globally */ + WinSrvApiPort = CsrQueryApiPort(); + + /* Inform win32k about the API port */ + Status = NtUserSetInformationThread(NtCurrentThread(), + UserThreadCsrApiPort, + &WinSrvApiPort, + sizeof(WinSrvApiPort)); + if (!NT_SUCCESS(Status)) + { + return Status; + } + } + + /* Check parameter */ + if (*ConnectionInfoSize != sizeof(USERCONNECT)) + { + return STATUS_INVALID_PARAMETER; + } + + /* Pass the request to win32k */ + UserConnectionInfo->dwDispatchCount = gDispatchTableValues[0]; + Status = NtUserProcessConnect(CsrProcess->ProcessHandle, + UserConnectionInfo, + *ConnectionInfoSize); + + return Status; +} + +ULONG // Should be NTSTATUS, but PTHREAD_START_ROUTINE is defined that way... +NTAPI +TerminalServerRequestThread( + PVOID Parameter) +{ + UNIMPLEMENTED; + return STATUS_SUCCESS; +} + +ULONG +NTAPI +UserClientShutdown( + _In_ PCSR_PROCESS CsrProcess, + _In_ ULONG Flags, + _In_ BOOLEAN FirstPhase) +{ + UNIMPLEMENTED; + return 0; +} + +NTSTATUS +NTAPI +WinStationAPIInit( + VOID) +{ + CLIENT_ID ClientId; + HANDLE ThreadHandle; + LONG ThreadPriority; + ULONG Enabled; + NTSTATUS Status; + + /* Save the session id in a global variable */ + gSessionId = NtCurrentTeb()->ProcessEnvironmentBlock->SessionId; + + /* Query LUID Device Maps information */ + Status = NtQueryInformationProcess(NtCurrentProcess(), + ProcessLUIDDeviceMapsEnabled, + &Enabled, + sizeof(Enabled), + NULL); + if (NT_SUCCESS(Status)) + gLUIDDeviceMapsEnabled = Enabled; + + /* Create the terminal server request thread */ + Status = RtlCreateUserThread(NtCurrentProcess(), + NULL, + TRUE, + 0, + 0, + 0, + TerminalServerRequestThread, + NULL, + &ThreadHandle, + &ClientId); + if (!NT_SUCCESS(Status)) + { + return Status; + } + + /* Register the thread with CSR */ + CsrAddStaticServerThread(ThreadHandle, &ClientId, 0); + + /* Set the server thread priority to highest */ + ThreadPriority = THREAD_PRIORITY_HIGHEST; + Status = NtSetInformationThread(ThreadHandle, + ThreadBasePriority, + &ThreadPriority, + 4); + if (!NT_SUCCESS(Status)) + { + return Status; + } + + /* Now start the server thread */ + NtResumeThread(ThreadHandle, 0); + + return Status; +} + CSR_SERVER_DLL_INIT(UserServerDllInitialization) { /*** From win32csr... ***/ @@ -318,6 +447,54 @@ /* Create the media request event */ Status = NtCreateEvent(&ghMediaRequestEvent, EVENT_ALL_ACCESS, NULL, SynchronizationEvent, FALSE); if (!NT_SUCCESS(Status)) { return Status; } + /* Set the create notify routine */ + BaseSetProcessCreateNotify(NtUserNotifyProcessCreate); + /* Initialize the kernel mode subsystem */ Status = NtUserInitialize(USER_VERSION, ghPowerRequestEvent, ghMediaRequestEvent); if (!NT_SUCCESS(Status)) { return Status; } + /* Check if this is a terminal server */ + if (SharedUserData->SuiteMask & VER_SUITE_TERMINAL) + { + /* Enable ExitWindowsEx API */ + UserServerApiServerValidTable[UserpExitWindowsEx - USERSRV_FIRST_API_NUMBER] = TRUE; + + /* Do additional windowstation init */ + Status = WinStationAPIInit(); + if (!NT_SUCCESS(Status)) + { + return Status; + } + } + /* All done */ return STATUS_SUCCESS; } Index: win32ss/user/winsrv/usersrv/usersrv.h =================================================================== --- win32ss/user/winsrv/usersrv/usersrv.h (revision 60201) +++ win32ss/user/winsrv/usersrv/usersrv.h (working copy) @@ -45,6 +46,9 @@ /* USER Headers */ #include +/* BASESRV Header */ +#include + /* Public Win32 Headers */ #include