From: Emanuele Aliberti Date: Tue, 12 Apr 2005 21:25:58 +0000 (+0000) Subject: SM: some server side code for SM_API_QUERY_INFORMATION X-Git-Tag: backups/powerpc@14753~119 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=b27e1666982e49750045b24521a342691d32e7e5 SM: some server side code for SM_API_QUERY_INFORMATION svn path=/trunk/; revision=14598 --- diff --git a/reactos/subsys/smss/client.c b/reactos/subsys/smss/client.c index d0efa95663d..212e3332e86 100644 --- a/reactos/subsys/smss/client.c +++ b/reactos/subsys/smss/client.c @@ -276,4 +276,49 @@ SmDestroyClient (ULONG SubsystemId) return Status; } +/* === Utilities for SmQryInfo === */ + +/********************************************************************** + * SmGetClientBasicInformation/1 + */ +NTSTATUS FASTCALL +SmGetClientBasicInformation (PSM_BASIC_INFORMATION i) +{ + INT Index = 0; + PSM_CLIENT_DATA Client = NULL; + + DPRINT("SM: %s called\n", __FUNCTION__); + + RtlEnterCriticalSection (& SmpClientDirectory.Lock); + + i->SubSystemCount = SmpClientDirectory.Count; + i->Unused = 0; + + if (SmpClientDirectory.Count > 0) + { + Client = SmpClientDirectory.Client; + while ((NULL != Client) && (Index < SM_QRYINFO_MAX_SS_COUNT)) + { + i->SubSystem[Index].Id = Client->SubsystemId; + i->SubSystem[Index].Flags = 0; /* TODO */ + i->SubSystem[Index].ProcessId = 0; /* TODO */ + Client = Client->Next; + } + } + + RtlLeaveCriticalSection (& SmpClientDirectory.Lock); + return STATUS_SUCCESS; +} + +/********************************************************************** + * SmGetSubSystemInformation/1 + */ +NTSTATUS FASTCALL +SmGetSubSystemInformation (PSM_SUBSYSTEM_INFORMATION i) +{ + DPRINT("SM: %s called\n", __FUNCTION__); + + return STATUS_NOT_IMPLEMENTED; +} + /* EOF */ diff --git a/reactos/subsys/smss/makefile b/reactos/subsys/smss/makefile index 3845a347e7a..87f64a855bb 100644 --- a/reactos/subsys/smss/makefile +++ b/reactos/subsys/smss/makefile @@ -24,8 +24,12 @@ TARGET_OBJECTS = $(TARGET_NAME).o \ smapi.o smapicomp.o smapiexec.o smapiquery.o \ client.o debug.o print.o +DEP_OBJECTS = $(TARGET_OBJECTS) + include $(PATH_TO_TOP)/rules.mak include $(TOOLS_PATH)/helper.mk +include $(TOOLS_PATH)/depend.mk + # EOF diff --git a/reactos/subsys/smss/smapiquery.c b/reactos/subsys/smss/smapiquery.c index 4172231c60b..d1c402de757 100644 --- a/reactos/subsys/smss/smapiquery.c +++ b/reactos/subsys/smss/smapiquery.c @@ -1,4 +1,4 @@ -/* $Id: $ +/* $Id$ * * smapiquery.c - SM_API_QUERY_INFORMATION * @@ -37,8 +37,33 @@ SMAPI(SmQryInfo) NTSTATUS Status = STATUS_SUCCESS; DPRINT("SM: %s called\n", __FUNCTION__); - - Request->SmHeader.Status = STATUS_NOT_IMPLEMENTED; + + switch (Request->Request.QryInfo.SmInformationClass) + { + case SmBasicInformation: + if(Request->Request.QryInfo.DataLength != sizeof (SM_BASIC_INFORMATION)) + { + Request->Reply.QryInfo.DataLength = sizeof (SM_BASIC_INFORMATION); + Request->SmHeader.Status = STATUS_INFO_LENGTH_MISMATCH; + }else{ + Request->SmHeader.Status = + SmGetClientBasicInformation (& Request->Reply.QryInfo.BasicInformation); + } + break; + case SmSubSystemInformation: + if(Request->Request.QryInfo.DataLength != sizeof (SM_SUBSYSTEM_INFORMATION)) + { + Request->Reply.QryInfo.DataLength = sizeof (SM_SUBSYSTEM_INFORMATION); + Request->SmHeader.Status = STATUS_INFO_LENGTH_MISMATCH; + }else{ + Request->SmHeader.Status = + SmGetSubSystemInformation (& Request->Reply.QryInfo.SubSystemInformation); + } + break; + default: + Request->SmHeader.Status = STATUS_NOT_IMPLEMENTED; + break; + } return Status; } diff --git a/reactos/subsys/smss/smss.c b/reactos/subsys/smss/smss.c index b03197c0a70..09438cfcab8 100644 --- a/reactos/subsys/smss/smss.c +++ b/reactos/subsys/smss/smss.c @@ -56,6 +56,7 @@ NtProcessStartup(PPEB Peb) } /* Initialize the system */ Status = InitSessionManager(); + /* Watch required subsystems TODO */ #if 0 if (!NT_SUCCESS(Status)) { diff --git a/reactos/subsys/smss/smss.h b/reactos/subsys/smss/smss.h index eae61437e30..b5352bfcdba 100644 --- a/reactos/subsys/smss/smss.h +++ b/reactos/subsys/smss/smss.h @@ -96,6 +96,8 @@ NTSTATUS SmInitializeClientManagement(VOID); NTSTATUS STDCALL SmCreateClient(PSM_PORT_MESSAGE,PSM_CLIENT_DATA*); NTSTATUS STDCALL SmDestroyClient(ULONG); NTSTATUS STDCALL SmCompleteClientInitialization (HANDLE hProcess); +NTSTATUS FASTCALL SmGetClientBasicInformation (PSM_BASIC_INFORMATION); +NTSTATUS FASTCALL SmGetSubSystemInformation (PSM_SUBSYSTEM_INFORMATION); /* debug.c */ extern HANDLE DbgSsApiPort;