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/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; +ULONG gSessionId; +BOOL gLUIDDeviceMapsEnabled; +USHORT gDispatchTableValues[2] = {670, 2136}; HANDLE ghPowerRequestEvent; HANDLE ghMediaRequestEvent; /* Memory */ HANDLE UserServerHeap = NULL; // Our own heap. @@ -269,6 +275,128 @@ + +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 @@ /* 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; }