ntoskrnl/ke/main.c

* Move SeInit2() to before we initialize process
  management so we can create an initial system
  token to go with the initial system process.

ntoskrnl/ps/process.c
* Implement NtOpenProcessToken() by calling
  _NtOpenProcessToken() -- why do we have
  both of these?

* Fix bug in _NtOpenProcessToken() that
  caused us to crash creating the token
  handle.

* Return STATUS_INVALID_INFO_CLASS from
  NtQueryInformationProcess() and
  NtSetInformationProcess() for information classes
  documented as unqueryable or unsettable
  by Gary Nebbet in his book "Native API Reference".

* Fix bug in NtSetInformationProcess() where it
  assigns the primary token -- it derefeneced the
  old token if SeExchangePrimaryToken() failed;
  it should have derferenced it if it succeeded.

svn path=/trunk/; revision=3112
This commit is contained in:
joeg 2002-06-17 22:16:34 +00:00
parent eebe5809fd
commit 0f1c17eda0
2 changed files with 45 additions and 48 deletions

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
/* $Id: main.c,v 1.125 2002/06/16 11:44:53 ekohl Exp $ /* $Id: main.c,v 1.126 2002/06/17 22:16:33 joeg Exp $
* *
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
* FILE: ntoskrnl/ke/main.c * FILE: ntoskrnl/ke/main.c
@ -528,6 +528,10 @@ ExpInitializeExecutive(VOID)
KeBugCheck(SECURITY_INITIALIZATION_FAILED); KeBugCheck(SECURITY_INITIALIZATION_FAILED);
ObInit(); ObInit();
if (!SeInit2())
KeBugCheck(SECURITY1_INITIALIZATION_FAILED);
PiInitProcessManager(); PiInitProcessManager();
KdInit1(); KdInit1();
@ -751,9 +755,6 @@ ExpInitializeExecutive(VOID)
*/ */
InitSystemSharedUserPage ((PUCHAR)KeLoaderBlock.CommandLine); InitSystemSharedUserPage ((PUCHAR)KeLoaderBlock.CommandLine);
if (!SeInit2())
KeBugCheck(SECURITY1_INITIALIZATION_FAILED);
/* /*
* Launch initial process * Launch initial process
*/ */

View file

