Author: hbelusca Date: Sun Oct 21 17:18:33 2012 New Revision: 57589
URL: http://svn.reactos.org/svn/reactos?rev=57589&view=rev Log: [BASESRV] - Compile basesrv and add headers. Some other things are missing yet.
Added: branches/ros-csrss/include/reactos/subsys/win/basemsg.h (with props) Modified: branches/ros-csrss/include/reactos/subsys/win/base.h branches/ros-csrss/subsystems/win/basesrv/CMakeLists.txt branches/ros-csrss/subsystems/win/basesrv/basesrv.h branches/ros-csrss/subsystems/win/basesrv/init.c branches/ros-csrss/subsystems/win/basesrv/server.c
Modified: branches/ros-csrss/include/reactos/subsys/win/base.h URL: http://svn.reactos.org/svn/reactos/branches/ros-csrss/include/reactos/subsys... ============================================================================== --- branches/ros-csrss/include/reactos/subsys/win/base.h [iso-8859-1] (original) +++ branches/ros-csrss/include/reactos/subsys/win/base.h [iso-8859-1] Sun Oct 21 17:18:33 2012 @@ -1,17 +1,84 @@ -/*** Public header for BASESRV and the rest ***/
-#ifndef __INCLUDE_WIN_BASE_H -#define __INCLUDE_WIN_BASE_H +#ifndef __BASE_H__ +#define __BASE_H__
-//#include <csr/protocol.h> - -/* Base Server */ +#pragma once
typedef VOID (CALLBACK * BASE_PROCESS_CREATE_NOTIFY_ROUTINE)(PVOID);
NTSTATUS WINAPI BaseSetProcessCreateNotify (BASE_PROCESS_CREATE_NOTIFY_ROUTINE); CSR_SERVER_DLL_INIT(ServerDllInitialization);
-#endif // __INCLUDE_WIN_BASE_H + + +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; + +#endif // __BASE_H__
/* EOF */
Added: branches/ros-csrss/include/reactos/subsys/win/basemsg.h URL: http://svn.reactos.org/svn/reactos/branches/ros-csrss/include/reactos/subsys... ============================================================================== --- branches/ros-csrss/include/reactos/subsys/win/basemsg.h (added) +++ branches/ros-csrss/include/reactos/subsys/win/basemsg.h [iso-8859-1] Sun Oct 21 17:18:33 2012 @@ -1,0 +1,200 @@ + +#ifndef __BASEMSG_H__ +#define __BASEMSG_H__ + +#pragma once + +#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; + +#endif // __BASEMSG_H__ + +/* EOF */
Propchange: branches/ros-csrss/include/reactos/subsys/win/basemsg.h ------------------------------------------------------------------------------ svn:eol-style = native
Modified: branches/ros-csrss/subsystems/win/basesrv/CMakeLists.txt URL: http://svn.reactos.org/svn/reactos/branches/ros-csrss/subsystems/win/basesrv... ============================================================================== --- branches/ros-csrss/subsystems/win/basesrv/CMakeLists.txt [iso-8859-1] (original) +++ branches/ros-csrss/subsystems/win/basesrv/CMakeLists.txt [iso-8859-1] Sun Oct 21 17:18:33 2012 @@ -1,6 +1,5 @@
-include_directories(${REACTOS_SOURCE_DIR}/subsystems/win32/csrss/include - ${REACTOS_SOURCE_DIR}/include/reactos/subsys) +include_directories(${REACTOS_SOURCE_DIR}/include/reactos/subsys)
spec2def(basesrv.dll basesrv.spec)
@@ -14,7 +13,7 @@
target_link_libraries(basesrv ${PSEH_LIB})
-set_module_type(basesrv win32dll) +set_module_type(basesrv nativedll) # win32dll
add_importlibs(basesrv ntdll csrsrv)
Modified: branches/ros-csrss/subsystems/win/basesrv/basesrv.h URL: http://svn.reactos.org/svn/reactos/branches/ros-csrss/subsystems/win/basesrv... ============================================================================== --- branches/ros-csrss/subsystems/win/basesrv/basesrv.h [iso-8859-1] (original) +++ branches/ros-csrss/subsystems/win/basesrv/basesrv.h [iso-8859-1] Sun Oct 21 17:18:33 2012 @@ -1,289 +1,38 @@ -/*** Private header for BASESRV ***/ + +#ifndef __BASESRV_H__ +#define __BASESRV_H__
#pragma once
/* PSDK/NDK Headers */ -#include <stdio.h> +#define WIN32_NO_STATUS #include <windows.h> - #define NTOS_MODE_USER #include <ndk/ntndk.h>
/* CSRSS Header */ -#include <csrss/server.h> +#include <csr/csrsrv.h>
- +/* BASE Headers */ +#include <win/basemsg.h> #include <win/base.h>
+extern HANDLE BaseSrvHeap; +extern HANDLE BaseSrvSharedHeap; +extern PBASE_STATIC_SERVER_DATA BaseStaticServerData;
-#define BASESRV_SERVERDLL_INDEX 1 -#define BASESRV_FIRST_API_NUMBER 0 +VOID BaseCleanupDefineDosDevice(VOID);
+CSR_API(BaseSrvCreateProcess); +CSR_API(BaseSrvCreateThread); +CSR_API(BaseSrvGetTempFile); +CSR_API(BaseSrvExitProcess); +CSR_API(BaseSrvGetProcessShutdownParam); +CSR_API(BaseSrvSetProcessShutdownParam); +CSR_API(BaseSrvSoundSentryNotification); +CSR_API(BaseSrvDefineDosDevice);
-// 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, +#endif // __BASESRV_H__
- 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; - - +/* EOF */
Modified: branches/ros-csrss/subsystems/win/basesrv/init.c URL: http://svn.reactos.org/svn/reactos/branches/ros-csrss/subsystems/win/basesrv... ============================================================================== --- branches/ros-csrss/subsystems/win/basesrv/init.c [iso-8859-1] (original) +++ branches/ros-csrss/subsystems/win/basesrv/init.c [iso-8859-1] Sun Oct 21 17:18:33 2012 @@ -14,6 +14,11 @@ HANDLE DllHandle = NULL; HANDLE BaseApiPort = NULL;
+/* Memory */ +HANDLE BaseSrvHeap = NULL; // Our own heap. +HANDLE BaseSrvSharedHeap = NULL; // Shared heap with CSR. (CsrSrvSharedSectionHeap) +PBASE_STATIC_SERVER_DATA BaseStaticServerData = NULL; // Data that we can share amongst processes. Initialized inside BaseSrvSharedHeap. + extern LIST_ENTRY DosDeviceHistory; extern RTL_CRITICAL_SECTION BaseDefineDosDeviceCritSec;
@@ -27,12 +32,12 @@ BaseSrvGetTempFile, BaseSrvExitProcess, // BaseSrvDebugProcess, - BaseSrvCheckVDM, - BaseSrvUpdateVDMEntry, + // BaseSrvCheckVDM, + // BaseSrvUpdateVDMEntry, // BaseSrvGetNextVDMCommand, // BaseSrvExitVDM, // BaseSrvIsFirstVDM, - BaseSrvGetVDMExitCode, + // BaseSrvGetVDMExitCode, // BaseSrvSetReenterCount, BaseSrvSetProcessShutdownParam, BaseSrvGetProcessShutdownParam, @@ -56,12 +61,12 @@ TRUE, // SrvGetTempFile, FALSE, // SrvExitProcess, // FALSE, // SrvDebugProcess, - TRUE, // SrvCheckVDM, - TRUE, // SrvUpdateVDMEntry + // TRUE, // SrvCheckVDM, + // TRUE, // SrvUpdateVDMEntry // TRUE, // SrvGetNextVDMCommand // TRUE, // SrvExitVDM // TRUE, // SrvIsFirstVDM - TRUE, // SrvGetVDMExitCode + // TRUE, // SrvGetVDMExitCode // TRUE, // SrvSetReenterCount TRUE, // SrvSetProcessShutdownParam TRUE, // SrvGetProcessShutdownParam @@ -86,12 +91,12 @@ "BaseGetTempFile", "BaseExitProcess", // "BaseDebugProcess", - "BaseCheckVDM", - "BaseUpdateVDMEntry", + // "BaseCheckVDM", + // "BaseUpdateVDMEntry", // "BaseGetNextVDMCommand", // "BaseExitVDM", // "BaseIsFirstVDM", - "BaseGetVDMExitCode", + // "BaseGetVDMExitCode", // "BaseSetReenterCount", "BaseSetProcessShutdownParam", "BaseGetProcessShutdownParam", @@ -112,9 +117,126 @@
/* FUNCTIONS ******************************************************************/
+NTSTATUS +NTAPI +CreateBaseAcls(OUT PACL* Dacl, + OUT PACL* RestrictedDacl) +{ + PSID SystemSid, WorldSid, RestrictedSid; + SID_IDENTIFIER_AUTHORITY NtAuthority = {SECURITY_NT_AUTHORITY}; + SID_IDENTIFIER_AUTHORITY WorldAuthority = {SECURITY_WORLD_SID_AUTHORITY}; + NTSTATUS Status; + // UCHAR KeyValueBuffer[0x40]; + // PKEY_VALUE_PARTIAL_INFORMATION KeyValuePartialInfo; + // UNICODE_STRING KeyName; + // ULONG ProtectionMode = 0; + ULONG AclLength; // , ResultLength; + // HANDLE hKey; + // OBJECT_ATTRIBUTES ObjectAttributes; + + /* Open the Session Manager Key */ + /* + RtlInitUnicodeString(&KeyName, SM_REG_KEY); + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + Status = NtOpenKey(&hKey, KEY_READ, &ObjectAttributes); + if (NT_SUCCESS(Status)) + { + /* Read the key value */ + RtlInitUnicodeString(&KeyName, L"ProtectionMode"); + Status = NtQueryValueKey(hKey, + &KeyName, + KeyValuePartialInformation, + KeyValueBuffer, + sizeof(KeyValueBuffer), + &ResultLength); + + /* Make sure it's what we expect it to be */ + KeyValuePartialInfo = (PKEY_VALUE_PARTIAL_INFORMATION)KeyValueBuffer; + if ((NT_SUCCESS(Status)) && (KeyValuePartialInfo->Type == REG_DWORD) && + (*(PULONG)KeyValuePartialInfo->Data)) + { + /* Save the Protection Mode */ + // ProtectionMode = *(PULONG)KeyValuePartialInfo->Data; + } + + /* Close the handle */ + NtClose(hKey); + } + */ + + /* Allocate the System SID */ + Status = RtlAllocateAndInitializeSid(&NtAuthority, + 1, SECURITY_LOCAL_SYSTEM_RID, + 0, 0, 0, 0, 0, 0, 0, + &SystemSid); + ASSERT(NT_SUCCESS(Status)); + + /* Allocate the World SID */ + Status = RtlAllocateAndInitializeSid(&WorldAuthority, + 1, SECURITY_WORLD_RID, + 0, 0, 0, 0, 0, 0, 0, + &WorldSid); + ASSERT(NT_SUCCESS(Status)); + + /* Allocate the restricted SID */ + Status = RtlAllocateAndInitializeSid(&NtAuthority, + 1, SECURITY_RESTRICTED_CODE_RID, + 0, 0, 0, 0, 0, 0, 0, + &RestrictedSid); + ASSERT(NT_SUCCESS(Status)); + + /* Allocate one ACL with 3 ACEs each for one SID */ + AclLength = sizeof(ACL) + 3 * sizeof(ACCESS_ALLOWED_ACE) + + RtlLengthSid(SystemSid) + + RtlLengthSid(RestrictedSid) + + RtlLengthSid(WorldSid); + *Dacl = RtlAllocateHeap(BaseSrvHeap, 0, AclLength); + ASSERT(*Dacl != NULL); + + /* Set the correct header fields */ + Status = RtlCreateAcl(*Dacl, AclLength, ACL_REVISION2); + ASSERT(NT_SUCCESS(Status)); + + /* Give the appropriate rights to each SID */ + /* FIXME: Should check SessionId/ProtectionMode */ + Status = RtlAddAccessAllowedAce(*Dacl, ACL_REVISION2, DIRECTORY_QUERY | DIRECTORY_TRAVERSE | DIRECTORY_CREATE_OBJECT | DIRECTORY_CREATE_SUBDIRECTORY | READ_CONTROL, WorldSid); + ASSERT(NT_SUCCESS(Status)); + Status = RtlAddAccessAllowedAce(*Dacl, ACL_REVISION2, DIRECTORY_ALL_ACCESS, SystemSid); + ASSERT(NT_SUCCESS(Status)); + Status = RtlAddAccessAllowedAce(*Dacl, ACL_REVISION2, DIRECTORY_TRAVERSE, RestrictedSid); + ASSERT(NT_SUCCESS(Status)); + + /* Now allocate the restricted DACL */ + *RestrictedDacl = RtlAllocateHeap(BaseSrvHeap, 0, AclLength); + ASSERT(*RestrictedDacl != NULL); + + /* Initialize it */ + Status = RtlCreateAcl(*RestrictedDacl, AclLength, ACL_REVISION2); + ASSERT(NT_SUCCESS(Status)); + + /* And add the same ACEs as before */ + /* FIXME: Not really fully correct */ + Status = RtlAddAccessAllowedAce(*RestrictedDacl, ACL_REVISION2, DIRECTORY_QUERY | DIRECTORY_TRAVERSE | DIRECTORY_CREATE_OBJECT | DIRECTORY_CREATE_SUBDIRECTORY | READ_CONTROL, WorldSid); + ASSERT(NT_SUCCESS(Status)); + Status = RtlAddAccessAllowedAce(*RestrictedDacl, ACL_REVISION2, DIRECTORY_ALL_ACCESS, SystemSid); + ASSERT(NT_SUCCESS(Status)); + Status = RtlAddAccessAllowedAce(*RestrictedDacl, ACL_REVISION2, DIRECTORY_TRAVERSE, RestrictedSid); + ASSERT(NT_SUCCESS(Status)); + + /* The SIDs are captured, can free them now */ + RtlFreeHeap(BaseSrvHeap, 0, SystemSid); + RtlFreeHeap(BaseSrvHeap, 0, WorldSid); + RtlFreeHeap(BaseSrvHeap, 0, RestrictedSid); + return Status; +} + VOID NTAPI -BasepFakeStaticServerData(VOID) +BaseInitializeStaticServerData(IN PCSR_SERVER_DLL LoadedServerDll) { NTSTATUS Status; WCHAR Buffer[MAX_PATH]; @@ -147,6 +269,10 @@ {0} };
+ /* Initialize memory */ + BaseSrvHeap = RtlGetProcessHeap(); // Initialize our own heap. + BaseSrvSharedHeap = LoadedServerDll->SharedSection; // Get the CSR shared heap. + /* Get the session ID */ SessionId = NtCurrentPeb()->SessionId;
@@ -175,7 +301,7 @@ RtlInitUnicodeString(&BnoString, Buffer);
/* Allocate the server data */ - BaseStaticServerData = RtlAllocateHeap(CsrSrvSharedSectionHeap, + BaseStaticServerData = RtlAllocateHeap(BaseSrvSharedHeap, HEAP_ZERO_MEMORY, sizeof(BASE_STATIC_SERVER_DATA)); ASSERT(BaseStaticServerData != NULL); @@ -191,7 +317,7 @@
/* Make a shared heap copy of the Windows directory */ BaseStaticServerData->WindowsDirectory = BaseSrvWindowsDirectory; - HeapBuffer = RtlAllocateHeap(CsrSrvSharedSectionHeap, + HeapBuffer = RtlAllocateHeap(BaseSrvSharedHeap, 0, BaseSrvWindowsDirectory.MaximumLength); ASSERT(HeapBuffer); @@ -202,7 +328,7 @@
/* Make a shared heap copy of the System directory */ BaseStaticServerData->WindowsSystemDirectory = BaseSrvWindowsSystemDirectory; - HeapBuffer = RtlAllocateHeap(CsrSrvSharedSectionHeap, + HeapBuffer = RtlAllocateHeap(BaseSrvSharedHeap, 0, BaseSrvWindowsSystemDirectory.MaximumLength); ASSERT(HeapBuffer); @@ -220,7 +346,7 @@ BaseStaticServerData->NamedObjectDirectory = BnoString; BaseStaticServerData->NamedObjectDirectory.MaximumLength = BnoString.Length + sizeof(UNICODE_NULL); - HeapBuffer = RtlAllocateHeap(CsrSrvSharedSectionHeap, + HeapBuffer = RtlAllocateHeap(BaseSrvSharedHeap, 0, BaseStaticServerData->NamedObjectDirectory.MaximumLength); ASSERT(HeapBuffer); @@ -272,7 +398,7 @@ BaseStaticServerData->IsWowTaskReady = FALSE;
/* Allocate a security descriptor and create it */ - BnoSd = RtlAllocateHeap(CsrHeap, 0, 1024); + BnoSd = RtlAllocateHeap(BaseSrvHeap, 0, 1024); ASSERT(BnoSd); Status = RtlCreateSecurityDescriptor(BnoSd, SECURITY_DESCRIPTOR_REVISION); ASSERT(NT_SUCCESS(Status)); @@ -376,13 +502,14 @@ }
/* Finally, set the pointer */ - CsrSrvSharedStaticServerData[CSR_CONSOLE] = BaseStaticServerData; + // CsrSrvSharedStaticServerData[CSR_CONSOLE] = BaseStaticServerData; + LoadedServerDll->SharedSection = BaseStaticServerData; }
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; @@ -396,7 +523,7 @@ { default: Reply = Request; - Status = NtReplyPort(BaseApiPort, Reply); + /* Status =*/ NtReplyPort(BaseApiPort, Reply); break; } } @@ -427,8 +554,7 @@ LoadedServerDll->SizeOfProcessData = 0; LoadedServerDll->ConnectCallback = NULL; LoadedServerDll->DisconnectCallback = NULL; - - BasepFakeStaticServerData(); + BaseInitializeStaticServerData(LoadedServerDll);
RtlInitializeCriticalSection(&BaseDefineDosDeviceCritSec); InitializeListHead(&DosDeviceHistory);
Modified: branches/ros-csrss/subsystems/win/basesrv/server.c URL: http://svn.reactos.org/svn/reactos/branches/ros-csrss/subsystems/win/basesrv... ============================================================================== --- branches/ros-csrss/subsystems/win/basesrv/server.c [iso-8859-1] (original) +++ branches/ros-csrss/subsystems/win/basesrv/server.c [iso-8859-1] Sun Oct 21 17:18:33 2012 @@ -12,15 +12,44 @@ #include <debug.h>
-extern NTSTATUS CallProcessCreated(PCSR_PROCESS, PCSR_PROCESS); // TODO: Import it from csrsrv/init.c +// extern NTSTATUS CallProcessCreated(PCSR_PROCESS, PCSR_PROCESS); // TODO: Import it from csrsrv/init.c +// Remove it and correct csrsrv instead... +#if 0 +NTSTATUS +CallProcessCreated(IN PCSR_PROCESS SourceProcessData, + IN PCSR_PROCESS TargetProcessData) +{ + NTSTATUS Status = STATUS_SUCCESS; + ULONG i; + PCSR_SERVER_DLL ServerDll; + + DPRINT("CSR: %s called\n", __FUNCTION__); + + /* Notify the Server DLLs */ + for (i = 0; i < CSR_SERVER_DLL_MAX; i++) + { + /* Get the current Server DLL */ + ServerDll = CsrLoadedServerDll[i]; + + /* Make sure it's valid and that it has callback */ + if ((ServerDll) && (ServerDll->NewProcessCallback)) + { + Status = ServerDll->NewProcessCallback(SourceProcessData, TargetProcessData); + } + } + + return Status; +} +#endif
CSR_API(BaseSrvCreateProcess) { NTSTATUS Status; + PBASE_CREATE_PROCESS CreateProcessRequest = &((PBASE_API_MESSAGE)ApiMessage)->Data.CreateProcessRequest; HANDLE ProcessHandle, ThreadHandle; PCSR_THREAD CsrThread; - PCSR_PROCESS Process, NewProcess; - ULONG Flags, VdmPower = 0, DebugFlags = 0; + PCSR_PROCESS Process; // , NewProcess; + ULONG /* Flags, */ VdmPower = 0, DebugFlags = 0;
/* Get the current client thread */ CsrThread = CsrGetClientThread(); @@ -29,12 +58,12 @@ 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); + // Flags = (ULONG_PTR)CreateProcessRequest->ProcessHandle & 3; + CreateProcessRequest->ProcessHandle = (HANDLE)((ULONG_PTR)CreateProcessRequest->ProcessHandle & ~3);
/* Duplicate the process handle */ Status = NtDuplicateObject(Process->ProcessHandle, - ApiMessage->Data.CreateProcessRequest.ProcessHandle, + CreateProcessRequest->ProcessHandle, NtCurrentProcess(), &ProcessHandle, 0, @@ -48,7 +77,7 @@
/* Duplicate the thread handle */ Status = NtDuplicateObject(Process->ProcessHandle, - ApiMessage->Data.CreateProcessRequest.ThreadHandle, + CreateProcessRequest->ThreadHandle, NtCurrentProcess(), &ThreadHandle, 0, @@ -79,7 +108,7 @@ }
/* Convert some flags. FIXME: More need conversion */ - if (ApiMessage->Data.CreateProcessRequest.CreationFlags & CREATE_NEW_PROCESS_GROUP) + if (CreateProcessRequest->CreationFlags & CREATE_NEW_PROCESS_GROUP) { DebugFlags |= CsrProcessCreateNewGroup; } @@ -89,7 +118,7 @@ /* Call CSRSRV to create the CSR_PROCESS structure and the first CSR_THREAD */ Status = CsrCreateProcess(ProcessHandle, ThreadHandle, - &ApiMessage->Data.CreateProcessRequest.ClientId, + &CreateProcessRequest->ClientId, Process->NtSession, DebugFlags, NULL); @@ -111,16 +140,18 @@ /* FIXME: VDM vodoo */
/* ReactOS Compatibility */ - Status = CsrLockProcessByClientId(ApiMessage->Data.CreateProcessRequest.ClientId.UniqueProcess, &NewProcess); +#if 0 + Status = CsrLockProcessByClientId(CreateProcessRequest->ClientId.UniqueProcess, &NewProcess); ASSERT(Status == STATUS_SUCCESS); - if (!(ApiMessage->Data.CreateProcessRequest.CreationFlags & (CREATE_NEW_CONSOLE | DETACHED_PROCESS))) + if (!(CreateProcessRequest->CreationFlags & (CREATE_NEW_CONSOLE | DETACHED_PROCESS))) { NewProcess->ParentConsole = Process->Console; - NewProcess->bInheritHandles = ApiMessage->Data.CreateProcessRequest.bInheritHandles; + NewProcess->bInheritHandles = CreateProcessRequest->bInheritHandles; } RtlInitializeCriticalSection(&NewProcess->HandleTableLock); CallProcessCreated(Process, NewProcess); CsrUnlockProcess(NewProcess); +#endif
/* Return the result of this operation */ return Status; @@ -128,9 +159,10 @@
CSR_API(BaseSrvCreateThread) { + NTSTATUS Status; + PBASE_CREATE_THREAD CreateThreadRequest = &((PBASE_API_MESSAGE)ApiMessage)->Data.CreateThreadRequest; PCSR_THREAD CurrentThread; HANDLE ThreadHandle; - NTSTATUS Status; PCSR_PROCESS CsrProcess;
/* Get the current CSR thread */ @@ -138,32 +170,32 @@ if (!CurrentThread) { DPRINT1("Server Thread TID: [%lx.%lx]\n", - ApiMessage->Data.CreateThreadRequest.ClientId.UniqueProcess, - ApiMessage->Data.CreateThreadRequest.ClientId.UniqueThread); + CreateThreadRequest->ClientId.UniqueProcess, + 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) + CreateThreadRequest->ClientId.UniqueProcess) { /* This is a remote thread request -- is it within the server itself? */ - if (ApiMessage->Data.CreateThreadRequest.ClientId.UniqueProcess == NtCurrentTeb()->ClientId.UniqueProcess) + if (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, + Status = CsrLockProcessByClientId(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, + CreateThreadRequest->ThreadHandle, NtCurrentProcess(), &ThreadHandle, 0, @@ -174,7 +206,7 @@ /* Call CSRSRV to tell it about the new thread */ Status = CsrCreateThread(CsrProcess, ThreadHandle, - &ApiMessage->Data.CreateThreadRequest.ClientId); + &CreateThreadRequest->ClientId); }
/* Unlock the process and return */ @@ -185,11 +217,12 @@ CSR_API(BaseSrvGetTempFile) { static UINT CsrGetTempFileUnique = 0; + PBASE_GET_TEMP_FILE GetTempFile = &((PBASE_API_MESSAGE)ApiMessage)->Data.GetTempFile;
/* Return 16-bits ID */ - ApiMessage->Data.GetTempFile.UniqueID = (++CsrGetTempFileUnique & 0xFFFF); - - DPRINT("Returning: %u\n", ApiMessage->Data.GetTempFile.UniqueID); + GetTempFile->UniqueID = (++CsrGetTempFileUnique & 0xFFFF); + + DPRINT("Returning: %u\n", GetTempFile->UniqueID);
return STATUS_SUCCESS; } @@ -204,27 +237,29 @@
/* Remove the CSR_THREADs and CSR_PROCESS */ return CsrDestroyProcess(&CsrThread->ClientId, - (NTSTATUS)ApiMessage->Data.TerminateProcessRequest.uExitCode); + (NTSTATUS)((PBASE_API_MESSAGE)ApiMessage)->Data.ExitProcessRequest.uExitCode); }
CSR_API(BaseSrvGetProcessShutdownParam) { + PBASE_GET_PROCESS_SHUTDOWN_PARAMS GetShutdownParametersRequest = &((PBASE_API_MESSAGE)ApiMessage)->Data.GetShutdownParametersRequest; PCSR_THREAD CsrThread = CsrGetClientThread(); ASSERT(CsrThread);
- ApiMessage->Data.GetShutdownParametersRequest.Level = CsrThread->Process->ShutdownLevel; - ApiMessage->Data.GetShutdownParametersRequest.Flags = CsrThread->Process->ShutdownFlags; + GetShutdownParametersRequest->Level = CsrThread->Process->ShutdownLevel; + GetShutdownParametersRequest->Flags = CsrThread->Process->ShutdownFlags;
return STATUS_SUCCESS; }
CSR_API(BaseSrvSetProcessShutdownParam) { + PBASE_SET_PROCESS_SHUTDOWN_PARAMS SetShutdownParametersRequest = &((PBASE_API_MESSAGE)ApiMessage)->Data.SetShutdownParametersRequest; PCSR_THREAD CsrThread = CsrGetClientThread(); ASSERT(CsrThread);
- CsrThread->Process->ShutdownLevel = ApiMessage->Data.SetShutdownParametersRequest.Level; - CsrThread->Process->ShutdownFlags = ApiMessage->Data.SetShutdownParametersRequest.Flags; + CsrThread->Process->ShutdownLevel = SetShutdownParametersRequest->Level; + CsrThread->Process->ShutdownFlags = SetShutdownParametersRequest->Flags;
return STATUS_SUCCESS; } @@ -284,21 +319,56 @@ *** Dos Devices (C) Pierre Schweitzer (pierre.schweitzer@reactos.org) ***/
-typedef struct tagCSRSS_DOS_DEVICE_HISTORY_ENTRY +typedef struct tagBASE_DOS_DEVICE_HISTORY_ENTRY { UNICODE_STRING Device; UNICODE_STRING Target; LIST_ENTRY Entry; -} CSRSS_DOS_DEVICE_HISTORY_ENTRY, *PCSRSS_DOS_DEVICE_HISTORY_ENTRY; +} BASE_DOS_DEVICE_HISTORY_ENTRY, *PBASE_DOS_DEVICE_HISTORY_ENTRY;
LIST_ENTRY DosDeviceHistory; RTL_CRITICAL_SECTION BaseDefineDosDeviceCritSec;
+VOID BaseCleanupDefineDosDevice(VOID) +{ + PLIST_ENTRY Entry, ListHead; + PBASE_DOS_DEVICE_HISTORY_ENTRY HistoryEntry; + + (void) RtlDeleteCriticalSection(&BaseDefineDosDeviceCritSec); + + ListHead = &DosDeviceHistory; + Entry = ListHead->Flink; + while (Entry != ListHead) + { + HistoryEntry = (PBASE_DOS_DEVICE_HISTORY_ENTRY) + CONTAINING_RECORD(Entry, + BASE_DOS_DEVICE_HISTORY_ENTRY, + Entry); + Entry = Entry->Flink; + + if (HistoryEntry) + { + if (HistoryEntry->Target.Buffer) + (void) RtlFreeHeap(BaseSrvHeap, + 0, + HistoryEntry->Target.Buffer); + if (HistoryEntry->Device.Buffer) + (void) RtlFreeHeap(BaseSrvHeap, + 0, + HistoryEntry->Device.Buffer); + (void) RtlFreeHeap(BaseSrvHeap, + 0, + HistoryEntry); + } + } +} + CSR_API(BaseSrvDefineDosDevice) { + NTSTATUS Status; + PBASE_DEFINE_DOS_DEVICE DefineDosDeviceRequest = &((PBASE_API_MESSAGE)ApiMessage)->Data.DefineDosDeviceRequest; OBJECT_ATTRIBUTES ObjectAttributes; HANDLE LinkHandle = NULL; - NTSTATUS Status; UNICODE_STRING DeviceName = {0}; UNICODE_STRING RequestDeviceName = {0}; UNICODE_STRING LinkTarget = {0}; @@ -312,7 +382,7 @@ PSID SystemSid; PSID WorldSid; ULONG SidLength; - PCSRSS_DOS_DEVICE_HISTORY_ENTRY HistoryEntry; + PBASE_DOS_DEVICE_HISTORY_ENTRY HistoryEntry; PLIST_ENTRY Entry; PLIST_ENTRY ListHead; BOOLEAN Matched, AddHistory; @@ -320,16 +390,16 @@ PWSTR lpBuffer;
DPRINT("CsrDefineDosDevice entered, Flags:%d, DeviceName:%wZ, TargetName:%wZ\n", - ApiMessage->Data.DefineDosDeviceRequest.dwFlags, - &ApiMessage->Data.DefineDosDeviceRequest.DeviceName, - &ApiMessage->Data.DefineDosDeviceRequest.TargetName); + DefineDosDeviceRequest->dwFlags, + &DefineDosDeviceRequest->DeviceName, + &DefineDosDeviceRequest->TargetName);
Matched = AddHistory = FALSE; HistoryEntry = NULL; AdminSid = SystemSid = WorldSid = NULL; SecurityDescriptor = NULL; ListHead = &DosDeviceHistory; - dwFlags = ApiMessage->Data.DefineDosDeviceRequest.dwFlags; + dwFlags = DefineDosDeviceRequest->dwFlags;
/* Validate the flags */ if ( (dwFlags & 0xFFFFFFF0) || @@ -351,14 +421,13 @@ { Status = RtlUpcaseUnicodeString(&RequestDeviceName, - &ApiMessage->Data.DefineDosDeviceRequest.DeviceName, + &DefineDosDeviceRequest->DeviceName, TRUE); if (! NT_SUCCESS(Status)) _SEH2_LEAVE;
- RequestLinkTarget = - &ApiMessage->Data.DefineDosDeviceRequest.TargetName; - lpBuffer = (PWSTR) RtlAllocateHeap(Win32CsrApiHeap, + RequestLinkTarget = &DefineDosDeviceRequest->TargetName; + lpBuffer = (PWSTR) RtlAllocateHeap(BaseSrvHeap, HEAP_ZERO_MEMORY, RequestDeviceName.MaximumLength + 5 * sizeof(WCHAR)); if (! lpBuffer) @@ -392,7 +461,7 @@ LinkTarget.Length = 0; LinkTarget.MaximumLength = Length; LinkTarget.Buffer = (PWSTR) - RtlAllocateHeap(Win32CsrApiHeap, + RtlAllocateHeap(BaseSrvHeap, HEAP_ZERO_MEMORY, Length); if (! LinkTarget.Buffer) @@ -444,9 +513,9 @@ Entry = ListHead->Flink; while (Entry != ListHead) { - HistoryEntry = (PCSRSS_DOS_DEVICE_HISTORY_ENTRY) + HistoryEntry = (PBASE_DOS_DEVICE_HISTORY_ENTRY) CONTAINING_RECORD(Entry, - CSRSS_DOS_DEVICE_HISTORY_ENTRY, + BASE_DOS_DEVICE_HISTORY_ENTRY, Entry); Matched = ! RtlCompareUnicodeString(&RequestDeviceName, @@ -473,9 +542,9 @@ Entry = ListHead->Flink; while (Entry != ListHead) { - HistoryEntry = (PCSRSS_DOS_DEVICE_HISTORY_ENTRY) + HistoryEntry = (PBASE_DOS_DEVICE_HISTORY_ENTRY) CONTAINING_RECORD(Entry, - CSRSS_DOS_DEVICE_HISTORY_ENTRY, + BASE_DOS_DEVICE_HISTORY_ENTRY, Entry); Matched = ! RtlCompareUnicodeString(&RequestDeviceName, @@ -551,10 +620,10 @@
if (AddHistory) { - HistoryEntry = (PCSRSS_DOS_DEVICE_HISTORY_ENTRY) - RtlAllocateHeap(Win32CsrApiHeap, + HistoryEntry = (PBASE_DOS_DEVICE_HISTORY_ENTRY) + RtlAllocateHeap(BaseSrvHeap, HEAP_ZERO_MEMORY, - sizeof(CSRSS_DOS_DEVICE_HISTORY_ENTRY)); + sizeof(BASE_DOS_DEVICE_HISTORY_ENTRY)); if (! HistoryEntry) { DPRINT1("Failed to allocate memory\n"); @@ -563,7 +632,7 @@ }
HistoryEntry->Target.Buffer = - RtlAllocateHeap(Win32CsrApiHeap, + RtlAllocateHeap(BaseSrvHeap, HEAP_ZERO_MEMORY, LinkTarget.Length); if (! HistoryEntry->Target.Buffer) @@ -579,7 +648,7 @@ &LinkTarget);
HistoryEntry->Device.Buffer = - RtlAllocateHeap(Win32CsrApiHeap, + RtlAllocateHeap(BaseSrvHeap, HEAP_ZERO_MEMORY, RequestDeviceName.Length); if (! HistoryEntry->Device.Buffer) @@ -641,7 +710,7 @@ RtlLengthSid(WorldSid); Length = sizeof(ACL) + SidLength + 3 * sizeof(ACCESS_ALLOWED_ACE);
- SecurityDescriptor = RtlAllocateHeap(Win32CsrApiHeap, + SecurityDescriptor = RtlAllocateHeap(BaseSrvHeap, 0, SECURITY_DESCRIPTOR_MIN_LENGTH + Length); if (! SecurityDescriptor) @@ -723,15 +792,15 @@ { (void) RtlLeaveCriticalSection(&BaseDefineDosDeviceCritSec); if (DeviceName.Buffer) - (void) RtlFreeHeap(Win32CsrApiHeap, + (void) RtlFreeHeap(BaseSrvHeap, 0, DeviceName.Buffer); if (LinkTarget.Buffer) - (void) RtlFreeHeap(Win32CsrApiHeap, + (void) RtlFreeHeap(BaseSrvHeap, 0, LinkTarget.Buffer); if (SecurityDescriptor) - (void) RtlFreeHeap(Win32CsrApiHeap, + (void) RtlFreeHeap(BaseSrvHeap, 0, SecurityDescriptor); if (LinkHandle) @@ -746,14 +815,14 @@ if (HistoryEntry) { if (HistoryEntry->Target.Buffer) - (void) RtlFreeHeap(Win32CsrApiHeap, + (void) RtlFreeHeap(BaseSrvHeap, 0, HistoryEntry->Target.Buffer); if (HistoryEntry->Device.Buffer) - (void) RtlFreeHeap(Win32CsrApiHeap, + (void) RtlFreeHeap(BaseSrvHeap, 0, HistoryEntry->Device.Buffer); - (void) RtlFreeHeap(Win32CsrApiHeap, + (void) RtlFreeHeap(BaseSrvHeap, 0, HistoryEntry); } @@ -764,40 +833,6 @@ 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); - } - } -} -