mirror of
https://github.com/reactos/reactos.git
synced 2025-02-22 16:36:33 +00:00
[CSR]
Remove old csrss. svn path=/branches/ros-csrss/; revision=57579
This commit is contained in:
parent
61d07a5b47
commit
13811a0034
15 changed files with 0 additions and 7272 deletions
|
@ -1,16 +0,0 @@
|
|||
|
||||
include_directories(
|
||||
include
|
||||
${REACTOS_SOURCE_DIR}/include/reactos/subsys
|
||||
${REACTOS_SOURCE_DIR}/include/reactos/drivers)
|
||||
|
||||
add_executable(csrss2 main.c csr.rc)
|
||||
|
||||
set_module_type(csrss2 nativecui)
|
||||
target_link_libraries(csrss2 nt)
|
||||
add_importlibs(csrss2 ntdll csrsrv2)
|
||||
add_dependencies(csrss2 psdk bugcodes)
|
||||
add_cd_file(TARGET csrss2 DESTINATION reactos/system32 FOR all)
|
||||
|
||||
add_subdirectory(csrsrv)
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
#define REACTOS_STR_FILE_DESCRIPTION "Client/Server Runtime Process\0"
|
||||
#define REACTOS_STR_INTERNAL_NAME "csrss\0"
|
||||
#define REACTOS_STR_ORIGINAL_FILENAME "csrss.exe\0"
|
||||
#include <reactos/version.rc>
|
|
@ -1,30 +0,0 @@
|
|||
|
||||
include_directories(${REACTOS_SOURCE_DIR}/subsystems/win32/csrss/include)
|
||||
include_directories(${REACTOS_SOURCE_DIR}/include/reactos/subsys)
|
||||
|
||||
spec2def(csrsrv2.dll csrsrv2.spec ADD_IMPORTLIB)
|
||||
|
||||
list(APPEND SOURCE
|
||||
api.c
|
||||
init.c
|
||||
process.c
|
||||
server.c
|
||||
session.c
|
||||
thread.c
|
||||
wait.c
|
||||
csrsrv.rc
|
||||
${CMAKE_CURRENT_BINARY_DIR}/csrsrv2.def)
|
||||
|
||||
add_library(csrsrv2 SHARED ${SOURCE})
|
||||
|
||||
target_link_libraries(csrsrv2 ${PSEH_LIB} smlib)
|
||||
|
||||
set_module_type(csrsrv2 nativedll)
|
||||
|
||||
add_importlibs(csrsrv2 ntdll)
|
||||
|
||||
add_pch(csrsrv2 srv.h)
|
||||
|
||||
add_dependencies(csrsrv2 psdk bugcodes)
|
||||
add_cd_file(TARGET csrsrv2 DESTINATION reactos/system32 FOR all)
|
||||
|
File diff suppressed because it is too large
Load diff
|
@ -1,5 +0,0 @@
|
|||
#define REACTOS_VERSION_DLL
|
||||
#define REACTOS_STR_FILE_DESCRIPTION "ReactOS CSR Core Server\0"
|
||||
#define REACTOS_STR_INTERNAL_NAME "csrsrv\0"
|
||||
#define REACTOS_STR_ORIGINAL_FILENAME "csrsrv.dll\0"
|
||||
#include <reactos/version.rc>
|
|
@ -1,35 +0,0 @@
|
|||
@ stdcall CsrAddStaticServerThread(ptr ptr long)
|
||||
@ stdcall CsrCallServerFromServer(ptr ptr)
|
||||
@ stdcall CsrConnectToUser()
|
||||
@ stdcall CsrCreateProcess(ptr ptr ptr ptr long ptr)
|
||||
@ stdcall CsrCreateRemoteThread(ptr ptr)
|
||||
@ stdcall CsrCreateThread(ptr ptr ptr long)
|
||||
@ stdcall CsrCreateWait(ptr ptr ptr ptr ptr ptr)
|
||||
@ stdcall CsrDebugProcess(ptr)
|
||||
@ stdcall CsrDebugProcessStop(ptr)
|
||||
@ stdcall CsrDereferenceProcess(ptr)
|
||||
@ stdcall CsrDereferenceThread(ptr)
|
||||
@ stdcall CsrDereferenceWait(ptr)
|
||||
@ stdcall CsrDestroyProcess(ptr long)
|
||||
@ stdcall CsrDestroyThread(ptr)
|
||||
@ stdcall CsrExecServerThread(ptr long)
|
||||
@ stdcall CsrGetProcessLuid(ptr ptr)
|
||||
@ stdcall CsrImpersonateClient(ptr)
|
||||
@ stdcall CsrLockProcessByClientId(ptr ptr)
|
||||
@ stdcall CsrLockThreadByClientId(ptr ptr)
|
||||
@ stdcall CsrMoveSatisfiedWait(ptr ptr)
|
||||
@ stdcall CsrNotifyWait(ptr long ptr ptr)
|
||||
@ stdcall CsrPopulateDosDevices()
|
||||
@ stdcall CsrQueryApiPort()
|
||||
@ stdcall CsrReferenceThread(ptr)
|
||||
@ stdcall CsrRevertToSelf()
|
||||
@ stdcall CsrServerInitialization(long ptr)
|
||||
@ stdcall CsrSetBackgroundPriority(ptr)
|
||||
@ stdcall CsrSetCallingSpooler(long)
|
||||
@ stdcall CsrSetForegroundPriority(ptr)
|
||||
@ stdcall CsrShutdownProcesses(ptr long)
|
||||
@ stdcall CsrUnhandledExceptionFilter(ptr)
|
||||
@ stdcall CsrUnlockProcess(ptr)
|
||||
@ stdcall CsrUnlockThread(ptr)
|
||||
@ stdcall CsrValidateMessageBuffer(ptr ptr long long)
|
||||
@ stdcall CsrValidateMessageString(ptr ptr)
|
|
@ -1,988 +0,0 @@
|
|||
/*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS CSR Sub System
|
||||
* FILE: subsys/csr/csrsrv/init.c
|
||||
* PURPOSE: CSR Server DLL Initialization
|
||||
* PROGRAMMERS: Alex Ionescu (alex@relsoft.net)
|
||||
*/
|
||||
|
||||
/* INCLUDES ******************************************************************/
|
||||
|
||||
#include "srv.h"
|
||||
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
/* DATA **********************************************************************/
|
||||
|
||||
HANDLE CsrObjectDirectory;
|
||||
ULONG SessionId;
|
||||
BOOLEAN CsrProfileControl;
|
||||
UNICODE_STRING CsrDirectoryName;
|
||||
HANDLE CsrHeap;
|
||||
HANDLE BNOLinksDirectory;
|
||||
HANDLE SessionObjectDirectory;
|
||||
HANDLE DosDevicesDirectory;
|
||||
HANDLE CsrInitializationEvent;
|
||||
SYSTEM_BASIC_INFORMATION CsrNtSysInfo;
|
||||
ULONG CsrDebug;
|
||||
|
||||
/* PRIVATE FUNCTIONS *********************************************************/
|
||||
|
||||
/*++
|
||||
* @name CsrParseServerCommandLine
|
||||
*
|
||||
* The CsrParseServerCommandLine routine parses the CSRSS command-line in the
|
||||
* registry and performs operations for each entry found.
|
||||
*
|
||||
* @param ArgumentCount
|
||||
* Number of arguments on the command line.
|
||||
*
|
||||
* @param Arguments
|
||||
* Array of arguments.
|
||||
*
|
||||
* @return STATUS_SUCCESS in case of success, STATUS_UNSUCCESSFUL
|
||||
* othwerwise.
|
||||
*
|
||||
* @remarks None.
|
||||
*
|
||||
*--*/
|
||||
NTSTATUS
|
||||
FASTCALL
|
||||
CsrParseServerCommandLine(IN ULONG ArgumentCount,
|
||||
IN PCHAR Arguments[])
|
||||
{
|
||||
NTSTATUS Status;
|
||||
PCHAR ParameterName = NULL, ParameterValue = NULL, EntryPoint, ServerString;
|
||||
ULONG i, DllIndex;
|
||||
ANSI_STRING AnsiString;
|
||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||
|
||||
/* Set the Defaults */
|
||||
CsrTotalPerProcessDataLength = 0;
|
||||
CsrObjectDirectory = 0;
|
||||
CsrMaxApiRequestThreads = 16;
|
||||
|
||||
/* Save our Session ID, and create a Directory for it */
|
||||
SessionId = NtCurrentPeb()->SessionId;
|
||||
Status = CsrCreateSessionObjectDirectory(SessionId);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("CSRSS: CsrCreateSessionObjectDirectory failed (%lx)\n",
|
||||
Status);
|
||||
|
||||
/* It's not fatal if the session ID isn't zero */
|
||||
if (SessionId) return Status;
|
||||
ASSERT(NT_SUCCESS(Status));
|
||||
}
|
||||
|
||||
/* Loop through every argument */
|
||||
for (i = 1; i < ArgumentCount; i++)
|
||||
{
|
||||
/* Split Name and Value */
|
||||
ParameterName = Arguments[i];
|
||||
ParameterValue = NULL;
|
||||
ParameterValue = strchr(ParameterName, '=');
|
||||
if (ParameterValue) *ParameterValue++ = ANSI_NULL;
|
||||
DPRINT1("Name=%s, Value=%s\n", ParameterName, ParameterValue);
|
||||
|
||||
/* Check for Object Directory */
|
||||
if (!_stricmp(ParameterName, "ObjectDirectory"))
|
||||
{
|
||||
/* Check if a session ID is specified */
|
||||
if (SessionId)
|
||||
{
|
||||
DPRINT1("Sessions not yet implemented\n");
|
||||
ASSERT(SessionId);
|
||||
}
|
||||
|
||||
/* Initialize the directory name */
|
||||
RtlInitAnsiString(&AnsiString, ParameterValue);
|
||||
Status = RtlAnsiStringToUnicodeString(&CsrDirectoryName,
|
||||
&AnsiString,
|
||||
TRUE);
|
||||
ASSERT(NT_SUCCESS(Status) || SessionId != 0);
|
||||
if (!NT_SUCCESS(Status)) return Status;
|
||||
|
||||
/* Create it */
|
||||
InitializeObjectAttributes(&ObjectAttributes,
|
||||
&CsrDirectoryName,
|
||||
OBJ_OPENIF | OBJ_CASE_INSENSITIVE | OBJ_PERMANENT,
|
||||
NULL,
|
||||
NULL);
|
||||
Status = NtCreateDirectoryObject(&CsrObjectDirectory,
|
||||
DIRECTORY_ALL_ACCESS,
|
||||
&ObjectAttributes);
|
||||
if (!NT_SUCCESS(Status)) return Status;
|
||||
|
||||
/* Secure it */
|
||||
Status = CsrSetDirectorySecurity(CsrObjectDirectory);
|
||||
if (!NT_SUCCESS(Status)) return Status;
|
||||
}
|
||||
else if (!_stricmp(ParameterName, "SubSystemType"))
|
||||
{
|
||||
/* Ignored */
|
||||
}
|
||||
else if (!_stricmp(ParameterName, "MaxRequestThreads"))
|
||||
{
|
||||
Status = RtlCharToInteger(ParameterValue,
|
||||
0,
|
||||
&CsrMaxApiRequestThreads);
|
||||
}
|
||||
else if (!_stricmp(ParameterName, "RequestThreads"))
|
||||
{
|
||||
/* Ignored */
|
||||
Status = STATUS_SUCCESS;
|
||||
}
|
||||
else if (!_stricmp(ParameterName, "ProfileControl"))
|
||||
{
|
||||
/* Ignored */
|
||||
}
|
||||
else if (!_stricmp(ParameterName, "SharedSection"))
|
||||
{
|
||||
/* Craete the Section */
|
||||
Status = CsrSrvCreateSharedSection(ParameterValue);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("CSRSS: *** Invalid syntax for %s=%s (Status == %X)\n",
|
||||
ParameterName, ParameterValue, Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Load us */
|
||||
Status = CsrLoadServerDll("CSRSS", NULL, CSR_SRV_SERVER);
|
||||
}
|
||||
else if (!_stricmp(ParameterName, "ServerDLL"))
|
||||
{
|
||||
/* Loop the command line */
|
||||
EntryPoint = NULL;
|
||||
Status = STATUS_INVALID_PARAMETER;
|
||||
ServerString = ParameterValue;
|
||||
while (*ServerString)
|
||||
{
|
||||
/* Check for the Entry Point */
|
||||
if ((*ServerString == ':') && (!EntryPoint))
|
||||
{
|
||||
/* Found it. Add a nullchar and save it */
|
||||
*ServerString++ = ANSI_NULL;
|
||||
EntryPoint = ServerString;
|
||||
}
|
||||
|
||||
/* Check for the Dll Index */
|
||||
if (*ServerString++ == ',') break;
|
||||
}
|
||||
|
||||
/* Did we find something to load? */
|
||||
if (!*ServerString)
|
||||
{
|
||||
DPRINT1("CSRSS: *** Invalid syntax for ServerDll=%s (Status == %X)\n",
|
||||
ParameterValue, Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Convert it to a ULONG */
|
||||
Status = RtlCharToInteger(ServerString, 10, &DllIndex);
|
||||
|
||||
/* Add a null char if it was valid */
|
||||
if (NT_SUCCESS(Status)) ServerString[-1] = ANSI_NULL;
|
||||
|
||||
/* Load it */
|
||||
if (CsrDebug & 1) DPRINT1("CSRSS: Loading ServerDll=%s:%s\n", ParameterValue, EntryPoint);
|
||||
Status = CsrLoadServerDll(ParameterValue, EntryPoint, DllIndex);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("CSRSS: *** Failed loading ServerDll=%s (Status == 0x%x)\n",
|
||||
ParameterValue, Status);
|
||||
return Status;
|
||||
}
|
||||
}
|
||||
else if (!_stricmp(ParameterName, "Windows"))
|
||||
{
|
||||
/* Ignored */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Invalid parameter on the command line */
|
||||
Status = STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
}
|
||||
|
||||
/* Return status */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/*++
|
||||
* @name CsrCreateLocalSystemSD
|
||||
*
|
||||
* The CsrCreateLocalSystemSD routine creates a Security Descriptor for
|
||||
* the local account with PORT_ALL_ACCESS.
|
||||
*
|
||||
* @param LocalSystemSd
|
||||
* Pointer to a pointer to the security descriptor to create.
|
||||
*
|
||||
* @return STATUS_SUCCESS in case of success, STATUS_UNSUCCESSFUL
|
||||
* othwerwise.
|
||||
*
|
||||
* @remarks None.
|
||||
*
|
||||
*--*/
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrCreateLocalSystemSD(OUT PSECURITY_DESCRIPTOR *LocalSystemSd)
|
||||
{
|
||||
SID_IDENTIFIER_AUTHORITY NtSidAuthority = {SECURITY_NT_AUTHORITY};
|
||||
PSID SystemSid;
|
||||
ULONG Length;
|
||||
PSECURITY_DESCRIPTOR SystemSd;
|
||||
PACL Dacl;
|
||||
NTSTATUS Status;
|
||||
|
||||
/* Initialize the System SID */
|
||||
RtlAllocateAndInitializeSid(&NtSidAuthority, 1,
|
||||
SECURITY_LOCAL_SYSTEM_RID,
|
||||
0, 0, 0, 0, 0, 0, 0,
|
||||
&SystemSid);
|
||||
|
||||
/* Get the length of the SID */
|
||||
Length = RtlLengthSid(SystemSid) + sizeof(ACL) + sizeof(ACCESS_ALLOWED_ACE);
|
||||
|
||||
/* Allocate a buffer for the Security Descriptor, with SID and DACL */
|
||||
SystemSd = RtlAllocateHeap(CsrHeap, 0, SECURITY_DESCRIPTOR_MIN_LENGTH + Length);
|
||||
|
||||
/* Set the pointer to the DACL */
|
||||
Dacl = (PACL)((ULONG_PTR)SystemSd + SECURITY_DESCRIPTOR_MIN_LENGTH);
|
||||
|
||||
/* Now create the SD itself */
|
||||
Status = RtlCreateSecurityDescriptor(SystemSd, SECURITY_DESCRIPTOR_REVISION);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
/* Fail */
|
||||
RtlFreeHeap(CsrHeap, 0, SystemSd);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Create the DACL for it*/
|
||||
RtlCreateAcl(Dacl, Length, ACL_REVISION2);
|
||||
|
||||
/* Create the ACE */
|
||||
Status = RtlAddAccessAllowedAce(Dacl, ACL_REVISION, PORT_ALL_ACCESS, SystemSid);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
/* Fail */
|
||||
RtlFreeHeap(CsrHeap, 0, SystemSd);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Clear the DACL in the SD */
|
||||
Status = RtlSetDaclSecurityDescriptor(SystemSd, TRUE, Dacl, FALSE);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
/* Fail */
|
||||
RtlFreeHeap(CsrHeap, 0, SystemSd);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Free the SID and return*/
|
||||
RtlFreeSid(SystemSid);
|
||||
*LocalSystemSd = SystemSd;
|
||||
return Status;
|
||||
}
|
||||
|
||||
/*++
|
||||
* @name GetDosDevicesProtection
|
||||
*
|
||||
* The GetDosDevicesProtection creates a security descriptor for the DOS Devices
|
||||
* Object Directory.
|
||||
*
|
||||
* @param DosDevicesSd
|
||||
* Pointer to the Security Descriptor to return.
|
||||
*
|
||||
* @return STATUS_SUCCESS in case of success, STATUS_UNSUCCESSFUL
|
||||
* othwerwise.
|
||||
*
|
||||
* @remarks Depending on the DOS Devices Protection Mode (set in the registry),
|
||||
* regular users may or may not have full access to the directory.
|
||||
*
|
||||
*--*/
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
GetDosDevicesProtection(OUT PSECURITY_DESCRIPTOR DosDevicesSd)
|
||||
{
|
||||
SID_IDENTIFIER_AUTHORITY WorldAuthority = {SECURITY_WORLD_SID_AUTHORITY};
|
||||
SID_IDENTIFIER_AUTHORITY CreatorAuthority = {SECURITY_CREATOR_SID_AUTHORITY};
|
||||
SID_IDENTIFIER_AUTHORITY NtSidAuthority = {SECURITY_NT_AUTHORITY};
|
||||
PSID WorldSid, CreatorSid, AdminSid, SystemSid;
|
||||
UCHAR KeyValueBuffer[0x40];
|
||||
PKEY_VALUE_PARTIAL_INFORMATION KeyValuePartialInfo;
|
||||
UNICODE_STRING KeyName;
|
||||
ULONG ProtectionMode = 0;
|
||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||
PACL Dacl;
|
||||
PACCESS_ALLOWED_ACE Ace;
|
||||
HANDLE hKey;
|
||||
NTSTATUS Status;
|
||||
ULONG ResultLength, SidLength, AclLength;
|
||||
|
||||
/* Create the SD */
|
||||
Status = RtlCreateSecurityDescriptor(DosDevicesSd, SECURITY_DESCRIPTOR_REVISION);
|
||||
ASSERT(NT_SUCCESS(Status));
|
||||
|
||||
/* Initialize the System SID */
|
||||
Status = RtlAllocateAndInitializeSid(&NtSidAuthority, 1,
|
||||
SECURITY_LOCAL_SYSTEM_RID,
|
||||
0, 0, 0, 0, 0, 0, 0,
|
||||
&SystemSid);
|
||||
ASSERT(NT_SUCCESS(Status));
|
||||
|
||||
/* Initialize the World SID */
|
||||
Status = RtlAllocateAndInitializeSid(&WorldAuthority, 1,
|
||||
SECURITY_WORLD_RID,
|
||||
0, 0, 0, 0, 0, 0, 0,
|
||||
&WorldSid);
|
||||
ASSERT(NT_SUCCESS(Status));
|
||||
|
||||
/* Initialize the Admin SID */
|
||||
Status = RtlAllocateAndInitializeSid(&NtSidAuthority, 2,
|
||||
SECURITY_BUILTIN_DOMAIN_RID,
|
||||
DOMAIN_ALIAS_RID_ADMINS,
|
||||
0, 0, 0, 0, 0, 0,
|
||||
&AdminSid);
|
||||
ASSERT(NT_SUCCESS(Status));
|
||||
|
||||
/* Initialize the Creator SID */
|
||||
Status = RtlAllocateAndInitializeSid(&CreatorAuthority, 1,
|
||||
SECURITY_CREATOR_OWNER_RID,
|
||||
0, 0, 0, 0, 0, 0, 0,
|
||||
&CreatorSid);
|
||||
ASSERT(NT_SUCCESS(Status));
|
||||
|
||||
/* 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);
|
||||
}
|
||||
|
||||
/* Check the Protection Mode */
|
||||
if (ProtectionMode & 3)
|
||||
{
|
||||
/* Calculate SID Lengths */
|
||||
SidLength = RtlLengthSid(CreatorSid) + RtlLengthSid(SystemSid) +
|
||||
RtlLengthSid(AdminSid);
|
||||
AclLength = sizeof(ACL) + 3 * sizeof(ACCESS_ALLOWED_ACE) + SidLength;
|
||||
|
||||
/* Allocate memory for the DACL */
|
||||
Dacl = RtlAllocateHeap(CsrHeap, HEAP_ZERO_MEMORY, AclLength);
|
||||
ASSERT(Dacl != NULL);
|
||||
|
||||
/* Build the ACL and add 3 ACEs */
|
||||
Status = RtlCreateAcl(Dacl, AclLength, ACL_REVISION2);
|
||||
ASSERT(NT_SUCCESS(Status));
|
||||
Status = RtlAddAccessAllowedAce(Dacl, ACL_REVISION, GENERIC_ALL, SystemSid);
|
||||
ASSERT(NT_SUCCESS(Status));
|
||||
Status = RtlAddAccessAllowedAce(Dacl, ACL_REVISION, GENERIC_ALL, AdminSid);
|
||||
ASSERT(NT_SUCCESS(Status));
|
||||
Status = RtlAddAccessAllowedAce(Dacl, ACL_REVISION, GENERIC_ALL, CreatorSid);
|
||||
ASSERT(NT_SUCCESS(Status));
|
||||
|
||||
/* Edit the ACEs to make them inheritable */
|
||||
Status = RtlGetAce(Dacl, 0, (PVOID*)&Ace);
|
||||
ASSERT(NT_SUCCESS(Status));
|
||||
Ace->Header.AceFlags |= OBJECT_INHERIT_ACE | CONTAINER_INHERIT_ACE;
|
||||
Status = RtlGetAce(Dacl, 1, (PVOID*)&Ace);
|
||||
ASSERT(NT_SUCCESS(Status));
|
||||
Ace->Header.AceFlags |= OBJECT_INHERIT_ACE | CONTAINER_INHERIT_ACE;
|
||||
Status = RtlGetAce(Dacl, 2, (PVOID*)&Ace);
|
||||
ASSERT(NT_SUCCESS(Status));
|
||||
Ace->Header.AceFlags |= OBJECT_INHERIT_ACE | CONTAINER_INHERIT_ACE | INHERIT_ONLY_ACE;
|
||||
|
||||
/* Set this DACL with the SD */
|
||||
Status = RtlSetDaclSecurityDescriptor(DosDevicesSd, TRUE, Dacl, FALSE);
|
||||
ASSERT(NT_SUCCESS(Status));
|
||||
goto Quickie;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Calculate SID Lengths */
|
||||
SidLength = RtlLengthSid(WorldSid) + RtlLengthSid(SystemSid);
|
||||
AclLength = sizeof(ACL) + 3 * sizeof(ACCESS_ALLOWED_ACE) + SidLength;
|
||||
|
||||
/* Allocate memory for the DACL */
|
||||
Dacl = RtlAllocateHeap(CsrHeap, HEAP_ZERO_MEMORY, AclLength);
|
||||
ASSERT(Dacl != NULL);
|
||||
|
||||
/* Build the ACL and add 3 ACEs */
|
||||
Status = RtlCreateAcl(Dacl, AclLength, ACL_REVISION2);
|
||||
ASSERT(NT_SUCCESS(Status));
|
||||
Status = RtlAddAccessAllowedAce(Dacl, ACL_REVISION, GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE, WorldSid);
|
||||
ASSERT(NT_SUCCESS(Status));
|
||||
Status = RtlAddAccessAllowedAce(Dacl, ACL_REVISION, GENERIC_ALL, SystemSid);
|
||||
ASSERT(NT_SUCCESS(Status));
|
||||
Status = RtlAddAccessAllowedAce(Dacl, ACL_REVISION, GENERIC_ALL, WorldSid);
|
||||
ASSERT(NT_SUCCESS(Status));
|
||||
|
||||
/* Edit the last ACE to make it inheritable */
|
||||
Status = RtlGetAce(Dacl, 2, (PVOID*)&Ace);
|
||||
ASSERT(NT_SUCCESS(Status));
|
||||
Ace->Header.AceFlags |= OBJECT_INHERIT_ACE | CONTAINER_INHERIT_ACE | INHERIT_ONLY_ACE;
|
||||
|
||||
/* Set this DACL with the SD */
|
||||
Status = RtlSetDaclSecurityDescriptor(DosDevicesSd, TRUE, Dacl, FALSE);
|
||||
ASSERT(NT_SUCCESS(Status));
|
||||
goto Quickie;
|
||||
}
|
||||
|
||||
/* FIXME: failure cases! Fail: */
|
||||
/* Free the memory */
|
||||
RtlFreeHeap(CsrHeap, 0, Dacl);
|
||||
|
||||
/* FIXME: semi-failure cases! Quickie: */
|
||||
Quickie:
|
||||
/* Free the SIDs */
|
||||
RtlFreeSid(SystemSid);
|
||||
RtlFreeSid(WorldSid);
|
||||
RtlFreeSid(AdminSid);
|
||||
RtlFreeSid(CreatorSid);
|
||||
|
||||
/* Return */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/*++
|
||||
* @name FreeDosDevicesProtection
|
||||
*
|
||||
* The FreeDosDevicesProtection frees the security descriptor that was created
|
||||
* by GetDosDevicesProtection
|
||||
*
|
||||
* @param DosDevicesSd
|
||||
* Pointer to the security descriptor to free.
|
||||
|
||||
* @return None.
|
||||
*
|
||||
* @remarks None.
|
||||
*
|
||||
*--*/
|
||||
VOID
|
||||
NTAPI
|
||||
FreeDosDevicesProtection(IN PSECURITY_DESCRIPTOR DosDevicesSd)
|
||||
{
|
||||
PACL Dacl;
|
||||
BOOLEAN Present, Default;
|
||||
NTSTATUS Status;
|
||||
|
||||
/* Get the DACL corresponding to this SD */
|
||||
Status = RtlGetDaclSecurityDescriptor(DosDevicesSd, &Present, &Dacl, &Default);
|
||||
ASSERT(NT_SUCCESS(Status));
|
||||
ASSERT(Present);
|
||||
ASSERT(Dacl != NULL);
|
||||
|
||||
/* Free it */
|
||||
if ((NT_SUCCESS(Status)) && (Dacl)) RtlFreeHeap(CsrHeap, 0, Dacl);
|
||||
}
|
||||
|
||||
/*++
|
||||
* @name CsrCreateSessionObjectDirectory
|
||||
*
|
||||
* The CsrCreateSessionObjectDirectory routine creates the BaseNamedObjects,
|
||||
* Session and Dos Devices directories for the specified session.
|
||||
*
|
||||
* @param Session
|
||||
* Session ID for which to create the directories.
|
||||
*
|
||||
* @return STATUS_SUCCESS in case of success, STATUS_UNSUCCESSFUL
|
||||
* othwerwise.
|
||||
*
|
||||
* @remarks None.
|
||||
*
|
||||
*--*/
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrCreateSessionObjectDirectory(IN ULONG Session)
|
||||
{
|
||||
WCHAR SessionBuffer[512], BnoBuffer[512];
|
||||
UNICODE_STRING SessionString, BnoString;
|
||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||
HANDLE BnoHandle;
|
||||
SECURITY_DESCRIPTOR DosDevicesSd;
|
||||
NTSTATUS Status;
|
||||
|
||||
/* Generate the Session BNOLINKS Directory name */
|
||||
swprintf(SessionBuffer, L"%ws\\BNOLINKS", SESSION_ROOT);
|
||||
RtlInitUnicodeString(&SessionString, SessionBuffer);
|
||||
|
||||
/* Create it */
|
||||
InitializeObjectAttributes(&ObjectAttributes,
|
||||
&SessionString,
|
||||
OBJ_OPENIF | OBJ_CASE_INSENSITIVE,
|
||||
NULL,
|
||||
NULL);
|
||||
Status = NtCreateDirectoryObject(&BNOLinksDirectory,
|
||||
DIRECTORY_ALL_ACCESS,
|
||||
&ObjectAttributes);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("CSRSS: NtCreateDirectoryObject failed in "
|
||||
"CsrCreateSessionObjectDirectory - status = %lx\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Now add the Session ID */
|
||||
swprintf(SessionBuffer, L"%ld", Session);
|
||||
RtlInitUnicodeString(&SessionString, SessionBuffer);
|
||||
|
||||
/* Check if this is the first Session */
|
||||
if (Session)
|
||||
{
|
||||
/* Not the first, so the name will be slighly more complex */
|
||||
swprintf(BnoBuffer, L"%ws\\%ld\\BaseNamedObjects", SESSION_ROOT, Session);
|
||||
RtlInitUnicodeString(&BnoString, BnoBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Use the direct name */
|
||||
RtlInitUnicodeString(&BnoString, L"\\BaseNamedObjects");
|
||||
}
|
||||
|
||||
/* Create the symlink */
|
||||
InitializeObjectAttributes(&ObjectAttributes,
|
||||
&SessionString,
|
||||
OBJ_OPENIF | OBJ_CASE_INSENSITIVE,
|
||||
BNOLinksDirectory,
|
||||
NULL);
|
||||
Status = NtCreateSymbolicLinkObject(&BnoHandle,
|
||||
SYMBOLIC_LINK_ALL_ACCESS,
|
||||
&ObjectAttributes,
|
||||
&BnoString);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("CSRSS: NtCreateSymbolicLinkObject failed in "
|
||||
"CsrCreateSessionObjectDirectory - status = %lx\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Create the \DosDevices Security Descriptor */
|
||||
Status = GetDosDevicesProtection(&DosDevicesSd);
|
||||
if (!NT_SUCCESS(Status)) return Status;
|
||||
|
||||
/* Now create a directory for this session */
|
||||
swprintf(SessionBuffer, L"%ws\\%ld", SESSION_ROOT, Session);
|
||||
RtlInitUnicodeString(&SessionString, SessionBuffer);
|
||||
|
||||
/* Create the directory */
|
||||
InitializeObjectAttributes(&ObjectAttributes,
|
||||
&SessionString,
|
||||
OBJ_OPENIF | OBJ_CASE_INSENSITIVE,
|
||||
0,
|
||||
&DosDevicesSd);
|
||||
Status = NtCreateDirectoryObject(&SessionObjectDirectory,
|
||||
DIRECTORY_ALL_ACCESS,
|
||||
&ObjectAttributes);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("CSRSS: NtCreateDirectoryObject failed in "
|
||||
"CsrCreateSessionObjectDirectory - status = %lx\n", Status);
|
||||
FreeDosDevicesProtection(&DosDevicesSd);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Next, create a directory for this session's DOS Devices */
|
||||
RtlInitUnicodeString(&SessionString, L"DosDevices");
|
||||
InitializeObjectAttributes(&ObjectAttributes,
|
||||
&SessionString,
|
||||
OBJ_CASE_INSENSITIVE,
|
||||
SessionObjectDirectory,
|
||||
&DosDevicesSd);
|
||||
Status = NtCreateDirectoryObject(&DosDevicesDirectory,
|
||||
DIRECTORY_ALL_ACCESS,
|
||||
&ObjectAttributes);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("CSRSS: NtCreateDirectoryObject failed in "
|
||||
"CsrCreateSessionObjectDirectory - status = %lx\n", Status);
|
||||
}
|
||||
|
||||
/* Release the Security Descriptor */
|
||||
FreeDosDevicesProtection(&DosDevicesSd);
|
||||
|
||||
/* Return */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/*++
|
||||
* @name CsrSetProcessSecurity
|
||||
*
|
||||
* The CsrSetProcessSecurity routine protects access to the CSRSS process
|
||||
* from unauthorized tampering.
|
||||
*
|
||||
* @param None.
|
||||
*
|
||||
* @return STATUS_SUCCESS in case of success, STATUS_UNSUCCESSFUL
|
||||
* othwerwise.
|
||||
*
|
||||
* @remarks None.
|
||||
*
|
||||
*--*/
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrSetProcessSecurity(VOID)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
HANDLE hToken, hProcess = NtCurrentProcess();
|
||||
ULONG ReturnLength, Length;
|
||||
PTOKEN_USER TokenInfo = NULL;
|
||||
PSECURITY_DESCRIPTOR ProcSd = NULL;
|
||||
PACL Dacl;
|
||||
PSID UserSid;
|
||||
|
||||
/* Open our token */
|
||||
Status = NtOpenProcessToken(hProcess, TOKEN_QUERY, &hToken);
|
||||
if (!NT_SUCCESS(Status)) goto Quickie;
|
||||
|
||||
/* Get the Token User Length */
|
||||
NtQueryInformationToken(hToken, TokenUser, NULL, 0, &Length);
|
||||
|
||||
/* Allocate space for it */
|
||||
TokenInfo = RtlAllocateHeap(CsrHeap, HEAP_ZERO_MEMORY, Length);
|
||||
if (!TokenInfo)
|
||||
{
|
||||
Status = STATUS_NO_MEMORY;
|
||||
goto Quickie;
|
||||
}
|
||||
|
||||
/* Now query the data */
|
||||
Status = NtQueryInformationToken(hToken, TokenUser, TokenInfo, Length, &Length);
|
||||
NtClose(hToken);
|
||||
if (!NT_SUCCESS(Status)) goto Quickie;
|
||||
|
||||
/* Now check the SID Length */
|
||||
UserSid = TokenInfo->User.Sid;
|
||||
ReturnLength = RtlLengthSid(UserSid) + sizeof(ACL) + sizeof(ACCESS_ALLOWED_ACE);
|
||||
|
||||
/* Allocate a buffer for the Security Descriptor, with SID and DACL */
|
||||
ProcSd = RtlAllocateHeap(CsrHeap, HEAP_ZERO_MEMORY, SECURITY_DESCRIPTOR_MIN_LENGTH + Length);
|
||||
if (!ProcSd)
|
||||
{
|
||||
Status = STATUS_NO_MEMORY;
|
||||
goto Quickie;
|
||||
}
|
||||
|
||||
/* Set the pointer to the DACL */
|
||||
Dacl = (PACL)((ULONG_PTR)ProcSd + SECURITY_DESCRIPTOR_MIN_LENGTH);
|
||||
|
||||
/* Now create the SD itself */
|
||||
Status = RtlCreateSecurityDescriptor(ProcSd, SECURITY_DESCRIPTOR_REVISION);
|
||||
if (!NT_SUCCESS(Status)) goto Quickie;
|
||||
|
||||
/* Create the DACL for it*/
|
||||
RtlCreateAcl(Dacl, Length, ACL_REVISION2);
|
||||
|
||||
/* Create the ACE */
|
||||
Status = RtlAddAccessAllowedAce(Dacl,
|
||||
ACL_REVISION,
|
||||
PROCESS_VM_READ | PROCESS_VM_WRITE |
|
||||
PROCESS_VM_OPERATION | PROCESS_DUP_HANDLE |
|
||||
PROCESS_TERMINATE | PROCESS_SUSPEND_RESUME |
|
||||
PROCESS_QUERY_INFORMATION | READ_CONTROL,
|
||||
UserSid);
|
||||
if (!NT_SUCCESS(Status)) goto Quickie;
|
||||
|
||||
/* Clear the DACL in the SD */
|
||||
Status = RtlSetDaclSecurityDescriptor(ProcSd, TRUE, Dacl, FALSE);
|
||||
if (!NT_SUCCESS(Status)) goto Quickie;
|
||||
|
||||
/* Write the SD into the Process */
|
||||
Status = NtSetSecurityObject(hProcess, DACL_SECURITY_INFORMATION, ProcSd);
|
||||
|
||||
/* Free the memory and return */
|
||||
Quickie:
|
||||
if (ProcSd) RtlFreeHeap(CsrHeap, 0, ProcSd);
|
||||
RtlFreeHeap(CsrHeap, 0, TokenInfo);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/*++
|
||||
* @name CsrSetDirectorySecurity
|
||||
*
|
||||
* The CsrSetDirectorySecurity routine sets the security descriptor for the
|
||||
* specified Object Directory.
|
||||
*
|
||||
* @param ObjectDirectory
|
||||
* Handle fo the Object Directory to protect.
|
||||
*
|
||||
* @return STATUS_SUCCESS in case of success, STATUS_UNSUCCESSFUL
|
||||
* othwerwise.
|
||||
*
|
||||
* @remarks None.
|
||||
*
|
||||
*--*/
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrSetDirectorySecurity(IN HANDLE ObjectDirectory)
|
||||
{
|
||||
/* FIXME: Implement */
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/* PUBLIC FUNCTIONS **********************************************************/
|
||||
|
||||
/*++
|
||||
* @name CsrServerInitialization
|
||||
* @implemented NT4
|
||||
*
|
||||
* The CsrServerInitialization routine is the native (not Server) entrypoint
|
||||
* of this Server DLL. It serves as the entrypoint for csrss.
|
||||
*
|
||||
* @param ArgumentCount
|
||||
* Number of arguments on the command line.
|
||||
*
|
||||
* @param Arguments
|
||||
* Array of arguments from the command line.
|
||||
*
|
||||
* @return STATUS_SUCCESS in case of success, STATUS_UNSUCCESSFUL
|
||||
* othwerwise.
|
||||
*
|
||||
* @remarks None.
|
||||
*
|
||||
*--*/
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrServerInitialization(IN ULONG ArgumentCount,
|
||||
IN PCHAR Arguments[])
|
||||
{
|
||||
NTSTATUS Status = STATUS_SUCCESS;
|
||||
ULONG i = 0;
|
||||
PVOID ProcessData;
|
||||
PCSR_SERVER_DLL ServerDll;
|
||||
DPRINT("CSRSRV: %s called\n", __FUNCTION__);
|
||||
|
||||
/* Create the Init Event */
|
||||
Status = NtCreateEvent(&CsrInitializationEvent,
|
||||
EVENT_ALL_ACCESS,
|
||||
NULL,
|
||||
SynchronizationEvent,
|
||||
FALSE);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("CSRSRV:%s: NtCreateEvent failed (Status=%08lx)\n",
|
||||
__FUNCTION__, Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Cache System Basic Information so we don't always request it */
|
||||
Status = NtQuerySystemInformation(SystemBasicInformation,
|
||||
&CsrNtSysInfo,
|
||||
sizeof(SYSTEM_BASIC_INFORMATION),
|
||||
NULL);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("CSRSRV:%s: NtQuerySystemInformation failed (Status=%08lx)\n",
|
||||
__FUNCTION__, Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Save our Heap */
|
||||
CsrHeap = RtlGetProcessHeap();
|
||||
|
||||
/* Set our Security Descriptor to protect the process */
|
||||
Status = CsrSetProcessSecurity();
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("CSRSRV:%s: CsrSetProcessSecurity failed (Status=%08lx)\n",
|
||||
__FUNCTION__, Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Set up Session Support */
|
||||
Status = CsrInitializeNtSessionList();
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("CSRSRV:%s: CsrInitializeSessions failed (Status=%08lx)\n",
|
||||
__FUNCTION__, Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Set up Process Support */
|
||||
Status = CsrInitializeProcessStructure();
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("CSRSRV:%s: CsrInitializeProcessStructure failed (Status=%08lx)\n",
|
||||
__FUNCTION__, Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Parse the command line */
|
||||
Status = CsrParseServerCommandLine(ArgumentCount, Arguments);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("CSRSRV:%s: CsrParseServerCommandLine failed (Status=%08lx)\n",
|
||||
__FUNCTION__, Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* All Server DLLs are now loaded, allocate a heap for the Root Process */
|
||||
ProcessData = RtlAllocateHeap(CsrHeap,
|
||||
HEAP_ZERO_MEMORY,
|
||||
CsrTotalPerProcessDataLength);
|
||||
if (!ProcessData)
|
||||
{
|
||||
DPRINT1("CSRSRV:%s: RtlAllocateHeap failed (Status=%08lx)\n",
|
||||
__FUNCTION__, STATUS_NO_MEMORY);
|
||||
return STATUS_NO_MEMORY;
|
||||
}
|
||||
|
||||
/*
|
||||
* Our Root Process was never officially initalized, so write the data
|
||||
* for each Server DLL manually.
|
||||
*/
|
||||
for (i = 0; i < CSR_SERVER_DLL_MAX; i++)
|
||||
{
|
||||
/* Get the current Server */
|
||||
ServerDll = CsrLoadedServerDll[i];
|
||||
|
||||
/* Is it loaded, and does it have per process data? */
|
||||
if ((ServerDll) && (ServerDll->SizeOfProcessData))
|
||||
{
|
||||
/* It does, give it part of our allocated heap */
|
||||
CsrRootProcess->ServerData[i] = ProcessData;
|
||||
|
||||
/* Move to the next heap position */
|
||||
ProcessData = (PVOID)((ULONG_PTR)ProcessData +
|
||||
ServerDll->SizeOfProcessData);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Nothing for this Server DLL */
|
||||
CsrRootProcess->ServerData[i] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* Now initialize the Root Process manually as well */
|
||||
for (i = 0; i < CSR_SERVER_DLL_MAX; i++)
|
||||
{
|
||||
/* Get the current Server */
|
||||
ServerDll = CsrLoadedServerDll[i];
|
||||
|
||||
/* Is it loaded, and does it a callback for new processes? */
|
||||
if ((ServerDll) && (ServerDll->NewProcessCallback))
|
||||
{
|
||||
/* Call the callback */
|
||||
ServerDll->NewProcessCallback(NULL, CsrRootProcess);
|
||||
}
|
||||
}
|
||||
|
||||
/* Now initialize our API Port */
|
||||
Status = CsrApiPortInitialize();
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("CSRSRV:%s: CsrApiPortInitialize failed (Status=%08lx)\n",
|
||||
__FUNCTION__, Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Initialize the API Port for SM communication */
|
||||
Status = CsrSbApiPortInitialize();
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("CSRSRV:%s: CsrSbApiPortInitialize failed (Status=%08lx)\n",
|
||||
__FUNCTION__, Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* We're all set! Connect to SM! */
|
||||
Status = SmConnectToSm(&CsrSbApiPortName,
|
||||
CsrSbApiPort,
|
||||
IMAGE_SUBSYSTEM_WINDOWS_GUI,
|
||||
&CsrSmApiPort);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("CSRSRV:%s: SmConnectToSm failed (Status=%08lx)\n",
|
||||
__FUNCTION__, Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Finito! Signal the event */
|
||||
Status = NtSetEvent(CsrInitializationEvent, NULL);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("CSRSRV:%s: NtSetEvent failed (Status=%08lx)\n",
|
||||
__FUNCTION__, Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Close the event handle now */
|
||||
NtClose(CsrInitializationEvent);
|
||||
|
||||
/* Have us handle Hard Errors */
|
||||
Status = NtSetDefaultHardErrorPort(CsrApiPort);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("CSRSRV:%s: NtSetDefaultHardErrorPort failed (Status=%08lx)\n",
|
||||
__FUNCTION__, Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Return status */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/*++
|
||||
* @name CsrPopulateDosDevices
|
||||
* @unimplemented NT5.1
|
||||
*
|
||||
* The CsrPopulateDosDevices routine uses the DOS Device Map from the Kernel
|
||||
* to populate the Dos Devices Object Directory for the session.
|
||||
*
|
||||
* @param None.
|
||||
*
|
||||
* @return None.
|
||||
*
|
||||
* @remarks None.
|
||||
*
|
||||
*--*/
|
||||
VOID
|
||||
NTAPI
|
||||
CsrPopulateDosDevices(VOID)
|
||||
{
|
||||
DPRINT1("Deprecated API\n");
|
||||
return;
|
||||
}
|
||||
|
||||
BOOL
|
||||
NTAPI
|
||||
DllMain(IN HANDLE hDll,
|
||||
IN DWORD dwReason,
|
||||
IN LPVOID lpReserved)
|
||||
{
|
||||
/* We don't do much */
|
||||
UNREFERENCED_PARAMETER(hDll);
|
||||
UNREFERENCED_PARAMETER(dwReason);
|
||||
UNREFERENCED_PARAMETER(lpReserved);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* EOF */
|
File diff suppressed because it is too large
Load diff
|
@ -1,687 +0,0 @@
|
|||
/*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS CSR Sub System
|
||||
* FILE: subsys/csr/csrsrv/server.c
|
||||
* PURPOSE: CSR Server DLL Server Functions
|
||||
* PROGRAMMERS: Alex Ionescu (alex@relsoft.net)
|
||||
*/
|
||||
|
||||
/* INCLUDES ******************************************************************/
|
||||
#include "srv.h"
|
||||
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
/* DATA **********************************************************************/
|
||||
|
||||
PCSR_API_ROUTINE CsrServerApiDispatchTable[5] =
|
||||
{
|
||||
CsrSrvClientConnect,
|
||||
CsrSrvUnusedFunction,
|
||||
CsrSrvUnusedFunction,
|
||||
CsrSrvIdentifyAlertableThread,
|
||||
CsrSrvSetPriorityClass
|
||||
};
|
||||
|
||||
BOOLEAN CsrServerApiServerValidTable[5] =
|
||||
{
|
||||
TRUE,
|
||||
FALSE,
|
||||
TRUE,
|
||||
TRUE,
|
||||
TRUE
|
||||
};
|
||||
|
||||
PCHAR CsrServerApiNameTable[5] =
|
||||
{
|
||||
"ClientConnect",
|
||||
"ThreadConnect",
|
||||
"ProfileControl",
|
||||
"IdentifyAlertableThread",
|
||||
"SetPriorityClass"
|
||||
};
|
||||
|
||||
PCSR_SERVER_DLL CsrLoadedServerDll[CSR_SERVER_DLL_MAX];
|
||||
PVOID CsrSrvSharedSectionHeap;
|
||||
PVOID CsrSrvSharedSectionBase;
|
||||
PVOID *CsrSrvSharedStaticServerData;
|
||||
ULONG CsrSrvSharedSectionSize;
|
||||
HANDLE CsrSrvSharedSection;
|
||||
|
||||
/* PRIVATE FUNCTIONS**********************************************************/
|
||||
|
||||
/*++
|
||||
* @name CsrLoadServerDll
|
||||
* @implemented NT4
|
||||
*
|
||||
* The CsrLoadServerDll routine loads a CSR Server DLL and calls its entrypoint
|
||||
*
|
||||
* @param DllString
|
||||
* Pointer to the CSR Server DLL to load and call.
|
||||
*
|
||||
* @param EntryPoint
|
||||
* Pointer to the name of the server's initialization function. If
|
||||
* this parameter is NULL, the default ServerDllInitialize will be
|
||||
* assumed.
|
||||
*
|
||||
* @return STATUS_SUCCESS in case of success, STATUS_UNSUCCESSFUL
|
||||
* othwerwise.
|
||||
*
|
||||
* @remarks None.
|
||||
*
|
||||
*--*/
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrLoadServerDll(IN PCHAR DllString,
|
||||
IN PCHAR EntryPoint OPTIONAL,
|
||||
IN ULONG ServerId)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
ANSI_STRING DllName;
|
||||
UNICODE_STRING TempString, ErrorString;
|
||||
ULONG_PTR Parameters[2];
|
||||
HANDLE hServerDll = NULL;
|
||||
ULONG Size;
|
||||
PCSR_SERVER_DLL ServerDll;
|
||||
STRING EntryPointString;
|
||||
PCSR_SERVER_DLL_INIT_CALLBACK ServerDllInitProcedure;
|
||||
ULONG Response;
|
||||
|
||||
/* Check if it's beyond the maximum we support */
|
||||
if (ServerId >= CSR_SERVER_DLL_MAX) return STATUS_TOO_MANY_NAMES;
|
||||
|
||||
/* Check if it's already been loaded */
|
||||
if (CsrLoadedServerDll[ServerId]) return STATUS_INVALID_PARAMETER;
|
||||
|
||||
/* Convert the name to Unicode */
|
||||
ASSERT(DllString != NULL);
|
||||
RtlInitAnsiString(&DllName, DllString);
|
||||
Status = RtlAnsiStringToUnicodeString(&TempString, &DllName, TRUE);
|
||||
if (!NT_SUCCESS(Status)) return Status;
|
||||
|
||||
/* If we are loading ourselves, don't actually load us */
|
||||
if (ServerId != CSR_SRV_SERVER)
|
||||
{
|
||||
/* Load the DLL */
|
||||
Status = LdrLoadDll(NULL, 0, &TempString, &hServerDll);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
/* Setup error parameters */
|
||||
Parameters[0] = (ULONG_PTR)&TempString;
|
||||
Parameters[1] = (ULONG_PTR)&ErrorString;
|
||||
RtlInitUnicodeString(&ErrorString, L"Default Load Path");
|
||||
|
||||
/* Send a hard error */
|
||||
NtRaiseHardError(Status,
|
||||
2,
|
||||
3,
|
||||
Parameters,
|
||||
OptionOk,
|
||||
&Response);
|
||||
}
|
||||
|
||||
/* Get rid of the string */
|
||||
RtlFreeUnicodeString(&TempString);
|
||||
if (!NT_SUCCESS(Status)) return Status;
|
||||
}
|
||||
|
||||
/* Allocate a CSR DLL Object */
|
||||
Size = sizeof(CSR_SERVER_DLL) + DllName.MaximumLength;
|
||||
ServerDll = RtlAllocateHeap(CsrHeap, HEAP_ZERO_MEMORY, Size);
|
||||
if (!ServerDll)
|
||||
{
|
||||
if (hServerDll) LdrUnloadDll(hServerDll);
|
||||
return STATUS_NO_MEMORY;
|
||||
}
|
||||
|
||||
/* Set up the Object */
|
||||
ServerDll->Length = Size;
|
||||
ServerDll->SharedSection = CsrSrvSharedSectionHeap;
|
||||
ServerDll->Event = CsrInitializationEvent;
|
||||
ServerDll->Name.Length = DllName.Length;
|
||||
ServerDll->Name.MaximumLength = DllName.MaximumLength;
|
||||
ServerDll->Name.Buffer = (PCHAR)(ServerDll + 1);
|
||||
if (DllName.Length)
|
||||
{
|
||||
strncpy(ServerDll->Name.Buffer, DllName.Buffer, DllName.Length);
|
||||
}
|
||||
ServerDll->ServerId = ServerId;
|
||||
ServerDll->ServerHandle = hServerDll;
|
||||
|
||||
/* Now get the entrypoint */
|
||||
if (hServerDll)
|
||||
{
|
||||
/* Initialize a string for the entrypoint, or use the default */
|
||||
RtlInitAnsiString(&EntryPointString,
|
||||
!(EntryPoint) ? "ServerDllInitialization" :
|
||||
EntryPoint);
|
||||
|
||||
/* Get a pointer to it */
|
||||
Status = LdrGetProcedureAddress(hServerDll,
|
||||
&EntryPointString,
|
||||
0,
|
||||
(PVOID)&ServerDllInitProcedure);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* No handle, so we are loading ourselves */
|
||||
ServerDllInitProcedure = CsrServerDllInitialization;
|
||||
Status = STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/* Check if we got the pointer, and call it */
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
/* Get the result from the Server DLL */
|
||||
Status = ServerDllInitProcedure(ServerDll);
|
||||
|
||||
/* Check for Success */
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
/*
|
||||
* Add this Server's Per-Process Data Size to the total that each
|
||||
* process will need.
|
||||
*/
|
||||
CsrTotalPerProcessDataLength += ServerDll->SizeOfProcessData;
|
||||
|
||||
/* Save the pointer in our list */
|
||||
CsrLoadedServerDll[ServerDll->ServerId] = ServerDll;
|
||||
|
||||
/* Does it use our generic heap? */
|
||||
if (ServerDll->SharedSection != CsrSrvSharedSectionHeap)
|
||||
{
|
||||
/* No, save the pointer to its shared section in our list */
|
||||
CsrSrvSharedStaticServerData[ServerDll->ServerId] = ServerDll->SharedSection;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Use shared failure code */
|
||||
goto LoadFailed;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LoadFailed:
|
||||
/* Server Init failed, unload it */
|
||||
if (hServerDll) LdrUnloadDll(hServerDll);
|
||||
|
||||
/* Delete the Object */
|
||||
RtlFreeHeap(CsrHeap, 0, ServerDll);
|
||||
}
|
||||
|
||||
/* Return to caller */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/*++
|
||||
* @name CsrServerDllInitialization
|
||||
* @implemented NT4
|
||||
*
|
||||
* The CsrServerDllInitialization is the initialization routine for
|
||||
* the this Server DLL.
|
||||
*
|
||||
* @param LoadedServerDll
|
||||
* Pointer to the CSR Server DLL structure representing this Server DLL.
|
||||
*
|
||||
* @return STATUS_SUCCESS.
|
||||
*
|
||||
* @remarks None.
|
||||
*
|
||||
*--*/
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrServerDllInitialization(IN PCSR_SERVER_DLL LoadedServerDll)
|
||||
{
|
||||
/* Setup the DLL Object */
|
||||
LoadedServerDll->ApiBase = 0;
|
||||
LoadedServerDll->HighestApiSupported = 5;
|
||||
LoadedServerDll->DispatchTable = CsrServerApiDispatchTable;
|
||||
LoadedServerDll->ValidTable = CsrServerApiServerValidTable;
|
||||
LoadedServerDll->NameTable = CsrServerApiNameTable;
|
||||
LoadedServerDll->SizeOfProcessData = 0;
|
||||
LoadedServerDll->ConnectCallback = NULL;
|
||||
LoadedServerDll->DisconnectCallback = NULL;
|
||||
|
||||
/* All done */
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/*++
|
||||
* @name CsrSrvClientConnect
|
||||
*
|
||||
* The CsrSrvClientConnect CSR API handles a new connection to a server DLL.
|
||||
*
|
||||
* @param ApiMessage
|
||||
* Pointer to the CSR API Message for this request.
|
||||
*
|
||||
* @param Reply
|
||||
* Optional reply to this request.
|
||||
*
|
||||
* @return STATUS_SUCCESS in case of success, STATUS_INVALID_PARAMETER
|
||||
* or STATUS_TOO_MANY_NAMES in case of failure.
|
||||
*
|
||||
* @remarks None.
|
||||
*
|
||||
*--*/
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrSrvClientConnect(IN OUT PCSR_API_MESSAGE ApiMessage,
|
||||
IN OUT PULONG Reply OPTIONAL)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
PCSR_CLIENT_CONNECT ClientConnect;
|
||||
PCSR_SERVER_DLL ServerDll;
|
||||
PCSR_PROCESS CurrentProcess = ((PCSR_THREAD)NtCurrentTeb()->CsrClientThread)->Process;
|
||||
|
||||
/* Load the Message, set default reply */
|
||||
ClientConnect = (PCSR_CLIENT_CONNECT)&ApiMessage->CsrClientConnect;
|
||||
*Reply = 0;
|
||||
|
||||
/* Validate the ServerID */
|
||||
if (ClientConnect->ServerId >= CSR_SERVER_DLL_MAX)
|
||||
{
|
||||
return STATUS_TOO_MANY_NAMES;
|
||||
}
|
||||
else if (!CsrLoadedServerDll[ClientConnect->ServerId])
|
||||
{
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
/* Validate the Message Buffer */
|
||||
if (!(CsrValidateMessageBuffer(ApiMessage,
|
||||
ClientConnect->ConnectionInfo,
|
||||
ClientConnect->ConnectionInfoSize,
|
||||
1)))
|
||||
{
|
||||
/* Fail due to buffer overflow or other invalid buffer */
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
/* Load the Server DLL */
|
||||
ServerDll = CsrLoadedServerDll[ClientConnect->ServerId];
|
||||
|
||||
/* Check if it has a Connect Callback */
|
||||
if (ServerDll->ConnectCallback)
|
||||
{
|
||||
/* Call the callback */
|
||||
Status = ServerDll->ConnectCallback(CurrentProcess,
|
||||
ClientConnect->ConnectionInfo,
|
||||
&ClientConnect->ConnectionInfoSize);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Assume success */
|
||||
Status = STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/* Return status */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/*++
|
||||
* @name CsrSrvCreateSharedSection
|
||||
*
|
||||
* The CsrSrvCreateSharedSection creates the Shared Section that all CSR Server
|
||||
* DLLs and Clients can use to share data.
|
||||
*
|
||||
* @param ParameterValue
|
||||
* Specially formatted string from our registry command-line which
|
||||
* specifies various arguments for the shared section.
|
||||
*
|
||||
* @return STATUS_SUCCESS in case of success, STATUS_UNSUCCESSFUL
|
||||
* othwerwise.
|
||||
*
|
||||
* @remarks None.
|
||||
*
|
||||
*--*/
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrSrvCreateSharedSection(IN PCHAR ParameterValue)
|
||||
{
|
||||
PCHAR SizeValue = ParameterValue;
|
||||
ULONG Size;
|
||||
NTSTATUS Status;
|
||||
LARGE_INTEGER SectionSize;
|
||||
ULONG ViewSize = 0;
|
||||
PPEB Peb = NtCurrentPeb();
|
||||
|
||||
/* If there's no parameter, fail */
|
||||
if (!ParameterValue) return STATUS_INVALID_PARAMETER;
|
||||
|
||||
/* Find the first comma, and null terminate */
|
||||
while (*SizeValue)
|
||||
{
|
||||
if (*SizeValue == ',')
|
||||
{
|
||||
*SizeValue++ = ANSI_NULL;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
SizeValue++;
|
||||
}
|
||||
}
|
||||
|
||||
/* Make sure it's valid */
|
||||
if (!*SizeValue) return STATUS_INVALID_PARAMETER;
|
||||
|
||||
/* Convert it to an integer */
|
||||
Status = RtlCharToInteger(SizeValue, 0, &Size);
|
||||
if (!NT_SUCCESS(Status)) return Status;
|
||||
|
||||
/* Multiply by 1024 entries and round to page size */
|
||||
CsrSrvSharedSectionSize = ROUND_UP(Size * 1024, CsrNtSysInfo.PageSize);
|
||||
|
||||
/* Create the Secion */
|
||||
SectionSize.LowPart = CsrSrvSharedSectionSize;
|
||||
SectionSize.HighPart = 0;
|
||||
Status = NtCreateSection(&CsrSrvSharedSection,
|
||||
SECTION_ALL_ACCESS,
|
||||
NULL,
|
||||
&SectionSize,
|
||||
PAGE_EXECUTE_READWRITE,
|
||||
SEC_BASED | SEC_RESERVE,
|
||||
NULL);
|
||||
if (!NT_SUCCESS(Status)) return Status;
|
||||
|
||||
/* Map the section */
|
||||
Status = NtMapViewOfSection(CsrSrvSharedSection,
|
||||
NtCurrentProcess(),
|
||||
&CsrSrvSharedSectionBase,
|
||||
0,
|
||||
0,
|
||||
NULL,
|
||||
&ViewSize,
|
||||
ViewUnmap,
|
||||
MEM_TOP_DOWN,
|
||||
PAGE_EXECUTE_READWRITE);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
/* Fail */
|
||||
NtClose(CsrSrvSharedSection);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* FIXME: Write the value to registry */
|
||||
|
||||
/* The Heap is the same place as the Base */
|
||||
CsrSrvSharedSectionHeap = CsrSrvSharedSectionBase;
|
||||
|
||||
/* Create the heap */
|
||||
if (!(RtlCreateHeap(HEAP_ZERO_MEMORY | HEAP_CLASS_7,
|
||||
CsrSrvSharedSectionHeap,
|
||||
CsrSrvSharedSectionSize,
|
||||
PAGE_SIZE,
|
||||
0,
|
||||
0)))
|
||||
{
|
||||
/* Failure, unmap section and return */
|
||||
NtUnmapViewOfSection(NtCurrentProcess(), CsrSrvSharedSectionBase);
|
||||
NtClose(CsrSrvSharedSection);
|
||||
return STATUS_NO_MEMORY;
|
||||
}
|
||||
|
||||
/* Now allocate space from the heap for the Shared Data */
|
||||
CsrSrvSharedStaticServerData = RtlAllocateHeap(CsrSrvSharedSectionHeap,
|
||||
0,
|
||||
CSR_SERVER_DLL_MAX *
|
||||
sizeof(PVOID));
|
||||
if (!CsrSrvSharedStaticServerData) return STATUS_NO_MEMORY;
|
||||
|
||||
/* Write the values to the PEB */
|
||||
Peb->ReadOnlySharedMemoryBase = CsrSrvSharedSectionBase;
|
||||
Peb->ReadOnlySharedMemoryHeap = CsrSrvSharedSectionHeap;
|
||||
Peb->ReadOnlyStaticServerData = CsrSrvSharedStaticServerData;
|
||||
|
||||
/* Return */
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/*++
|
||||
* @name CsrSrvAttachSharedSection
|
||||
*
|
||||
* The CsrSrvAttachSharedSection maps the CSR Shared Section into a new
|
||||
* CSR Process' address space, and returns the pointers to the section
|
||||
* through the Connection Info structure.
|
||||
*
|
||||
* @param CsrProcess
|
||||
* Pointer to the CSR Process that is attempting a connection.
|
||||
*
|
||||
* @param ConnectInfo
|
||||
* Pointer to the CSR Connection Info structure for the incoming
|
||||
* connection.
|
||||
*
|
||||
* @return STATUS_SUCCESS in case of success, STATUS_UNSUCCESSFUL
|
||||
* othwerwise.
|
||||
*
|
||||
* @remarks None.
|
||||
*
|
||||
*--*/
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrSrvAttachSharedSection(IN PCSR_PROCESS CsrProcess OPTIONAL,
|
||||
OUT PCSR_CONNECTION_INFO ConnectInfo)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
ULONG ViewSize = 0;
|
||||
|
||||
/* Check if we have a process */
|
||||
if (CsrProcess)
|
||||
{
|
||||
/* Map the sectio into this process */
|
||||
Status = NtMapViewOfSection(CsrSrvSharedSection,
|
||||
CsrProcess->ProcessHandle,
|
||||
&CsrSrvSharedSectionBase,
|
||||
0,
|
||||
0,
|
||||
NULL,
|
||||
&ViewSize,
|
||||
ViewUnmap,
|
||||
SEC_NO_CHANGE,
|
||||
PAGE_EXECUTE_READ);
|
||||
if (!NT_SUCCESS(Status)) return Status;
|
||||
}
|
||||
|
||||
/* Write the values in the Connection Info structure */
|
||||
ConnectInfo->SharedSectionBase = CsrSrvSharedSectionBase;
|
||||
ConnectInfo->SharedSectionHeap = CsrSrvSharedSectionHeap;
|
||||
ConnectInfo->SharedSectionData = CsrSrvSharedStaticServerData;
|
||||
|
||||
/* Return success */
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/*++
|
||||
* @name CsrSrvIdentifyAlertableThread
|
||||
* @implemented NT4
|
||||
*
|
||||
* The CsrSrvIdentifyAlertableThread CSR API marks a CSR Thread as alertable.
|
||||
*
|
||||
* @param ApiMessage
|
||||
* Pointer to the CSR API Message for this request.
|
||||
*
|
||||
* @param Reply
|
||||
* Pointer to an optional reply to this request.
|
||||
*
|
||||
* @return STATUS_SUCCESS.
|
||||
*
|
||||
* @remarks None.
|
||||
*
|
||||
*--*/
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrSrvIdentifyAlertableThread(IN OUT PCSR_API_MESSAGE ApiMessage,
|
||||
IN OUT PULONG Reply)
|
||||
{
|
||||
PCSR_THREAD CsrThread = NtCurrentTeb()->CsrClientThread;
|
||||
|
||||
/* Set the alertable flag */
|
||||
CsrThread->Flags |= CsrThreadAltertable;
|
||||
|
||||
/* Return success */
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/*++
|
||||
* @name CsrSrvSetPriorityClass
|
||||
* @implemented NT4
|
||||
*
|
||||
* The CsrSrvSetPriorityClass CSR API is deprecated.
|
||||
*
|
||||
* @param ApiMessage
|
||||
* Pointer to the CSR API Message for this request.
|
||||
*
|
||||
* @param Reply
|
||||
* Pointer to an optional reply to this request.
|
||||
*
|
||||
* @return STATUS_SUCCESS.
|
||||
*
|
||||
* @remarks None.
|
||||
*
|
||||
*--*/
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrSrvSetPriorityClass(IN OUT PCSR_API_MESSAGE ApiMessage,
|
||||
IN OUT PULONG Reply)
|
||||
{
|
||||
/* Deprecated */
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/*++
|
||||
* @name CsrSrvUnusedFunction
|
||||
* @implemented NT4
|
||||
*
|
||||
* The CsrSrvUnusedFunction CSR API is a stub for deprecated APIs.
|
||||
*
|
||||
* The CsrSrvSetPriorityClass CSR API is deprecated.
|
||||
*
|
||||
* @param ApiMessage
|
||||
* Pointer to the CSR API Message for this request.
|
||||
*
|
||||
* @param Reply
|
||||
* Pointer to an optional reply to this request.
|
||||
*
|
||||
* @return STATUS_INVALID_PARAMETER.
|
||||
*
|
||||
* @remarks CsrSrvSetPriorityClass does not use this stub because it must
|
||||
* return success.
|
||||
*
|
||||
*--*/
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrSrvUnusedFunction(IN OUT PCSR_API_MESSAGE ApiMessage,
|
||||
IN OUT PULONG Reply)
|
||||
{
|
||||
/* Deprecated */
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
/* PUBLIC FUNCTIONS***********************************************************/
|
||||
|
||||
/*++
|
||||
* @name CsrSetCallingSpooler
|
||||
* @implemented NT4
|
||||
*
|
||||
* the CsrSetCallingSpooler routine is deprecated.
|
||||
*
|
||||
* @param Reserved
|
||||
* Deprecated
|
||||
*
|
||||
* @return None.
|
||||
*
|
||||
* @remarks This routine was used in archaic versions of NT for Printer Drivers.
|
||||
*
|
||||
*--*/
|
||||
VOID
|
||||
NTAPI
|
||||
CsrSetCallingSpooler(ULONG Reserved)
|
||||
{
|
||||
/* Deprecated */
|
||||
return;
|
||||
}
|
||||
|
||||
/*++
|
||||
* @name CsrUnhandledExceptionFilter
|
||||
* @implemented NT5
|
||||
*
|
||||
* The CsrUnhandledExceptionFilter routine handles all exceptions
|
||||
* within SEH-protected blocks.
|
||||
*
|
||||
* @param ExceptionPointers
|
||||
* System-defined Argument.
|
||||
*
|
||||
* @return EXCEPTION_EXECUTE_HANDLER.
|
||||
*
|
||||
* @remarks None.
|
||||
*
|
||||
*--*/
|
||||
LONG
|
||||
NTAPI
|
||||
CsrUnhandledExceptionFilter(IN PEXCEPTION_POINTERS ExceptionInfo)
|
||||
{
|
||||
SYSTEM_KERNEL_DEBUGGER_INFORMATION DebuggerInfo;
|
||||
EXCEPTION_DISPOSITION Result = EXCEPTION_EXECUTE_HANDLER;
|
||||
BOOLEAN OldValue;
|
||||
NTSTATUS Status;
|
||||
UNICODE_STRING ErrorSource;
|
||||
ULONG_PTR ErrorParameters[4];
|
||||
ULONG Response;
|
||||
|
||||
/* Check if a debugger is installed */
|
||||
Status = NtQuerySystemInformation(SystemKernelDebuggerInformation,
|
||||
&DebuggerInfo,
|
||||
sizeof(DebuggerInfo),
|
||||
NULL);
|
||||
|
||||
/* Check if this is Session 0, and the Debugger is Enabled */
|
||||
if ((NtCurrentPeb()->SessionId) && (NT_SUCCESS(Status)) &&
|
||||
(DebuggerInfo.KernelDebuggerEnabled))
|
||||
{
|
||||
/* Call the Unhandled Exception Filter */
|
||||
if ((Result = RtlUnhandledExceptionFilter(ExceptionInfo)) !=
|
||||
EXCEPTION_CONTINUE_EXECUTION)
|
||||
{
|
||||
/* We're going to raise an error. Get Shutdown Privilege first */
|
||||
Status = RtlAdjustPrivilege(SE_SHUTDOWN_PRIVILEGE,
|
||||
TRUE,
|
||||
TRUE,
|
||||
&OldValue);
|
||||
|
||||
/* Use the Process token if that failed */
|
||||
if (Status == STATUS_NO_TOKEN)
|
||||
{
|
||||
Status = RtlAdjustPrivilege(SE_SHUTDOWN_PRIVILEGE,
|
||||
TRUE,
|
||||
FALSE,
|
||||
&OldValue);
|
||||
}
|
||||
|
||||
/* Initialize our Name String */
|
||||
RtlInitUnicodeString(&ErrorSource, L"Windows SubSystem");
|
||||
|
||||
/* Set the parameters */
|
||||
ErrorParameters[0] = (ULONG_PTR)&ErrorSource;
|
||||
ErrorParameters[1] = ExceptionInfo->ExceptionRecord->ExceptionCode;
|
||||
ErrorParameters[2] = (ULONG_PTR)ExceptionInfo->ExceptionRecord->ExceptionAddress;
|
||||
ErrorParameters[3] = (ULONG_PTR)ExceptionInfo->ContextRecord;
|
||||
|
||||
/* Bugcheck */
|
||||
Status = NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED,
|
||||
4,
|
||||
1,
|
||||
ErrorParameters,
|
||||
OptionShutdownSystem,
|
||||
&Response);
|
||||
}
|
||||
|
||||
/* Just terminate us */
|
||||
NtTerminateProcess(NtCurrentProcess(),
|
||||
ExceptionInfo->ExceptionRecord->ExceptionCode);
|
||||
}
|
||||
|
||||
return Result;
|
||||
}
|
||||
|
||||
/* EOF */
|
|
@ -1,407 +0,0 @@
|
|||
/*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS CSR Sub System
|
||||
* FILE: subsys/csr/csrsrv/session.c
|
||||
* PURPOSE: CSR Server DLL Session Implementation
|
||||
* PROGRAMMERS: Alex Ionescu (alex@relsoft.net)
|
||||
*/
|
||||
|
||||
/* INCLUDES ******************************************************************/
|
||||
|
||||
#include "srv.h"
|
||||
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
/* DATA **********************************************************************/
|
||||
|
||||
RTL_CRITICAL_SECTION CsrNtSessionLock;
|
||||
LIST_ENTRY CsrNtSessionList;
|
||||
HANDLE CsrSmApiPort;
|
||||
|
||||
PSB_API_ROUTINE CsrServerSbApiDispatch[5] =
|
||||
{
|
||||
CsrSbCreateSession,
|
||||
CsrSbTerminateSession,
|
||||
CsrSbForeignSessionComplete,
|
||||
CsrSbCreateProcess,
|
||||
NULL
|
||||
};
|
||||
|
||||
PCHAR CsrServerSbApiName[5] =
|
||||
{
|
||||
"SbCreateSession",
|
||||
"SbTerminateSession",
|
||||
"SbForeignSessionComplete",
|
||||
"SbCreateProcess",
|
||||
"Unknown Csr Sb Api Number"
|
||||
};
|
||||
|
||||
/* PRIVATE FUNCTIONS *********************************************************/
|
||||
|
||||
/*++
|
||||
* @name CsrInitializeNtSessionList
|
||||
*
|
||||
* The CsrInitializeNtSessionList routine sets up support for CSR Sessions.
|
||||
*
|
||||
* @param None
|
||||
*
|
||||
* @return None
|
||||
*
|
||||
* @remarks None.
|
||||
*
|
||||
*--*/
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrInitializeNtSessionList(VOID)
|
||||
{
|
||||
DPRINT("CSRSRV: %s called\n", __FUNCTION__);
|
||||
|
||||
/* Initialize the Session List */
|
||||
InitializeListHead(&CsrNtSessionList);
|
||||
|
||||
/* Initialize the Session Lock */
|
||||
return RtlInitializeCriticalSection(&CsrNtSessionLock);
|
||||
}
|
||||
|
||||
/*++
|
||||
* @name CsrAllocateNtSession
|
||||
*
|
||||
* The CsrAllocateNtSession routine allocates a new CSR NT Session.
|
||||
*
|
||||
* @param SessionId
|
||||
* Session ID of the CSR NT Session to allocate.
|
||||
*
|
||||
* @return Pointer to the newly allocated CSR NT Session.
|
||||
*
|
||||
* @remarks None.
|
||||
*
|
||||
*--*/
|
||||
PCSR_NT_SESSION
|
||||
NTAPI
|
||||
CsrAllocateNtSession(IN ULONG SessionId)
|
||||
{
|
||||
PCSR_NT_SESSION NtSession;
|
||||
|
||||
/* Allocate an NT Session Object */
|
||||
NtSession = RtlAllocateHeap(CsrHeap, 0, sizeof(CSR_NT_SESSION));
|
||||
if (NtSession)
|
||||
{
|
||||
/* Setup the Session Object */
|
||||
NtSession->SessionId = SessionId;
|
||||
NtSession->ReferenceCount = 1;
|
||||
|
||||
/* Insert it into the Session List */
|
||||
CsrAcquireNtSessionLock();
|
||||
InsertHeadList(&CsrNtSessionList, &NtSession->SessionLink);
|
||||
CsrReleaseNtSessionLock();
|
||||
}
|
||||
else
|
||||
{
|
||||
ASSERT(NtSession != NULL);
|
||||
}
|
||||
|
||||
/* Return the Session (or NULL) */
|
||||
return NtSession;
|
||||
}
|
||||
|
||||
/*++
|
||||
* @name CsrReferenceNtSession
|
||||
*
|
||||
* The CsrReferenceNtSession increases the reference count of a CSR NT Session.
|
||||
*
|
||||
* @param Session
|
||||
* Pointer to the CSR NT Session to reference.
|
||||
*
|
||||
* @return None.
|
||||
*
|
||||
* @remarks None.
|
||||
*
|
||||
*--*/
|
||||
VOID
|
||||
NTAPI
|
||||
CsrReferenceNtSession(IN PCSR_NT_SESSION Session)
|
||||
{
|
||||
/* Acquire the lock */
|
||||
CsrAcquireNtSessionLock();
|
||||
|
||||
/* Sanity checks */
|
||||
ASSERT(!IsListEmpty(&Session->SessionLink));
|
||||
ASSERT(Session->SessionId != 0);
|
||||
ASSERT(Session->ReferenceCount != 0);
|
||||
|
||||
/* Increase the reference count */
|
||||
Session->ReferenceCount++;
|
||||
|
||||
/* Release the lock */
|
||||
CsrReleaseNtSessionLock();
|
||||
}
|
||||
|
||||
/*++
|
||||
* @name CsrDereferenceNtSession
|
||||
*
|
||||
* The CsrDereferenceNtSession decreases the reference count of a
|
||||
* CSR NT Session.
|
||||
*
|
||||
* @param Session
|
||||
* Pointer to the CSR NT Session to reference.
|
||||
*
|
||||
* @param ExitStatus
|
||||
* If this is the last reference to the session, this argument
|
||||
* specifies the exit status.
|
||||
*
|
||||
* @return None.
|
||||
*
|
||||
* @remarks CsrDereferenceNtSession will complete the session if
|
||||
* the last reference to it has been closed.
|
||||
*
|
||||
*--*/
|
||||
VOID
|
||||
NTAPI
|
||||
CsrDereferenceNtSession(IN PCSR_NT_SESSION Session,
|
||||
IN NTSTATUS ExitStatus)
|
||||
{
|
||||
/* Acquire the lock */
|
||||
CsrAcquireNtSessionLock();
|
||||
|
||||
/* Sanity checks */
|
||||
ASSERT(!IsListEmpty(&Session->SessionLink));
|
||||
ASSERT(Session->SessionId != 0);
|
||||
ASSERT(Session->ReferenceCount != 0);
|
||||
|
||||
/* Dereference the Session Object */
|
||||
if (!(--Session->ReferenceCount))
|
||||
{
|
||||
/* Remove it from the list */
|
||||
RemoveEntryList(&Session->SessionLink);
|
||||
|
||||
/* Release the lock */
|
||||
CsrReleaseNtSessionLock();
|
||||
|
||||
/* Tell SM that we're done here */
|
||||
SmSessionComplete(CsrSmApiPort, Session->SessionId, ExitStatus);
|
||||
|
||||
/* Free the Session Object */
|
||||
RtlFreeHeap(CsrHeap, 0, Session);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Release the lock, the Session is still active */
|
||||
CsrReleaseNtSessionLock();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* SESSION MANAGER FUNCTIONS**************************************************/
|
||||
|
||||
/*++
|
||||
* @name CsrSbCreateSession
|
||||
*
|
||||
* The CsrSbCreateSession API is called by the Session Manager whenever a new
|
||||
* session is created.
|
||||
*
|
||||
* @param ApiMessage
|
||||
* Pointer to the Session Manager API Message.
|
||||
*
|
||||
* @return TRUE in case of success, FALSE othwerwise.
|
||||
*
|
||||
* @remarks The CsrSbCreateSession routine will initialize a new CSR NT
|
||||
* Session and allocate a new CSR Process for the subsystem process.
|
||||
*
|
||||
*--*/
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
CsrSbCreateSession(IN PSB_API_MSG ApiMessage)
|
||||
{
|
||||
PSB_CREATE_SESSION_MSG CreateSession = &ApiMessage->CreateSession;
|
||||
HANDLE hProcess, hThread;
|
||||
PCSR_PROCESS CsrProcess;
|
||||
NTSTATUS Status;
|
||||
KERNEL_USER_TIMES KernelTimes;
|
||||
PCSR_THREAD CsrThread;
|
||||
PVOID ProcessData;
|
||||
ULONG i;
|
||||
|
||||
/* Save the Process and Thread Handles */
|
||||
hProcess = CreateSession->ProcessInfo.ProcessHandle;
|
||||
hThread = CreateSession->ProcessInfo.ThreadHandle;
|
||||
|
||||
/* Lock the Processes */
|
||||
CsrAcquireProcessLock();
|
||||
|
||||
/* Allocate a new process */
|
||||
CsrProcess = CsrAllocateProcess();
|
||||
if (!CsrProcess)
|
||||
{
|
||||
/* Fail */
|
||||
ApiMessage->ReturnValue = STATUS_NO_MEMORY;
|
||||
CsrReleaseProcessLock();
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* Set the exception port */
|
||||
Status = NtSetInformationProcess(hProcess,
|
||||
ProcessExceptionPort,
|
||||
&CsrApiPort,
|
||||
sizeof(HANDLE));
|
||||
|
||||
/* Check for success */
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
/* Fail the request */
|
||||
CsrDeallocateProcess(CsrProcess);
|
||||
CsrReleaseProcessLock();
|
||||
|
||||
/* Strange as it seems, NTSTATUSes are actually returned */
|
||||
return (BOOLEAN)STATUS_NO_MEMORY;
|
||||
}
|
||||
|
||||
/* Get the Create Time */
|
||||
Status = NtQueryInformationThread(hThread,
|
||||
ThreadTimes,
|
||||
&KernelTimes,
|
||||
sizeof(KERNEL_USER_TIMES),
|
||||
NULL);
|
||||
|
||||
/* Check for success */
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
/* Fail the request */
|
||||
CsrDeallocateProcess(CsrProcess);
|
||||
CsrReleaseProcessLock();
|
||||
|
||||
/* Strange as it seems, NTSTATUSes are actually returned */
|
||||
return (BOOLEAN)Status;
|
||||
}
|
||||
|
||||
/* Allocate a new Thread */
|
||||
CsrThread = CsrAllocateThread(CsrProcess);
|
||||
if (!CsrThread)
|
||||
{
|
||||
/* Fail the request */
|
||||
CsrDeallocateProcess(CsrProcess);
|
||||
ApiMessage->ReturnValue = STATUS_NO_MEMORY;
|
||||
CsrReleaseProcessLock();
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* Setup the Thread Object */
|
||||
CsrThread->CreateTime = KernelTimes.CreateTime;
|
||||
CsrThread->ClientId = CreateSession->ProcessInfo.ClientId;
|
||||
CsrThread->ThreadHandle = hThread;
|
||||
ProtectHandle(hThread);
|
||||
CsrThread->Flags = 0;
|
||||
|
||||
/* Insert it into the Process List */
|
||||
CsrInsertThread(CsrProcess, CsrThread);
|
||||
|
||||
/* Setup Process Data */
|
||||
CsrProcess->ClientId = CreateSession->ProcessInfo.ClientId;
|
||||
CsrProcess->ProcessHandle = hProcess;
|
||||
CsrProcess->NtSession = CsrAllocateNtSession(CreateSession->SessionId);
|
||||
|
||||
/* Set the Process Priority */
|
||||
CsrSetBackgroundPriority(CsrProcess);
|
||||
|
||||
/* Get the first data location */
|
||||
ProcessData = &CsrProcess->ServerData[CSR_SERVER_DLL_MAX];
|
||||
|
||||
/* Loop every DLL */
|
||||
for (i = 0; i < CSR_SERVER_DLL_MAX; i++)
|
||||
{
|
||||
/* Check if the DLL is loaded and has Process Data */
|
||||
if (CsrLoadedServerDll[i] && CsrLoadedServerDll[i]->SizeOfProcessData)
|
||||
{
|
||||
/* Write the pointer to the data */
|
||||
CsrProcess->ServerData[i] = ProcessData;
|
||||
|
||||
/* Move to the next data location */
|
||||
ProcessData = (PVOID)((ULONG_PTR)ProcessData +
|
||||
CsrLoadedServerDll[i]->SizeOfProcessData);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Nothing for this Process */
|
||||
CsrProcess->ServerData[i] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* Insert the Process */
|
||||
CsrInsertProcess(NULL, NULL, CsrProcess);
|
||||
|
||||
/* Activate the Thread */
|
||||
ApiMessage->ReturnValue = NtResumeThread(hThread, NULL);
|
||||
|
||||
/* Release lock and return */
|
||||
CsrReleaseProcessLock();
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*++
|
||||
* @name CsrSbForeignSessionComplete
|
||||
*
|
||||
* The CsrSbForeignSessionComplete API is called by the Session Manager
|
||||
* whenever a foreign session is completed (ie: terminated).
|
||||
*
|
||||
* @param ApiMessage
|
||||
* Pointer to the Session Manager API Message.
|
||||
*
|
||||
* @return TRUE in case of success, FALSE othwerwise.
|
||||
*
|
||||
* @remarks The CsrSbForeignSessionComplete API is not yet implemented.
|
||||
*
|
||||
*--*/
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
CsrSbForeignSessionComplete(IN PSB_API_MSG ApiMessage)
|
||||
{
|
||||
/* Deprecated/Unimplemented in NT */
|
||||
ApiMessage->ReturnValue = STATUS_NOT_IMPLEMENTED;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*++
|
||||
* @name CsrSbTerminateSession
|
||||
*
|
||||
* The CsrSbTerminateSession API is called by the Session Manager
|
||||
* whenever a foreign session should be destroyed.
|
||||
*
|
||||
* @param ApiMessage
|
||||
* Pointer to the Session Manager API Message.
|
||||
*
|
||||
* @return TRUE in case of success, FALSE othwerwise.
|
||||
*
|
||||
* @remarks The CsrSbTerminateSession API is not yet implemented.
|
||||
*
|
||||
*--*/
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
CsrSbTerminateSession(IN PSB_API_MSG ApiMessage)
|
||||
{
|
||||
ApiMessage->ReturnValue = STATUS_NOT_IMPLEMENTED;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*++
|
||||
* @name CsrSbCreateProcess
|
||||
*
|
||||
* The CsrSbCreateProcess API is called by the Session Manager
|
||||
* whenever a foreign session is created and a new process should be started.
|
||||
*
|
||||
* @param ApiMessage
|
||||
* Pointer to the Session Manager API Message.
|
||||
*
|
||||
* @return TRUE in case of success, FALSE othwerwise.
|
||||
*
|
||||
* @remarks The CsrSbCreateProcess API is not yet implemented.
|
||||
*
|
||||
*--*/
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
CsrSbCreateProcess(IN PSB_API_MSG ApiMessage)
|
||||
{
|
||||
ApiMessage->ReturnValue = STATUS_NOT_IMPLEMENTED;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* EOF */
|
|
@ -1,395 +0,0 @@
|
|||
#ifndef _SRV_H
|
||||
#define _SRV_H
|
||||
|
||||
/* PSDK/NDK Headers */
|
||||
#define NTOS_MODE_USER
|
||||
#include <stdio.h>
|
||||
#define WIN32_NO_STATUS
|
||||
#include <windows.h>
|
||||
#include <winnt.h>
|
||||
#include <ndk/ntndk.h>
|
||||
|
||||
/* CSR Header */
|
||||
#include <csr/server.h>
|
||||
#include <sm/smmsg.h>
|
||||
|
||||
/* PSEH for SEH Support */
|
||||
#include <pseh/pseh2.h>
|
||||
|
||||
/* DEFINES *******************************************************************/
|
||||
|
||||
#define CSR_SERVER_DLL_MAX 4
|
||||
|
||||
#define CsrAcquireProcessLock() \
|
||||
RtlEnterCriticalSection(&CsrProcessLock);
|
||||
|
||||
#define CsrReleaseProcessLock() \
|
||||
RtlLeaveCriticalSection(&CsrProcessLock);
|
||||
|
||||
#define CsrAcquireWaitLock() \
|
||||
RtlEnterCriticalSection(&CsrWaitListsLock);
|
||||
|
||||
#define CsrReleaseWaitLock() \
|
||||
RtlLeaveCriticalSection(&CsrWaitListsLock);
|
||||
|
||||
#define CsrAcquireNtSessionLock() \
|
||||
RtlEnterCriticalSection(&CsrNtSessionLock)
|
||||
|
||||
#define CsrReleaseNtSessionLock() \
|
||||
RtlLeaveCriticalSection(&CsrNtSessionLock)
|
||||
|
||||
#define CsrHashThread(t) \
|
||||
(HandleToUlong(t)&(256 - 1))
|
||||
|
||||
#define ProcessStructureListLocked() \
|
||||
(CsrProcessLock.OwningThread == NtCurrentTeb()->ClientId.UniqueThread)
|
||||
|
||||
#define SM_REG_KEY \
|
||||
L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Session Manager"
|
||||
|
||||
#define SESSION_ROOT L"\\Sessions"
|
||||
#define GLOBAL_ROOT L"\\GLOBAL??"
|
||||
#define SYMLINK_NAME L"SymbolicLink"
|
||||
#define SB_PORT_NAME L"SbAbiPort"
|
||||
#define CSR_PORT_NAME L"ApiPort"
|
||||
#define UNICODE_PATH_SEP L"\\"
|
||||
|
||||
#define ROUND_UP(n, align) ROUND_DOWN(((ULONG)n) + (align) - 1, (align))
|
||||
#define ROUND_DOWN(n, align) (((ULONG)n) & ~((align) - 1l))
|
||||
|
||||
/* DATA **********************************************************************/
|
||||
|
||||
extern ULONG CsrTotalPerProcessDataLength;
|
||||
extern ULONG CsrMaxApiRequestThreads;
|
||||
extern PCSR_SERVER_DLL CsrLoadedServerDll[CSR_SERVER_DLL_MAX];
|
||||
extern PCSR_PROCESS CsrRootProcess;
|
||||
extern UNICODE_STRING CsrSbApiPortName;
|
||||
extern UNICODE_STRING CsrApiPortName;
|
||||
extern HANDLE CsrSbApiPort;
|
||||
extern HANDLE CsrSmApiPort;
|
||||
extern HANDLE CsrApiPort;
|
||||
extern HANDLE CsrHeap;
|
||||
extern RTL_CRITICAL_SECTION CsrProcessLock;
|
||||
extern RTL_CRITICAL_SECTION CsrWaitListsLock;
|
||||
extern LIST_ENTRY CsrThreadHashTable[256];
|
||||
extern HANDLE CsrInitializationEvent;
|
||||
extern SYSTEM_BASIC_INFORMATION CsrNtSysInfo;
|
||||
extern UNICODE_STRING CsrDirectoryName;
|
||||
extern HANDLE CsrObjectDirectory;
|
||||
extern PSB_API_ROUTINE CsrServerSbApiDispatch[5];
|
||||
extern ULONG CsrDebug;
|
||||
|
||||
/* FUNCTIONS *****************************************************************/
|
||||
|
||||
/* FIXME: Public APIs should go in the CSR Server Include */
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
CsrCaptureArguments(
|
||||
IN PCSR_THREAD CsrThread,
|
||||
IN PCSR_API_MESSAGE ApiMessage
|
||||
);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrLoadServerDll(
|
||||
IN PCHAR DllString,
|
||||
IN PCHAR EntryPoint,
|
||||
IN ULONG ServerId
|
||||
);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrServerInitialization(
|
||||
ULONG ArgumentCount,
|
||||
PCHAR Arguments[]
|
||||
);
|
||||
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
UnProtectHandle(IN HANDLE ObjectHandle);
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
CsrLockedReferenceProcess(IN PCSR_PROCESS CsrProcess);
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
CsrLockedReferenceThread(IN PCSR_THREAD CsrThread);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrCreateSessionObjectDirectory(IN ULONG SessionId);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrCreateObjectDirectory(IN PCHAR ObjectDirectory);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrSrvCreateSharedSection(IN PCHAR ParameterValue);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrInitializeNtSessionList(VOID);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrInitializeProcessStructure(VOID);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrApiPortInitialize(VOID);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrSbApiPortInitialize(VOID);
|
||||
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
CsrSbCreateSession(IN PSB_API_MSG ApiMessage);
|
||||
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
CsrSbTerminateSession(IN PSB_API_MSG ApiMessage);
|
||||
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
CsrSbForeignSessionComplete(IN PSB_API_MSG ApiMessage);
|
||||
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
CsrSbCreateProcess(IN PSB_API_MSG ApiMessage);
|
||||
|
||||
PCSR_PROCESS
|
||||
NTAPI
|
||||
CsrAllocateProcess(VOID);
|
||||
|
||||
PCSR_THREAD
|
||||
NTAPI
|
||||
CsrAllocateThread(IN PCSR_PROCESS CsrProcess);
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
CsrInsertThread(
|
||||
IN PCSR_PROCESS Process,
|
||||
IN PCSR_THREAD Thread
|
||||
);
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
CsrSetBackgroundPriority(IN PCSR_PROCESS CsrProcess);
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
CsrDeallocateProcess(IN PCSR_PROCESS CsrProcess);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrGetProcessLuid(
|
||||
HANDLE hProcess,
|
||||
PLUID Luid
|
||||
);
|
||||
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
CsrImpersonateClient(IN PCSR_THREAD CsrThread);
|
||||
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
CsrRevertToSelf(VOID);
|
||||
|
||||
PCSR_THREAD
|
||||
NTAPI
|
||||
CsrLocateThreadByClientId(
|
||||
OUT PCSR_PROCESS *Process,
|
||||
IN PCLIENT_ID ClientId
|
||||
);
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
CsrDereferenceNtSession(
|
||||
IN PCSR_NT_SESSION Session,
|
||||
NTSTATUS ExitStatus
|
||||
);
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
CsrReferenceNtSession(PCSR_NT_SESSION Session);
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
CsrLockedDereferenceThread(PCSR_THREAD CsrThread);
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
CsrLockedDereferenceProcess(PCSR_PROCESS CsrProcess);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrLockProcessByClientId(
|
||||
IN HANDLE Pid,
|
||||
OUT PCSR_PROCESS *CsrProcess OPTIONAL
|
||||
);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrUnlockProcess(PCSR_PROCESS CsrProcess);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrSrvClientConnect(
|
||||
IN OUT PCSR_API_MESSAGE ApiMessage,
|
||||
IN OUT PULONG Reply
|
||||
);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrSrvUnusedFunction(
|
||||
IN OUT PCSR_API_MESSAGE ApiMessage,
|
||||
IN OUT PULONG Reply
|
||||
);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrSrvIdentifyAlertableThread(
|
||||
IN OUT PCSR_API_MESSAGE ApiMessage,
|
||||
IN OUT PULONG Reply
|
||||
);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrSrvSetPriorityClass(
|
||||
IN OUT PCSR_API_MESSAGE ApiMessage,
|
||||
IN OUT PULONG Reply
|
||||
);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrServerDllInitialization(IN PCSR_SERVER_DLL LoadedServerDll);
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
CsrDereferenceThread(PCSR_THREAD CsrThread);
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
CsrSbApiRequestThread(IN PVOID Parameter);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrApiRequestThread(IN PVOID Parameter);
|
||||
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
ProtectHandle(IN HANDLE ObjectHandle);
|
||||
|
||||
PCSR_THREAD
|
||||
NTAPI
|
||||
CsrAddStaticServerThread(
|
||||
IN HANDLE hThread,
|
||||
IN PCLIENT_ID ClientId,
|
||||
IN ULONG ThreadFlags
|
||||
);
|
||||
|
||||
PCSR_THREAD
|
||||
NTAPI
|
||||
CsrConnectToUser(VOID);
|
||||
|
||||
PCSR_THREAD
|
||||
NTAPI
|
||||
CsrLocateThreadInProcess(
|
||||
IN PCSR_PROCESS CsrProcess OPTIONAL,
|
||||
IN PCLIENT_ID Cid
|
||||
);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrSbApiHandleConnectionRequest(IN PSB_API_MSG Message);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrApiHandleConnectionRequest(IN PCSR_API_MESSAGE ApiMessage);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrSrvAttachSharedSection(
|
||||
IN PCSR_PROCESS CsrProcess OPTIONAL,
|
||||
OUT PCSR_CONNECTION_INFO ConnectInfo
|
||||
);
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
CsrReleaseCapturedArguments(IN PCSR_API_MESSAGE ApiMessage);
|
||||
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
CsrNotifyWaitBlock(
|
||||
IN PCSR_WAIT_BLOCK WaitBlock,
|
||||
IN PLIST_ENTRY WaitList,
|
||||
IN PVOID WaitArgument1,
|
||||
IN PVOID WaitArgument2,
|
||||
IN ULONG WaitFlags,
|
||||
IN BOOLEAN DereferenceThread
|
||||
);
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
CsrDereferenceProcess(PCSR_PROCESS CsrProcess);
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
CsrInsertProcess(
|
||||
IN PCSR_PROCESS Parent OPTIONAL,
|
||||
IN PCSR_PROCESS CurrentProcess OPTIONAL,
|
||||
IN PCSR_PROCESS CsrProcess
|
||||
);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrPopulateDosDevicesDirectory(
|
||||
IN HANDLE DosDevicesDirectory,
|
||||
IN PPROCESS_DEVICEMAP_INFORMATION DeviceMap
|
||||
);
|
||||
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
CsrValidateMessageBuffer(
|
||||
IN PCSR_API_MESSAGE ApiMessage,
|
||||
IN PVOID *Buffer,
|
||||
IN ULONG ArgumentSize,
|
||||
IN ULONG ArgumentCount
|
||||
);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrCreateLocalSystemSD(OUT PSECURITY_DESCRIPTOR *LocalSystemSd);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrDestroyThread(IN PCLIENT_ID Cid);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrDestroyProcess(
|
||||
IN PCLIENT_ID Cid,
|
||||
IN NTSTATUS ExitStatus
|
||||
);
|
||||
|
||||
LONG
|
||||
NTAPI
|
||||
CsrUnhandledExceptionFilter(
|
||||
IN PEXCEPTION_POINTERS ExceptionInfo
|
||||
);
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
CsrProcessRefcountZero(IN PCSR_PROCESS CsrProcess);
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
CsrThreadRefcountZero(IN PCSR_THREAD CsrThread);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
CsrSetDirectorySecurity(IN HANDLE ObjectDirectory);
|
||||
#endif
|
|
@ -1,111 +0,0 @@
|
|||
/*
|
||||
* CSRSRV Status
|
||||
*/
|
||||
|
||||
/* Organization
|
||||
*
|
||||
* api.c - Handles the LPC Reply/Request Threads which wait on Sb and Csr APIs.
|
||||
* Also in charge of creating those threads and setting up the ports.
|
||||
* Finally, it provides external APIs for validating the API buffers
|
||||
* and doing server-to-server API calls.
|
||||
*
|
||||
* init.c - Handles initialization of CSRSRV, including command-line parsing,
|
||||
* loading the Server DLLs, creating the Session Directories, setting
|
||||
* up the DosDevices Object Directory, and initializing each component.
|
||||
*
|
||||
* process.c - Handles all internal functions dealing with the CSR Process Object,
|
||||
* including de/allocation, de/referencing, un/locking, prority, and
|
||||
* lookups. Also handles all external APIs which touch the CSR Process Object.
|
||||
*
|
||||
* server.c - Handles all internal functions related to loading and managing Server
|
||||
* DLLs, as well as the routines handling the Shared Static Memory Section.
|
||||
* Holds the API Dispatch/Valid/Name Tables and the public CSR_SERVER API
|
||||
* interface. Also home of the SEH handler.
|
||||
*
|
||||
* session.c - Handles all internal functions dealing with the CSR Session Object,
|
||||
* including de/allocation, de/referencing, and un/locking. Holds the SB API
|
||||
* Dispatch/Name Tables and the public CsrSv API Interface for commmunication
|
||||
* with the Session Manager.
|
||||
*
|
||||
* thread.c - Handles all internal functions dealing with the CSR Thread Object,
|
||||
* including de/allocation, de/referencing, un/locking, impersonation, and
|
||||
* lookups. Also handles all external APIs which touch the CSR Thread Object.
|
||||
*
|
||||
* wait.c - Handles all internal functions dealing with the CSR Wait Object,
|
||||
* including de/allocation, de/referencing and un/locking. Also implements
|
||||
* the external Wait API for creating, removing and/or notifying waits.
|
||||
*/
|
||||
|
||||
/* Exported APIs, their location, and their status
|
||||
* CsrAddStaticServerThread 753E679E 1 - server.c - IMPLEMENTED
|
||||
* CsrCallServerFromServer 753E4FD9 2 - api.c - IMPLEMENTED
|
||||
* CsrConnectToUser 753E4E48 3 - api.c - IMPLEMENTED
|
||||
* CsrCreateProcess 753E6FD3 4 - process.c - IMPLEMENTED
|
||||
* CsrCreateRemoteThread 753E73BD 5 - thread.c - IMPLEMENTED
|
||||
* CsrCreateThread 753E72DA 6 - thread.c - IMPLEMENTED
|
||||
* CsrCreateWait 753E770E 7 - wait.c - IMPLEMENTED
|
||||
* CsrDebugProcess 753E7682 8 - process.c - IMPLEMENTED
|
||||
* CsrDebugProcessStop 753E768A 9 - process.c - IMPLEMENTED
|
||||
* CsrDereferenceProcess 753E6281 10 - process.c - IMPLEMENTED
|
||||
* CsrDereferenceThread 753E6964 11 - thread.c - IMPLEMENTED
|
||||
* CsrDereferenceWait 753E7886 12 - wait.c - IMPLEMENTED
|
||||
* CsrDestroyProcess 753E7225 13 - process.c - IMPLEMENTED
|
||||
* CsrDestroyThread 753E7478 14 - thread.c - IMPLEMENTED
|
||||
* CsrExecServerThread 753E6841 15 - thread.c - IMPLEMENTED
|
||||
* CsrGetProcessLuid 753E632F 16 - process.c - IMPLEMENTED
|
||||
* CsrImpersonateClient 753E60F8 17 - thread.c - IMPLEMENTED
|
||||
* CsrLockProcessByClientId 753E668F 18 - process.c - IMPLEMENTED
|
||||
* CsrLockThreadByClientId 753E6719 19 - thread.c - IMPLEMENTED
|
||||
* CsrMoveSatisfiedWait 753E7909 20 - wait.c - IMPLEMENTED
|
||||
* CsrNotifyWait 753E782F 21 - wait.c - IMPLEMENTED
|
||||
* CsrPopulateDosDevices 753E37A5 22 - init.c - IMPLEMENTED
|
||||
* CsrQueryApiPort 753E4E42 23 - api.c - IMPLEMENTED
|
||||
* CsrReferenceThread 753E61E5 24 - thread.c - IMPLEMENTED
|
||||
* CsrRevertToSelf 753E615A 25 - thread.c - IMPLEMENTED
|
||||
* CsrServerInitialization 753E3D75 26 - server.c - IMPLEMENTED
|
||||
* CsrSetBackgroundPriority 753E5E87 27 - process.c - IMPLEMENTED
|
||||
* CsrSetCallingSpooler 753E6425 28 - server.c - IMPLEMENTED
|
||||
* CsrSetForegroundPriority 753E5E67 29 - process.c - IMPLEMENTED
|
||||
* CsrShutdownProcesses 753E7547 30 - process.c - IMPLEMENTED
|
||||
* CsrUnhandledExceptionFilter 753E3FE3 31 - server.c - IMPLEMENTED
|
||||
* CsrUnlockProcess 753E66FD 32 - process.c - IMPLEMENTED
|
||||
* CsrUnlockThread 753E7503 33 - thread.c - IMPLEMENTED
|
||||
* CsrValidateMessageBuffer 753E528D 34 - api.c - IMPLEMENTED
|
||||
* CsrValidateMessageString 753E5323 35 - api.c - UNIMPLEMENTED
|
||||
*/
|
||||
|
||||
/* Public CSR API Interface Status (server.c)
|
||||
* CsrSrvClientConnect - IMPLEMENTED
|
||||
* CsrSrvUnusedFunction - IMPLEMENTED
|
||||
* CsrSrvIdentifyAlertableThread - IMPLEMENTED
|
||||
* CsrSrvSetPriorityClass - IMPLEMENTED
|
||||
*/
|
||||
|
||||
/* Public SB API Interface Status (session.c)
|
||||
* CsrSbCreateSession - IMPLEMENTED
|
||||
* CsrSbForeignSessionComplete - IMPLEMENTED
|
||||
* CsrSbTerminateSession - UNIMPLEMENTED
|
||||
* CsrSbCreateProcess - UNIMPLEMENTED
|
||||
*/
|
||||
|
||||
/* What's missing:
|
||||
*
|
||||
* - SMSS needs to be partly re-written to match some things done here.
|
||||
* Among other things, SmConnectToSm, SmCompleteSession and the other
|
||||
* Sm* Exported APIs have to be properly implemented, as well as the
|
||||
* callback calling and SM LPC APIs. [DONE!]
|
||||
*
|
||||
* - NTDLL needs to get the Csr* routines properly implemented. [DONE!]
|
||||
*
|
||||
* - KERNEL32, USER32 need to register with their servers properly.
|
||||
* Additionally, user32 needs to have ClientThreadStartup implemented
|
||||
* properly and do the syscall NtUserInitialize (I think) which also
|
||||
* needs to be implemented in win32k.sys. All this should be less then
|
||||
* 100 lines of code. [KERNEL32 50% DONE, USER32 NOT DONE]
|
||||
*
|
||||
* - The skeleton code for winsrv and basesrv which connects with CSR/CSRSRV
|
||||
* needs to be written. [NOT DONE]
|
||||
*
|
||||
* - The kernel's LPC implementation needs to be made compatible. [DONE!]
|
||||
*/
|
||||
|
File diff suppressed because it is too large
Load diff
|
@ -1,449 +0,0 @@
|
|||
/*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS CSR Sub System
|
||||
* FILE: subsys/csr/csrsrv/wait.c
|
||||
* PURPOSE: CSR Server DLL Wait Implementation
|
||||
* PROGRAMMERS: Emanuele Aliberti
|
||||
* Alex Ionescu (alex@relsoft.net)
|
||||
*/
|
||||
|
||||
/* INCLUDES ******************************************************************/
|
||||
|
||||
#include "srv.h"
|
||||
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
/* DATA **********************************************************************/
|
||||
|
||||
RTL_CRITICAL_SECTION CsrWaitListsLock;
|
||||
|
||||
/* PRIVATE FUNCTIONS *********************************************************/
|
||||
|
||||
/*++
|
||||
* @name CsrInitializeWait
|
||||
*
|
||||
* The CsrInitializeWait routine initializes a CSR Wait Object.
|
||||
*
|
||||
* @param WaitFunction
|
||||
* Pointer to the function that will handle this wait.
|
||||
*
|
||||
* @param CsrWaitThread
|
||||
* Pointer to the CSR Thread that will perform the wait.
|
||||
*
|
||||
* @param WaitApiMessage
|
||||
* Pointer to the CSR API Message associated to this wait.
|
||||
*
|
||||
* @param WaitContext
|
||||
* Pointer to a user-defined parameter associated to this wait.
|
||||
*
|
||||
* @param NewWaitBlock
|
||||
* Pointed to the initialized CSR Wait Block for this wait.
|
||||
*
|
||||
* @return TRUE in case of success, FALSE othwerwise.
|
||||
*
|
||||
* @remarks None.
|
||||
*
|
||||
*--*/
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
CsrInitializeWait(IN CSR_WAIT_FUNCTION WaitFunction,
|
||||
IN PCSR_THREAD CsrWaitThread,
|
||||
IN OUT PCSR_API_MESSAGE WaitApiMessage,
|
||||
IN PVOID WaitContext,
|
||||
OUT PCSR_WAIT_BLOCK *NewWaitBlock)
|
||||
{
|
||||
ULONG Size;
|
||||
PCSR_WAIT_BLOCK WaitBlock;
|
||||
|
||||
/* Calculate the size of the wait block */
|
||||
Size = sizeof(CSR_WAIT_BLOCK) -
|
||||
sizeof(WaitBlock->WaitApiMessage) +
|
||||
WaitApiMessage->Header.u1.s1.TotalLength;
|
||||
|
||||
/* Allocate the Wait Block */
|
||||
WaitBlock = RtlAllocateHeap(CsrHeap, 0, Size);
|
||||
if (!WaitBlock)
|
||||
{
|
||||
/* Fail */
|
||||
WaitApiMessage->Status = STATUS_NO_MEMORY;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Initialize it */
|
||||
WaitBlock->Size = Size;
|
||||
WaitBlock->WaitThread = CsrWaitThread;
|
||||
WaitBlock->WaitContext = WaitContext;
|
||||
WaitBlock->WaitFunction = WaitFunction;
|
||||
WaitBlock->UserWaitList.Flink = NULL;
|
||||
WaitBlock->UserWaitList.Blink = NULL;
|
||||
WaitBlock->WaitList = WaitBlock->UserWaitList;
|
||||
|
||||
/* Copy the message */
|
||||
RtlMoveMemory(&WaitBlock->WaitApiMessage,
|
||||
WaitApiMessage,
|
||||
WaitApiMessage->Header.u1.s1.TotalLength);
|
||||
|
||||
/* Return the block */
|
||||
*NewWaitBlock = WaitBlock;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*++
|
||||
* @name CsrNotifyWaitBlock
|
||||
*
|
||||
* The CsrNotifyWaitBlock routine calls the wait function for a registered
|
||||
* CSR Wait Block, and replies to the attached CSR API Message, if any.
|
||||
*
|
||||
* @param WaitBlock
|
||||
* Pointer to the CSR Wait Block
|
||||
*
|
||||
* @param WaitList
|
||||
* Pointer to the wait list for this wait.
|
||||
*
|
||||
* @param WaitArgument[1-2]
|
||||
* User-defined values to pass to the wait function.
|
||||
*
|
||||
* @param WaitFlags
|
||||
* Wait flags for this wait.
|
||||
*
|
||||
* @param DereferenceThread
|
||||
* Specifies whether the CSR Thread should be dereferenced at the
|
||||
* end of this wait.
|
||||
*
|
||||
* @return TRUE in case of success, FALSE otherwise.
|
||||
*
|
||||
* @remarks After a wait block is notified, the wait function becomes invalid.
|
||||
*
|
||||
*--*/
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
CsrNotifyWaitBlock(IN PCSR_WAIT_BLOCK WaitBlock,
|
||||
IN PLIST_ENTRY WaitList,
|
||||
IN PVOID WaitArgument1,
|
||||
IN PVOID WaitArgument2,
|
||||
IN ULONG WaitFlags,
|
||||
IN BOOLEAN DereferenceThread)
|
||||
{
|
||||
/* Call the wait function */
|
||||
if ((WaitBlock->WaitFunction)(WaitList,
|
||||
WaitBlock->WaitThread,
|
||||
&WaitBlock->WaitApiMessage,
|
||||
WaitBlock->WaitContext,
|
||||
WaitArgument1,
|
||||
WaitArgument2,
|
||||
WaitFlags))
|
||||
{
|
||||
/* The wait is done, clear the block */
|
||||
WaitBlock->WaitThread->WaitBlock = NULL;
|
||||
|
||||
/* Check for captured arguments */
|
||||
if (WaitBlock->WaitApiMessage.CsrCaptureData)
|
||||
{
|
||||
/* Release them */
|
||||
CsrReleaseCapturedArguments(&WaitBlock->WaitApiMessage);
|
||||
}
|
||||
|
||||
/* Reply to the port */
|
||||
NtReplyPort(WaitBlock->WaitThread->Process->ClientPort,
|
||||
(PPORT_MESSAGE)&WaitBlock->WaitApiMessage);
|
||||
|
||||
/* Check if we should dereference the thread */
|
||||
if (DereferenceThread)
|
||||
{
|
||||
/* Remove it from the Wait List */
|
||||
if (WaitBlock->WaitList.Flink)
|
||||
{
|
||||
RemoveEntryList(&WaitBlock->WaitList);
|
||||
}
|
||||
|
||||
/* Remove it from the User Wait List */
|
||||
if (WaitBlock->UserWaitList.Flink)
|
||||
{
|
||||
RemoveEntryList(&WaitBlock->UserWaitList);
|
||||
}
|
||||
|
||||
/* Dereference teh thread */
|
||||
CsrDereferenceThread(WaitBlock->WaitThread);
|
||||
|
||||
/* Free the wait block */
|
||||
RtlFreeHeap(CsrHeap, 0, WaitBlock);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* The wait is complete, but the thread is being kept alive */
|
||||
WaitBlock->WaitFunction = NULL;
|
||||
}
|
||||
|
||||
/* The wait suceeded */
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* The wait failed */
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* PUBLIC FUNCTIONS **********************************************************/
|
||||
|
||||
/*++
|
||||
* @name CsrCreateWait
|
||||
* @implemented NT4
|
||||
*
|
||||
* The CsrCreateWait routine creates a CSR Wait.
|
||||
*
|
||||
* @param WaitList
|
||||
* Pointer to a list entry of the waits to associate.
|
||||
*
|
||||
* @param WaitFunction
|
||||
* Pointer to the function that will handle this wait.
|
||||
*
|
||||
* @param CsrWaitThread
|
||||
* Pointer to the CSR Thread that will perform the wait.
|
||||
*
|
||||
* @param WaitApiMessage
|
||||
* Pointer to the CSR API Message associated to this wait.
|
||||
*
|
||||
* @param WaitContext
|
||||
* Pointer to a user-defined parameter associated to this wait.
|
||||
*
|
||||
* @param UserWaitList
|
||||
* Pointer to a list entry of the user-defined waits to associate.
|
||||
*
|
||||
* @return TRUE in case of success, FALSE otherwise.
|
||||
*
|
||||
* @remarks None.
|
||||
*
|
||||
*--*/
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
CsrCreateWait(IN PLIST_ENTRY WaitList,
|
||||
IN CSR_WAIT_FUNCTION WaitFunction,
|
||||
IN PCSR_THREAD CsrWaitThread,
|
||||
IN OUT PCSR_API_MESSAGE WaitApiMessage,
|
||||
IN PVOID WaitContext,
|
||||
IN PLIST_ENTRY UserWaitList OPTIONAL)
|
||||
{
|
||||
PCSR_WAIT_BLOCK WaitBlock;
|
||||
|
||||
/* Initialize the wait */
|
||||
if (!CsrInitializeWait(WaitFunction,
|
||||
CsrWaitThread,
|
||||
WaitApiMessage,
|
||||
WaitContext,
|
||||
&WaitBlock))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Acquire the Wait Lock */
|
||||
CsrAcquireWaitLock();
|
||||
|
||||
/* Make sure the thread wasn't destroyed */
|
||||
if (CsrWaitThread->Flags & CsrThreadTerminated)
|
||||
{
|
||||
/* Fail the wait */
|
||||
RtlFreeHeap(CsrHeap, 0, WaitBlock);
|
||||
CsrReleaseWaitLock();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Insert the wait in the queue */
|
||||
InsertTailList(WaitList, &WaitBlock->WaitList);
|
||||
|
||||
/* Insert the User Wait too, if one was given */
|
||||
if (UserWaitList) InsertTailList(UserWaitList, &WaitBlock->UserWaitList);
|
||||
|
||||
/* Return */
|
||||
CsrReleaseWaitLock();
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*++
|
||||
* @name CsrDereferenceWait
|
||||
* @implemented NT4
|
||||
*
|
||||
* The CsrDereferenceWait routine derefences a CSR Wait Block.
|
||||
*
|
||||
* @param WaitList
|
||||
* Pointer to the Wait List associated to the wait.
|
||||
|
||||
* @return None.
|
||||
*
|
||||
* @remarks None.
|
||||
*
|
||||
*--*/
|
||||
VOID
|
||||
NTAPI
|
||||
CsrDereferenceWait(IN PLIST_ENTRY WaitList)
|
||||
{
|
||||
PLIST_ENTRY NextEntry;
|
||||
PCSR_WAIT_BLOCK WaitBlock;
|
||||
|
||||
/* Acquire the Process and Wait Locks */
|
||||
CsrAcquireProcessLock();
|
||||
CsrAcquireWaitLock();
|
||||
|
||||
/* Set the list pointers */
|
||||
NextEntry = WaitList->Flink;
|
||||
|
||||
/* Start the loop */
|
||||
while (NextEntry != WaitList)
|
||||
{
|
||||
/* Get the wait block */
|
||||
WaitBlock = CONTAINING_RECORD(NextEntry, CSR_WAIT_BLOCK, WaitList);
|
||||
|
||||
/* Move to the next entry */
|
||||
NextEntry = NextEntry->Flink;
|
||||
|
||||
/* Check if there's no Wait Routine */
|
||||
if (!WaitBlock->WaitFunction)
|
||||
{
|
||||
/* Remove it from the Wait List */
|
||||
if (WaitBlock->WaitList.Flink)
|
||||
{
|
||||
RemoveEntryList(&WaitBlock->WaitList);
|
||||
}
|
||||
|
||||
/* Remove it from the User Wait List */
|
||||
if (WaitBlock->UserWaitList.Flink)
|
||||
{
|
||||
RemoveEntryList(&WaitBlock->UserWaitList);
|
||||
}
|
||||
|
||||
/* Dereference the thread waiting on it */
|
||||
CsrDereferenceThread(WaitBlock->WaitThread);
|
||||
|
||||
/* Free the block */
|
||||
RtlFreeHeap(CsrHeap, 0, WaitBlock);
|
||||
}
|
||||
}
|
||||
|
||||
/* Release the locks */
|
||||
CsrReleaseWaitLock();
|
||||
CsrReleaseProcessLock();
|
||||
}
|
||||
|
||||
/*++
|
||||
* @name CsrMoveSatisfiedWait
|
||||
* @implemented NT5
|
||||
*
|
||||
* The CsrMoveSatisfiedWait routine moves satisfied waits from a wait list
|
||||
* to another list entry.
|
||||
*
|
||||
* @param NewEntry
|
||||
* Pointer to a list entry where the satisfied waits will be added.
|
||||
*
|
||||
* @param WaitList
|
||||
* Pointer to a list entry to analyze for satisfied waits.
|
||||
*
|
||||
* @return None.
|
||||
*
|
||||
* @remarks None.
|
||||
*
|
||||
*--*/
|
||||
VOID
|
||||
NTAPI
|
||||
CsrMoveSatisfiedWait(IN PLIST_ENTRY NewEntry,
|
||||
IN PLIST_ENTRY WaitList)
|
||||
{
|
||||
PLIST_ENTRY NextEntry;
|
||||
PCSR_WAIT_BLOCK WaitBlock;
|
||||
|
||||
/* Acquire the Wait Lock */
|
||||
CsrAcquireWaitLock();
|
||||
|
||||
/* Set the List pointers */
|
||||
NextEntry = WaitList->Flink;
|
||||
|
||||
/* Start looping */
|
||||
while (NextEntry != WaitList)
|
||||
{
|
||||
/* Get the Wait block */
|
||||
WaitBlock = CONTAINING_RECORD(NextEntry, CSR_WAIT_BLOCK, WaitList);
|
||||
|
||||
/* Go to the next entry */
|
||||
NextEntry = NextEntry->Flink;
|
||||
|
||||
/* Check if there is a Wait Callback */
|
||||
if (WaitBlock->WaitFunction)
|
||||
{
|
||||
/* Remove it from the Wait Block Queue */
|
||||
RemoveEntryList(&WaitBlock->WaitList);
|
||||
|
||||
/* Insert the new entry */
|
||||
InsertTailList(&WaitBlock->WaitList, NewEntry);
|
||||
}
|
||||
}
|
||||
|
||||
/* Release the wait lock */
|
||||
CsrReleaseWaitLock();
|
||||
}
|
||||
|
||||
/*++
|
||||
* @name CsrNotifyWait
|
||||
* @implemented NT4
|
||||
*
|
||||
* The CsrNotifyWait notifies a CSR Wait Block.
|
||||
*
|
||||
* @param WaitList
|
||||
* Pointer to the list entry for this wait.
|
||||
*
|
||||
* @param WaitType
|
||||
* Type of the wait to perform, either WaitAny or WaitAll.
|
||||
*
|
||||
* @param WaitArgument[1-2]
|
||||
* User-defined argument to pass on to the wait function.
|
||||
*
|
||||
* @return TRUE in case of success, FALSE othwerwise.
|
||||
*
|
||||
* @remarks None.
|
||||
*
|
||||
*--*/
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
CsrNotifyWait(IN PLIST_ENTRY WaitList,
|
||||
IN ULONG WaitType,
|
||||
IN PVOID WaitArgument1,
|
||||
IN PVOID WaitArgument2)
|
||||
{
|
||||
PLIST_ENTRY NextEntry;
|
||||
PCSR_WAIT_BLOCK WaitBlock;
|
||||
BOOLEAN NotifySuccess = FALSE;
|
||||
|
||||
/* Acquire the Wait Lock */
|
||||
CsrAcquireWaitLock();
|
||||
|
||||
/* Set the List pointers */
|
||||
NextEntry = WaitList->Flink;
|
||||
|
||||
/* Start looping */
|
||||
while (NextEntry != WaitList)
|
||||
{
|
||||
/* Get the Wait block */
|
||||
WaitBlock = CONTAINING_RECORD(NextEntry, CSR_WAIT_BLOCK, WaitList);
|
||||
|
||||
/* Go to the next entry */
|
||||
NextEntry = NextEntry->Flink;
|
||||
|
||||
/* Check if there is a Wait Callback */
|
||||
if (WaitBlock->WaitFunction)
|
||||
{
|
||||
/* Notify the Waiter */
|
||||
NotifySuccess |= CsrNotifyWaitBlock(WaitBlock,
|
||||
WaitList,
|
||||
WaitArgument1,
|
||||
WaitArgument2,
|
||||
0,
|
||||
FALSE);
|
||||
|
||||
/* We've already done a wait, so leave unless this is a Wait All */
|
||||
if (WaitType != WaitAll) break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Release the wait lock and return */
|
||||
CsrReleaseWaitLock();
|
||||
return NotifySuccess;
|
||||
}
|
||||
|
||||
/* EOF */
|
|
@ -1,97 +0,0 @@
|
|||
/*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS CSR Sub System
|
||||
* FILE: subsys/csr/csrss.c
|
||||
* PURPOSE: CSR Executable
|
||||
* PROGRAMMERS: Alex Ionescu (alex@relsoft.net)
|
||||
*/
|
||||
|
||||
/* INCLUDES ******************************************************************/
|
||||
|
||||
#define WIN32_NO_STATUS
|
||||
#include <windows.h>
|
||||
#define NTOS_MODE_USER
|
||||
#include <ndk/ntndk.h>
|
||||
#include <csr/server.h>
|
||||
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
/* PRIVATE FUNCTIONS *********************************************************/
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
CsrpSetDefaultProcessHardErrorMode (VOID)
|
||||
{
|
||||
ULONG DefaultHardErrorMode = 0;
|
||||
|
||||
/* Disable hard errors */
|
||||
NtSetInformationProcess(NtCurrentProcess(),
|
||||
ProcessDefaultHardErrorMode,
|
||||
&DefaultHardErrorMode,
|
||||
sizeof(DefaultHardErrorMode));
|
||||
}
|
||||
|
||||
/*
|
||||
* Note: Standard entrypoint for Native C Programs.
|
||||
* The OS backend (NtProcessStartup) which calls this routine is
|
||||
* implemented in a CRT-like static library (much like mainCRTStartup).
|
||||
* Do NOT manually add the NtProcessStartup entrypoint or anything else.
|
||||
*/
|
||||
int
|
||||
_cdecl
|
||||
_main(int argc,
|
||||
char *argv[],
|
||||
char *envp[],
|
||||
int DebugFlag)
|
||||
{
|
||||
KPRIORITY BasePriority = (8 + 1) + 4;
|
||||
NTSTATUS Status;
|
||||
ULONG Response;
|
||||
UNREFERENCED_PARAMETER(envp);
|
||||
UNREFERENCED_PARAMETER(DebugFlag);
|
||||
|
||||
/* Set the Priority */
|
||||
NtSetInformationProcess(NtCurrentProcess(),
|
||||
ProcessBasePriority,
|
||||
&BasePriority,
|
||||
sizeof(KPRIORITY));
|
||||
|
||||
/* Give us IOPL so that we can access the VGA registers */
|
||||
Status = NtSetInformationProcess(NtCurrentProcess(),
|
||||
ProcessUserModeIOPL,
|
||||
NULL,
|
||||
0);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
/* Raise a hard error */
|
||||
DPRINT1("CSRSS: Could not raise IOPL: %x\n", Status);
|
||||
Status = NtRaiseHardError(STATUS_IO_PRIVILEGE_FAILED,
|
||||
0,
|
||||
0,
|
||||
NULL,
|
||||
OptionOk,
|
||||
&Response);
|
||||
}
|
||||
|
||||
/* Initialize CSR through CSRSRV */
|
||||
Status = CsrServerInitialization(argc, argv);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
/* Kill us */
|
||||
DPRINT1("CSRSS: CsrServerInitialization failed:% lx\n", Status);
|
||||
NtTerminateProcess(NtCurrentProcess(), Status);
|
||||
}
|
||||
|
||||
/* Disable errors */
|
||||
CsrpSetDefaultProcessHardErrorMode();
|
||||
|
||||
/* If this is Session 0, make sure killing us bugchecks the system */
|
||||
if (!NtCurrentPeb()->SessionId) RtlSetProcessIsCritical(TRUE, NULL, FALSE);
|
||||
|
||||
/* Kill this thread. CSRSRV keeps us going */
|
||||
NtTerminateThread(NtCurrentThread(), Status);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* EOF */
|
Loading…
Reference in a new issue