Index: include/reactos/subsys/win/basemsg.h =================================================================== --- include/reactos/subsys/win/basemsg.h (revision 60201) +++ include/reactos/subsys/win/basemsg.h (working copy) @@ -22,7 +22,7 @@ BasepCreateThread, BasepGetTempFile, BasepExitProcess, - BasepDebugProcess, + BasepDebugProcessOld, BasepCheckVDM, BasepUpdateVDMEntry, BasepGetNextVDMCommand, @@ -46,8 +46,9 @@ BasepNlsUpdateCacheCount, BasepSetTermsrvClientTimeZone, BasepSxsCreateActivationContext, - BasepUnknown, + BasepDebugProcess, BasepRegisterThread, + BasepCheckApplicationCompatibility, BasepNlsGetUserInfo, BasepMaxApiNumber @@ -72,7 +73,7 @@ { ULONG Flags; ULONG ProcessParameterFlags; - HANDLE FileHandle; + HANDLE FileHandle; UNICODE_STRING SxsWin32ExePath; UNICODE_STRING SxsNtExePath; SIZE_T OverrideManifestOffset; Index: subsystems/win32/csrsrv/api.c =================================================================== --- subsystems/win32/csrsrv/api.c (revision 60201) +++ subsystems/win32/csrsrv/api.c (working copy) @@ -159,22 +159,6 @@ /* Reference the Process */ CsrLockedReferenceProcess(CsrProcess); - /* Release the lock */ - CsrReleaseProcessLock(); - - /* Duplicate the Object Directory */ - Status = NtDuplicateObject(NtCurrentProcess(), - CsrObjectDirectory, - CsrProcess->ProcessHandle, - &ConnectInfo->ObjectDirectory, - 0, - 0, - DUPLICATE_SAME_ACCESS | - DUPLICATE_SAME_ATTRIBUTES); - - /* Acquire the lock */ - CsrAcquireProcessLock(); - /* Check for success */ if (NT_SUCCESS(Status)) { @@ -1057,7 +1041,7 @@ { Connected = FALSE; } _SEH2_END; - + if (!Connected) { DPRINT1("CSRSS: CsrConnectToUser failed\n"); Index: subsystems/win/basesrv/basesrv.h =================================================================== --- subsystems/win/basesrv/basesrv.h (revision 60201) +++ subsystems/win/basesrv/basesrv.h (working copy) @@ -63,6 +63,18 @@ extern HANDLE BaseSrvSharedHeap; extern PBASE_STATIC_SERVER_DATA BaseStaticServerData; +NTSTATUS +NTAPI +BaseSrvNlsConnect( + PCSR_PROCESS CsrProcess, + PVOID ConnectionInfo, + PULONG ConnectionInfoLength); + +NTSTATUS +NTAPI +BaseSrvCleanupVDMResources( + PCSR_PROCESS CsrProcess); + #endif // __BASESRV_H__ /* EOF */ Index: subsystems/win/basesrv/CMakeLists.txt =================================================================== --- subsystems/win/basesrv/CMakeLists.txt (revision 60201) +++ subsystems/win/basesrv/CMakeLists.txt (working copy) @@ -1,9 +1,10 @@ include_directories(${REACTOS_SOURCE_DIR}/include/reactos/subsys) -spec2def(basesrv.dll basesrv.spec) +spec2def(basesrv.dll basesrv.spec ADD_IMPORTLIB) list(APPEND SOURCE 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: subsystems/win/basesrv/init.c =================================================================== --- subsystems/win/basesrv/init.c (revision 60201) +++ subsystems/win/basesrv/init.c (working copy) @@ -57,8 +57,9 @@ BaseSrvNlsUpdateCacheCount, BaseSrvSetTermsrvClientTimeZone, BaseSrvSxsCreateActivationContext, - BaseSrvUnknown, + BaseSrvDebugProcess, BaseSrvRegisterThread, + BaseSrvCheckApplicationCompatibility, BaseSrvNlsGetUserInfo, }; @@ -92,46 +93,49 @@ TRUE, // BaseSrvNlsUpdateCacheCount TRUE, // BaseSrvSetTermsrvClientTimeZone TRUE, // BaseSrvSxsCreateActivationContext - TRUE, // BaseSrvUnknown + TRUE, // BaseSrvDebugProcess TRUE, // BaseSrvRegisterThread + TRUE, // BaseSrvCheckApplicationCompatibility TRUE, // BaseSrvNlsGetUserInfo }; PCHAR BaseServerApiNameTable[BasepMaxApiNumber - BASESRV_FIRST_API_NUMBER] = { - "BaseCreateProcess", - "BaseCreateThread", - "BaseGetTempFile", - "BaseExitProcess", - "BaseDebugProcess", - "BaseCheckVDM", - "BaseUpdateVDMEntry", - "BaseGetNextVDMCommand", - "BaseExitVDM", - "BaseIsFirstVDM", - "BaseGetVDMExitCode", - "BaseSetReenterCount", - "BaseSetProcessShutdownParam", - "BaseGetProcessShutdownParam", - "BaseNlsSetUserInfo", - "BaseNlsSetMultipleUserInfo", - "BaseNlsCreateSection", - "BaseSetVDMCurDirs", - "BaseGetVDMCurDirs", - "BaseBatNotification", - "BaseRegisterWowExec", - "BaseSoundSentryNotification", - "BaseRefreshIniFileMapping", - "BaseDefineDosDevice", - "BaseSetTermsrvAppInstallMode", - "BaseNlsUpdateCacheCount", - "BaseSetTermsrvClientTimeZone", - "BaseSxsCreateActivationContext", - "BaseUnknown", - "BaseRegisterThread", - "BaseNlsGetUserInfo", + "BaseSrvCreateProcess", + "BaseSrvCreateThread", + "BaseSrvGetTempFile", + "BaseSrvExitProcess", + "BaseSrvDebugProcess", + "BaseSrvCheckVDM", + "BaseSrvUpdateVDMEntry", + "BaseSrvGetNextVDMCommand", + "BaseSrvExitVDM", + "BaseSrvIsFirstVDM", + "BaseSrvGetVDMExitCode", + "BaseSrvSetReenterCount", + "BaseSrvSetProcessShutdownParam", + "BaseSrvGetProcessShutdownParam", + "BaseSrvNlsSetUserInfo", + "BaseSrvNlsSetMultipleUserInfo", + "BaseSrvNlsCreateSection", + "BaseSrvSetVDMCurDirs", + "BaseSrvGetVDMCurDirs", + "BaseSrvBatNotification", + "BaseSrvRegisterWowExec", + "BaseSrvSoundSentryNotification", + "BaseSrvRefreshIniFileMapping", + "BaseSrvDefineDosDevice", + "BaseSrvSetTermsrvAppInstallMode", + "BaseSrvNlsUpdateCacheCount", + "BaseSrvSetTermsrvClientTimeZone", + "BaseSrvSxsCreateActivationContext", + "BaseSrvDebugProcess", + "BaseSrvRegisterThread", + "BaseSrvCheckApplicationCompatibility", + "BaseSrvNlsGetUserInfo", }; + /* FUNCTIONS ******************************************************************/ NTSTATUS @@ -560,6 +564,32 @@ LoadedServerDll->SharedSection = BaseStaticServerData; } +NTSTATUS +NTAPI +BaseClientConnectRoutine( + _In_ PCSR_PROCESS CsrProcess, + _Inout_ PVOID ConnectionInfo, + _Inout_ PULONG ConnectionInfoLength) +{ + /* Check parameter */ + if (*ConnectionInfoLength != 4) + { + return STATUS_INVALID_PARAMETER; + } + + /* Do the NLS connection */ + return BaseSrvNlsConnect(CsrProcess, ConnectionInfo, ConnectionInfoLength); +} + +NTSTATUS +NTAPI +BaseClientDisconnectRoutine( + _In_ PCSR_PROCESS CsrProcess) +{ + /* Cleanup VDM resources */ + return BaseSrvCleanupVDMResources(CsrProcess); +} + CSR_SERVER_DLL_INIT(ServerDllInitialization) { /* Setup the DLL Object */ @@ -569,8 +599,8 @@ LoadedServerDll->ValidTable = BaseServerApiServerValidTable; LoadedServerDll->NameTable = BaseServerApiNameTable; LoadedServerDll->SizeOfProcessData = 0; - LoadedServerDll->ConnectCallback = NULL; - LoadedServerDll->DisconnectCallback = NULL; + LoadedServerDll->ConnectCallback = BaseClientConnectRoutine; + LoadedServerDll->DisconnectCallback = BaseClientDisconnectRoutine; LoadedServerDll->ShutdownProcessCallback = NULL; BaseSrvDllInstance = LoadedServerDll->ServerHandle; Index: subsystems/win/basesrv/nls.c =================================================================== --- subsystems/win/basesrv/nls.c (revision 60201) +++ subsystems/win/basesrv/nls.c (working copy) @@ -128,6 +128,18 @@ NtQueryDefaultLocale(0, &pNlsRegUserInfo->UserLocaleId); } +NTSTATUS +NTAPI +BaseSrvNlsConnect( + PCSR_PROCESS CsrProcess, + PVOID ConnectionInfo, + PULONG ConnectionInfoLength) +{ + /* Does nothing */ + return STATUS_SUCCESS; +} + + /* PUBLIC SERVER APIS *********************************************************/ CSR_API(BaseSrvNlsSetUserInfo) Index: subsystems/win/basesrv/vdm.c =================================================================== --- subsystems/win/basesrv/vdm.c (revision 60201) +++ subsystems/win/basesrv/vdm.c (working copy) @@ -13,6 +13,14 @@ #define NDEBUG #include +NTSTATUS +NTAPI +BaseSrvCleanupVDMResources(PCSR_PROCESS CsrProcess) +{ + UNIMPLEMENTED; + return STATUS_SUCCESS; +} + /* PUBLIC SERVER APIS *********************************************************/ CSR_API(BaseSrvCheckVDM) 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... ***/ @@ -293,9 +421,10 @@ LoadedServerDll->ValidTable = UserServerApiServerValidTable; LoadedServerDll->NameTable = UserServerApiNameTable; LoadedServerDll->SizeOfProcessData = 0; - LoadedServerDll->ConnectCallback = NULL; + LoadedServerDll->ConnectCallback = UserClientConnect; LoadedServerDll->DisconnectCallback = NULL; LoadedServerDll->HardErrorCallback = UserServerHardError; - LoadedServerDll->ShutdownProcessCallback = NULL; + LoadedServerDll->ShutdownProcessCallback = UserClientShutdown; UserServerDllInstance = LoadedServerDll->ServerHandle; @@ -318,6 +447,54 @@ } /*** END - From win32csr... ***/ + /* Create the power request event */ + Status = NtCreateEvent(&ghPowerRequestEvent, + EVENT_ALL_ACCESS, + NULL, + SynchronizationEvent, + FALSE); + if (!NT_SUCCESS(Status)) + { + return Status; + } + + /* 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(0x50000, + 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) @@ -29,6 +29,7 @@ #include #include #include +#include /* Public Win32K Headers */ #include @@ -45,6 +46,9 @@ /* USER Headers */ #include +/* BASESRV Header */ +#include + /* Public Win32 Headers */ #include