Implemented [Get/Set]ProcessShutdownParameters().

svn path=/trunk/; revision=3645
This commit is contained in:
Eric Kohl 2002-10-20 16:40:12 +00:00
parent 31789101ee
commit bb4e509794
5 changed files with 266 additions and 208 deletions

View file

@ -293,6 +293,13 @@ typedef struct
DWORD Reserved; DWORD Reserved;
} CSRSS_EXIT_REACTOS_REQUEST, *PCSRSS_EXIT_REACTOS_REQUEST; } CSRSS_EXIT_REACTOS_REQUEST, *PCSRSS_EXIT_REACTOS_REQUEST;
typedef struct
{
DWORD Level;
DWORD Flags;
} CSRSS_SHUTDOWN_PARAMETERS, *PCSRSS_SHUTDOWN_PARAMETERS;
#define CSRSS_MAX_WRITE_CONSOLE_REQUEST \ #define CSRSS_MAX_WRITE_CONSOLE_REQUEST \
(MAX_MESSAGE_DATA - sizeof(ULONG) - sizeof(CSRSS_WRITE_CONSOLE_REQUEST)) (MAX_MESSAGE_DATA - sizeof(ULONG) - sizeof(CSRSS_WRITE_CONSOLE_REQUEST))
@ -343,7 +350,8 @@ typedef struct
#define CSRSS_GET_NUM_INPUT_EVENTS (0x1C) #define CSRSS_GET_NUM_INPUT_EVENTS (0x1C)
#define CSRSS_REGISTER_SERVICES_PROCESS (0x1D) #define CSRSS_REGISTER_SERVICES_PROCESS (0x1D)
#define CSRSS_EXIT_REACTOS (0x1E) #define CSRSS_EXIT_REACTOS (0x1E)
#define CSRSS_GET_SHUTDOWN_PARAMETERS (0x1F)
#define CSRSS_SET_SHUTDOWN_PARAMETERS (0x20)
/* Keep in sync with definition below. */ /* Keep in sync with definition below. */
@ -384,6 +392,7 @@ typedef struct
CSRSS_GET_NUM_INPUT_EVENTS_REQUEST GetNumInputEventsRequest; CSRSS_GET_NUM_INPUT_EVENTS_REQUEST GetNumInputEventsRequest;
CSRSS_REGISTER_SERVICES_PROCESS_REQUEST RegisterServicesProcessRequest; CSRSS_REGISTER_SERVICES_PROCESS_REQUEST RegisterServicesProcessRequest;
CSRSS_EXIT_REACTOS_REQUEST ExitReactosRequest; CSRSS_EXIT_REACTOS_REQUEST ExitReactosRequest;
CSRSS_SHUTDOWN_PARAMETERS SetShutdownParametersRequest;
} Data; } Data;
} CSRSS_API_REQUEST, *PCSRSS_API_REQUEST; } CSRSS_API_REQUEST, *PCSRSS_API_REQUEST;
@ -410,6 +419,7 @@ typedef struct
CSRSS_READ_CONSOLE_OUTPUT_CHAR_REPLY ReadConsoleOutputCharReply; CSRSS_READ_CONSOLE_OUTPUT_CHAR_REPLY ReadConsoleOutputCharReply;
CSRSS_READ_CONSOLE_OUTPUT_ATTRIB_REPLY ReadConsoleOutputAttribReply; CSRSS_READ_CONSOLE_OUTPUT_ATTRIB_REPLY ReadConsoleOutputAttribReply;
CSRSS_GET_NUM_INPUT_EVENTS_REPLY GetNumInputEventsReply; CSRSS_GET_NUM_INPUT_EVENTS_REPLY GetNumInputEventsReply;
CSRSS_SHUTDOWN_PARAMETERS GetShutdownParametersReply;
} Data; } Data;
} CSRSS_API_REPLY, *PCSRSS_API_REPLY; } CSRSS_API_REPLY, *PCSRSS_API_REPLY;

View file

