|
|
/*++
Copyright (c) 1989 Microsoft Corporation
Module Name:
smsrvp.h
Abstract:
Session Manager Private Types and Prototypes
Author:
Mark Lucovsky (markl) 04-Oct-1989
Revision History:
--*/
#ifndef _SMSRVP_
#define _SMSRVP_
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <ntsm.h>
#define NOEXTAPI
#include <wdbgexts.h>
#include <ntdbg.h>
#include <stdlib.h>
#if defined(REMOTE_BOOT)
#include <remboot.h>
#endif // defined(REMOTE_BOOT)
#include "sm.h"
#pragma warning(3:4101) // Unreferenced local variable
#define SMP_SHOW_REGISTRY_DATA 0
//
// VOID
// SmpSetDaclDefaulted(
// IN POBJECT_ATTRIBUTES ObjectAttributes,
// OUT PSECURITY_DESCRIPTOR_CONTROL CurrentSdControl
// )
//
// Description:
//
// This routine will set the DaclDefaulted flag of the DACL passed
// via the ObjectAttributes parameter. If the ObjectAttributes do
// not include a SecurityDescriptor, then no action is taken.
//
// Parameters:
//
// ObjectAttributes - The object attributes whose security descriptor is
// to have its DaclDefaulted flag set.
//
// CurrentSdControl - Receives the current value of the security descriptor's
// control flags. This may be used in a subsequent call to
// SmpRestoreDaclDefaulted() to restore the flag to its original state.
//
#define SmpSetDaclDefaulted( OA, SDC ) \
if( (OA)->SecurityDescriptor != NULL) { \ (*SDC) = ((PISECURITY_DESCRIPTOR)((OA)->SecurityDescriptor))->Control & \ SE_DACL_DEFAULTED; \ ((PISECURITY_DESCRIPTOR)((OA)->SecurityDescriptor))->Control |= \ SE_DACL_DEFAULTED; \ }
//
// VOID
// SmpRestoreDaclDefaulted(
// IN POBJECT_ATTRIBUTES ObjectAttributes,
// IN SECURITY_DESCRIPTOR_CONTROL OriginalSdControl
// )
//
// Description:
//
// This routine will set the DaclDefaulted flag of the DACL back to
// a prior state (indicated by the value in OriginalSdControl).
//
// Parameters:
//
// ObjectAttributes - The object attributes whose security descriptor is
// to have its DaclDefaulted flag restored. If the object attributes
// have no security descriptor, then no action is taken.
//
// OriginalSdControl - The original value of the security descriptor's
// control flags. This typically is obtained via a prior call to
// SmpSetDaclDefaulted().
//
#define SmpRestoreDaclDefaulted( OA, SDC ) \
if( (OA)->SecurityDescriptor != NULL) { \ ((PISECURITY_DESCRIPTOR)((OA)->SecurityDescriptor))->Control = \ (((PISECURITY_DESCRIPTOR)((OA)->SecurityDescriptor))->Control & \ ~SE_DACL_DEFAULTED) | \ (SDC & SE_DACL_DEFAULTED); \ }
//
// VOID
// SmpReferenceKnownSubSys(
// IN PSMPKNOWNSUBSYS KnownSubSys
// )
//
// Description:
//
// This routine Increments the Refcount for a KnownSubSys
// to prevent him from being deleted while still in use.
// The KnownSubSystem lock must be held while using thie macro
//
// Parameters:
//
// KnownSubSys - The SMPKNOWNSUBSYS structure to referemce.
//
#define SmpReferenceKnownSubSys( KS ) KS->RefCount++
//
// VOID
// SmpDereferenceKnownSubSys(
// IN PSMPKNOWNSUBSYS KnownSubSys
// )
//
// Description:
//
// This routine decrements the Refcount for a KnownSubSys
// If the KnownSubSys is bein deleted and refcount goes to
// Zero, then cleanup is done and KnownSubSys is freed.
// The KnownSubSystem lock must be held while using thie macro
//
// Parameters:
//
// KnownSubSys - The SMPKNOWNSUBSYS structure to dereference.
//
#define SmpDeferenceKnownSubSys( KS ) \
if ((--KS->RefCount) == 0 && KS->Deleting) { \ if (KS->Active) {NtClose(KS->Active);} \ if (KS->Process) {NtClose(KS->Process);} \ if (KS->SbApiCommunicationPort) {NtClose(KS->SbApiCommunicationPort);} \ RtlFreeHeap(SmpHeap, 0, KS); \ }
//
// Types
//
typedef struct _SMP_REGISTRY_VALUE { LIST_ENTRY Entry; UNICODE_STRING Name; UNICODE_STRING Value; LPSTR AnsiValue; } SMP_REGISTRY_VALUE, *PSMP_REGISTRY_VALUE;
typedef struct _SMPKNOWNSUBSYS { LIST_ENTRY Links; HANDLE Active; HANDLE Process; ULONG ImageType; HANDLE SmApiCommunicationPort; HANDLE SbApiCommunicationPort; CLIENT_ID InitialClientId; ULONG MuSessionId; BOOLEAN Deleting; ULONG RefCount; } SMPKNOWNSUBSYS, *PSMPKNOWNSUBSYS;
typedef enum { UNKNOWN_CONTEXT, NONSYSTEM_CONTEXT, SYSTEM_CONTEXT } ENUMSECURITYCONTEXT;
typedef struct _SMP_CLIENT_CONTEXT {
struct _SMP_CLIENT_CONTEXT * Link; PSMPKNOWNSUBSYS KnownSubSys; HANDLE ClientProcessHandle; HANDLE ServerPortHandle; ENUMSECURITYCONTEXT SecurityContext; } SMP_CLIENT_CONTEXT, *PSMP_CLIENT_CONTEXT;
typedef struct _SMPSESSION { LIST_ENTRY SortedSessionIdListLinks; ULONG SessionId; PSMPKNOWNSUBSYS OwningSubsystem; PSMPKNOWNSUBSYS CreatorSubsystem; } SMPSESSION, *PSMPSESSION;
typedef struct _SMPPROCESS { LIST_ENTRY Links; CLIENT_ID DebugUiClientId; CLIENT_ID ConnectionKey; } SMPPROCESS, *PSMPPROCESS;
//
// Define structure for an on-disk master boot record. (pulled from
// private\windows\setup\textmode\kernel\sppartit.h)
//
typedef struct _ON_DISK_PTE { UCHAR ActiveFlag; UCHAR StartHead; UCHAR StartSector; UCHAR StartCylinder; UCHAR SystemId; UCHAR EndHead; UCHAR EndSector; UCHAR EndCylinder; UCHAR RelativeSectors[4]; UCHAR SectorCount[4]; } ON_DISK_PTE, *PON_DISK_PTE; typedef struct _ON_DISK_MBR { UCHAR BootCode[440]; UCHAR NTFTSignature[4]; UCHAR Filler[2]; ON_DISK_PTE PartitionTable[4]; UCHAR AA55Signature[2]; } ON_DISK_MBR, *PON_DISK_MBR;
//
// Global Data
//
RTL_CRITICAL_SECTION SmpKnownSubSysLock; LIST_ENTRY SmpKnownSubSysHead;
LIST_ENTRY NativeProcessList;
RTL_CRITICAL_SECTION SmpSessionListLock; LIST_ENTRY SmpSessionListHead; ULONG SmpNextSessionId; BOOLEAN SmpNextSessionIdScanMode;
ULONG SmpDebug; HANDLE SmpDebugPort; BOOLEAN SmpDbgSsLoaded; PDBGSS_INITIALIZE_ROUTINE SmpDbgInitRoutine; PDBGSS_HANDLE_MSG_ROUTINE SmpDbgHandleMsgRoutine;
UNICODE_STRING SmpSubsystemName; UNICODE_STRING SmpKnownDllPath; HANDLE SmpDosDevicesObjectDirectory; HANDLE SmpSessionsObjectDirectory;
PVOID SmpHeap;
LUID SmpTcbPrivilege;
PVOID SmpDefaultEnvironment;
PTOKEN_OWNER SmpSmOwnerSid; ULONG SmpSmOwnerSidLength;
UNICODE_STRING SmpDefaultLibPath; WCHAR *SmpDefaultLibPathBuffer;
UNICODE_STRING SmpSystemRoot; WCHAR *SmpSystemRootBuffer;
#define VALUE_BUFFER_SIZE (sizeof(KEY_VALUE_PARTIAL_INFORMATION) + 256 * sizeof(WCHAR))
#if defined(REMOTE_BOOT)
#define MAX_HAL_NAME_LENGTH 30 // Keep in sync with definition in setupblk.h
extern BOOLEAN SmpAutoFormat; extern BOOLEAN SmpRepin; extern BOOLEAN SmpNetboot; extern BOOLEAN SmpNetbootDisconnected; extern CHAR SmpHalName[MAX_HAL_NAME_LENGTH + 1]; #endif // defined(REMOTE_BOOT)
extern ULONG AttachedSessionId;
//
// Session Manager Apis
//
typedef NTSTATUS (* PSMAPI)( IN PSMAPIMSG SmApiMsg, IN PSMP_CLIENT_CONTEXT CallingClient, IN HANDLE CallPort );
NTSTATUS SmpCreateForeignSession( IN PSMAPIMSG SmApiMsg, IN PSMP_CLIENT_CONTEXT CallingClient, IN HANDLE CallPort );
NTSTATUS SmpSessionComplete( IN PSMAPIMSG SmApiMsg, IN PSMP_CLIENT_CONTEXT CallingClient, IN HANDLE CallPort );
NTSTATUS SmpTerminateForeignSession( IN PSMAPIMSG SmApiMsg, IN PSMP_CLIENT_CONTEXT CallingClient, IN HANDLE CallPort );
NTSTATUS SmpExecPgm( // Temporary Hack
IN PSMAPIMSG SmApiMsg, IN PSMP_CLIENT_CONTEXT CallingClient, IN HANDLE CallPort );
NTSTATUS SmpLoadDeferedSubsystem( IN PSMAPIMSG SmApiMsg, IN PSMP_CLIENT_CONTEXT CallingClient, IN HANDLE CallPort );
NTSTATUS SmpStartCsr( IN PSMAPIMSG SmApiMsg, IN PSMP_CLIENT_CONTEXT CallingClient, IN HANDLE CallPort ); NTSTATUS SmpStopCsr( IN PSMAPIMSG SmApiMsg, IN PSMP_CLIENT_CONTEXT CallingClient, IN HANDLE CallPort );
ENUMSECURITYCONTEXT SmpClientSecurityContext ( IN PPORT_MESSAGE Message, IN HANDLE ServerPortHandle );
//
// Private Prototypes
//
NTSTATUS SmpExecuteInitialCommand( IN ULONG MuSessionId, IN PUNICODE_STRING InitialCommand, OUT PHANDLE InitialCommandProcess, OUT PULONG_PTR InitialCommandProcessId );
NTSTATUS SmpApiLoop ( IN PVOID ThreadParameter );
NTSTATUS SmpInit( OUT PUNICODE_STRING InitialCommand, OUT PHANDLE WindowsSubSystem );
NTSTATUS SmpExecuteImage( IN PUNICODE_STRING ImageFileName, IN PUNICODE_STRING CurrentDirectory, IN PUNICODE_STRING CommandLine, IN ULONG MuSessionId, IN ULONG Flags, IN OUT PRTL_USER_PROCESS_INFORMATION ProcessInformation OPTIONAL );
NTSTATUS SmpLoadDbgSs( IN PUNICODE_STRING DbgSsName );
PSMPKNOWNSUBSYS SmpLocateKnownSubSysByCid( IN PCLIENT_ID ClientId );
PSMPKNOWNSUBSYS SmpLocateKnownSubSysByType( IN ULONG MuSessionId, IN ULONG ImageType );
ULONG SmpAllocateSessionId( IN PSMPKNOWNSUBSYS OwningSubsystem, IN PSMPKNOWNSUBSYS CreatorSubsystem OPTIONAL );
PSMPSESSION SmpSessionIdToSession( IN ULONG SessionId );
VOID SmpDeleteSession( IN ULONG SessionId );
HANDLE SmpOpenDir( BOOLEAN IsDosName, BOOLEAN IsSynchronous, PWSTR DirName );
NTSTATUS SmpCopyFile( HANDLE SrcDirHandle, HANDLE DstDirHandle, PUNICODE_STRING FileName );
NTSTATUS SmpDeleteFile( IN PUNICODE_STRING pFile );
#if SMP_SHOW_REGISTRY_DATA
VOID SmpDumpQuery( IN PWSTR ModId, IN PCHAR RoutineName, IN PWSTR ValueName, IN ULONG ValueType, IN PVOID ValueData, IN ULONG ValueLength ); #endif
#define ALIGN(p,val) (PVOID)((((ULONG_PTR)(p) + (val) - 1)) & (~((val) - 1)))
#define U_USHORT(p) (*(USHORT UNALIGNED *)(p))
#define U_ULONG(p) (*(ULONG UNALIGNED *)(p))
#if defined(REMOTE_BOOT)
VOID SmpGetHarddiskBootPartition( OUT PULONG DiskNumber, OUT PULONG PartitionNumber );
VOID SmpPartitionDisk( IN ULONG DiskNumber, OUT PULONG PartitionNumber );
VOID SmpFindCSCPartition( IN ULONG DiskNumber, OUT PULONG PartitionNumber ); #endif // defined(REMOTE_BOOT)
//
// Stubs for Hydra specific API's
//
NTSTATUS SmpLoadSubSystemsForMuSession( OUT PULONG pMuSessionId, OUT PULONG_PTR WindowsSubSysProcessId, IN OUT PUNICODE_STRING InitialCommand );
NTSTATUS SmpGetProcessMuSessionId( IN HANDLE Process, OUT PULONG pMuSessionId );
NTSTATUS SmpSetProcessMuSessionId( IN HANDLE Process, IN ULONG MuSessionId );
BOOLEAN SmpCheckDuplicateMuSessionId( IN ULONG MuSessionId );
//
// Stubs for Sb APIs
//
NTSTATUS SmpSbCreateSession ( IN PSMPSESSION SourceSession OPTIONAL, IN PSMPKNOWNSUBSYS CreatorSubsystem OPTIONAL, IN PRTL_USER_PROCESS_INFORMATION ProcessInformation, IN ULONG DebugSession OPTIONAL, IN PCLIENT_ID DebugUiClientId OPTIONAL );
ULONG SmBaseTag;
#define MAKE_TAG( t ) (RTL_HEAP_MAKE_TAG( SmBaseTag, t ))
#define INIT_TAG 0
#define DBG_TAG 1
#define SM_TAG 2
//
// Utility Routines (smutil.c)
//
NTSTATUS SmpSaveRegistryValue( IN OUT PLIST_ENTRY ListHead, IN PWSTR Name, IN PWSTR Value OPTIONAL, IN BOOLEAN CheckForDuplicate );
PSMP_REGISTRY_VALUE SmpFindRegistryValue( IN PLIST_ENTRY ListHead, IN PWSTR Name );
NTSTATUS SmpAcquirePrivilege( ULONG Privilege, PVOID *ReturnedState );
VOID SmpReleasePrivilege( PVOID StatePointer );
//
// String parsing routine from sminit.c
//
NTSTATUS SmpParseCommandLine( IN PUNICODE_STRING CommandLine, OUT PULONG Flags, OUT PUNICODE_STRING ImageFileName, OUT PUNICODE_STRING ImageFileDirectory OPTIONAL, OUT PUNICODE_STRING Arguments );
//
// Crashdump routines from smcrash.c
//
BOOLEAN SmpCheckForCrashDump( IN PUNICODE_STRING PageFileName );
#endif // _SMSRVP_
|