From 13fc08ccc7f7e1e4735af505667c503a322f3e82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sat, 20 Oct 2012 21:03:32 +0000 Subject: [PATCH] [NTDLL/KERNEL32] - Use new naming scheme. [CSRSRV] - Continuing headers reorganization. - Activate new code. [CSRSRV/WIN32CSR] - Move some code into basesrv. [BASESRV] - Add basesrv.dll The names of the APIs tables come from http://j00ru.vexillium.org/csrss_list/api_list.html as usual, however I used the NT 4 ones for testing purposes only. After that I will update them to 2k3 version and add function stubs. Also some variable names are deduced from the subsystems/win32/csrss/csrsrv/server.c ones. svn path=/branches/ros-csrss/; revision=57587 --- dll/ntdll/csr/api.c | 6 +- dll/win32/kernel32/client/dosdev.c | 4 +- dll/win32/kernel32/client/file/deviceio.c | 2 +- dll/win32/kernel32/client/file/filename.c | 2 +- dll/win32/kernel32/client/proc.c | 12 +- dll/win32/kernel32/client/vdm.c | 4 +- include/reactos/subsys/csrss/csrss.h | 295 +------ include/reactos/subsys/win/base.h | 15 +- .../subsys/{csrss/csrcons.h => win/console.h} | 137 +++ include/reactos/subsys/win/windows.h | 6 +- subsystems/win/basesrv/CMakeLists.txt | 24 + subsystems/win/basesrv/basesrv.def | 6 - subsystems/win/basesrv/basesrv.h | 280 +++++- subsystems/win/basesrv/basesrv.rc | 2 +- subsystems/win/basesrv/basesrv.spec | 2 + subsystems/win/basesrv/init.c | 496 +++++++++-- subsystems/win/basesrv/main.c | 44 - subsystems/win/basesrv/server.c | 832 +++++++++++++++++- subsystems/win32/csrsrv/api/process.c | 207 +---- subsystems/win32/csrsrv/api/wapi.c | 6 +- subsystems/win32/csrsrv/init.c | 31 +- subsystems/win32/csrsrv/procsup.c | 2 +- subsystems/win32/csrsrv/server.c | 48 +- win32ss/user/win32csr/CMakeLists.txt | 1 - win32ss/user/win32csr/dllmain.c | 110 ++- win32ss/user/win32csr/file.c | 586 ------------ win32ss/user/win32csr/file.h | 28 - 27 files changed, 1843 insertions(+), 1345 deletions(-) rename include/reactos/subsys/{csrss/csrcons.h => win/console.h} (55%) create mode 100644 subsystems/win/basesrv/CMakeLists.txt delete mode 100644 subsystems/win/basesrv/basesrv.def create mode 100644 subsystems/win/basesrv/basesrv.spec delete mode 100644 subsystems/win/basesrv/main.c delete mode 100644 win32ss/user/win32csr/file.c delete mode 100644 win32ss/user/win32csr/file.h diff --git a/dll/ntdll/csr/api.c b/dll/ntdll/csr/api.c index 965fe5c2ea1..9b5b054adf1 100644 --- a/dll/ntdll/csr/api.c +++ b/dll/ntdll/csr/api.c @@ -48,7 +48,7 @@ CsrSetPriorityClass(HANDLE hProcess, /* Call it */ Status = CsrClientCallServer(&ApiMessage, NULL, - CSR_CREATE_API_NUMBER(CSR_SRV_SERVER, CsrpSetPriorityClass), + CSR_CREATE_API_NUMBER(CSRSRV_SERVERDLL_INDEX, CsrpSetPriorityClass), sizeof(CSR_SET_PRIORITY_CLASS)); /* Return what we got, if requested */ @@ -63,7 +63,7 @@ CsrSetPriorityClass(HANDLE hProcess, */ NTSTATUS NTAPI -CsrIdentifyAlertableThread (VOID) +CsrIdentifyAlertableThread(VOID) { NTSTATUS Status; CSR_API_MESSAGE ApiMessage; @@ -77,7 +77,7 @@ CsrIdentifyAlertableThread (VOID) /* Call it */ Status = CsrClientCallServer(&ApiMessage, NULL, - CSR_CREATE_API_NUMBER(CSR_SRV_SERVER, CsrpIdentifyAlertable), + CSR_CREATE_API_NUMBER(CSRSRV_SERVERDLL_INDEX, CsrpIdentifyAlertable), sizeof(CSR_SET_PRIORITY_CLASS)); /* Return to caller */ diff --git a/dll/win32/kernel32/client/dosdev.c b/dll/win32/kernel32/client/dosdev.c index 3da3ec83312..2882de566ba 100644 --- a/dll/win32/kernel32/client/dosdev.c +++ b/dll/win32/kernel32/client/dosdev.c @@ -4,7 +4,7 @@ * PROJECT: ReactOS system libraries * FILE: lib/kernel32/file/dosdev.c * PURPOSE: Dos device functions - * PROGRAMMER: Ariadne ( ariadne@xs4all.nl) + * PROGRAMMER: Ariadne (ariadne@xs4all.nl) * UPDATE HISTORY: * Created 01/11/98 */ @@ -183,7 +183,7 @@ DefineDosDeviceW( Status = CsrClientCallServer(&Request, CaptureBuffer, - CSR_CREATE_API_NUMBER(CSR_CONSOLE, DEFINE_DOS_DEVICE), + CSR_CREATE_API_NUMBER(BASESRV_SERVERDLL_INDEX, BasepDefineDosDevice), sizeof(CSR_API_MESSAGE)); CsrFreeCaptureBuffer(CaptureBuffer); diff --git a/dll/win32/kernel32/client/file/deviceio.c b/dll/win32/kernel32/client/file/deviceio.c index 28eab558ba1..4d6796135d8 100644 --- a/dll/win32/kernel32/client/file/deviceio.c +++ b/dll/win32/kernel32/client/file/deviceio.c @@ -31,7 +31,7 @@ NotifySoundSentry(VOID) { CsrClientCallServer(&ApiMessage, NULL, - CSR_CREATE_API_NUMBER(CSR_NATIVE, SOUND_SENTRY), + CSR_CREATE_API_NUMBER(BASESRV_SERVERDLL_INDEX, BasepSoundSentryNotification), sizeof(CSR_API_MESSAGE)); } } diff --git a/dll/win32/kernel32/client/file/filename.c b/dll/win32/kernel32/client/file/filename.c index 6a3e2105444..1e94be315a2 100644 --- a/dll/win32/kernel32/client/file/filename.c +++ b/dll/win32/kernel32/client/file/filename.c @@ -160,7 +160,7 @@ GetTempFileNameW(IN LPCWSTR lpPathName, { CsrClientCallServer(&ApiMessage, NULL, - CSR_CREATE_API_NUMBER(CSR_NATIVE, GET_TEMP_FILE), + CSR_CREATE_API_NUMBER(BASESRV_SERVERDLL_INDEX, BasepGetTempFile), sizeof(CSR_API_MESSAGE)); if (ApiMessage.Data.GetTempFile.UniqueID == 0) { diff --git a/dll/win32/kernel32/client/proc.c b/dll/win32/kernel32/client/proc.c index 601e6882099..921c669e119 100644 --- a/dll/win32/kernel32/client/proc.c +++ b/dll/win32/kernel32/client/proc.c @@ -494,7 +494,6 @@ WINAPI BasepNotifyCsrOfThread(IN HANDLE ThreadHandle, IN PCLIENT_ID ClientId) { - ULONG Request = CREATE_THREAD; CSR_API_MESSAGE CsrRequest; NTSTATUS Status; @@ -508,7 +507,7 @@ BasepNotifyCsrOfThread(IN HANDLE ThreadHandle, /* Call CSR */ Status = CsrClientCallServer(&CsrRequest, NULL, - CSR_CREATE_API_NUMBER(CSR_NATIVE, Request), + CSR_CREATE_API_NUMBER(BASESRV_SERVERDLL_INDEX, BasepCreateThread), sizeof(CSR_API_MESSAGE)); if (!NT_SUCCESS(Status) || !NT_SUCCESS(CsrRequest.Status)) { @@ -538,7 +537,6 @@ BasepCreateFirstThread(HANDLE ProcessHandle, INITIAL_TEB InitialTeb; NTSTATUS Status; HANDLE hThread; - ULONG Request = CREATE_PROCESS; CSR_API_MESSAGE CsrRequest; DPRINT("BasepCreateFirstThread. hProcess: %lx\n", ProcessHandle); @@ -584,7 +582,7 @@ BasepCreateFirstThread(HANDLE ProcessHandle, /* Call CSR */ Status = CsrClientCallServer(&CsrRequest, NULL, - CSR_CREATE_API_NUMBER(CSR_NATIVE, Request), + CSR_CREATE_API_NUMBER(BASESRV_SERVERDLL_INDEX, BasepCreateProcess), sizeof(CSR_API_MESSAGE)); if (!NT_SUCCESS(Status) || !NT_SUCCESS(CsrRequest.Status)) { @@ -1182,7 +1180,7 @@ GetProcessShutdownParameters(OUT LPDWORD lpdwLevel, /* Ask CSRSS for shutdown information */ Status = CsrClientCallServer(&CsrRequest, NULL, - CSR_CREATE_API_NUMBER(CSR_NATIVE, GET_SHUTDOWN_PARAMETERS), + CSR_CREATE_API_NUMBER(BASESRV_SERVERDLL_INDEX, BasepGetProcessShutdownParam), sizeof(CSR_API_MESSAGE)); if (!(NT_SUCCESS(Status)) || !(NT_SUCCESS(CsrRequest.Status))) { @@ -1213,7 +1211,7 @@ SetProcessShutdownParameters(IN DWORD dwLevel, CsrRequest.Data.SetShutdownParametersRequest.Flags = dwFlags; Status = CsrClientCallServer(&CsrRequest, NULL, - CSR_CREATE_API_NUMBER(CSR_NATIVE, SET_SHUTDOWN_PARAMETERS), + CSR_CREATE_API_NUMBER(BASESRV_SERVERDLL_INDEX, BasepSetProcessShutdownParam), sizeof(CSR_API_MESSAGE)); if (!NT_SUCCESS(Status) || !NT_SUCCESS(CsrRequest.Status)) { @@ -1760,7 +1758,7 @@ ExitProcess(IN UINT uExitCode) CsrRequest.Data.TerminateProcessRequest.uExitCode = uExitCode; CsrClientCallServer(&CsrRequest, NULL, - CSR_CREATE_API_NUMBER(CSR_NATIVE, TERMINATE_PROCESS), + CSR_CREATE_API_NUMBER(BASESRV_SERVERDLL_INDEX, BasepExitProcess), sizeof(CSR_API_MESSAGE)); /* Now do it again */ diff --git a/dll/win32/kernel32/client/vdm.c b/dll/win32/kernel32/client/vdm.c index 166cd21f835..803558703a7 100644 --- a/dll/win32/kernel32/client/vdm.c +++ b/dll/win32/kernel32/client/vdm.c @@ -134,7 +134,7 @@ BaseUpdateVDMEntry(IN ULONG UpdateIndex, /* Send the message to CSRSS */ Status = CsrClientCallServer(&Msg, NULL, - CSR_CREATE_API_NUMBER(CSR_CONSOLE, UPDATE_VDM_ENTRY), + CSR_CREATE_API_NUMBER(BASESRV_SERVERDLL_INDEX, BasepUpdateVDMEntry), sizeof(Msg)); if (!(NT_SUCCESS(Status)) || !(NT_SUCCESS(Msg.Status))) { @@ -178,7 +178,7 @@ BaseCheckForVDM(IN HANDLE ProcessHandle, /* Call CSRSS */ Status = CsrClientCallServer(&Msg, NULL, - CSR_CREATE_API_NUMBER(CSR_CONSOLE, GET_VDM_EXIT_CODE), + CSR_CREATE_API_NUMBER(BASESRV_SERVERDLL_INDEX, BasepCheckVDM /* BasepGetVDMExitCode */), sizeof(Msg)); if (!NT_SUCCESS(Status)) return FALSE; diff --git a/include/reactos/subsys/csrss/csrss.h b/include/reactos/subsys/csrss/csrss.h index 06385623443..c3f233d0450 100644 --- a/include/reactos/subsys/csrss/csrss.h +++ b/include/reactos/subsys/csrss/csrss.h @@ -3,9 +3,9 @@ #ifndef __INCLUDE_CSRSS_CSRSS_H #define __INCLUDE_CSRSS_CSRSS_H -#define CSR_NATIVE 0x0000 -#define CSR_CONSOLE 0x0001 -#define CSR_GUI 0x0002 +#define CSR_NATIVE 0x0000 // CSRSRV +#define CSR_CONSOLE 0x0001 // WIN32CSR +#define CSR_GUI 0x0002 // WINSRV #define CONSOLE_INPUT_MODE_VALID (0x0f) #define CONSOLE_OUTPUT_MODE_VALID (0x03) @@ -14,63 +14,6 @@ typedef VOID (CALLBACK *PCONTROLDISPATCHER)(DWORD); -typedef struct -{ - ULONG Dummy; -} CSRSS_CONNECT_PROCESS, *PCSRSS_CONNECT_PROCESS; - -typedef struct _BASE_SXS_CREATEPROCESS_MSG -{ - ULONG Flags; - ULONG ProcessParameterFlags; - HANDLE FileHandle; - UNICODE_STRING SxsWin32ExePath; - UNICODE_STRING SxsNtExePath; - SIZE_T OverrideManifestOffset; - ULONG OverrideManifestSize; - SIZE_T OverridePolicyOffset; - ULONG OverridePolicySize; - PVOID PEManifestAddress; - ULONG PEManifestSize; - UNICODE_STRING CultureFallbacks; - ULONG Unknown[7]; - UNICODE_STRING AssemblyName; -} BASE_SXS_CREATEPROCESS_MSG, *PBASE_SXS_CREATEPROCESS_MSG; - -typedef struct -{ - // - // NT-type structure (BASE_CREATEPROCESS_MSG) - // - HANDLE ProcessHandle; - HANDLE ThreadHandle; - CLIENT_ID ClientId; - ULONG CreationFlags; - ULONG VdmBinaryType; - ULONG VdmTask; - HANDLE hVDM; - BASE_SXS_CREATEPROCESS_MSG Sxs; - PVOID PebAddressNative; - ULONG PebAddressWow64; - USHORT ProcessorArchitecture; - - // - // ReactOS Data - // - BOOL bInheritHandles; -} CSRSS_CREATE_PROCESS, *PCSRSS_CREATE_PROCESS; - -typedef struct -{ - CLIENT_ID ClientId; - HANDLE ThreadHandle; -} CSRSS_CREATE_THREAD, *PCSRSS_CREATE_THREAD; - -typedef struct -{ - UINT uExitCode; -} CSRSS_TERMINATE_PROCESS, *PCSRSS_TERMINATE_PROCESS; - typedef struct { USHORT nMaxIds; @@ -78,8 +21,6 @@ typedef struct ULONG nProcessIdsTotal; } CSRSS_GET_PROCESS_LIST, *PCSRSS_GET_PROCESS_LIST; -#include "csrcons.h" - typedef struct { HANDLE UniqueThread; @@ -97,18 +38,6 @@ typedef struct DWORD Reserved; } CSRSS_EXIT_REACTOS, *PCSRSS_EXIT_REACTOS; -typedef struct -{ - DWORD Level; - DWORD Flags; -} CSRSS_SET_SHUTDOWN_PARAMETERS, *PCSRSS_SET_SHUTDOWN_PARAMETERS; - -typedef struct -{ - DWORD Level; - DWORD Flags; -} CSRSS_GET_SHUTDOWN_PARAMETERS, *PCSRSS_GET_SHUTDOWN_PARAMETERS; - typedef struct { HANDLE Handle; @@ -160,239 +89,21 @@ typedef struct HANDLE InputWaitHandle; } CSRSS_GET_INPUT_WAIT_HANDLE, *PCSRSS_GET_INPUT_WAIT_HANDLE; -typedef struct -{ - UINT UniqueID; -} CSRSS_GET_TEMP_FILE, *PCSRSS_GET_TEMP_FILE; - -typedef struct -{ - UNICODE_STRING DeviceName; - UNICODE_STRING TargetName; - DWORD dwFlags; -} CSRSS_DEFINE_DOS_DEVICE, *PCSRSS_DEFINE_DOS_DEVICE; - -typedef struct -{ - ULONG VideoMode; -} CSRSS_SOUND_SENTRY, *PCSRSS_SOUND_SENTRY; - -typedef struct -{ - ULONG iTask; - ULONG BinaryType; - HANDLE ConsoleHandle; - HANDLE VDMProcessHandle; - HANDLE WaitObjectForParent; - USHORT EntryIndex; - USHORT VDMCreationState; -} CSRSS_UPDATE_VDM_ENTRY, *PCSRSS_UPDATE_VDM_ENTRY; - -typedef struct -{ - HANDLE ConsoleHandle; - HANDLE hParent; - ULONG ExitCode; -} CSRSS_GET_VDM_EXIT_CODE, *PCSRSS_GET_VDM_EXIT_CODE; - -typedef struct -{ - ULONG iTask; - HANDLE ConsoleHandle; - ULONG BinaryType; - HANDLE WaitObjectForParent; - HANDLE StdIn; - HANDLE StdOut; - HANDLE StdErr; - ULONG CodePage; - ULONG dwCreationFlags; - PCHAR CmdLine; - PCHAR appName; - PCHAR PifFile; - PCHAR CurDirectory; - PCHAR Env; - ULONG EnvLen; - PVOID StartupInfo; - PCHAR Desktop; - ULONG DesktopLen; - PCHAR Title; - ULONG TitleLen; - PCHAR Reserved; - ULONG ReservedLen; - USHORT CmdLen; - USHORT AppLen; - USHORT PifLen; - USHORT CurDirectoryLen; - USHORT CurDrive; - USHORT VDMState; -} CSRSS_CHECK_VDM, *PCSRSS_CHECK_VDM; - #define CSR_API_MESSAGE_HEADER_SIZE(Type) (FIELD_OFFSET(CSR_API_MESSAGE, Data) + sizeof(Type)) -#define CSRSS_MAX_WRITE_CONSOLE (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE)) -#define CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR)) -#define CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB)) -#define CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR)) -#define CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_ATTRIB)) -#define CREATE_PROCESS (0x0) -#define TERMINATE_PROCESS (0x1) -#define WRITE_CONSOLE (0x2) -#define READ_CONSOLE (0x3) -#define ALLOC_CONSOLE (0x4) -#define FREE_CONSOLE (0x5) -#define CONNECT_PROCESS (0x6) -#define SCREEN_BUFFER_INFO (0x7) -#define SET_CURSOR (0x8) -#define FILL_OUTPUT (0x9) -#define READ_INPUT (0xA) -#define WRITE_CONSOLE_OUTPUT_CHAR (0xB) -#define WRITE_CONSOLE_OUTPUT_ATTRIB (0xC) -#define FILL_OUTPUT_ATTRIB (0xD) -#define GET_CURSOR_INFO (0xE) -#define SET_CURSOR_INFO (0xF) -#define SET_ATTRIB (0x10) -#define GET_CONSOLE_MODE (0x11) -#define SET_CONSOLE_MODE (0x12) -#define CREATE_SCREEN_BUFFER (0x13) -#define SET_SCREEN_BUFFER (0x14) -#define SET_TITLE (0x15) -#define GET_TITLE (0x16) -#define WRITE_CONSOLE_OUTPUT (0x17) -#define FLUSH_INPUT_BUFFER (0x18) -#define SCROLL_CONSOLE_SCREEN_BUFFER (0x19) -#define READ_CONSOLE_OUTPUT_CHAR (0x1A) -#define READ_CONSOLE_OUTPUT_ATTRIB (0x1B) -#define GET_NUM_INPUT_EVENTS (0x1C) #define REGISTER_SERVICES_PROCESS (0x1D) #define EXIT_REACTOS (0x1E) -#define GET_SHUTDOWN_PARAMETERS (0x1F) -#define SET_SHUTDOWN_PARAMETERS (0x20) -#define PEEK_CONSOLE_INPUT (0x21) -#define READ_CONSOLE_OUTPUT (0x22) -#define WRITE_CONSOLE_INPUT (0x23) -#define GET_INPUT_HANDLE (0x24) -#define GET_OUTPUT_HANDLE (0x25) #define CLOSE_HANDLE (0x26) #define VERIFY_HANDLE (0x27) #define DUPLICATE_HANDLE (0x28) -#define SETGET_CONSOLE_HW_STATE (0x29) -#define GET_CONSOLE_WINDOW (0x2A) #define CREATE_DESKTOP (0x2B) #define SHOW_DESKTOP (0x2C) #define HIDE_DESKTOP (0x2D) -#define SET_CONSOLE_ICON (0x2E) #define SET_LOGON_NOTIFY_WINDOW (0x2F) #define REGISTER_LOGON_PROCESS (0x30) -#define GET_CONSOLE_CP (0x31) -#define SET_CONSOLE_CP (0x32) -#define GET_CONSOLE_OUTPUT_CP (0x33) -#define SET_CONSOLE_OUTPUT_CP (0x34) #define GET_INPUT_WAIT_HANDLE (0x35) #define GET_PROCESS_LIST (0x36) #define START_SCREEN_SAVER (0x37) -#define ADD_CONSOLE_ALIAS (0x38) -#define GET_CONSOLE_ALIAS (0x39) -#define GET_ALL_CONSOLE_ALIASES (0x3A) -#define GET_ALL_CONSOLE_ALIASES_LENGTH (0x3B) -#define GET_CONSOLE_ALIASES_EXES (0x3C) -#define GET_CONSOLE_ALIASES_EXES_LENGTH (0x3D) -#define GENERATE_CTRL_EVENT (0x3E) -#define CREATE_THREAD (0x3F) -#define SET_SCREEN_BUFFER_SIZE (0x40) -#define GET_CONSOLE_SELECTION_INFO (0x41) -#define GET_COMMAND_HISTORY_LENGTH (0x42) -#define GET_COMMAND_HISTORY (0x43) -#define EXPUNGE_COMMAND_HISTORY (0x44) -#define SET_HISTORY_NUMBER_COMMANDS (0x45) -#define GET_HISTORY_INFO (0x46) -#define SET_HISTORY_INFO (0x47) -#define GET_TEMP_FILE (0x48) -#define DEFINE_DOS_DEVICE (0x49) -#define SOUND_SENTRY (0x50) -#define UPDATE_VDM_ENTRY (0x51) -#define GET_VDM_EXIT_CODE (0x52) -#define CHECK_VDM (0x53) -typedef struct _NLS_USER_INFO -{ - WCHAR iCountry[80]; - WCHAR sCountry[80]; - WCHAR sList[80]; - WCHAR iMeasure[80]; - WCHAR iPaperSize[80]; - WCHAR sDecimal[80]; - WCHAR sThousand[80]; - WCHAR sGrouping[80]; - WCHAR iDigits[80]; - WCHAR iLZero[80]; - WCHAR iNegNumber[80]; - WCHAR sNativeDigits[80]; - WCHAR iDigitSubstitution[80]; - WCHAR sCurrency[80]; - WCHAR sMonDecSep[80]; - WCHAR sMonThouSep[80]; - WCHAR sMonGrouping[80]; - WCHAR iCurrDigits[80]; - WCHAR iCurrency[80]; - WCHAR iNegCurr[80]; - WCHAR sPosSign[80]; - WCHAR sNegSign[80]; - WCHAR sTimeFormat[80]; - WCHAR s1159[80]; - WCHAR s2359[80]; - WCHAR sShortDate[80]; - WCHAR sYearMonth[80]; - WCHAR sLongDate[80]; - WCHAR iCalType[80]; - WCHAR iFirstDay[80]; - WCHAR iFirstWeek[80]; - WCHAR sLocale[80]; - WCHAR sLocaleName[85]; - LCID UserLocaleId; - LUID InteractiveUserLuid; - CHAR InteractiveUserSid[68]; // SECURITY_MAX_SID_SIZE to make ROS happy - ULONG ulCacheUpdateCount; -} NLS_USER_INFO, *PNLS_USER_INFO; - - -typedef struct _BASE_STATIC_SERVER_DATA -{ - UNICODE_STRING WindowsDirectory; - UNICODE_STRING WindowsSystemDirectory; - UNICODE_STRING NamedObjectDirectory; - USHORT WindowsMajorVersion; - USHORT WindowsMinorVersion; - USHORT BuildNumber; - USHORT CSDNumber; - USHORT RCNumber; - WCHAR CSDVersion[128]; - SYSTEM_BASIC_INFORMATION SysInfo; - SYSTEM_TIMEOFDAY_INFORMATION TimeOfDay; - PVOID IniFileMapping; - NLS_USER_INFO NlsUserInfo; - BOOLEAN DefaultSeparateVDM; - BOOLEAN IsWowTaskReady; - UNICODE_STRING WindowsSys32x86Directory; - BOOLEAN fTermsrvAppInstallMode; - TIME_ZONE_INFORMATION tziTermsrvClientTimeZone; - KSYSTEM_TIME ktTermsrvClientBias; - ULONG TermsrvClientTimeZoneId; - BOOLEAN LUIDDeviceMapsEnabled; - ULONG TermsrvClientTimeZoneChangeNum; -} BASE_STATIC_SERVER_DATA, *PBASE_STATIC_SERVER_DATA; - - -/* Types used in the new CSR. Temporarly here for proper compile of NTDLL */ -// Not used at the moment... -typedef enum _CSR_SRV_API_NUMBER -{ - CsrpClientConnect, - CsrpThreadConnect, - CsrpProfileControl, - CsrpIdentifyAlertable, - CsrpSetPriorityClass, - CsrpMaxApiNumber -} CSR_SRV_API_NUMBER, *PCSR_SRV_API_NUMBER; - #endif /* __INCLUDE_CSRSS_CSRSS_H */ diff --git a/include/reactos/subsys/win/base.h b/include/reactos/subsys/win/base.h index a064f1bca22..b69587b72ca 100644 --- a/include/reactos/subsys/win/base.h +++ b/include/reactos/subsys/win/base.h @@ -1,16 +1,17 @@ -#if !defined(__INCLUDE_WIN_BASE_H) +/*** Public header for BASESRV and the rest ***/ + +#ifndef __INCLUDE_WIN_BASE_H #define __INCLUDE_WIN_BASE_H -#include +//#include -/* w32 base server */ - -#define WIN_SRV_BASE 1 +/* Base Server */ typedef VOID (CALLBACK * BASE_PROCESS_CREATE_NOTIFY_ROUTINE)(PVOID); NTSTATUS WINAPI BaseSetProcessCreateNotify (BASE_PROCESS_CREATE_NOTIFY_ROUTINE); -NTSTATUS WINAPI ServerDllInitialization (ULONG,LPWSTR*); +CSR_SERVER_DLL_INIT(ServerDllInitialization); -#endif /* ndef __INCLUDE_WIN_BASE_H */ +#endif // __INCLUDE_WIN_BASE_H +/* EOF */ diff --git a/include/reactos/subsys/csrss/csrcons.h b/include/reactos/subsys/win/console.h similarity index 55% rename from include/reactos/subsys/csrss/csrcons.h rename to include/reactos/subsys/win/console.h index ce7e7d0e034..6bb57852a94 100644 --- a/include/reactos/subsys/csrss/csrcons.h +++ b/include/reactos/subsys/win/console.h @@ -7,6 +7,72 @@ #include + + +#define CSRSS_MAX_WRITE_CONSOLE (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE)) +#define CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR)) +#define CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB)) +#define CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR)) +#define CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_ATTRIB)) + +#define WRITE_CONSOLE (0x2) +#define READ_CONSOLE (0x3) +#define ALLOC_CONSOLE (0x4) +#define FREE_CONSOLE (0x5) +#define SCREEN_BUFFER_INFO (0x7) +#define SET_CURSOR (0x8) +#define FILL_OUTPUT (0x9) +#define READ_INPUT (0xA) +#define WRITE_CONSOLE_OUTPUT_CHAR (0xB) +#define WRITE_CONSOLE_OUTPUT_ATTRIB (0xC) +#define FILL_OUTPUT_ATTRIB (0xD) +#define GET_CURSOR_INFO (0xE) +#define SET_CURSOR_INFO (0xF) +#define SET_ATTRIB (0x10) +#define GET_CONSOLE_MODE (0x11) +#define SET_CONSOLE_MODE (0x12) +#define CREATE_SCREEN_BUFFER (0x13) +#define SET_SCREEN_BUFFER (0x14) +#define SET_TITLE (0x15) +#define GET_TITLE (0x16) +#define WRITE_CONSOLE_OUTPUT (0x17) +#define FLUSH_INPUT_BUFFER (0x18) +#define SCROLL_CONSOLE_SCREEN_BUFFER (0x19) +#define READ_CONSOLE_OUTPUT_CHAR (0x1A) +#define READ_CONSOLE_OUTPUT_ATTRIB (0x1B) +#define GET_NUM_INPUT_EVENTS (0x1C) +#define PEEK_CONSOLE_INPUT (0x21) +#define READ_CONSOLE_OUTPUT (0x22) +#define WRITE_CONSOLE_INPUT (0x23) +#define GET_INPUT_HANDLE (0x24) +#define GET_OUTPUT_HANDLE (0x25) +#define SETGET_CONSOLE_HW_STATE (0x29) +#define GET_CONSOLE_WINDOW (0x2A) +#define SET_CONSOLE_ICON (0x2E) +#define GET_CONSOLE_CP (0x31) +#define SET_CONSOLE_CP (0x32) +#define GET_CONSOLE_OUTPUT_CP (0x33) +#define SET_CONSOLE_OUTPUT_CP (0x34) +#define ADD_CONSOLE_ALIAS (0x38) +#define GET_CONSOLE_ALIAS (0x39) +#define GET_ALL_CONSOLE_ALIASES (0x3A) +#define GET_ALL_CONSOLE_ALIASES_LENGTH (0x3B) +#define GET_CONSOLE_ALIASES_EXES (0x3C) +#define GET_CONSOLE_ALIASES_EXES_LENGTH (0x3D) +#define GENERATE_CTRL_EVENT (0x3E) +#define SET_SCREEN_BUFFER_SIZE (0x40) +#define GET_CONSOLE_SELECTION_INFO (0x41) +#define GET_COMMAND_HISTORY_LENGTH (0x42) +#define GET_COMMAND_HISTORY (0x43) +#define EXPUNGE_COMMAND_HISTORY (0x44) +#define SET_HISTORY_NUMBER_COMMANDS (0x45) +#define GET_HISTORY_INFO (0x46) +#define SET_HISTORY_INFO (0x47) + + + + + typedef struct { HANDLE ConsoleHandle; @@ -387,6 +453,77 @@ typedef struct UINT CodePage; } CSRSS_SET_CONSOLE_OUTPUT_CP, *PCSRSS_SET_CONSOLE_OUTPUT_CP; + + + + + + + + + + + +#if 0 + + CSRSS_WRITE_CONSOLE WriteConsoleRequest; + CSRSS_READ_CONSOLE ReadConsoleRequest; + CSRSS_ALLOC_CONSOLE AllocConsoleRequest; + CSRSS_FREE_CONSOLE FreeConsoleRequest; + CSRSS_SCREEN_BUFFER_INFO ScreenBufferInfoRequest; + CSRSS_SET_CURSOR SetCursorRequest; + CSRSS_FILL_OUTPUT FillOutputRequest; + CSRSS_FILL_OUTPUT_ATTRIB FillOutputAttribRequest; + CSRSS_READ_INPUT ReadInputRequest; + CSRSS_WRITE_CONSOLE_OUTPUT_CHAR WriteConsoleOutputCharRequest; + CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB WriteConsoleOutputAttribRequest; + CSRSS_GET_CURSOR_INFO GetCursorInfoRequest; + CSRSS_SET_CURSOR_INFO SetCursorInfoRequest; + CSRSS_SET_ATTRIB SetAttribRequest; + CSRSS_SET_CONSOLE_MODE SetConsoleModeRequest; + CSRSS_GET_CONSOLE_MODE GetConsoleModeRequest; + CSRSS_CREATE_SCREEN_BUFFER CreateScreenBufferRequest; + CSRSS_SET_SCREEN_BUFFER SetScreenBufferRequest; + CSRSS_SET_TITLE SetTitleRequest; + CSRSS_GET_TITLE GetTitleRequest; + CSRSS_WRITE_CONSOLE_OUTPUT WriteConsoleOutputRequest; + CSRSS_FLUSH_INPUT_BUFFER FlushInputBufferRequest; + CSRSS_SCROLL_CONSOLE_SCREEN_BUFFER ScrollConsoleScreenBufferRequest; + CSRSS_READ_CONSOLE_OUTPUT_CHAR ReadConsoleOutputCharRequest; + CSRSS_READ_CONSOLE_OUTPUT_ATTRIB ReadConsoleOutputAttribRequest; + CSRSS_PEEK_CONSOLE_INPUT PeekConsoleInputRequest; + CSRSS_READ_CONSOLE_OUTPUT ReadConsoleOutputRequest; + CSRSS_WRITE_CONSOLE_INPUT WriteConsoleInputRequest; + CSRSS_GET_INPUT_HANDLE GetInputHandleRequest; + CSRSS_GET_OUTPUT_HANDLE GetOutputHandleRequest; + CSRSS_SETGET_CONSOLE_HW_STATE ConsoleHardwareStateRequest; + CSRSS_GET_CONSOLE_WINDOW GetConsoleWindowRequest; + CSRSS_SET_CONSOLE_ICON SetConsoleIconRequest; + CSRSS_ADD_CONSOLE_ALIAS AddConsoleAlias; + CSRSS_GET_CONSOLE_ALIAS GetConsoleAlias; + CSRSS_GET_ALL_CONSOLE_ALIASES GetAllConsoleAlias; + CSRSS_GET_ALL_CONSOLE_ALIASES_LENGTH GetAllConsoleAliasesLength; + CSRSS_GET_CONSOLE_ALIASES_EXES GetConsoleAliasesExes; + CSRSS_GET_CONSOLE_ALIASES_EXES_LENGTH GetConsoleAliasesExesLength; + CSRSS_GENERATE_CTRL_EVENT GenerateCtrlEvent; + CSRSS_GET_NUM_INPUT_EVENTS GetNumInputEventsRequest; + CSRSS_SET_SCREEN_BUFFER_SIZE SetScreenBufferSize; + CSRSS_GET_CONSOLE_SELECTION_INFO GetConsoleSelectionInfo; + CSRSS_GET_COMMAND_HISTORY_LENGTH GetCommandHistoryLength; + CSRSS_GET_COMMAND_HISTORY GetCommandHistory; + CSRSS_EXPUNGE_COMMAND_HISTORY ExpungeCommandHistory; + CSRSS_SET_HISTORY_NUMBER_COMMANDS SetHistoryNumberCommands; + CSRSS_GET_HISTORY_INFO GetHistoryInfo; + CSRSS_SET_HISTORY_INFO SetHistoryInfo; + CSRSS_GET_CONSOLE_CP GetConsoleCodePage; + CSRSS_SET_CONSOLE_CP SetConsoleCodePage; + CSRSS_GET_CONSOLE_OUTPUT_CP GetConsoleOutputCodePage; + CSRSS_SET_CONSOLE_OUTPUT_CP SetConsoleOutputCodePage; + +#endif + + + #endif // __CSRCONS_H__ /* EOF */ diff --git a/include/reactos/subsys/win/windows.h b/include/reactos/subsys/win/windows.h index 0e42ea0d64e..5883ff4c1e1 100644 --- a/include/reactos/subsys/win/windows.h +++ b/include/reactos/subsys/win/windows.h @@ -4,12 +4,10 @@ #include /* w32 console server */ -#define WIN_SRV_WIN_CONSOLE 2 -NTSTATUS WINAPI ConServerDllInitialization (ULONG,LPWSTR*); +CSR_SERVER_DLL_INIT(ConServerDllInitialization); /* w32 user server */ -#define WIN_SRV_WIN_USER 3 -NTSTATUS WINAPI UserServerDllInitialization (ULONG,LPWSTR*); +CSR_SERVER_DLL_INIT(UserServerDllInitialization); #endif /* ndef __INCLUDE_WIN_WINDOWS_H */ diff --git a/subsystems/win/basesrv/CMakeLists.txt b/subsystems/win/basesrv/CMakeLists.txt new file mode 100644 index 00000000000..61c472377a6 --- /dev/null +++ b/subsystems/win/basesrv/CMakeLists.txt @@ -0,0 +1,24 @@ + +include_directories(${REACTOS_SOURCE_DIR}/subsystems/win32/csrss/include + ${REACTOS_SOURCE_DIR}/include/reactos/subsys) + +spec2def(basesrv.dll basesrv.spec) + +list(APPEND SOURCE + init.c + server.c + basesrv.rc + ${CMAKE_CURRENT_BINARY_DIR}/basesrv.def) + +add_library(basesrv SHARED ${SOURCE}) + +target_link_libraries(basesrv ${PSEH_LIB}) + +set_module_type(basesrv win32dll) + +add_importlibs(basesrv ntdll csrsrv) + +#add_pch(basesrv w32csr.h) + +add_dependencies(basesrv bugcodes) +add_cd_file(TARGET basesrv DESTINATION reactos/system32 FOR all) diff --git a/subsystems/win/basesrv/basesrv.def b/subsystems/win/basesrv/basesrv.def deleted file mode 100644 index ae74aeaf3b6..00000000000 --- a/subsystems/win/basesrv/basesrv.def +++ /dev/null @@ -1,6 +0,0 @@ -; $Id$ -LIBRARY basesrv.dll -EXPORTS -BaseSetProcessCreateNotify@4 -ServerDllInitialization@8 -; EOF diff --git a/subsystems/win/basesrv/basesrv.h b/subsystems/win/basesrv/basesrv.h index fe5cdb98ba5..a9edde6240a 100644 --- a/subsystems/win/basesrv/basesrv.h +++ b/subsystems/win/basesrv/basesrv.h @@ -1,3 +1,5 @@ +/*** Private header for BASESRV ***/ + #pragma once /* PSDK/NDK Headers */ @@ -7,5 +9,281 @@ #define NTOS_MODE_USER #include -#include +/* CSRSS Header */ +#include + + #include + + + +#define BASESRV_SERVERDLL_INDEX 1 +#define BASESRV_FIRST_API_NUMBER 0 + + +// Windows NT 4 table, adapted from http://j00ru.vexillium.org/csrss_list/api_list.html#Windows_NT +// It is for testing purposes. After that I will update it to 2k3 version and add stubs. +typedef enum _BASESRV_API_NUMBER +{ + BasepCreateProcess = BASESRV_FIRST_API_NUMBER, + BasepCreateThread, + BasepGetTempFile, + BasepExitProcess, + // BasepDebugProcess, + BasepCheckVDM, + BasepUpdateVDMEntry, + // BasepGetNextVDMCommand, + // BasepExitVDM, + // BasepIsFirstVDM, + BasepGetVDMExitCode, + // BasepSetReenterCount, + BasepSetProcessShutdownParam, + BasepGetProcessShutdownParam, + // BasepNlsSetUserInfo, + // BasepNlsSetMultipleUserInfo, + // BasepNlsCreateSortSection, + // BasepNlsPreserveSection, + // BasepSetVDMCurDirs, + // BasepGetVDMCurDirs, + // BasepBatNotification, + // BasepRegisterWowExec, + BasepSoundSentryNotification, + // BasepRefreshIniFileMapping, + BasepDefineDosDevice, + + BasepMaxApiNumber +} BASESRV_API_NUMBER, *PBASESRV_API_NUMBER; + + +typedef struct _BASE_SXS_CREATEPROCESS_MSG +{ + ULONG Flags; + ULONG ProcessParameterFlags; + HANDLE FileHandle; + UNICODE_STRING SxsWin32ExePath; + UNICODE_STRING SxsNtExePath; + SIZE_T OverrideManifestOffset; + ULONG OverrideManifestSize; + SIZE_T OverridePolicyOffset; + ULONG OverridePolicySize; + PVOID PEManifestAddress; + ULONG PEManifestSize; + UNICODE_STRING CultureFallbacks; + ULONG Unknown[7]; + UNICODE_STRING AssemblyName; +} BASE_SXS_CREATEPROCESS_MSG, *PBASE_SXS_CREATEPROCESS_MSG; + +typedef struct +{ + // + // NT-type structure (BASE_CREATEPROCESS_MSG) + // + HANDLE ProcessHandle; + HANDLE ThreadHandle; + CLIENT_ID ClientId; + ULONG CreationFlags; + ULONG VdmBinaryType; + ULONG VdmTask; + HANDLE hVDM; + BASE_SXS_CREATEPROCESS_MSG Sxs; + PVOID PebAddressNative; + ULONG PebAddressWow64; + USHORT ProcessorArchitecture; + + // + // ReactOS Data + // + BOOL bInheritHandles; +} BASE_CREATE_PROCESS, *PBASE_CREATE_PROCESS; + +typedef struct +{ + CLIENT_ID ClientId; + HANDLE ThreadHandle; +} BASE_CREATE_THREAD, *PBASE_CREATE_THREAD; + +typedef struct +{ + UINT uExitCode; +} BASE_EXIT_PROCESS, *PBASE_EXIT_PROCESS; + +typedef struct +{ + UINT UniqueID; +} BASE_GET_TEMP_FILE, *PBASE_GET_TEMP_FILE; + +typedef struct +{ + ULONG iTask; + HANDLE ConsoleHandle; + ULONG BinaryType; + HANDLE WaitObjectForParent; + HANDLE StdIn; + HANDLE StdOut; + HANDLE StdErr; + ULONG CodePage; + ULONG dwCreationFlags; + PCHAR CmdLine; + PCHAR appName; + PCHAR PifFile; + PCHAR CurDirectory; + PCHAR Env; + ULONG EnvLen; + PVOID StartupInfo; + PCHAR Desktop; + ULONG DesktopLen; + PCHAR Title; + ULONG TitleLen; + PCHAR Reserved; + ULONG ReservedLen; + USHORT CmdLen; + USHORT AppLen; + USHORT PifLen; + USHORT CurDirectoryLen; + USHORT CurDrive; + USHORT VDMState; +} BASE_CHECK_VDM, *PBASE_CHECK_VDM; + +typedef struct +{ + ULONG iTask; + ULONG BinaryType; + HANDLE ConsoleHandle; + HANDLE VDMProcessHandle; + HANDLE WaitObjectForParent; + USHORT EntryIndex; + USHORT VDMCreationState; +} BASE_UPDATE_VDM_ENTRY, *PBASE_UPDATE_VDM_ENTRY; + +typedef struct +{ + HANDLE ConsoleHandle; + HANDLE hParent; + ULONG ExitCode; +} BASE_GET_VDM_EXIT_CODE, *PBASE_GET_VDM_EXIT_CODE; + +typedef struct +{ + DWORD Level; + DWORD Flags; +} BASE_SET_PROCESS_SHUTDOWN_PARAMS, *PBASE_SET_PROCESS_SHUTDOWN_PARAMS; + +typedef struct +{ + DWORD Level; + DWORD Flags; +} BASE_GET_PROCESS_SHUTDOWN_PARAMS, *PBASE_GET_PROCESS_SHUTDOWN_PARAMS; + +typedef struct +{ + ULONG VideoMode; +} BASE_SOUND_SENTRY, *PBASE_SOUND_SENTRY; + +typedef struct +{ + UNICODE_STRING DeviceName; + UNICODE_STRING TargetName; + DWORD dwFlags; +} BASE_DEFINE_DOS_DEVICE, *PBASE_DEFINE_DOS_DEVICE; + + +typedef struct _BASE_API_MESSAGE +{ + PORT_MESSAGE Header; + + PCSR_CAPTURE_BUFFER CsrCaptureData; + CSR_API_NUMBER ApiNumber; + ULONG Status; + ULONG Reserved; + union + { + BASE_CREATE_PROCESS CreateProcessRequest; + BASE_CREATE_THREAD CreateThreadRequest; + BASE_EXIT_PROCESS ExitProcessRequest; // CSRSS_TERMINATE_PROCESS TerminateProcessRequest; + BASE_GET_TEMP_FILE GetTempFile; + BASE_CHECK_VDM CheckVdm; + BASE_UPDATE_VDM_ENTRY UpdateVdmEntry; + BASE_GET_VDM_EXIT_CODE GetVdmExitCode; + BASE_SET_PROCESS_SHUTDOWN_PARAMS SetShutdownParametersRequest; // CSRSS_SET_SHUTDOWN_PARAMETERS + BASE_GET_PROCESS_SHUTDOWN_PARAMS GetShutdownParametersRequest; // CSRSS_GET_SHUTDOWN_PARAMETERS + BASE_SOUND_SENTRY SoundSentryRequest; + BASE_DEFINE_DOS_DEVICE DefineDosDeviceRequest; + } Data; +} BASE_API_MESSAGE, *PBASE_API_MESSAGE; + + + + + + + + +typedef struct _NLS_USER_INFO +{ + WCHAR iCountry[80]; + WCHAR sCountry[80]; + WCHAR sList[80]; + WCHAR iMeasure[80]; + WCHAR iPaperSize[80]; + WCHAR sDecimal[80]; + WCHAR sThousand[80]; + WCHAR sGrouping[80]; + WCHAR iDigits[80]; + WCHAR iLZero[80]; + WCHAR iNegNumber[80]; + WCHAR sNativeDigits[80]; + WCHAR iDigitSubstitution[80]; + WCHAR sCurrency[80]; + WCHAR sMonDecSep[80]; + WCHAR sMonThouSep[80]; + WCHAR sMonGrouping[80]; + WCHAR iCurrDigits[80]; + WCHAR iCurrency[80]; + WCHAR iNegCurr[80]; + WCHAR sPosSign[80]; + WCHAR sNegSign[80]; + WCHAR sTimeFormat[80]; + WCHAR s1159[80]; + WCHAR s2359[80]; + WCHAR sShortDate[80]; + WCHAR sYearMonth[80]; + WCHAR sLongDate[80]; + WCHAR iCalType[80]; + WCHAR iFirstDay[80]; + WCHAR iFirstWeek[80]; + WCHAR sLocale[80]; + WCHAR sLocaleName[85]; + LCID UserLocaleId; + LUID InteractiveUserLuid; + CHAR InteractiveUserSid[68]; // SECURITY_MAX_SID_SIZE to make ROS happy + ULONG ulCacheUpdateCount; +} NLS_USER_INFO, *PNLS_USER_INFO; + + +typedef struct _BASE_STATIC_SERVER_DATA +{ + UNICODE_STRING WindowsDirectory; + UNICODE_STRING WindowsSystemDirectory; + UNICODE_STRING NamedObjectDirectory; + USHORT WindowsMajorVersion; + USHORT WindowsMinorVersion; + USHORT BuildNumber; + USHORT CSDNumber; + USHORT RCNumber; + WCHAR CSDVersion[128]; + SYSTEM_BASIC_INFORMATION SysInfo; + SYSTEM_TIMEOFDAY_INFORMATION TimeOfDay; + PVOID IniFileMapping; + NLS_USER_INFO NlsUserInfo; + BOOLEAN DefaultSeparateVDM; + BOOLEAN IsWowTaskReady; + UNICODE_STRING WindowsSys32x86Directory; + BOOLEAN fTermsrvAppInstallMode; + TIME_ZONE_INFORMATION tziTermsrvClientTimeZone; + KSYSTEM_TIME ktTermsrvClientBias; + ULONG TermsrvClientTimeZoneId; + BOOLEAN LUIDDeviceMapsEnabled; + ULONG TermsrvClientTimeZoneChangeNum; +} BASE_STATIC_SERVER_DATA, *PBASE_STATIC_SERVER_DATA; + + diff --git a/subsystems/win/basesrv/basesrv.rc b/subsystems/win/basesrv/basesrv.rc index a6032596fc9..bfd2c93e468 100644 --- a/subsystems/win/basesrv/basesrv.rc +++ b/subsystems/win/basesrv/basesrv.rc @@ -1,5 +1,5 @@ #define REACTOS_VERSION_DLL -#define REACTOS_STR_FILE_DESCRIPTION "ReactOS/Win32 base usermode server\0" +#define REACTOS_STR_FILE_DESCRIPTION "ReactOS BASE API Server DLL\0" #define REACTOS_STR_INTERNAL_NAME "basesrv\0" #define REACTOS_STR_ORIGINAL_FILENAME "basesrv.dll\0" #include diff --git a/subsystems/win/basesrv/basesrv.spec b/subsystems/win/basesrv/basesrv.spec new file mode 100644 index 00000000000..d9a4b8d08df --- /dev/null +++ b/subsystems/win/basesrv/basesrv.spec @@ -0,0 +1,2 @@ +@ stdcall BaseSetProcessCreateNotify(ptr) +@ stdcall ServerDllInitialization(ptr) diff --git a/subsystems/win/basesrv/init.c b/subsystems/win/basesrv/init.c index 93dcffa8fa9..dd7f5d16a23 100644 --- a/subsystems/win/basesrv/init.c +++ b/subsystems/win/basesrv/init.c @@ -1,73 +1,461 @@ -/* $Id$ - * - * init.c - ReactOS/Win32 base enviroment subsystem server - * - * ReactOS Operating System - * - * -------------------------------------------------------------------- - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * -------------------------------------------------------------------- +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS/Win32 base enviroment subsystem server + * FILE: subsystems/win/basesrv/init.c + * PURPOSE: Initialization + * PROGRAMMERS: Hermes Belusca-Maito (hermes.belusca@sfr.fr) */ + #include "basesrv.h" #define NDEBUG #include -HANDLE BaseApiPort = (HANDLE) 0; +HANDLE DllHandle = NULL; +HANDLE BaseApiPort = NULL; -/********************************************************************** - * NAME PRIVATE - * BaseStaticServerThread/1 - */ -VOID WINAPI BaseStaticServerThread (PVOID x) +extern LIST_ENTRY DosDeviceHistory; +extern RTL_CRITICAL_SECTION BaseDefineDosDeviceCritSec; + +// Windows NT 4 tables, adapted from http://j00ru.vexillium.org/csrss_list/api_list.html#Windows_NT +// It is for testing purposes. After that I will update it to 2k3 version and add stubs. +// Some names are also deduced from the subsystems/win32/csrss/csrsrv/server.c ones. +PCSR_API_ROUTINE BaseServerApiDispatchTable[BasepMaxApiNumber] = { - NTSTATUS Status = STATUS_SUCCESS; - PPORT_MESSAGE Request = (PPORT_MESSAGE) x; - PPORT_MESSAGE Reply = NULL; - ULONG MessageType = 0; + BaseSrvCreateProcess, + BaseSrvCreateThread, + BaseSrvGetTempFile, + BaseSrvExitProcess, + // BaseSrvDebugProcess, + BaseSrvCheckVDM, + BaseSrvUpdateVDMEntry, + // BaseSrvGetNextVDMCommand, + // BaseSrvExitVDM, + // BaseSrvIsFirstVDM, + BaseSrvGetVDMExitCode, + // BaseSrvSetReenterCount, + BaseSrvSetProcessShutdownParam, + BaseSrvGetProcessShutdownParam, + // BaseSrvNlsSetUserInfo, + // BaseSrvNlsSetMultipleUserInfo, + // BaseSrvNlsCreateSortSection, + // BaseSrvNlsPreserveSection, + // BaseSrvSetVDMCurDirs, + // BaseSrvGetVDMCurDirs, + // BaseSrvBatNotification, + // BaseSrvRegisterWowExec, + BaseSrvSoundSentryNotification, + // BaseSrvRefreshIniFileMapping, + BaseSrvDefineDosDevice +}; - DPRINT("BASESRV: %s called\n", __FUNCTION__); +BOOLEAN BaseServerApiServerValidTable[BasepMaxApiNumber] = +{ + TRUE, // SrvCreateProcess, + TRUE, // SrvCreateThread, + TRUE, // SrvGetTempFile, + FALSE, // SrvExitProcess, + // FALSE, // SrvDebugProcess, + TRUE, // SrvCheckVDM, + TRUE, // SrvUpdateVDMEntry + // TRUE, // SrvGetNextVDMCommand + // TRUE, // SrvExitVDM + // TRUE, // SrvIsFirstVDM + TRUE, // SrvGetVDMExitCode + // TRUE, // SrvSetReenterCount + TRUE, // SrvSetProcessShutdownParam + TRUE, // SrvGetProcessShutdownParam + // TRUE, // SrvNlsSetUserInfo + // TRUE, // SrvNlsSetMultipleUserInfo + // TRUE, // SrvNlsCreateSortSection + // TRUE, // SrvNlsPreserveSection + // TRUE, // SrvSetVDMCurDirs + // TRUE, // SrvGetVDMCurDirs + // TRUE, // SrvBatNotification + // TRUE, // SrvRegisterWowExec + TRUE, // SrvSoundSentryNotification + // TRUE, // SrvRefreshIniFileMapping + TRUE, // SrvDefineDosDevice + // FALSE +}; - MessageType = Request->u2.s2.Type; - DPRINT("BASESRV: %s received a message (Type=%d)\n", - __FUNCTION__, MessageType); - switch (MessageType) - { - default: - Reply = Request; - Status = NtReplyPort (BaseApiPort, Reply); - break; - } +PCHAR BaseServerApiNameTable[BasepMaxApiNumber] = +{ + "BaseCreateProcess", + "BaseCreateThread", + "BaseGetTempFile", + "BaseExitProcess", + // "BaseDebugProcess", + "BaseCheckVDM", + "BaseUpdateVDMEntry", + // "BaseGetNextVDMCommand", + // "BaseExitVDM", + // "BaseIsFirstVDM", + "BaseGetVDMExitCode", + // "BaseSetReenterCount", + "BaseSetProcessShutdownParam", + "BaseGetProcessShutdownParam", + // "BaseNlsSetUserInfo", + // "BaseNlsSetMultipleUserInfo", + // "BaseNlsCreateSortSection", + // "BaseNlsPreserveSection", + // "BaseSetVDMCurDirs", + // "BaseGetVDMCurDirs", + // "BaseBatNotification", + // "BaseRegisterWowExec", + "BaseSoundSentryNotification", + // "BaseSrvRefreshIniFileMapping" + "BaseDefineDosDevice", + // NULL +}; + + +/* FUNCTIONS ******************************************************************/ + +VOID +NTAPI +BasepFakeStaticServerData(VOID) +{ + NTSTATUS Status; + WCHAR Buffer[MAX_PATH]; + PWCHAR HeapBuffer; + UNICODE_STRING SystemRootString; + UNICODE_STRING UnexpandedSystemRootString = RTL_CONSTANT_STRING(L"%SystemRoot%"); + UNICODE_STRING BaseSrvCSDString; + UNICODE_STRING BaseSrvWindowsDirectory; + UNICODE_STRING BaseSrvWindowsSystemDirectory; + UNICODE_STRING BnoString; + OBJECT_ATTRIBUTES ObjectAttributes; + ULONG SessionId; + HANDLE BaseSrvNamedObjectDirectory; + HANDLE BaseSrvRestrictedObjectDirectory; + PACL BnoDacl, BnoRestrictedDacl; + PSECURITY_DESCRIPTOR BnoSd; + HANDLE SymHandle; + UNICODE_STRING DirectoryName, SymlinkName; + ULONG LuidEnabled; + RTL_QUERY_REGISTRY_TABLE BaseServerRegistryConfigurationTable[2] = + { + { + NULL, + RTL_QUERY_REGISTRY_DIRECT, + L"CSDVersion", + &BaseSrvCSDString, + REG_NONE, NULL, 0 + }, + + {0} + }; + + /* Get the session ID */ + SessionId = NtCurrentPeb()->SessionId; + + /* Get the Windows directory */ + RtlInitEmptyUnicodeString(&SystemRootString, Buffer, sizeof(Buffer)); + Status = RtlExpandEnvironmentStrings_U(NULL, + &UnexpandedSystemRootString, + &SystemRootString, + NULL); + ASSERT(NT_SUCCESS(Status)); + + /* Create the base directory */ + Buffer[SystemRootString.Length / sizeof(WCHAR)] = UNICODE_NULL; + Status = RtlCreateUnicodeString(&BaseSrvWindowsDirectory, + SystemRootString.Buffer); + ASSERT(NT_SUCCESS(Status)); + + /* Create the system directory */ + wcscat(SystemRootString.Buffer, L"\\System32"); + Status = RtlCreateUnicodeString(&BaseSrvWindowsSystemDirectory, + SystemRootString.Buffer); + ASSERT(NT_SUCCESS(Status)); + + /* FIXME: Check Session ID */ + wcscpy(Buffer, L"\\BaseNamedObjects"); + RtlInitUnicodeString(&BnoString, Buffer); + + /* Allocate the server data */ + BaseStaticServerData = RtlAllocateHeap(CsrSrvSharedSectionHeap, + HEAP_ZERO_MEMORY, + sizeof(BASE_STATIC_SERVER_DATA)); + ASSERT(BaseStaticServerData != NULL); + + /* Process timezone information */ + BaseStaticServerData->TermsrvClientTimeZoneId = TIME_ZONE_ID_INVALID; + BaseStaticServerData->TermsrvClientTimeZoneChangeNum = 0; + Status = NtQuerySystemInformation(SystemTimeOfDayInformation, + &BaseStaticServerData->TimeOfDay, + sizeof(BaseStaticServerData->TimeOfDay), + NULL); + ASSERT(NT_SUCCESS(Status)); + + /* Make a shared heap copy of the Windows directory */ + BaseStaticServerData->WindowsDirectory = BaseSrvWindowsDirectory; + HeapBuffer = RtlAllocateHeap(CsrSrvSharedSectionHeap, + 0, + BaseSrvWindowsDirectory.MaximumLength); + ASSERT(HeapBuffer); + RtlCopyMemory(HeapBuffer, + BaseStaticServerData->WindowsDirectory.Buffer, + BaseSrvWindowsDirectory.MaximumLength); + BaseStaticServerData->WindowsDirectory.Buffer = HeapBuffer; + + /* Make a shared heap copy of the System directory */ + BaseStaticServerData->WindowsSystemDirectory = BaseSrvWindowsSystemDirectory; + HeapBuffer = RtlAllocateHeap(CsrSrvSharedSectionHeap, + 0, + BaseSrvWindowsSystemDirectory.MaximumLength); + ASSERT(HeapBuffer); + RtlCopyMemory(HeapBuffer, + BaseStaticServerData->WindowsSystemDirectory.Buffer, + BaseSrvWindowsSystemDirectory.MaximumLength); + BaseStaticServerData->WindowsSystemDirectory.Buffer = HeapBuffer; + + /* This string is not used */ + RtlInitEmptyUnicodeString(&BaseStaticServerData->WindowsSys32x86Directory, + NULL, + 0); + + /* Make a shared heap copy of the BNO directory */ + BaseStaticServerData->NamedObjectDirectory = BnoString; + BaseStaticServerData->NamedObjectDirectory.MaximumLength = BnoString.Length + + sizeof(UNICODE_NULL); + HeapBuffer = RtlAllocateHeap(CsrSrvSharedSectionHeap, + 0, + BaseStaticServerData->NamedObjectDirectory.MaximumLength); + ASSERT(HeapBuffer); + RtlCopyMemory(HeapBuffer, + BaseStaticServerData->NamedObjectDirectory.Buffer, + BaseStaticServerData->NamedObjectDirectory.MaximumLength); + BaseStaticServerData->NamedObjectDirectory.Buffer = HeapBuffer; + + /* + * Confirmed that in Windows, CSDNumber and RCNumber are actually Length + * and MaximumLength of the CSD String, since the same UNICODE_STRING is + * being queried twice, the first time as a ULONG! + * + * Somehow, in Windows this doesn't cause a buffer overflow, but it might + * in ReactOS, so this code is disabled until someone figures out WTF. + */ + BaseStaticServerData->CSDNumber = 0; + BaseStaticServerData->RCNumber = 0; + + /* Initialize the CSD string and query its value from the registry */ + RtlInitEmptyUnicodeString(&BaseSrvCSDString, Buffer, sizeof(Buffer)); + Status = RtlQueryRegistryValues(RTL_REGISTRY_WINDOWS_NT, + L"", + BaseServerRegistryConfigurationTable, + NULL, + NULL); + if (NT_SUCCESS(Status)) + { + /* Copy into the shared buffer */ + wcsncpy(BaseStaticServerData->CSDVersion, + BaseSrvCSDString.Buffer, + BaseSrvCSDString.Length / sizeof(WCHAR)); + } + else + { + /* NULL-terminate to indicate nothing is there */ + BaseStaticServerData->CSDVersion[0] = UNICODE_NULL; + } + + /* Cache the system information */ + Status = NtQuerySystemInformation(SystemBasicInformation, + &BaseStaticServerData->SysInfo, + sizeof(BaseStaticServerData->SysInfo), + NULL); + ASSERT(NT_SUCCESS(Status)); + + /* FIXME: Should query the registry for these */ + BaseStaticServerData->DefaultSeparateVDM = FALSE; + BaseStaticServerData->IsWowTaskReady = FALSE; + + /* Allocate a security descriptor and create it */ + BnoSd = RtlAllocateHeap(CsrHeap, 0, 1024); + ASSERT(BnoSd); + Status = RtlCreateSecurityDescriptor(BnoSd, SECURITY_DESCRIPTOR_REVISION); + ASSERT(NT_SUCCESS(Status)); + + /* Create the BNO and \Restricted DACLs */ + Status = CreateBaseAcls(&BnoDacl, &BnoRestrictedDacl); + ASSERT(NT_SUCCESS(Status)); + + /* Set the BNO DACL as active for now */ + Status = RtlSetDaclSecurityDescriptor(BnoSd, TRUE, BnoDacl, FALSE); + ASSERT(NT_SUCCESS(Status)); + + /* Create the BNO directory */ + RtlInitUnicodeString(&BnoString, L"\\BaseNamedObjects"); + InitializeObjectAttributes(&ObjectAttributes, + &BnoString, + OBJ_OPENIF | OBJ_PERMANENT | OBJ_CASE_INSENSITIVE, + NULL, + BnoSd); + Status = NtCreateDirectoryObject(&BaseSrvNamedObjectDirectory, + DIRECTORY_ALL_ACCESS, + &ObjectAttributes); + ASSERT(NT_SUCCESS(Status)); + + /* Check if we are session 0 */ + if (SessionId == 0) + { + /* Mark this as a session 0 directory */ + Status = NtSetInformationObject(BaseSrvNamedObjectDirectory, + ObjectSessionInformation, + NULL, + 0); + ASSERT(NT_SUCCESS(Status)); + } + + /* Check if LUID device maps are enabled */ + Status = NtQueryInformationProcess(NtCurrentProcess(), + ProcessLUIDDeviceMapsEnabled, + &LuidEnabled, + sizeof(LuidEnabled), + NULL); + ASSERT(NT_SUCCESS(Status)); + BaseStaticServerData->LUIDDeviceMapsEnabled = LuidEnabled; + if (!BaseStaticServerData->LUIDDeviceMapsEnabled) + { + /* Make Global point back to BNO */ + RtlInitUnicodeString(&DirectoryName, L"Global"); + RtlInitUnicodeString(&SymlinkName, L"\\BaseNamedObjects"); + InitializeObjectAttributes(&ObjectAttributes, + &DirectoryName, + OBJ_OPENIF | OBJ_PERMANENT | OBJ_CASE_INSENSITIVE, + BaseSrvNamedObjectDirectory, + BnoSd); + Status = NtCreateSymbolicLinkObject(&SymHandle, + SYMBOLIC_LINK_ALL_ACCESS, + &ObjectAttributes, + &SymlinkName); + if ((NT_SUCCESS(Status)) && SessionId == 0) NtClose(SymHandle); + + /* Make local point back to \Sessions\x\BNO */ + RtlInitUnicodeString(&DirectoryName, L"Local"); + ASSERT(SessionId == 0); + InitializeObjectAttributes(&ObjectAttributes, + &DirectoryName, + OBJ_OPENIF | OBJ_PERMANENT | OBJ_CASE_INSENSITIVE, + BaseSrvNamedObjectDirectory, + BnoSd); + Status = NtCreateSymbolicLinkObject(&SymHandle, + SYMBOLIC_LINK_ALL_ACCESS, + &ObjectAttributes, + &SymlinkName); + if ((NT_SUCCESS(Status)) && SessionId == 0) NtClose(SymHandle); + + /* Make Session point back to BNOLINKS */ + RtlInitUnicodeString(&DirectoryName, L"Session"); + RtlInitUnicodeString(&SymlinkName, L"\\Sessions\\BNOLINKS"); + InitializeObjectAttributes(&ObjectAttributes, + &DirectoryName, + OBJ_OPENIF | OBJ_PERMANENT | OBJ_CASE_INSENSITIVE, + BaseSrvNamedObjectDirectory, + BnoSd); + Status = NtCreateSymbolicLinkObject(&SymHandle, + SYMBOLIC_LINK_ALL_ACCESS, + &ObjectAttributes, + &SymlinkName); + if ((NT_SUCCESS(Status)) && SessionId == 0) NtClose(SymHandle); + + /* Create the BNO\Restricted directory and set the restricted DACL */ + RtlInitUnicodeString(&DirectoryName, L"Restricted"); + Status = RtlSetDaclSecurityDescriptor(BnoSd, TRUE, BnoRestrictedDacl, FALSE); + ASSERT(NT_SUCCESS(Status)); + InitializeObjectAttributes(&ObjectAttributes, + &DirectoryName, + OBJ_OPENIF | OBJ_PERMANENT | OBJ_CASE_INSENSITIVE, + BaseSrvNamedObjectDirectory, + BnoSd); + Status = NtCreateDirectoryObject(&BaseSrvRestrictedObjectDirectory, + DIRECTORY_ALL_ACCESS, + &ObjectAttributes); + ASSERT(NT_SUCCESS(Status)); + } + + /* Finally, set the pointer */ + CsrSrvSharedStaticServerData[CSR_CONSOLE] = BaseStaticServerData; } -NTSTATUS WINAPI ServerDllInitialization (ULONG ArgumentCount, LPWSTR *Argument) +VOID WINAPI BaseStaticServerThread(PVOID x) { - NTSTATUS Status = STATUS_SUCCESS; + NTSTATUS Status = STATUS_SUCCESS; + PPORT_MESSAGE Request = (PPORT_MESSAGE)x; + PPORT_MESSAGE Reply = NULL; + ULONG MessageType = 0; - DPRINT("BASSRV: %s(%ld,...) called\n", __FUNCTION__, ArgumentCount); + DPRINT("BASESRV: %s called\n", __FUNCTION__); - BaseApiPort = CsrQueryApiPort (); - Status = CsrAddStaticServerThread (BaseStaticServerThread); - if (NT_SUCCESS(Status)) - { - //TODO initialize the BASE server - } - return STATUS_SUCCESS; + MessageType = Request->u2.s2.Type; + DPRINT("BASESRV: %s received a message (Type=%d)\n", + __FUNCTION__, MessageType); + switch (MessageType) + { + default: + Reply = Request; + Status = NtReplyPort(BaseApiPort, Reply); + break; + } +} + + +CSR_SERVER_DLL_INIT(ServerDllInitialization) +{ + // NTSTATUS Status = STATUS_SUCCESS; + +/* + DPRINT("BASSRV: %s(%ld,...) called\n", __FUNCTION__, ArgumentCount); + + BaseApiPort = CsrQueryApiPort (); + Status = CsrAddStaticServerThread(BaseStaticServerThread); + if (NT_SUCCESS(Status)) + { + //TODO initialize the BASE server + } + return STATUS_SUCCESS; +*/ + + /* Setup the DLL Object */ + LoadedServerDll->ApiBase = BASESRV_FIRST_API_NUMBER; // ApiNumberBase + LoadedServerDll->HighestApiSupported = BasepMaxApiNumber; // MaxApiNumber + LoadedServerDll->DispatchTable = BaseServerApiDispatchTable; + LoadedServerDll->ValidTable = BaseServerApiServerValidTable; + LoadedServerDll->NameTable = BaseServerApiNameTable; + LoadedServerDll->SizeOfProcessData = 0; + LoadedServerDll->ConnectCallback = NULL; + LoadedServerDll->DisconnectCallback = NULL; + + BasepFakeStaticServerData(); + + RtlInitializeCriticalSection(&BaseDefineDosDeviceCritSec); + InitializeListHead(&DosDeviceHistory); + + /* All done */ + return STATUS_SUCCESS; +} + +BOOL +NTAPI +DllMain(IN HANDLE hDll, + IN DWORD dwReason, + IN LPVOID lpReserved) +{ + UNREFERENCED_PARAMETER(dwReason); + UNREFERENCED_PARAMETER(lpReserved); + + if (DLL_PROCESS_ATTACH == dwReason) + { + DllHandle = hDll; + } + else if (DLL_PROCESS_DETACH == dwReason) + { + BaseCleanupDefineDosDevice(); + } + + return TRUE; } /* EOF */ diff --git a/subsystems/win/basesrv/main.c b/subsystems/win/basesrv/main.c deleted file mode 100644 index 3a72567c7fa..00000000000 --- a/subsystems/win/basesrv/main.c +++ /dev/null @@ -1,44 +0,0 @@ -/* $Id$ - * - * dllmain.c - ReactOS/Win32 base enviroment subsystem server - * - * ReactOS Operating System - * - * -------------------------------------------------------------------- - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * -------------------------------------------------------------------- - */ -#include "basesrv.h" - -#define NDEBUG -#include - -HANDLE DllHandle = 0; - -/* FUNCTIONS *****************************************************************/ - -BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) -{ - if (DLL_PROCESS_ATTACH == dwReason) - { - DllHandle = hDll; - } - - return TRUE; -} - -/* EOF */ diff --git a/subsystems/win/basesrv/server.c b/subsystems/win/basesrv/server.c index f5d0e924e58..1a676d64945 100644 --- a/subsystems/win/basesrv/server.c +++ b/subsystems/win/basesrv/server.c @@ -1,42 +1,814 @@ -/* $Id$ - * - * server.c - ReactOS/Win32 base enviroment subsystem server - * - * ReactOS Operating System - * - * -------------------------------------------------------------------- - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * -------------------------------------------------------------------- +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS/Win32 base enviroment subsystem server + * FILE: subsystems/win/basesrv/server.c + * PURPOSE: Initialization + * PROGRAMMERS: Hermes Belusca-Maito (hermes.belusca@sfr.fr) */ + #include "basesrv.h" #define NDEBUG #include -/*===================================================================== - * PUBLIC API - *===================================================================*/ -NTSTATUS WINAPI BaseSetProcessCreateNotify (BASE_PROCESS_CREATE_NOTIFY_ROUTINE ProcessCreateNotifyProc) +extern NTSTATUS CallProcessCreated(PCSR_PROCESS, PCSR_PROCESS); // TODO: Import it from csrsrv/init.c + +CSR_API(BaseSrvCreateProcess) { - NTSTATUS Status = STATUS_NOT_IMPLEMENTED; + NTSTATUS Status; + HANDLE ProcessHandle, ThreadHandle; + PCSR_THREAD CsrThread; + PCSR_PROCESS Process, NewProcess; + ULONG Flags, VdmPower = 0, DebugFlags = 0; - DPRINT("BASESRV: %s(%08lx) called\n", __FUNCTION__, ProcessCreateNotifyProc); - return Status; + /* Get the current client thread */ + CsrThread = CsrGetClientThread(); + ASSERT(CsrThread != NULL); + + Process = CsrThread->Process; + + /* Extract the flags out of the process handle */ + Flags = (ULONG_PTR)ApiMessage->Data.CreateProcessRequest.ProcessHandle & 3; + ApiMessage->Data.CreateProcessRequest.ProcessHandle = (HANDLE)((ULONG_PTR)ApiMessage->Data.CreateProcessRequest.ProcessHandle & ~3); + + /* Duplicate the process handle */ + Status = NtDuplicateObject(Process->ProcessHandle, + ApiMessage->Data.CreateProcessRequest.ProcessHandle, + NtCurrentProcess(), + &ProcessHandle, + 0, + 0, + DUPLICATE_SAME_ACCESS); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to duplicate process handle\n"); + return Status; + } + + /* Duplicate the thread handle */ + Status = NtDuplicateObject(Process->ProcessHandle, + ApiMessage->Data.CreateProcessRequest.ThreadHandle, + NtCurrentProcess(), + &ThreadHandle, + 0, + 0, + DUPLICATE_SAME_ACCESS); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to duplicate process handle\n"); + NtClose(ProcessHandle); + return Status; + } + + /* See if this is a VDM process */ + if (VdmPower) + { + /* Request VDM powers */ + Status = NtSetInformationProcess(ProcessHandle, + ProcessWx86Information, + &VdmPower, + sizeof(VdmPower)); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to get VDM powers\n"); + NtClose(ProcessHandle); + NtClose(ThreadHandle); + return Status; + } + } + + /* Convert some flags. FIXME: More need conversion */ + if (ApiMessage->Data.CreateProcessRequest.CreationFlags & CREATE_NEW_PROCESS_GROUP) + { + DebugFlags |= CsrProcessCreateNewGroup; + } + + /* FIXME: SxS Stuff */ + + /* Call CSRSRV to create the CSR_PROCESS structure and the first CSR_THREAD */ + Status = CsrCreateProcess(ProcessHandle, + ThreadHandle, + &ApiMessage->Data.CreateProcessRequest.ClientId, + Process->NtSession, + DebugFlags, + NULL); + if (Status == STATUS_THREAD_IS_TERMINATING) + { + DPRINT1("Thread already dead\n"); + return Status; + } + + /* Check for other failures */ + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to create process/thread structures: %lx\n", Status); + return Status; + } + + /* FIXME: Should notify user32 */ + + /* FIXME: VDM vodoo */ + + /* ReactOS Compatibility */ + Status = CsrLockProcessByClientId(ApiMessage->Data.CreateProcessRequest.ClientId.UniqueProcess, &NewProcess); + ASSERT(Status == STATUS_SUCCESS); + if (!(ApiMessage->Data.CreateProcessRequest.CreationFlags & (CREATE_NEW_CONSOLE | DETACHED_PROCESS))) + { + NewProcess->ParentConsole = Process->Console; + NewProcess->bInheritHandles = ApiMessage->Data.CreateProcessRequest.bInheritHandles; + } + RtlInitializeCriticalSection(&NewProcess->HandleTableLock); + CallProcessCreated(Process, NewProcess); + CsrUnlockProcess(NewProcess); + + /* Return the result of this operation */ + return Status; +} + +CSR_API(BaseSrvCreateThread) +{ + PCSR_THREAD CurrentThread; + HANDLE ThreadHandle; + NTSTATUS Status; + PCSR_PROCESS CsrProcess; + + /* Get the current CSR thread */ + CurrentThread = CsrGetClientThread(); + if (!CurrentThread) + { + DPRINT1("Server Thread TID: [%lx.%lx]\n", + ApiMessage->Data.CreateThreadRequest.ClientId.UniqueProcess, + ApiMessage->Data.CreateThreadRequest.ClientId.UniqueThread); + return STATUS_SUCCESS; // server-to-server + } + + /* Get the CSR Process for this request */ + CsrProcess = CurrentThread->Process; + if (CsrProcess->ClientId.UniqueProcess != + ApiMessage->Data.CreateThreadRequest.ClientId.UniqueProcess) + { + /* This is a remote thread request -- is it within the server itself? */ + if (ApiMessage->Data.CreateThreadRequest.ClientId.UniqueProcess == NtCurrentTeb()->ClientId.UniqueProcess) + { + /* Accept this without any further work */ + return STATUS_SUCCESS; + } + + /* Get the real CSR Process for the remote thread's process */ + Status = CsrLockProcessByClientId(ApiMessage->Data.CreateThreadRequest.ClientId.UniqueProcess, + &CsrProcess); + if (!NT_SUCCESS(Status)) return Status; + } + + /* Duplicate the thread handle so we can own it */ + Status = NtDuplicateObject(CurrentThread->Process->ProcessHandle, + ApiMessage->Data.CreateThreadRequest.ThreadHandle, + NtCurrentProcess(), + &ThreadHandle, + 0, + 0, + DUPLICATE_SAME_ACCESS); + if (NT_SUCCESS(Status)) + { + /* Call CSRSRV to tell it about the new thread */ + Status = CsrCreateThread(CsrProcess, + ThreadHandle, + &ApiMessage->Data.CreateThreadRequest.ClientId); + } + + /* Unlock the process and return */ + if (CsrProcess != CurrentThread->Process) CsrUnlockProcess(CsrProcess); + return Status; +} + +CSR_API(BaseSrvGetTempFile) +{ + static UINT CsrGetTempFileUnique = 0; + + /* Return 16-bits ID */ + ApiMessage->Data.GetTempFile.UniqueID = (++CsrGetTempFileUnique & 0xFFFF); + + DPRINT("Returning: %u\n", ApiMessage->Data.GetTempFile.UniqueID); + + return STATUS_SUCCESS; +} + +CSR_API(BaseSrvExitProcess) +{ + PCSR_THREAD CsrThread = CsrGetClientThread(); + ASSERT(CsrThread != NULL); + + /* Set magic flag so we don't reply this message back */ + ApiMessage->ApiNumber = 0xBABE; + + /* Remove the CSR_THREADs and CSR_PROCESS */ + return CsrDestroyProcess(&CsrThread->ClientId, + (NTSTATUS)ApiMessage->Data.TerminateProcessRequest.uExitCode); +} + +CSR_API(BaseSrvGetProcessShutdownParam) +{ + PCSR_THREAD CsrThread = CsrGetClientThread(); + ASSERT(CsrThread); + + ApiMessage->Data.GetShutdownParametersRequest.Level = CsrThread->Process->ShutdownLevel; + ApiMessage->Data.GetShutdownParametersRequest.Flags = CsrThread->Process->ShutdownFlags; + + return STATUS_SUCCESS; +} + +CSR_API(BaseSrvSetProcessShutdownParam) +{ + PCSR_THREAD CsrThread = CsrGetClientThread(); + ASSERT(CsrThread); + + CsrThread->Process->ShutdownLevel = ApiMessage->Data.SetShutdownParametersRequest.Level; + CsrThread->Process->ShutdownFlags = ApiMessage->Data.SetShutdownParametersRequest.Flags; + + return STATUS_SUCCESS; +} + + +/*** + *** Sound sentry + ***/ + +typedef BOOL (WINAPI *PUSER_SOUND_SENTRY)(VOID); +BOOL NTAPI FirstSoundSentry(VOID); + +PUSER_SOUND_SENTRY _UserSoundSentry = FirstSoundSentry; + +BOOL +NTAPI +FailSoundSentry(VOID) +{ + /* In case the function can't be found/is unimplemented */ + return FALSE; +} + +BOOL +NTAPI +FirstSoundSentry(VOID) +{ + UNICODE_STRING DllString = RTL_CONSTANT_STRING(L"winsrv"); + STRING FuncString = RTL_CONSTANT_STRING("_UserSoundSentry"); + HANDLE DllHandle; + NTSTATUS Status; + PUSER_SOUND_SENTRY NewSoundSentry = FailSoundSentry; + + /* Load winsrv manually */ + Status = LdrGetDllHandle(NULL, NULL, &DllString, &DllHandle); + if (NT_SUCCESS(Status)) + { + /* If it was found, get SoundSentry export */ + Status = LdrGetProcedureAddress(DllHandle, + &FuncString, + 0, + (PVOID*)&NewSoundSentry); + } + + /* Set it as the callback for the future, and call it */ + _UserSoundSentry = NewSoundSentry; + return _UserSoundSentry(); +} + +CSR_API(BaseSrvSoundSentryNotification) +{ + /* Call the API and see if it succeeds */ + return _UserSoundSentry() ? STATUS_SUCCESS : STATUS_ACCESS_DENIED; +} + + +/*** + *** Dos Devices (C) Pierre Schweitzer (pierre.schweitzer@reactos.org) + ***/ + +typedef struct tagCSRSS_DOS_DEVICE_HISTORY_ENTRY +{ + UNICODE_STRING Device; + UNICODE_STRING Target; + LIST_ENTRY Entry; +} CSRSS_DOS_DEVICE_HISTORY_ENTRY, *PCSRSS_DOS_DEVICE_HISTORY_ENTRY; + +LIST_ENTRY DosDeviceHistory; +RTL_CRITICAL_SECTION BaseDefineDosDeviceCritSec; + +CSR_API(BaseSrvDefineDosDevice) +{ + OBJECT_ATTRIBUTES ObjectAttributes; + HANDLE LinkHandle = NULL; + NTSTATUS Status; + UNICODE_STRING DeviceName = {0}; + UNICODE_STRING RequestDeviceName = {0}; + UNICODE_STRING LinkTarget = {0}; + PUNICODE_STRING RequestLinkTarget; + ULONG Length; + SID_IDENTIFIER_AUTHORITY WorldAuthority = {SECURITY_WORLD_SID_AUTHORITY}; + SID_IDENTIFIER_AUTHORITY SystemAuthority = {SECURITY_NT_AUTHORITY}; + PSECURITY_DESCRIPTOR SecurityDescriptor; + PACL Dacl; + PSID AdminSid; + PSID SystemSid; + PSID WorldSid; + ULONG SidLength; + PCSRSS_DOS_DEVICE_HISTORY_ENTRY HistoryEntry; + PLIST_ENTRY Entry; + PLIST_ENTRY ListHead; + BOOLEAN Matched, AddHistory; + DWORD dwFlags; + PWSTR lpBuffer; + + DPRINT("CsrDefineDosDevice entered, Flags:%d, DeviceName:%wZ, TargetName:%wZ\n", + ApiMessage->Data.DefineDosDeviceRequest.dwFlags, + &ApiMessage->Data.DefineDosDeviceRequest.DeviceName, + &ApiMessage->Data.DefineDosDeviceRequest.TargetName); + + Matched = AddHistory = FALSE; + HistoryEntry = NULL; + AdminSid = SystemSid = WorldSid = NULL; + SecurityDescriptor = NULL; + ListHead = &DosDeviceHistory; + dwFlags = ApiMessage->Data.DefineDosDeviceRequest.dwFlags; + + /* Validate the flags */ + if ( (dwFlags & 0xFFFFFFF0) || + ((dwFlags & DDD_EXACT_MATCH_ON_REMOVE) && + ! (dwFlags & DDD_REMOVE_DEFINITION)) ) + { + return STATUS_INVALID_PARAMETER; + } + + Status = RtlEnterCriticalSection(&BaseDefineDosDeviceCritSec); + if (! NT_SUCCESS(Status)) + { + DPRINT1("RtlEnterCriticalSection() failed (Status %lx)\n", + Status); + return Status; + } + + _SEH2_TRY + { + Status = + RtlUpcaseUnicodeString(&RequestDeviceName, + &ApiMessage->Data.DefineDosDeviceRequest.DeviceName, + TRUE); + if (! NT_SUCCESS(Status)) + _SEH2_LEAVE; + + RequestLinkTarget = + &ApiMessage->Data.DefineDosDeviceRequest.TargetName; + lpBuffer = (PWSTR) RtlAllocateHeap(Win32CsrApiHeap, + HEAP_ZERO_MEMORY, + RequestDeviceName.MaximumLength + 5 * sizeof(WCHAR)); + if (! lpBuffer) + { + DPRINT1("Failed to allocate memory\n"); + Status = STATUS_NO_MEMORY; + _SEH2_LEAVE; + } + + swprintf(lpBuffer, + L"\\??\\%wZ", + &RequestDeviceName); + RtlInitUnicodeString(&DeviceName, + lpBuffer); + InitializeObjectAttributes(&ObjectAttributes, + &DeviceName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + Status = NtOpenSymbolicLinkObject(&LinkHandle, + DELETE | 0x1, + &ObjectAttributes); + if (NT_SUCCESS(Status)) + { + Status = NtQuerySymbolicLinkObject(LinkHandle, + &LinkTarget, + &Length); + if (! NT_SUCCESS(Status) && + Status == STATUS_BUFFER_TOO_SMALL) + { + LinkTarget.Length = 0; + LinkTarget.MaximumLength = Length; + LinkTarget.Buffer = (PWSTR) + RtlAllocateHeap(Win32CsrApiHeap, + HEAP_ZERO_MEMORY, + Length); + if (! LinkTarget.Buffer) + { + DPRINT1("Failed to allocate memory\n"); + Status = STATUS_NO_MEMORY; + _SEH2_LEAVE; + } + + Status = NtQuerySymbolicLinkObject(LinkHandle, + &LinkTarget, + &Length); + } + + if (! NT_SUCCESS(Status)) + { + DPRINT1("NtQuerySymbolicLinkObject(%wZ) failed (Status %lx)\n", + &DeviceName, Status); + _SEH2_LEAVE; + } + + if ((dwFlags & DDD_REMOVE_DEFINITION)) + { + /* If no target name specified we remove the current symlink target */ + if (RequestLinkTarget->Length == 0) + Matched = TRUE; + else + { + if (dwFlags & DDD_EXACT_MATCH_ON_REMOVE) + Matched = ! RtlCompareUnicodeString(RequestLinkTarget, + &LinkTarget, + TRUE); + else + Matched = RtlPrefixUnicodeString(RequestLinkTarget, + &LinkTarget, + TRUE); + } + + if (Matched && IsListEmpty(ListHead)) + { + /* Current symlink target macthed and there is nothing to revert to */ + RequestLinkTarget = NULL; + } + else if (Matched && ! IsListEmpty(ListHead)) + { + /* Fetch the first history entry we come across for the device name */ + /* This will become the current symlink target for the device name */ + Matched = FALSE; + Entry = ListHead->Flink; + while (Entry != ListHead) + { + HistoryEntry = (PCSRSS_DOS_DEVICE_HISTORY_ENTRY) + CONTAINING_RECORD(Entry, + CSRSS_DOS_DEVICE_HISTORY_ENTRY, + Entry); + Matched = + ! RtlCompareUnicodeString(&RequestDeviceName, + &HistoryEntry->Device, + FALSE); + if (Matched) + { + RemoveEntryList(&HistoryEntry->Entry); + RequestLinkTarget = &HistoryEntry->Target; + break; + } + Entry = Entry->Flink; + HistoryEntry = NULL; + } + + /* Nothing to revert to so delete the symlink */ + if (! Matched) + RequestLinkTarget = NULL; + } + else if (! Matched) + { + /* Locate a previous symlink target as we did not get a hit earlier */ + /* If we find one we need to remove it */ + Entry = ListHead->Flink; + while (Entry != ListHead) + { + HistoryEntry = (PCSRSS_DOS_DEVICE_HISTORY_ENTRY) + CONTAINING_RECORD(Entry, + CSRSS_DOS_DEVICE_HISTORY_ENTRY, + Entry); + Matched = + ! RtlCompareUnicodeString(&RequestDeviceName, + &HistoryEntry->Device, + FALSE); + if (! Matched) + { + HistoryEntry = NULL; + Entry = Entry->Flink; + continue; + } + + Matched = FALSE; + if (dwFlags & DDD_EXACT_MATCH_ON_REMOVE) + { + if (! RtlCompareUnicodeString(RequestLinkTarget, + &HistoryEntry->Target, + TRUE)) + { + Matched = TRUE; + } + } + else if (RtlPrefixUnicodeString(RequestLinkTarget, + &HistoryEntry->Target, + TRUE)) + { + Matched = TRUE; + } + + if (Matched) + { + RemoveEntryList(&HistoryEntry->Entry); + break; + } + Entry = Entry->Flink; + HistoryEntry = NULL; + } + + /* Leave existing symlink as is */ + if (! Matched) + Status = STATUS_OBJECT_NAME_NOT_FOUND; + else + Status = STATUS_SUCCESS; + _SEH2_LEAVE; + } + } + else + { + AddHistory = TRUE; + } + + Status = NtMakeTemporaryObject(LinkHandle); + if (! NT_SUCCESS(Status)) + { + DPRINT1("NtMakeTemporaryObject(%wZ) failed (Status %lx)\n", + &DeviceName, Status); + _SEH2_LEAVE; + } + + Status = NtClose(LinkHandle); + LinkHandle = NULL; + if (! NT_SUCCESS(Status)) + { + DPRINT1("NtClose(%wZ) failed (Status %lx)\n", + &DeviceName, Status); + _SEH2_LEAVE; + } + } + + /* Don't create symlink if we don't have a target */ + if (! RequestLinkTarget || RequestLinkTarget->Length == 0) + _SEH2_LEAVE; + + if (AddHistory) + { + HistoryEntry = (PCSRSS_DOS_DEVICE_HISTORY_ENTRY) + RtlAllocateHeap(Win32CsrApiHeap, + HEAP_ZERO_MEMORY, + sizeof(CSRSS_DOS_DEVICE_HISTORY_ENTRY)); + if (! HistoryEntry) + { + DPRINT1("Failed to allocate memory\n"); + Status = STATUS_NO_MEMORY; + _SEH2_LEAVE; + } + + HistoryEntry->Target.Buffer = + RtlAllocateHeap(Win32CsrApiHeap, + HEAP_ZERO_MEMORY, + LinkTarget.Length); + if (! HistoryEntry->Target.Buffer) + { + DPRINT1("Failed to allocate memory\n"); + Status = STATUS_NO_MEMORY; + _SEH2_LEAVE; + } + HistoryEntry->Target.Length = + HistoryEntry->Target.MaximumLength = + LinkTarget.Length; + RtlCopyUnicodeString(&HistoryEntry->Target, + &LinkTarget); + + HistoryEntry->Device.Buffer = + RtlAllocateHeap(Win32CsrApiHeap, + HEAP_ZERO_MEMORY, + RequestDeviceName.Length); + if (! HistoryEntry->Device.Buffer) + { + DPRINT1("Failed to allocate memory\n"); + Status = STATUS_NO_MEMORY; + _SEH2_LEAVE; + } + HistoryEntry->Device.Length = + HistoryEntry->Device.MaximumLength = + RequestDeviceName.Length; + RtlCopyUnicodeString(&HistoryEntry->Device, + &RequestDeviceName); + + /* Remember previous symlink target for this device */ + InsertHeadList(ListHead, + &HistoryEntry->Entry); + HistoryEntry = NULL; + } + + RtlAllocateAndInitializeSid(&WorldAuthority, + 1, + SECURITY_WORLD_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + &WorldSid); + + RtlAllocateAndInitializeSid(&SystemAuthority, + 1, + SECURITY_LOCAL_SYSTEM_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + &SystemSid); + + RtlAllocateAndInitializeSid(&SystemAuthority, + 2, + SECURITY_BUILTIN_DOMAIN_RID, + DOMAIN_ALIAS_RID_ADMINS, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + SECURITY_NULL_RID, + &AdminSid); + + SidLength = RtlLengthSid(SystemSid) + + RtlLengthSid(AdminSid) + + RtlLengthSid(WorldSid); + Length = sizeof(ACL) + SidLength + 3 * sizeof(ACCESS_ALLOWED_ACE); + + SecurityDescriptor = RtlAllocateHeap(Win32CsrApiHeap, + 0, + SECURITY_DESCRIPTOR_MIN_LENGTH + Length); + if (! SecurityDescriptor) + { + DPRINT1("Failed to allocate memory\n"); + Status = STATUS_NO_MEMORY; + _SEH2_LEAVE; + } + + Dacl = (PACL)((ULONG_PTR)SecurityDescriptor + SECURITY_DESCRIPTOR_MIN_LENGTH); + Status = RtlCreateSecurityDescriptor(SecurityDescriptor, + SECURITY_DESCRIPTOR_REVISION); + if (! NT_SUCCESS(Status)) + { + DPRINT1("RtlCreateSecurityDescriptor() failed (Status %lx)\n", + Status); + _SEH2_LEAVE; + } + + Status = RtlCreateAcl(Dacl, + Length, + ACL_REVISION); + if (! NT_SUCCESS(Status)) + { + DPRINT1("RtlCreateAcl() failed (Status %lx)\n", + Status); + _SEH2_LEAVE; + } + + (void) RtlAddAccessAllowedAce(Dacl, + ACL_REVISION, + GENERIC_ALL, + SystemSid); + (void) RtlAddAccessAllowedAce(Dacl, + ACL_REVISION, + GENERIC_ALL, + AdminSid); + (void) RtlAddAccessAllowedAce(Dacl, + ACL_REVISION, + STANDARD_RIGHTS_READ, + WorldSid); + + Status = RtlSetDaclSecurityDescriptor(SecurityDescriptor, + TRUE, + Dacl, + FALSE); + if (! NT_SUCCESS(Status)) + { + DPRINT1("RtlSetDaclSecurityDescriptor() failed (Status %lx)\n", + Status); + _SEH2_LEAVE; + } + + InitializeObjectAttributes(&ObjectAttributes, + &DeviceName, + OBJ_CASE_INSENSITIVE, + NULL, + SecurityDescriptor); + Status = NtCreateSymbolicLinkObject(&LinkHandle, + SYMBOLIC_LINK_ALL_ACCESS, + &ObjectAttributes, + RequestLinkTarget); + if (NT_SUCCESS(Status)) + { + Status = NtMakePermanentObject(LinkHandle); + if (! NT_SUCCESS(Status)) + { + DPRINT1("NtMakePermanentObject(%wZ) failed (Status %lx)\n", + &DeviceName, Status); + } + } + else + { + DPRINT1("NtCreateSymbolicLinkObject(%wZ) failed (Status %lx)\n", + &DeviceName, Status); + } + } + _SEH2_FINALLY + { + (void) RtlLeaveCriticalSection(&BaseDefineDosDeviceCritSec); + if (DeviceName.Buffer) + (void) RtlFreeHeap(Win32CsrApiHeap, + 0, + DeviceName.Buffer); + if (LinkTarget.Buffer) + (void) RtlFreeHeap(Win32CsrApiHeap, + 0, + LinkTarget.Buffer); + if (SecurityDescriptor) + (void) RtlFreeHeap(Win32CsrApiHeap, + 0, + SecurityDescriptor); + if (LinkHandle) + (void) NtClose(LinkHandle); + if (SystemSid) + (void) RtlFreeSid(SystemSid); + if (AdminSid) + (void) RtlFreeSid(AdminSid); + if (WorldSid) + (void) RtlFreeSid(WorldSid); + RtlFreeUnicodeString(&RequestDeviceName); + if (HistoryEntry) + { + if (HistoryEntry->Target.Buffer) + (void) RtlFreeHeap(Win32CsrApiHeap, + 0, + HistoryEntry->Target.Buffer); + if (HistoryEntry->Device.Buffer) + (void) RtlFreeHeap(Win32CsrApiHeap, + 0, + HistoryEntry->Device.Buffer); + (void) RtlFreeHeap(Win32CsrApiHeap, + 0, + HistoryEntry); + } + } + _SEH2_END + + DPRINT("CsrDefineDosDevice Exit, Statux: 0x%x\n", Status); + return Status; +} + +VOID BaseCleanupDefineDosDevice(VOID) +{ + PLIST_ENTRY Entry, ListHead; + PCSRSS_DOS_DEVICE_HISTORY_ENTRY HistoryEntry; + + (void) RtlDeleteCriticalSection(&BaseDefineDosDeviceCritSec); + + ListHead = &DosDeviceHistory; + Entry = ListHead->Flink; + while (Entry != ListHead) + { + HistoryEntry = (PCSRSS_DOS_DEVICE_HISTORY_ENTRY) + CONTAINING_RECORD(Entry, + CSRSS_DOS_DEVICE_HISTORY_ENTRY, + Entry); + Entry = Entry->Flink; + + if (HistoryEntry) + { + if (HistoryEntry->Target.Buffer) + (void) RtlFreeHeap(Win32CsrApiHeap, + 0, + HistoryEntry->Target.Buffer); + if (HistoryEntry->Device.Buffer) + (void) RtlFreeHeap(Win32CsrApiHeap, + 0, + HistoryEntry->Device.Buffer); + (void) RtlFreeHeap(Win32CsrApiHeap, + 0, + HistoryEntry); + } + } +} + + + + + + +/* PUBLIC API *****************************************************************/ + +NTSTATUS NTAPI BaseSetProcessCreateNotify(IN BASE_PROCESS_CREATE_NOTIFY_ROUTINE ProcessCreateNotifyProc) +{ + DPRINT("BASESRV: %s(%08lx) called\n", __FUNCTION__, ProcessCreateNotifyProc); + return STATUS_NOT_IMPLEMENTED; } /* EOF */ diff --git a/subsystems/win32/csrsrv/api/process.c b/subsystems/win32/csrsrv/api/process.c index 46c4ce92dcd..97f5a8e4e72 100644 --- a/subsystems/win32/csrsrv/api/process.c +++ b/subsystems/win32/csrsrv/api/process.c @@ -1,7 +1,7 @@ /* * subsystems/win32/csrss/csrsrv/api/process.c * - * "\windows\ApiPort" port process management functions + * * * ReactOS Operating System */ @@ -13,7 +13,7 @@ #define NDEBUG #include -extern NTSTATUS CallProcessCreated(PCSR_PROCESS, PCSR_PROCESS); + /* GLOBALS *******************************************************************/ @@ -30,207 +30,4 @@ extern NTSTATUS CallProcessCreated(PCSR_PROCESS, PCSR_PROCESS); *** corresponding indexes, and the third one of names (not very efficient...). ***/ -CSR_API(BaseSrvCreateProcess) -{ - NTSTATUS Status; - HANDLE ProcessHandle, ThreadHandle; - PCSR_THREAD CsrThread; - PCSR_PROCESS Process, NewProcess; - ULONG Flags, VdmPower = 0, DebugFlags = 0; - - /* Get the current client thread */ - CsrThread = CsrGetClientThread(); - ASSERT(CsrThread != NULL); - - Process = CsrThread->Process; - - /* Extract the flags out of the process handle */ - Flags = (ULONG_PTR)ApiMessage->Data.CreateProcessRequest.ProcessHandle & 3; - ApiMessage->Data.CreateProcessRequest.ProcessHandle = (HANDLE)((ULONG_PTR)ApiMessage->Data.CreateProcessRequest.ProcessHandle & ~3); - - /* Duplicate the process handle */ - Status = NtDuplicateObject(Process->ProcessHandle, - ApiMessage->Data.CreateProcessRequest.ProcessHandle, - NtCurrentProcess(), - &ProcessHandle, - 0, - 0, - DUPLICATE_SAME_ACCESS); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Failed to duplicate process handle\n"); - return Status; - } - - /* Duplicate the thread handle */ - Status = NtDuplicateObject(Process->ProcessHandle, - ApiMessage->Data.CreateProcessRequest.ThreadHandle, - NtCurrentProcess(), - &ThreadHandle, - 0, - 0, - DUPLICATE_SAME_ACCESS); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Failed to duplicate process handle\n"); - NtClose(ProcessHandle); - return Status; - } - - /* See if this is a VDM process */ - if (VdmPower) - { - /* Request VDM powers */ - Status = NtSetInformationProcess(ProcessHandle, - ProcessWx86Information, - &VdmPower, - sizeof(VdmPower)); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Failed to get VDM powers\n"); - NtClose(ProcessHandle); - NtClose(ThreadHandle); - return Status; - } - } - - /* Convert some flags. FIXME: More need conversion */ - if (ApiMessage->Data.CreateProcessRequest.CreationFlags & CREATE_NEW_PROCESS_GROUP) - { - DebugFlags |= CsrProcessCreateNewGroup; - } - - /* FIXME: SxS Stuff */ - - /* Call CSRSRV to create the CSR_PROCESS structure and the first CSR_THREAD */ - Status = CsrCreateProcess(ProcessHandle, - ThreadHandle, - &ApiMessage->Data.CreateProcessRequest.ClientId, - Process->NtSession, - DebugFlags, - NULL); - if (Status == STATUS_THREAD_IS_TERMINATING) - { - DPRINT1("Thread already dead\n"); - return Status; - } - - /* Check for other failures */ - if (!NT_SUCCESS(Status)) - { - DPRINT1("Failed to create process/thread structures: %lx\n", Status); - return Status; - } - - /* FIXME: Should notify user32 */ - - /* FIXME: VDM vodoo */ - - /* ReactOS Compatibility */ - Status = CsrLockProcessByClientId(ApiMessage->Data.CreateProcessRequest.ClientId.UniqueProcess, &NewProcess); - ASSERT(Status == STATUS_SUCCESS); - if (!(ApiMessage->Data.CreateProcessRequest.CreationFlags & (CREATE_NEW_CONSOLE | DETACHED_PROCESS))) - { - NewProcess->ParentConsole = Process->Console; - NewProcess->bInheritHandles = ApiMessage->Data.CreateProcessRequest.bInheritHandles; - } - RtlInitializeCriticalSection(&NewProcess->HandleTableLock); - CallProcessCreated(Process, NewProcess); - CsrUnlockProcess(NewProcess); - - /* Return the result of this operation */ - return Status; -} - -CSR_API(BaseSrvCreateThread) -{ - PCSR_THREAD CurrentThread; - HANDLE ThreadHandle; - NTSTATUS Status; - PCSR_PROCESS CsrProcess; - - /* Get the current CSR thread */ - CurrentThread = CsrGetClientThread(); - if (!CurrentThread) - { - DPRINT1("Server Thread TID: [%lx.%lx]\n", - ApiMessage->Data.CreateThreadRequest.ClientId.UniqueProcess, - ApiMessage->Data.CreateThreadRequest.ClientId.UniqueThread); - return STATUS_SUCCESS; // server-to-server - } - - /* Get the CSR Process for this request */ - CsrProcess = CurrentThread->Process; - if (CsrProcess->ClientId.UniqueProcess != - ApiMessage->Data.CreateThreadRequest.ClientId.UniqueProcess) - { - /* This is a remote thread request -- is it within the server itself? */ - if (ApiMessage->Data.CreateThreadRequest.ClientId.UniqueProcess == NtCurrentTeb()->ClientId.UniqueProcess) - { - /* Accept this without any further work */ - return STATUS_SUCCESS; - } - - /* Get the real CSR Process for the remote thread's process */ - Status = CsrLockProcessByClientId(ApiMessage->Data.CreateThreadRequest.ClientId.UniqueProcess, - &CsrProcess); - if (!NT_SUCCESS(Status)) return Status; - } - - /* Duplicate the thread handle so we can own it */ - Status = NtDuplicateObject(CurrentThread->Process->ProcessHandle, - ApiMessage->Data.CreateThreadRequest.ThreadHandle, - NtCurrentProcess(), - &ThreadHandle, - 0, - 0, - DUPLICATE_SAME_ACCESS); - if (NT_SUCCESS(Status)) - { - /* Call CSRSRV to tell it about the new thread */ - Status = CsrCreateThread(CsrProcess, - ThreadHandle, - &ApiMessage->Data.CreateThreadRequest.ClientId); - } - - /* Unlock the process and return */ - if (CsrProcess != CurrentThread->Process) CsrUnlockProcess(CsrProcess); - return Status; -} - -CSR_API(BaseSrvExitProcess) -{ - PCSR_THREAD CsrThread = CsrGetClientThread(); - ASSERT(CsrThread != NULL); - - /* Set magic flag so we don't reply this message back */ - ApiMessage->ApiNumber = 0xBABE; - - /* Remove the CSR_THREADs and CSR_PROCESS */ - return CsrDestroyProcess(&CsrThread->ClientId, - (NTSTATUS)ApiMessage->Data.TerminateProcessRequest.uExitCode); -} - -CSR_API(BaseSrvGetProcessShutdownParam) -{ - PCSR_THREAD CsrThread = CsrGetClientThread(); - ASSERT(CsrThread); - - ApiMessage->Data.GetShutdownParametersRequest.Level = CsrThread->Process->ShutdownLevel; - ApiMessage->Data.GetShutdownParametersRequest.Flags = CsrThread->Process->ShutdownFlags; - - return STATUS_SUCCESS; -} - -CSR_API(BaseSrvSetProcessShutdownParam) -{ - PCSR_THREAD CsrThread = CsrGetClientThread(); - ASSERT(CsrThread); - - CsrThread->Process->ShutdownLevel = ApiMessage->Data.SetShutdownParametersRequest.Level; - CsrThread->Process->ShutdownFlags = ApiMessage->Data.SetShutdownParametersRequest.Flags; - - return STATUS_SUCCESS; -} - /* EOF */ diff --git a/subsystems/win32/csrsrv/api/wapi.c b/subsystems/win32/csrsrv/api/wapi.c index 271710ca97c..e88c6022718 100644 --- a/subsystems/win32/csrsrv/api/wapi.c +++ b/subsystems/win32/csrsrv/api/wapi.c @@ -1,6 +1,7 @@ /* * subsystems/win32/csrss/csrsrv/api/wapi.c * + * "\windows\ApiPort" port process management functions * CSRSS port message processing * * ReactOS Operating System @@ -25,6 +26,7 @@ extern ULONG CsrMaxApiRequestThreads; /* FUNCTIONS *****************************************************************/ +#if 0 NTSTATUS FASTCALL CsrApiRegisterDefinitions(PCSRSS_API_DEFINITION NewDefinitions) { @@ -61,6 +63,7 @@ CsrApiRegisterDefinitions(PCSRSS_API_DEFINITION NewDefinitions) return STATUS_SUCCESS; } +#endif /* VOID @@ -146,7 +149,7 @@ NTAPI CsrCallServerFromServer(PCSR_API_MESSAGE ReceiveMsg, PCSR_API_MESSAGE ReplyMsg) { -#if 0 // real code +#if 1 // Real code ULONG ServerId; PCSR_SERVER_DLL ServerDll; ULONG ApiId; @@ -199,6 +202,7 @@ CsrCallServerFromServer(PCSR_API_MESSAGE ReceiveMsg, _SEH2_TRY { /* Call the API and get the result */ + /// CsrApiCallHandler(ReplyMsg, /*ProcessData*/ &ReplyCode); /// Status = (ServerDll->DispatchTable[ApiId])(ReceiveMsg, &Reply); /* Return the result, no matter what it is */ diff --git a/subsystems/win32/csrsrv/init.c b/subsystems/win32/csrsrv/init.c index ea5db55bea4..6be1bbd3aad 100644 --- a/subsystems/win32/csrsrv/init.c +++ b/subsystems/win32/csrsrv/init.c @@ -60,6 +60,7 @@ CallHardError(IN PCSR_THREAD ThreadData, } } +#if 0 NTSTATUS CallProcessCreated(IN PCSR_PROCESS SourceProcessData, IN PCSR_PROCESS TargetProcessData) @@ -85,22 +86,11 @@ CallProcessCreated(IN PCSR_PROCESS SourceProcessData, return Status; } +#endif -/*** - *** Some APIs from here will go to basesrv.dll, some others to winsrv.dll. - *** Furthermore, this structure uses the old definition of APIs list. - *** The new one is in fact three arrays, one of APIs pointers, one other of - *** corresponding indexes, and the third one of names (not very efficient...). - ***/ CSRSS_API_DEFINITION NativeDefinitions[] = { - CSRSS_DEFINE_API(CREATE_PROCESS, BaseSrvCreateProcess), - CSRSS_DEFINE_API(CREATE_THREAD, BaseSrvCreateThread), - CSRSS_DEFINE_API(TERMINATE_PROCESS, BaseSrvExitProcess), - CSRSS_DEFINE_API(REGISTER_SERVICES_PROCESS, SrvRegisterServicesProcess), - CSRSS_DEFINE_API(GET_SHUTDOWN_PARAMETERS, BaseSrvGetProcessShutdownParam), - CSRSS_DEFINE_API(SET_SHUTDOWN_PARAMETERS, BaseSrvSetProcessShutdownParam), - { 0, 0, NULL } + CSRSS_DEFINE_API(REGISTER_SERVICES_PROCESS, SrvRegisterServicesProcess), // winsrv.dll }; /* === INIT ROUTINES === */ @@ -708,7 +698,7 @@ CsrParseServerCommandLine(IN ULONG ArgumentCount, } /* Load us */ - Status = CsrLoadServerDll("CSRSS" /* "CSRSRV" */, NULL, CSR_SRV_SERVER); + Status = CsrLoadServerDll("CSRSS" /* "CSRSRV" */, NULL, CSRSRV_SERVERDLL_INDEX); } else if (_stricmp(ParameterName, "ServerDLL") == 0) { @@ -1032,11 +1022,13 @@ CsrServerInitialization(IN ULONG ArgumentCount, return Status; } +#if 0 Status = CsrApiRegisterDefinitions(NativeDefinitions); if (!NT_SUCCESS(Status)) { DPRINT1("CSRSRV failed in %s with status %lx\n", "CsrApiRegisterDefinitions", Status); } +#endif /* Now initialize our API Port */ Status = CsrApiPortInitialize(); @@ -1047,17 +1039,6 @@ CsrServerInitialization(IN ULONG ArgumentCount, return Status; } - //////////////////////////// ADDED //////////////////////////// - /* - /\* Initialize Win32csr *\/ - Status = CsrLoadServerDll("win32csr", "Win32CsrInitialization", 2); - if (!NT_SUCCESS(Status)) - { - DPRINT1("CSRSRV failed in %s with status %lx\n", "CsrLoadServerDll", Status); - } - */ - //////////////////////////// END ADDED //////////////////////////// - /* Initialize the API Port for SM communication */ Status = CsrSbApiPortInitialize(); if (!NT_SUCCESS(Status)) diff --git a/subsystems/win32/csrsrv/procsup.c b/subsystems/win32/csrsrv/procsup.c index 180892d85e2..52a44279867 100644 --- a/subsystems/win32/csrsrv/procsup.c +++ b/subsystems/win32/csrsrv/procsup.c @@ -26,7 +26,7 @@ SECURITY_QUALITY_OF_SERVICE CsrSecurityQos = FALSE }; ULONG CsrProcessSequenceCount = 5; -extern ULONG CsrTotalPerProcessDataLength; // remove 'extern' if not needed. +extern ULONG CsrTotalPerProcessDataLength; /* PRIVATE FUNCTIONS **********************************************************/ diff --git a/subsystems/win32/csrsrv/server.c b/subsystems/win32/csrsrv/server.c index 1ca428e59c6..ea149b815de 100644 --- a/subsystems/win32/csrsrv/server.c +++ b/subsystems/win32/csrsrv/server.c @@ -1,12 +1,13 @@ /* * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS CSR Sub System + * PROJECT: ReactOS CSR SubSystem * FILE: subsystems/win32/csrss/csrsrv/server.c * PURPOSE: CSR Server DLL Server Functions * PROGRAMMERS: Alex Ionescu (alex@relsoft.net) */ /* INCLUDES ******************************************************************/ + #include "srv.h" #define NDEBUG @@ -14,7 +15,25 @@ /* DATA **********************************************************************/ -PCSR_API_ROUTINE CsrServerApiDispatchTable[5] = +/*** Must go elsewhere ***/ +#define CSR_SERVER_DLL_MAX 4 + +#define CSRSRV_SERVERDLL_INDEX 0 +#define CSRSRV_FIRST_API_NUMBER 0 + +typedef enum _CSR_SRV_API_NUMBER +{ + CsrpClientConnect = CSRSRV_FIRST_API_NUMBER, + CsrpThreadConnect, + CsrpProfileControl, + CsrpIdentifyAlertable, + CsrpSetPriorityClass, + + CsrpMaxApiNumber +} CSR_SRV_API_NUMBER, *PCSR_SRV_API_NUMBER; +/*************************/ + +PCSR_API_ROUTINE CsrServerApiDispatchTable[CsrpMaxApiNumber] = { CsrSrvClientConnect, CsrSrvUnusedFunction, @@ -23,7 +42,7 @@ PCSR_API_ROUTINE CsrServerApiDispatchTable[5] = CsrSrvSetPriorityClass }; -BOOLEAN CsrServerApiServerValidTable[5] = +BOOLEAN CsrServerApiServerValidTable[CsrpMaxApiNumber] = { TRUE, FALSE, @@ -32,7 +51,7 @@ BOOLEAN CsrServerApiServerValidTable[5] = TRUE }; -PCHAR CsrServerApiNameTable[5] = +PCHAR CsrServerApiNameTable[CsrpMaxApiNumber] = { "ClientConnect", "ThreadConnect", @@ -65,9 +84,7 @@ HANDLE CsrSrvSharedSection; * @remarks None. * *--*/ -NTSTATUS -NTAPI -CsrServerDllInitialization(IN PCSR_SERVER_DLL LoadedServerDll) +CSR_SERVER_DLL_INIT(CsrServerDllInitialization) { /* Setup the DLL Object */ LoadedServerDll->ApiBase = 0; @@ -133,7 +150,7 @@ CsrLoadServerDll(IN PCHAR DllString, if (!NT_SUCCESS(Status)) return Status; /* If we are loading ourselves, don't actually load us */ - if (ServerId != CSR_SRV_SERVER) + if (ServerId != CSRSRV_SERVERDLL_INDEX) { /* Load the DLL */ Status = LdrLoadDll(NULL, 0, &TempString, &hServerDll); @@ -186,8 +203,7 @@ CsrLoadServerDll(IN PCHAR DllString, { /* Initialize a string for the entrypoint, or use the default */ RtlInitAnsiString(&EntryPointString, - !(EntryPoint) ? "ServerDllInitialization" : - EntryPoint); + EntryPoint ? EntryPoint : "ServerDllInitialization"); /* Get a pointer to it */ Status = LdrGetProcedureAddress(hServerDll, @@ -207,8 +223,6 @@ CsrLoadServerDll(IN PCHAR DllString, { /* Get the result from the Server DLL */ Status = ServerDllInitProcedure(ServerDll); - - /* Check for Success */ if (NT_SUCCESS(Status)) { /* @@ -227,11 +241,13 @@ CsrLoadServerDll(IN PCHAR DllString, CsrSrvSharedStaticServerData[ServerDll->ServerId] = ServerDll->SharedSection; } - /* ReactOS Specific hax */ +#if 0 /* HACK: ReactOS Specific hax. REMOVE IT. */ if (ServerDll->HighestApiSupported == 0xDEADBABE) { + // CSRSS_API_DEFINITIONS == Old structure. Status = CsrApiRegisterDefinitions((PVOID)ServerDll->DispatchTable); } +#endif } else { @@ -275,9 +291,6 @@ NTAPI CsrSrvClientConnect(IN OUT PCSR_API_MESSAGE ApiMessage, IN OUT PULONG Reply OPTIONAL) { - /* Hack */ - return STATUS_SUCCESS; -#if 0 NTSTATUS Status; PCSR_CLIENT_CONNECT ClientConnect; PCSR_SERVER_DLL ServerDll; @@ -326,7 +339,6 @@ CsrSrvClientConnect(IN OUT PCSR_API_MESSAGE ApiMessage, /* Return status */ return Status; -#endif } /*++ @@ -628,7 +640,7 @@ CsrSetCallingSpooler(ULONG Reserved) * @remarks None. * *--*/ -LONG +EXCEPTION_DISPOSITION NTAPI CsrUnhandledExceptionFilter(IN PEXCEPTION_POINTERS ExceptionInfo) { diff --git a/win32ss/user/win32csr/CMakeLists.txt b/win32ss/user/win32csr/CMakeLists.txt index f07f8dd8d7e..8983ada1207 100644 --- a/win32ss/user/win32csr/CMakeLists.txt +++ b/win32ss/user/win32csr/CMakeLists.txt @@ -19,7 +19,6 @@ list(APPEND SOURCE desktopbg.c dllmain.c exitros.c - file.c guiconsole.c handle.c harderror.c diff --git a/win32ss/user/win32csr/dllmain.c b/win32ss/user/win32csr/dllmain.c index ad93d92296e..ad5e25cd3b6 100644 --- a/win32ss/user/win32csr/dllmain.c +++ b/win32ss/user/win32csr/dllmain.c @@ -9,19 +9,85 @@ /* INCLUDES ******************************************************************/ #define NDEBUG #include "w32csr.h" -#include "file.h" #include /* Not defined in any header file */ extern VOID WINAPI PrivateCsrssManualGuiCheck(LONG Check); -extern LIST_ENTRY DosDeviceHistory; -extern RTL_CRITICAL_SECTION Win32CsrDefineDosDeviceCritSec; /* GLOBALS *******************************************************************/ HANDLE Win32CsrApiHeap; HINSTANCE Win32CsrDllHandle = NULL; +PCSR_API_ROUTINE Win32CsrApiDefinitions[] = +{ + CsrGetHandle, + CsrGetHandle, + CsrCloseHandle, + CsrVerifyHandle, + CsrDuplicateHandle, + CsrGetInputWaitHandle, + CsrWriteConsole, + CsrReadConsole, + CsrAllocConsole, + CsrFreeConsole, + CsrGetScreenBufferInfo, + CsrSetCursor, + CsrFillOutputChar, + CsrReadInputEvent, + CsrWriteConsoleOutputChar, + CsrWriteConsoleOutputAttrib, + CsrFillOutputAttrib, + CsrGetCursorInfo, + CsrSetCursorInfo, + CsrSetTextAttrib, + CsrGetConsoleMode, + CsrSetConsoleMode, + CsrCreateScreenBuffer, + CsrSetScreenBuffer, + CsrSetTitle, + CsrGetTitle, + CsrWriteConsoleOutput, + CsrFlushInputBuffer, + CsrScrollConsoleScreenBuffer, + CsrReadConsoleOutputChar, + CsrReadConsoleOutputAttrib, + CsrGetNumberOfConsoleInputEvents, + CsrExitReactos, + CsrPeekConsoleInput, + CsrReadConsoleOutput, + CsrWriteConsoleInput, + CsrHardwareStateProperty, + CsrGetConsoleWindow, + CsrCreateDesktop, + CsrShowDesktop, + CsrHideDesktop, + CsrSetConsoleIcon, + CsrSetLogonNotifyWindow, + CsrRegisterLogonProcess, + CsrGetConsoleCodePage, + CsrSetConsoleCodePage, + CsrGetConsoleOutputCodePage, + CsrSetConsoleOutputCodePage, + CsrGetProcessList, + CsrAddConsoleAlias, + CsrGetConsoleAlias, + CsrGetAllConsoleAliases, + CsrGetAllConsoleAliasesLength, + CsrGetConsoleAliasesExes, + CsrGetConsoleAliasesExesLength, + CsrGenerateCtrlEvent, + CsrSetScreenBufferSize, + CsrGetConsoleSelectionInfo, + CsrGetCommandHistoryLength, + CsrGetCommandHistory, + CsrExpungeCommandHistory, + CsrSetHistoryNumberCommands, + CsrGetHistoryInfo, + CsrSetHistoryInfo +}; + +/* static CSRSS_API_DEFINITION Win32CsrApiDefinitions[] = { CSRSS_DEFINE_API(GET_INPUT_HANDLE, CsrGetHandle), @@ -88,11 +154,9 @@ static CSRSS_API_DEFINITION Win32CsrApiDefinitions[] = CSRSS_DEFINE_API(SET_HISTORY_NUMBER_COMMANDS, CsrSetHistoryNumberCommands), CSRSS_DEFINE_API(GET_HISTORY_INFO, CsrGetHistoryInfo), CSRSS_DEFINE_API(SET_HISTORY_INFO, CsrSetHistoryInfo), - CSRSS_DEFINE_API(GET_TEMP_FILE, CsrGetTempFile), - CSRSS_DEFINE_API(DEFINE_DOS_DEVICE, CsrDefineDosDevice), - CSRSS_DEFINE_API(SOUND_SENTRY, CsrSoundSentry), { 0, 0, NULL } }; +*/ static HHOOK hhk = NULL; @@ -268,10 +332,6 @@ DllMain(HANDLE hDll, // BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! } - if (DLL_PROCESS_DETACH == dwReason) - { - CsrCleanupDefineDosDevice(); - } return TRUE; } @@ -324,9 +384,7 @@ CreateSystemThreads(PVOID pParam) return 0; } -NTSTATUS -WINAPI -Win32CsrInitialization(IN PCSR_SERVER_DLL ServerDll) +CSR_SERVER_DLL_INIT(Win32CsrInitialization) { HANDLE ServerThread; CLIENT_ID ClientId; @@ -334,23 +392,25 @@ Win32CsrInitialization(IN PCSR_SERVER_DLL ServerDll) Win32CsrApiHeap = RtlGetProcessHeap(); - CsrpInitVideo(); + CsrpInitVideo(); // Must go into winsrv.dll NtUserInitialize(0, NULL, NULL); PrivateCsrssManualGuiCheck(0); - CsrInitConsoleSupport(); + CsrInitConsoleSupport(); // Go into consrv.dll - /* HACK */ - ServerDll->DispatchTable = (PVOID)Win32CsrApiDefinitions; - ServerDll->HighestApiSupported = 0xDEADBABE; - - ServerDll->HardErrorCallback = Win32CsrHardError; - ServerDll->NewProcessCallback = Win32CsrDuplicateHandleTable; - ServerDll->DisconnectCallback = Win32CsrReleaseConsole; - - RtlInitializeCriticalSection(&Win32CsrDefineDosDeviceCritSec); - InitializeListHead(&DosDeviceHistory); + /* Setup the DLL Object */ + LoadedServerDll->ApiBase = BASESRV_FIRST_API_NUMBER; // ApiNumberBase + LoadedServerDll->HighestApiSupported = BasepMaxApiNumber; // MaxApiNumber + LoadedServerDll->DispatchTable = Win32CsrApiDefinitions; + // LoadedServerDll->ValidTable = BaseServerApiServerValidTable; + // LoadedServerDll->NameTable = BaseServerApiNameTable; + // LoadedServerDll->SizeOfProcessData = 0; + // LoadedServerDll->ConnectCallback = NULL; + // LoadedServerDll->DisconnectCallback = NULL; + LoadedServerDll->HardErrorCallback = Win32CsrHardError; + LoadedServerDll->NewProcessCallback = Win32CsrDuplicateHandleTable; + LoadedServerDll->DisconnectCallback = Win32CsrReleaseConsole; /* Start Raw Input Threads */ Status = RtlCreateUserThread(NtCurrentProcess(), NULL, TRUE, 0, 0, 0, (PTHREAD_START_ROUTINE)CreateSystemThreads, (PVOID)0, &ServerThread, &ClientId); diff --git a/win32ss/user/win32csr/file.c b/win32ss/user/win32csr/file.c deleted file mode 100644 index 5ac4f2ddd02..00000000000 --- a/win32ss/user/win32csr/file.c +++ /dev/null @@ -1,586 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS system libraries - * FILE: subsys/csrss/win32csr/file.c - * PURPOSE: File handling - * PROGRAMMERS: Pierre Schweitzer (pierre.schweitzer@reactos.org) - * NOTE: Belongs to basesrv.dll - */ - -/* INCLUDES ******************************************************************/ - -#include -#define NDEBUG -#include -#include "file.h" - -/* GLOBALS *******************************************************************/ - -typedef BOOL (WINAPI *PUSER_SOUND_SENTRY)(VOID); -BOOL -WINAPI -FirstSoundSentry(VOID); - -UINT CsrGetTempFileUnique; -LIST_ENTRY DosDeviceHistory; -RTL_CRITICAL_SECTION Win32CsrDefineDosDeviceCritSec; -PUSER_SOUND_SENTRY _UserSoundSentry = FirstSoundSentry; - -/* FUNCTIONS *****************************************************************/ - -BOOL -WINAPI -FailSoundSentry(VOID) -{ - /* In case the function can't be found/is unimplemented */ - return FALSE; -} - -BOOL -WINAPI -FirstSoundSentry(VOID) -{ - UNICODE_STRING DllString = RTL_CONSTANT_STRING(L"winsrv"); - STRING FuncString = RTL_CONSTANT_STRING("_UserSoundSentry"); - HANDLE DllHandle; - NTSTATUS Status; - PUSER_SOUND_SENTRY NewSoundSentry = FailSoundSentry; - - /* Load winsrv manually */ - Status = LdrGetDllHandle(NULL, NULL, &DllString, &DllHandle); - if (NT_SUCCESS(Status)) - { - /* If it was found, get SoundSentry export */ - Status = LdrGetProcedureAddress(DllHandle, - &FuncString, - 0, - (PVOID*)&NewSoundSentry); - } - - /* Set it as the callback for the future, and call it */ - _UserSoundSentry = NewSoundSentry; - return _UserSoundSentry(); -} - -CSR_API(CsrSoundSentry) -{ - /* Call the API and see if it suceeds */ - return _UserSoundSentry() ? STATUS_SUCCESS : STATUS_ACCESS_DENIED; -} - -CSR_API(CsrGetTempFile) -{ - DPRINT("CsrGetTempFile entered\n"); - - /* Return 16-bits ID */ - ApiMessage->Data.GetTempFile.UniqueID = (++CsrGetTempFileUnique & 0xFFFF); - - DPRINT("Returning: %u\n", ApiMessage->Data.GetTempFile.UniqueID); - - return STATUS_SUCCESS; -} - -CSR_API(CsrDefineDosDevice) -{ - OBJECT_ATTRIBUTES ObjectAttributes; - HANDLE LinkHandle = NULL; - NTSTATUS Status; - UNICODE_STRING DeviceName = {0}; - UNICODE_STRING RequestDeviceName = {0}; - UNICODE_STRING LinkTarget = {0}; - PUNICODE_STRING RequestLinkTarget; - ULONG Length; - SID_IDENTIFIER_AUTHORITY WorldAuthority = {SECURITY_WORLD_SID_AUTHORITY}; - SID_IDENTIFIER_AUTHORITY SystemAuthority = {SECURITY_NT_AUTHORITY}; - PSECURITY_DESCRIPTOR SecurityDescriptor; - PACL Dacl; - PSID AdminSid; - PSID SystemSid; - PSID WorldSid; - ULONG SidLength; - PCSRSS_DOS_DEVICE_HISTORY_ENTRY HistoryEntry; - PLIST_ENTRY Entry; - PLIST_ENTRY ListHead; - BOOLEAN Matched, AddHistory; - DWORD dwFlags; - PWSTR lpBuffer; - - DPRINT("CsrDefineDosDevice entered, Flags:%d, DeviceName:%wZ, TargetName:%wZ\n", - ApiMessage->Data.DefineDosDeviceRequest.dwFlags, - &ApiMessage->Data.DefineDosDeviceRequest.DeviceName, - &ApiMessage->Data.DefineDosDeviceRequest.TargetName); - - Matched = AddHistory = FALSE; - HistoryEntry = NULL; - AdminSid = SystemSid = WorldSid = NULL; - SecurityDescriptor = NULL; - ListHead = &DosDeviceHistory; - dwFlags = ApiMessage->Data.DefineDosDeviceRequest.dwFlags; - - /* Validate the flags */ - if ( (dwFlags & 0xFFFFFFF0) || - ((dwFlags & DDD_EXACT_MATCH_ON_REMOVE) && - ! (dwFlags & DDD_REMOVE_DEFINITION)) ) - { - return STATUS_INVALID_PARAMETER; - } - - Status = RtlEnterCriticalSection(&Win32CsrDefineDosDeviceCritSec); - if (! NT_SUCCESS(Status)) - { - DPRINT1("RtlEnterCriticalSection() failed (Status %lx)\n", - Status); - return Status; - } - - _SEH2_TRY - { - Status = - RtlUpcaseUnicodeString(&RequestDeviceName, - &ApiMessage->Data.DefineDosDeviceRequest.DeviceName, - TRUE); - if (! NT_SUCCESS(Status)) - _SEH2_LEAVE; - - RequestLinkTarget = - &ApiMessage->Data.DefineDosDeviceRequest.TargetName; - lpBuffer = (PWSTR) RtlAllocateHeap(Win32CsrApiHeap, - HEAP_ZERO_MEMORY, - RequestDeviceName.MaximumLength + 5 * sizeof(WCHAR)); - if (! lpBuffer) - { - DPRINT1("Failed to allocate memory\n"); - Status = STATUS_NO_MEMORY; - _SEH2_LEAVE; - } - - swprintf(lpBuffer, - L"\\??\\%wZ", - &RequestDeviceName); - RtlInitUnicodeString(&DeviceName, - lpBuffer); - InitializeObjectAttributes(&ObjectAttributes, - &DeviceName, - OBJ_CASE_INSENSITIVE, - NULL, - NULL); - Status = NtOpenSymbolicLinkObject(&LinkHandle, - DELETE | 0x1, - &ObjectAttributes); - if (NT_SUCCESS(Status)) - { - Status = NtQuerySymbolicLinkObject(LinkHandle, - &LinkTarget, - &Length); - if (! NT_SUCCESS(Status) && - Status == STATUS_BUFFER_TOO_SMALL) - { - LinkTarget.Length = 0; - LinkTarget.MaximumLength = Length; - LinkTarget.Buffer = (PWSTR) - RtlAllocateHeap(Win32CsrApiHeap, - HEAP_ZERO_MEMORY, - Length); - if (! LinkTarget.Buffer) - { - DPRINT1("Failed to allocate memory\n"); - Status = STATUS_NO_MEMORY; - _SEH2_LEAVE; - } - - Status = NtQuerySymbolicLinkObject(LinkHandle, - &LinkTarget, - &Length); - } - - if (! NT_SUCCESS(Status)) - { - DPRINT1("NtQuerySymbolicLinkObject(%wZ) failed (Status %lx)\n", - &DeviceName, Status); - _SEH2_LEAVE; - } - - if ((dwFlags & DDD_REMOVE_DEFINITION)) - { - /* If no target name specified we remove the current symlink target */ - if (RequestLinkTarget->Length == 0) - Matched = TRUE; - else - { - if (dwFlags & DDD_EXACT_MATCH_ON_REMOVE) - Matched = ! RtlCompareUnicodeString(RequestLinkTarget, - &LinkTarget, - TRUE); - else - Matched = RtlPrefixUnicodeString(RequestLinkTarget, - &LinkTarget, - TRUE); - } - - if (Matched && IsListEmpty(ListHead)) - { - /* Current symlink target macthed and there is nothing to revert to */ - RequestLinkTarget = NULL; - } - else if (Matched && ! IsListEmpty(ListHead)) - { - /* Fetch the first history entry we come across for the device name */ - /* This will become the current symlink target for the device name */ - Matched = FALSE; - Entry = ListHead->Flink; - while (Entry != ListHead) - { - HistoryEntry = (PCSRSS_DOS_DEVICE_HISTORY_ENTRY) - CONTAINING_RECORD(Entry, - CSRSS_DOS_DEVICE_HISTORY_ENTRY, - Entry); - Matched = - ! RtlCompareUnicodeString(&RequestDeviceName, - &HistoryEntry->Device, - FALSE); - if (Matched) - { - RemoveEntryList(&HistoryEntry->Entry); - RequestLinkTarget = &HistoryEntry->Target; - break; - } - Entry = Entry->Flink; - HistoryEntry = NULL; - } - - /* Nothing to revert to so delete the symlink */ - if (! Matched) - RequestLinkTarget = NULL; - } - else if (! Matched) - { - /* Locate a previous symlink target as we did not get a hit earlier */ - /* If we find one we need to remove it */ - Entry = ListHead->Flink; - while (Entry != ListHead) - { - HistoryEntry = (PCSRSS_DOS_DEVICE_HISTORY_ENTRY) - CONTAINING_RECORD(Entry, - CSRSS_DOS_DEVICE_HISTORY_ENTRY, - Entry); - Matched = - ! RtlCompareUnicodeString(&RequestDeviceName, - &HistoryEntry->Device, - FALSE); - if (! Matched) - { - HistoryEntry = NULL; - Entry = Entry->Flink; - continue; - } - - Matched = FALSE; - if (dwFlags & DDD_EXACT_MATCH_ON_REMOVE) - { - if (! RtlCompareUnicodeString(RequestLinkTarget, - &HistoryEntry->Target, - TRUE)) - { - Matched = TRUE; - } - } - else if (RtlPrefixUnicodeString(RequestLinkTarget, - &HistoryEntry->Target, - TRUE)) - { - Matched = TRUE; - } - - if (Matched) - { - RemoveEntryList(&HistoryEntry->Entry); - break; - } - Entry = Entry->Flink; - HistoryEntry = NULL; - } - - /* Leave existing symlink as is */ - if (! Matched) - Status = STATUS_OBJECT_NAME_NOT_FOUND; - else - Status = STATUS_SUCCESS; - _SEH2_LEAVE; - } - } - else - { - AddHistory = TRUE; - } - - Status = NtMakeTemporaryObject(LinkHandle); - if (! NT_SUCCESS(Status)) - { - DPRINT1("NtMakeTemporaryObject(%wZ) failed (Status %lx)\n", - &DeviceName, Status); - _SEH2_LEAVE; - } - - Status = NtClose(LinkHandle); - LinkHandle = NULL; - if (! NT_SUCCESS(Status)) - { - DPRINT1("NtClose(%wZ) failed (Status %lx)\n", - &DeviceName, Status); - _SEH2_LEAVE; - } - } - - /* Don't create symlink if we don't have a target */ - if (! RequestLinkTarget || RequestLinkTarget->Length == 0) - _SEH2_LEAVE; - - if (AddHistory) - { - HistoryEntry = (PCSRSS_DOS_DEVICE_HISTORY_ENTRY) - RtlAllocateHeap(Win32CsrApiHeap, - HEAP_ZERO_MEMORY, - sizeof(CSRSS_DOS_DEVICE_HISTORY_ENTRY)); - if (! HistoryEntry) - { - DPRINT1("Failed to allocate memory\n"); - Status = STATUS_NO_MEMORY; - _SEH2_LEAVE; - } - - HistoryEntry->Target.Buffer = - RtlAllocateHeap(Win32CsrApiHeap, - HEAP_ZERO_MEMORY, - LinkTarget.Length); - if (! HistoryEntry->Target.Buffer) - { - DPRINT1("Failed to allocate memory\n"); - Status = STATUS_NO_MEMORY; - _SEH2_LEAVE; - } - HistoryEntry->Target.Length = - HistoryEntry->Target.MaximumLength = - LinkTarget.Length; - RtlCopyUnicodeString(&HistoryEntry->Target, - &LinkTarget); - - HistoryEntry->Device.Buffer = - RtlAllocateHeap(Win32CsrApiHeap, - HEAP_ZERO_MEMORY, - RequestDeviceName.Length); - if (! HistoryEntry->Device.Buffer) - { - DPRINT1("Failed to allocate memory\n"); - Status = STATUS_NO_MEMORY; - _SEH2_LEAVE; - } - HistoryEntry->Device.Length = - HistoryEntry->Device.MaximumLength = - RequestDeviceName.Length; - RtlCopyUnicodeString(&HistoryEntry->Device, - &RequestDeviceName); - - /* Remember previous symlink target for this device */ - InsertHeadList(ListHead, - &HistoryEntry->Entry); - HistoryEntry = NULL; - } - - RtlAllocateAndInitializeSid(&WorldAuthority, - 1, - SECURITY_WORLD_RID, - SECURITY_NULL_RID, - SECURITY_NULL_RID, - SECURITY_NULL_RID, - SECURITY_NULL_RID, - SECURITY_NULL_RID, - SECURITY_NULL_RID, - SECURITY_NULL_RID, - &WorldSid); - - RtlAllocateAndInitializeSid(&SystemAuthority, - 1, - SECURITY_LOCAL_SYSTEM_RID, - SECURITY_NULL_RID, - SECURITY_NULL_RID, - SECURITY_NULL_RID, - SECURITY_NULL_RID, - SECURITY_NULL_RID, - SECURITY_NULL_RID, - SECURITY_NULL_RID, - &SystemSid); - - RtlAllocateAndInitializeSid(&SystemAuthority, - 2, - SECURITY_BUILTIN_DOMAIN_RID, - DOMAIN_ALIAS_RID_ADMINS, - SECURITY_NULL_RID, - SECURITY_NULL_RID, - SECURITY_NULL_RID, - SECURITY_NULL_RID, - SECURITY_NULL_RID, - SECURITY_NULL_RID, - &AdminSid); - - SidLength = RtlLengthSid(SystemSid) + - RtlLengthSid(AdminSid) + - RtlLengthSid(WorldSid); - Length = sizeof(ACL) + SidLength + 3 * sizeof(ACCESS_ALLOWED_ACE); - - SecurityDescriptor = RtlAllocateHeap(Win32CsrApiHeap, - 0, - SECURITY_DESCRIPTOR_MIN_LENGTH + Length); - if (! SecurityDescriptor) - { - DPRINT1("Failed to allocate memory\n"); - Status = STATUS_NO_MEMORY; - _SEH2_LEAVE; - } - - Dacl = (PACL)((ULONG_PTR)SecurityDescriptor + SECURITY_DESCRIPTOR_MIN_LENGTH); - Status = RtlCreateSecurityDescriptor(SecurityDescriptor, - SECURITY_DESCRIPTOR_REVISION); - if (! NT_SUCCESS(Status)) - { - DPRINT1("RtlCreateSecurityDescriptor() failed (Status %lx)\n", - Status); - _SEH2_LEAVE; - } - - Status = RtlCreateAcl(Dacl, - Length, - ACL_REVISION); - if (! NT_SUCCESS(Status)) - { - DPRINT1("RtlCreateAcl() failed (Status %lx)\n", - Status); - _SEH2_LEAVE; - } - - (void) RtlAddAccessAllowedAce(Dacl, - ACL_REVISION, - GENERIC_ALL, - SystemSid); - (void) RtlAddAccessAllowedAce(Dacl, - ACL_REVISION, - GENERIC_ALL, - AdminSid); - (void) RtlAddAccessAllowedAce(Dacl, - ACL_REVISION, - STANDARD_RIGHTS_READ, - WorldSid); - - Status = RtlSetDaclSecurityDescriptor(SecurityDescriptor, - TRUE, - Dacl, - FALSE); - if (! NT_SUCCESS(Status)) - { - DPRINT1("RtlSetDaclSecurityDescriptor() failed (Status %lx)\n", - Status); - _SEH2_LEAVE; - } - - InitializeObjectAttributes(&ObjectAttributes, - &DeviceName, - OBJ_CASE_INSENSITIVE, - NULL, - SecurityDescriptor); - Status = NtCreateSymbolicLinkObject(&LinkHandle, - SYMBOLIC_LINK_ALL_ACCESS, - &ObjectAttributes, - RequestLinkTarget); - if (NT_SUCCESS(Status)) - { - Status = NtMakePermanentObject(LinkHandle); - if (! NT_SUCCESS(Status)) - { - DPRINT1("NtMakePermanentObject(%wZ) failed (Status %lx)\n", - &DeviceName, Status); - } - } - else - { - DPRINT1("NtCreateSymbolicLinkObject(%wZ) failed (Status %lx)\n", - &DeviceName, Status); - } - } - _SEH2_FINALLY - { - (void) RtlLeaveCriticalSection(&Win32CsrDefineDosDeviceCritSec); - if (DeviceName.Buffer) - (void) RtlFreeHeap(Win32CsrApiHeap, - 0, - DeviceName.Buffer); - if (LinkTarget.Buffer) - (void) RtlFreeHeap(Win32CsrApiHeap, - 0, - LinkTarget.Buffer); - if (SecurityDescriptor) - (void) RtlFreeHeap(Win32CsrApiHeap, - 0, - SecurityDescriptor); - if (LinkHandle) - (void) NtClose(LinkHandle); - if (SystemSid) - (void) RtlFreeSid(SystemSid); - if (AdminSid) - (void) RtlFreeSid(AdminSid); - if (WorldSid) - (void) RtlFreeSid(WorldSid); - RtlFreeUnicodeString(&RequestDeviceName); - if (HistoryEntry) - { - if (HistoryEntry->Target.Buffer) - (void) RtlFreeHeap(Win32CsrApiHeap, - 0, - HistoryEntry->Target.Buffer); - if (HistoryEntry->Device.Buffer) - (void) RtlFreeHeap(Win32CsrApiHeap, - 0, - HistoryEntry->Device.Buffer); - (void) RtlFreeHeap(Win32CsrApiHeap, - 0, - HistoryEntry); - } - } - _SEH2_END - - DPRINT("CsrDefineDosDevice Exit, Statux: 0x%x\n", Status); - return Status; -} - -void CsrCleanupDefineDosDevice(void) -{ - PLIST_ENTRY Entry, ListHead; - PCSRSS_DOS_DEVICE_HISTORY_ENTRY HistoryEntry; - - (void) RtlDeleteCriticalSection(&Win32CsrDefineDosDeviceCritSec); - - ListHead = &DosDeviceHistory; - Entry = ListHead->Flink; - while (Entry != ListHead) - { - HistoryEntry = (PCSRSS_DOS_DEVICE_HISTORY_ENTRY) - CONTAINING_RECORD(Entry, - CSRSS_DOS_DEVICE_HISTORY_ENTRY, - Entry); - Entry = Entry->Flink; - - if (HistoryEntry) - { - if (HistoryEntry->Target.Buffer) - (void) RtlFreeHeap(Win32CsrApiHeap, - 0, - HistoryEntry->Target.Buffer); - if (HistoryEntry->Device.Buffer) - (void) RtlFreeHeap(Win32CsrApiHeap, - 0, - HistoryEntry->Device.Buffer); - (void) RtlFreeHeap(Win32CsrApiHeap, - 0, - HistoryEntry); - } - } -} -/* EOF */ diff --git a/win32ss/user/win32csr/file.h b/win32ss/user/win32csr/file.h deleted file mode 100644 index fa33b62efd2..00000000000 --- a/win32ss/user/win32csr/file.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS system libraries - * FILE: subsystem/win32/csrss/win32csr/file.h - * PURPOSE: File handling - * PROGRAMMERS: Pierre Schweitzer (pierre.schweitzer@reactos.org) - * NOTE: Belongs to basesrv.dll - */ - -#pragma once - -#include "api.h" - -typedef struct tagCSRSS_DOS_DEVICE_HISTORY_ENTRY -{ - UNICODE_STRING Device; - UNICODE_STRING Target; - LIST_ENTRY Entry; -} CSRSS_DOS_DEVICE_HISTORY_ENTRY, *PCSRSS_DOS_DEVICE_HISTORY_ENTRY; - -/* Api functions */ -CSR_API(CsrGetTempFile); -CSR_API(CsrDefineDosDevice); - -/* functions */ -void CsrCleanupDefineDosDevice(); - -/* EOF */