@ -1,4 +1,4 @@
/* $Id: proc.c,v 1.47 2002/10/20 11:56:00 chorns Exp $ /* $Id: proc.c,v 1.48 2002/10/20 16:39:06 ekohl Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS system libraries * PROJECT: ReactOS system libraries
@ -44,98 +44,118 @@ RegisterWaitForInputIdle (WaitForInputIdleType lpfnRegisterWaitForInputIdle);
WINBOOL STDCALL WINBOOL STDCALL
GetProcessId (HANDLE hProcess, LPDWORD lpProcessId); GetProcessId (HANDLE hProcess, LPDWORD lpProcessId);
WINBOOL WINBOOL STDCALL
STDCALL GetProcessAffinityMask(HANDLE hProcess,
GetProcessAffinityMask (
HANDLE hProcess,
LPDWORD lpProcessAffinityMask, LPDWORD lpProcessAffinityMask,
LPDWORD lpSystemAffinityMask LPDWORD lpSystemAffinityMask)
)
{ {
if ( (NULL == lpProcessAffinityMask) if ((NULL == lpProcessAffinityMask)
|| (NULL == lpSystemAffinityMask) || (NULL == lpSystemAffinityMask))
)
{ {
SetLastError(ERROR_BAD_ARGUMENTS); SetLastError(ERROR_BAD_ARGUMENTS);
return FALSE; return(FALSE);
} }
/* FIXME: check hProcess is actually a process */ /* FIXME: check hProcess is actually a process */
/* FIXME: query the kernel process object */ /* FIXME: query the kernel process object */
*lpProcessAffinityMask = 0x00000001; *lpProcessAffinityMask = 0x00000001;
*lpSystemAffinityMask = 0x00000001; *lpSystemAffinityMask = 0x00000001;
return TRUE;
}
return(TRUE);
WINBOOL
STDCALL
GetProcessShutdownParameters (
LPDWORD lpdwLevel,
LPDWORD lpdwFlags
)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
}
WINBOOL
STDCALL
GetProcessWorkingSetSize (
HANDLE hProcess,
LPDWORD lpMinimumWorkingSetSize,
LPDWORD lpMaximumWorkingSetSize
)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
}
WINBOOL
STDCALL
SetProcessShutdownParameters (
DWORD dwLevel,
DWORD dwFlags
)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
}
WINBOOL
STDCALL
SetProcessWorkingSetSize (
HANDLE hProcess,
DWORD dwMinimumWorkingSetSize,
DWORD dwMaximumWorkingSetSize
)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
} }
WINBOOL STDCALL WINBOOL STDCALL
GetProcessTimes (HANDLE hProcess, GetProcessShutdownParameters(LPDWORD lpdwLevel,
LPDWORD lpdwFlags)
{
CSRSS_API_REQUEST CsrRequest;
CSRSS_API_REPLY CsrReply;
NTSTATUS Status;
CsrRequest.Type = CSRSS_GET_SHUTDOWN_PARAMETERS;
Status = CsrClientCallServer(&CsrRequest,
&CsrReply,
sizeof(CSRSS_API_REQUEST),
sizeof(CSRSS_API_REPLY));
if (!NT_SUCCESS(Status) || !NT_SUCCESS(CsrReply.Status))
{
SetLastError(Status);
return(FALSE);
}
*lpdwLevel = CsrReply.Data.GetShutdownParametersReply.Level;
*lpdwFlags = CsrReply.Data.GetShutdownParametersReply.Flags;
return(TRUE);
}
WINBOOL STDCALL
SetProcessShutdownParameters(DWORD dwLevel,
DWORD dwFlags)
{
CSRSS_API_REQUEST CsrRequest;
CSRSS_API_REPLY CsrReply;
NTSTATUS Status;
CsrRequest.Data.SetShutdownParametersRequest.Level = dwLevel;
CsrRequest.Data.SetShutdownParametersRequest.Flags = dwFlags;
CsrRequest.Type = CSRSS_SET_SHUTDOWN_PARAMETERS;
Status = CsrClientCallServer(&CsrRequest,
&CsrReply,
sizeof(CSRSS_API_REQUEST),
sizeof(CSRSS_API_REPLY));
if (!NT_SUCCESS(Status) || !NT_SUCCESS(CsrReply.Status))
{
SetLastError(Status);
return(FALSE);
}
return(TRUE);
}
WINBOOL STDCALL
GetProcessWorkingSetSize(HANDLE hProcess,
LPDWORD lpMinimumWorkingSetSize,
LPDWORD lpMaximumWorkingSetSize)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return(FALSE);
}
WINBOOL STDCALL
SetProcessWorkingSetSize(HANDLE hProcess,
DWORD dwMinimumWorkingSetSize,
DWORD dwMaximumWorkingSetSize)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return(FALSE);
}
WINBOOL STDCALL
GetProcessTimes(HANDLE hProcess,
LPFILETIME lpCreationTime, LPFILETIME lpCreationTime,
LPFILETIME lpExitTime, LPFILETIME lpExitTime,
LPFILETIME lpKernelTime, LPFILETIME lpKernelTime,
LPFILETIME lpUserTime) LPFILETIME lpUserTime)
{ {
NTSTATUS Status;
KERNEL_USER_TIMES Kut; KERNEL_USER_TIMES Kut;
NTSTATUS Status;
Status = NtQueryInformationProcess (hProcess, Status = NtQueryInformationProcess(hProcess,
ProcessTimes, ProcessTimes,
&Kut, &Kut,
sizeof(Kut), sizeof(Kut),
NULL NULL);
);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
SetLastErrorByStatus (Status); SetLastErrorByStatus(Status);
return (FALSE); return(FALSE);
} }
lpCreationTime->dwLowDateTime = Kut.CreateTime.u.LowPart; lpCreationTime->dwLowDateTime = Kut.CreateTime.u.LowPart;
@ -150,60 +170,59 @@ GetProcessTimes (HANDLE hProcess,
lpUserTime->dwLowDateTime = Kut.UserTime.u.LowPart; lpUserTime->dwLowDateTime = Kut.UserTime.u.LowPart;
lpUserTime->dwHighDateTime = Kut.UserTime.u.HighPart; lpUserTime->dwHighDateTime = Kut.UserTime.u.HighPart;
return (TRUE); return(TRUE);
} }
HANDLE STDCALL GetCurrentProcess (VOID) HANDLE STDCALL
GetCurrentProcess(VOID)
{ {
return((HANDLE)NtCurrentProcess()); return((HANDLE)NtCurrentProcess());
} }
HANDLE STDCALL GetCurrentThread (VOID) HANDLE STDCALL
GetCurrentThread(VOID)
{ {
return((HANDLE)NtCurrentThread()); return((HANDLE)NtCurrentThread());
} }
DWORD STDCALL GetCurrentProcessId (VOID) DWORD STDCALL
GetCurrentProcessId(VOID)
{ {
return((DWORD)GetTeb()->Cid.UniqueProcess); return((DWORD)GetTeb()->Cid.UniqueProcess);
} }
WINBOOL WINBOOL STDCALL
STDCALL GetExitCodeProcess(HANDLE hProcess,
GetExitCodeProcess ( LPDWORD lpExitCode)
HANDLE hProcess,
LPDWORD lpExitCode
)
{ {
NTSTATUS errCode;
PROCESS_BASIC_INFORMATION ProcessBasic; PROCESS_BASIC_INFORMATION ProcessBasic;
ULONG BytesWritten; ULONG BytesWritten;
NTSTATUS Status;
errCode = NtQueryInformationProcess(hProcess, Status = NtQueryInformationProcess(hProcess,
ProcessBasicInformation, ProcessBasicInformation,
&ProcessBasic, &ProcessBasic,
sizeof(PROCESS_BASIC_INFORMATION), sizeof(PROCESS_BASIC_INFORMATION),
&BytesWritten); &BytesWritten);
if (!NT_SUCCESS(errCode)) if (!NT_SUCCESS(Status))
{ {
SetLastErrorByStatus (errCode); SetLastErrorByStatus(Status);
return FALSE; return(FALSE);
} }
memcpy(lpExitCode, &ProcessBasic.ExitStatus, sizeof(DWORD)); memcpy(lpExitCode, &ProcessBasic.ExitStatus, sizeof(DWORD));
return TRUE;
return(TRUE);
} }
WINBOOL WINBOOL STDCALL
STDCALL GetProcessId(HANDLE hProcess,
GetProcessId ( LPDWORD lpProcessId)
HANDLE hProcess,
LPDWORD lpProcessId
)
{ {
NTSTATUS errCode; NTSTATUS errCode;
PROCESS_BASIC_INFORMATION ProcessBasic; PROCESS_BASIC_INFORMATION ProcessBasic;
@ -224,13 +243,10 @@ GetProcessId (
} }
HANDLE HANDLE STDCALL
STDCALL OpenProcess(DWORD dwDesiredAccess,
OpenProcess (
DWORD dwDesiredAccess,
WINBOOL bInheritHandle, WINBOOL bInheritHandle,
DWORD dwProcessId DWORD dwProcessId)
)
{ {
NTSTATUS errCode; NTSTATUS errCode;
HANDLE ProcessHandle; HANDLE ProcessHandle;
@ -264,12 +280,9 @@ OpenProcess (
} }
UINT UINT STDCALL
STDCALL WinExec(LPCSTR lpCmdLine,
WinExec ( UINT uCmdShow)
LPCSTR lpCmdLine,
UINT uCmdShow
)
{ {
STARTUPINFOA StartupInfo; STARTUPINFOA StartupInfo;
PROCESS_INFORMATION ProcessInformation; PROCESS_INFORMATION ProcessInformation;
@ -308,8 +321,7 @@ WinExec (
} }
VOID VOID STDCALL
STDCALL
RegisterWaitForInputIdle ( RegisterWaitForInputIdle (
WaitForInputIdleType lpfnRegisterWaitForInputIdle WaitForInputIdleType lpfnRegisterWaitForInputIdle
) )
@ -319,8 +331,7 @@ RegisterWaitForInputIdle (
} }
DWORD DWORD STDCALL
STDCALL
WaitForInputIdle ( WaitForInputIdle (
HANDLE hProcess, HANDLE hProcess,
DWORD dwMilliseconds DWORD dwMilliseconds
@ -330,19 +341,16 @@ WaitForInputIdle (
} }
VOID VOID STDCALL
STDCALL Sleep(DWORD dwMilliseconds)
Sleep (
DWORD dwMilliseconds
)
{ {
SleepEx (dwMilliseconds, FALSE); SleepEx(dwMilliseconds, FALSE);
return; return;
} }
DWORD STDCALL DWORD STDCALL
SleepEx (DWORD dwMilliseconds, SleepEx(DWORD dwMilliseconds,
BOOL bAlertable) BOOL bAlertable)
{ {
TIME Interval; TIME Interval;
@ -384,7 +392,7 @@ GetStartupInfoW(LPSTARTUPINFOW lpStartupInfo)
return; return;
} }
Params = NtCurrentPeb ()->ProcessParameters; Params = NtCurrentPeb()->ProcessParameters;
lpStartupInfo->cb = sizeof(STARTUPINFOW); lpStartupInfo->cb = sizeof(STARTUPINFOW);
lpStartupInfo->lpDesktop = Params->DesktopInfo.Buffer; lpStartupInfo->lpDesktop = Params->DesktopInfo.Buffer;
@ -482,14 +490,14 @@ FlushInstructionCache (HANDLE hProcess,
LPCVOID lpBaseAddress, LPCVOID lpBaseAddress,
DWORD dwSize) DWORD dwSize)
{ {
NTSTATUS errCode; NTSTATUS Status;
errCode = NtFlushInstructionCache (hProcess, Status = NtFlushInstructionCache(hProcess,
(PVOID) lpBaseAddress, (PVOID)lpBaseAddress,
dwSize); dwSize);
if (!NT_SUCCESS(errCode)) if (!NT_SUCCESS(Status))
{ {
SetLastErrorByStatus (errCode); SetLastErrorByStatus(Status);
return FALSE; return FALSE;
} }
return TRUE; return TRUE;
@ -497,7 +505,7 @@ FlushInstructionCache (HANDLE hProcess,
VOID STDCALL VOID STDCALL
ExitProcess (UINT uExitCode) ExitProcess(UINT uExitCode)
{ {
CSRSS_API_REQUEST CsrRequest; CSRSS_API_REQUEST CsrRequest;
CSRSS_API_REPLY CsrReply; CSRSS_API_REPLY CsrReply;
@ -528,8 +536,9 @@ WINBOOL STDCALL
TerminateProcess (HANDLE hProcess, TerminateProcess (HANDLE hProcess,
UINT uExitCode) UINT uExitCode)
{ {
NTSTATUS Status = NtTerminateProcess (hProcess, uExitCode); NTSTATUS Status;
Status = NtTerminateProcess (hProcess, uExitCode);
if (NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
{ {
return TRUE; return TRUE;
@ -559,7 +568,7 @@ FatalAppExitA (UINT uAction,
VOID STDCALL VOID STDCALL
FatalAppExitW (UINT uAction, FatalAppExitW(UINT uAction,
LPCWSTR lpMessageText) LPCWSTR lpMessageText)
{ {
return; return;

View file

@ -79,6 +79,8 @@ typedef struct
ULONG HandleTableSize; ULONG HandleTableSize;
Object_t ** HandleTable; Object_t ** HandleTable;
ULONG ProcessId; ULONG ProcessId;
ULONG ShutdownLevel;
ULONG ShutdownFlags;
HANDLE ConsoleEvent; HANDLE ConsoleEvent;
PVOID CsrSectionViewBase; PVOID CsrSectionViewBase;
ULONG CsrSectionViewSize; ULONG CsrSectionViewSize;
@ -124,6 +126,8 @@ CSR_API(CsrReadConsoleOutputAttrib);
CSR_API(CsrGetNumberOfConsoleInputEvents); CSR_API(CsrGetNumberOfConsoleInputEvents);
CSR_API(CsrRegisterServicesProcess); CSR_API(CsrRegisterServicesProcess);
CSR_API(CsrExitReactos); CSR_API(CsrExitReactos);
CSR_API(CsrGetShutdownParameters);
CSR_API(CsrSetShutdownParameters);
/* print.c */ /* print.c */
VOID STDCALL DisplayString(LPCWSTR lpwString); VOID STDCALL DisplayString(LPCWSTR lpwString);

View file

@ -1,4 +1,4 @@
/* $Id: process.c,v 1.20 2002/10/01 06:41:56 ei Exp $ /* $Id: process.c,v 1.21 2002/10/20 16:40:12 ekohl Exp $
* *
* reactos/subsys/csrss/api/process.c * reactos/subsys/csrss/api/process.c
* *
@ -134,6 +134,10 @@ CSR_API(CsrCreateProcess)
return(STATUS_NO_MEMORY); return(STATUS_NO_MEMORY);
} }
/* Set default shutdown parameters */
NewProcessData->ShutdownLevel = 0x280;
NewProcessData->ShutdownFlags = 0;
if (Request->Data.CreateProcessRequest.Flags & DETACHED_PROCESS) if (Request->Data.CreateProcessRequest.Flags & DETACHED_PROCESS)
{ {
NewProcessData->Console = NULL; NewProcessData->Console = NULL;
@ -225,4 +229,33 @@ CSR_API(CsrConnectProcess)
return(STATUS_SUCCESS); return(STATUS_SUCCESS);
} }
CSR_API(CsrGetShutdownParameters)
{
Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) -
sizeof(LPC_MESSAGE_HEADER);
Reply->Data.GetShutdownParametersReply.Level = ProcessData->ShutdownLevel;
Reply->Data.GetShutdownParametersReply.Flags = ProcessData->ShutdownFlags;
Reply->Status = STATUS_SUCCESS;
return(STATUS_SUCCESS);
}
CSR_API(CsrSetShutdownParameters)
{
Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) -
sizeof(LPC_MESSAGE_HEADER);
ProcessData->ShutdownLevel = Request->Data.SetShutdownParametersRequest.Level;
ProcessData->ShutdownFlags = Request->Data.SetShutdownParametersRequest.Flags;
Reply->Status = STATUS_SUCCESS;
return(STATUS_SUCCESS);
}
/* EOF */ /* EOF */

View file

@ -1,4 +1,4 @@
/* $Id: wapi.c,v 1.21 2002/10/20 14:53:43 ekohl Exp $ /* $Id: wapi.c,v 1.22 2002/10/20 16:40:12 ekohl Exp $
* *
* reactos/subsys/csrss/api/wapi.c * reactos/subsys/csrss/api/wapi.c
* *
@ -58,6 +58,8 @@ static const CsrFunc CsrFuncs[] = {
CsrGetNumberOfConsoleInputEvents, CsrGetNumberOfConsoleInputEvents,
CsrRegisterServicesProcess, CsrRegisterServicesProcess,
CsrExitReactos, CsrExitReactos,
CsrGetShutdownParameters,
CsrSetShutdownParameters,
0 }; 0 };
static void Thread_Api2(HANDLE ServerPort) static void Thread_Api2(HANDLE ServerPort)