@ -1,4 +1,4 @@
/* $Id: process.c,v 1.81 2002/06/11 22:09:03 dwelch Exp $ /* $Id: process.c,v 1.82 2002/06/17 22:16:34 joeg Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -95,13 +95,6 @@ PsGetNextProcess(PEPROCESS OldProcess)
return(NextProcess); return(NextProcess);
} }
NTSTATUS STDCALL
NtOpenProcessToken(IN HANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
OUT PHANDLE TokenHandle)
{
return(STATUS_UNSUCCESSFUL);
}
NTSTATUS STDCALL NTSTATUS STDCALL
_NtOpenProcessToken(IN HANDLE ProcessHandle, _NtOpenProcessToken(IN HANDLE ProcessHandle,
@ -121,12 +114,21 @@ _NtOpenProcessToken(IN HANDLE ProcessHandle,
Token, Token,
DesiredAccess, DesiredAccess,
FALSE, FALSE,
ProcessHandle); TokenHandle);
ObDereferenceObject(Token); ObDereferenceObject(Token);
return(Status); return(Status);
} }
NTSTATUS STDCALL
NtOpenProcessToken(IN HANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
OUT PHANDLE TokenHandle)
{
return _NtOpenProcessToken(ProcessHandle, DesiredAccess, TokenHandle);
}
PACCESS_TOKEN STDCALL PACCESS_TOKEN STDCALL
PsReferencePrimaryToken(PEPROCESS Process) PsReferencePrimaryToken(PEPROCESS Process)
{ {
@ -831,13 +833,8 @@ NtQueryInformationProcess(IN HANDLE ProcessHandle,
case ProcessIoCounters: case ProcessIoCounters:
case ProcessVmCounters: case ProcessVmCounters:
case ProcessTimes: case ProcessTimes:
case ProcessBasePriority:
case ProcessRaisePriority:
case ProcessDebugPort: case ProcessDebugPort:
case ProcessExceptionPort:
case ProcessAccessToken:
case ProcessLdtInformation: case ProcessLdtInformation:
case ProcessLdtSize:
Status = STATUS_NOT_IMPLEMENTED; Status = STATUS_NOT_IMPLEMENTED;
break; break;
@ -845,24 +842,12 @@ NtQueryInformationProcess(IN HANDLE ProcessHandle,
*((PULONG)ProcessInformation) = Process->DefaultHardErrorProcessing; *((PULONG)ProcessInformation) = Process->DefaultHardErrorProcessing;
break; break;
case ProcessIoPortHandlers:
case ProcessWorkingSetWatch: case ProcessWorkingSetWatch:
case ProcessUserModeIOPL:
case ProcessEnableAlignmentFaultFixup:
Status = STATUS_NOT_IMPLEMENTED; Status = STATUS_NOT_IMPLEMENTED;
break; break;
case ProcessForegroundInformation:
((PPROCESS_PRIORITY_CLASS)ProcessInformation)->Foreground =
FALSE; /*FIXME: how to compute it? */
case ProcessPriorityClass:
((PPROCESS_PRIORITY_CLASS)ProcessInformation)->PriorityClass =
Process->PriorityClass;
break;
case ProcessWx86Information: case ProcessWx86Information:
case ProcessHandleCount: case ProcessHandleCount:
case ProcessAffinityMask:
case ProcessPriorityBoost: case ProcessPriorityBoost:
case ProcessDeviceMap: case ProcessDeviceMap:
case ProcessSessionInformation: case ProcessSessionInformation:
@ -870,6 +855,17 @@ NtQueryInformationProcess(IN HANDLE ProcessHandle,
Status = STATUS_NOT_IMPLEMENTED; Status = STATUS_NOT_IMPLEMENTED;
break; break;
case ProcessBasePriority:
case ProcessRaisePriority:
case ProcessExceptionPort:
case ProcessAccessToken:
case ProcessLdtSize:
case ProcessIoPortHandlers:
case ProcessUserModeIOPL:
case ProcessEnableAlignmentFaultFixup:
case ProcessPriorityClass:
case ProcessAffinityMask:
case ProcessForegroundInformation:
default: default:
Status = STATUS_INVALID_INFO_CLASS; Status = STATUS_INVALID_INFO_CLASS;
} }
@ -896,7 +892,7 @@ PspAssignPrimaryToken(PEPROCESS Process,
return(Status); return(Status);
} }
Status = SeExchangePrimaryToken(Process, Token, &OldToken); Status = SeExchangePrimaryToken(Process, Token, &OldToken);
if (!NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
{ {
ObDereferenceObject(OldToken); ObDereferenceObject(OldToken);
} }
@ -912,7 +908,6 @@ NtSetInformationProcess(IN HANDLE ProcessHandle,
{ {
PEPROCESS Process; PEPROCESS Process;
NTSTATUS Status; NTSTATUS Status;
PPROCESS_BASIC_INFORMATION ProcessBasicInformationP;
PHANDLE ProcessAccessTokenP; PHANDLE ProcessAccessTokenP;
Status = ObReferenceObjectByHandle(ProcessHandle, Status = ObReferenceObjectByHandle(ProcessHandle,
@ -928,22 +923,14 @@ NtSetInformationProcess(IN HANDLE ProcessHandle,
switch (ProcessInformationClass) switch (ProcessInformationClass)
{ {
case ProcessBasicInformation:
ProcessBasicInformationP = (PPROCESS_BASIC_INFORMATION)
ProcessInformation;
memset(ProcessBasicInformationP, 0, sizeof(PROCESS_BASIC_INFORMATION));
Process->Pcb.Affinity = ProcessBasicInformationP->AffinityMask;
Status = STATUS_SUCCESS;
break;
case ProcessQuotaLimits: case ProcessQuotaLimits:
case ProcessIoCounters:
case ProcessVmCounters:
case ProcessTimes:
case ProcessBasePriority: case ProcessBasePriority:
case ProcessRaisePriority: case ProcessRaisePriority:
case ProcessDebugPort: case ProcessDebugPort:
case ProcessExceptionPort: case ProcessExceptionPort:
Status = STATUS_NOT_IMPLEMENTED;
break;
case ProcessAccessToken: case ProcessAccessToken:
ProcessAccessTokenP = (PHANDLE)ProcessInformation; ProcessAccessTokenP = (PHANDLE)ProcessInformation;
Status = PspAssignPrimaryToken(Process, *ProcessAccessTokenP); Status = PspAssignPrimaryToken(Process, *ProcessAccessTokenP);
@ -951,7 +938,7 @@ NtSetInformationProcess(IN HANDLE ProcessHandle,
case ProcessImageFileName: case ProcessImageFileName:
memcpy(Process->ImageFileName, ProcessInformation, 8); memcpy(Process->ImageFileName, ProcessInformation, 8);
// DPRINT1("Process->ImageFileName %.8s\n", Process->ImageFileName); // DPRINT1("Process->ImageFileName %.8s\n", Process->ImageFileName);
Status = STATUS_SUCCESS; Status = STATUS_SUCCESS;
break; break;
@ -963,11 +950,20 @@ NtSetInformationProcess(IN HANDLE ProcessHandle,
case ProcessUserModeIOPL: case ProcessUserModeIOPL:
case ProcessEnableAlignmentFaultFixup: case ProcessEnableAlignmentFaultFixup:
case ProcessPriorityClass: case ProcessPriorityClass:
case ProcessAffinityMask:
Status = STATUS_NOT_IMPLEMENTED;
break;
case ProcessBasicInformation:
case ProcessIoCounters:
case ProcessVmCounters:
case ProcessTimes:
case ProcessPooledUsageAndLimits:
case ProcessWx86Information: case ProcessWx86Information:
case ProcessHandleCount: case ProcessHandleCount:
case ProcessAffinityMask: case ProcessWow64Information:
default: default:
Status = STATUS_NOT_IMPLEMENTED; Status = STATUS_INVALID_INFO_CLASS;
} }
ObDereferenceObject(Process); ObDereferenceObject(Process);
return(Status); return(Status);