Added support for ZwOpenProcess

svn path=/trunk/; revision=543
This commit is contained in:
David Welch 1999-06-08 14:02:01 +00:00
parent 0a1f866c8f
commit c8cd1fe03c
4 changed files with 87 additions and 3 deletions

View file

@ -312,6 +312,7 @@ typedef struct _KPROCESS
*/
LIST_ENTRY MemoryAreaList;
HANDLE_TABLE HandleTable;
LIST_ENTRY ProcessListEntry;
} KPROCESS, *PKPROCESS;
typedef struct _EPROCESS

View file

@ -15,7 +15,7 @@ include rules.mak
# Required to run the system
#
COMPONENTS = iface_native ntoskrnl
DLLS = ntdll kernel32 crtdll user32 fmifs
DLLS = ntdll kernel32 crtdll fmifs
#DLLS = crtdll mingw32
SUBSYS = win32k

View file

@ -29,6 +29,8 @@ HANDLE SystemProcessHandle = NULL;
POBJECT_TYPE PsProcessType = NULL;
static LIST_ENTRY PsProcessListHead;
static KSPIN_LOCK PsProcessListLock;
static ULONG PiNextProcessUniqueId = 0;
/* FUNCTIONS *****************************************************************/
@ -37,6 +39,7 @@ VOID PsInitProcessManagment(VOID)
{
ANSI_STRING AnsiString;
PKPROCESS KProcess;
KIRQL oldIrql;
/*
* Register the process object type
@ -62,6 +65,9 @@ VOID PsInitProcessManagment(VOID)
RtlInitAnsiString(&AnsiString,"Process");
RtlAnsiStringToUnicodeString(&PsProcessType->TypeName,&AnsiString,TRUE);
InitializeListHead(&PsProcessListHead);
KeInitializeSpinLock(&PsProcessListLock);
/*
* Initialize the system process
*/
@ -83,6 +89,10 @@ VOID PsInitProcessManagment(VOID)
SystemProcess->UniqueProcessId =
InterlockedIncrement(&PiNextProcessUniqueId);
KeAcquireSpinLock(&PsProcessListLock, &oldIrql);
InsertHeadList(&PsProcessListHead, &KProcess->ProcessListEntry);
KeReleaseSpinLock(&PsProcessListLock, oldIrql);
ObCreateHandle(SystemProcess,
SystemProcess,
PROCESS_ALL_ACCESS,
@ -169,6 +179,7 @@ NTSTATUS STDCALL ZwCreateProcess(
PEPROCESS ParentProcess;
PKPROCESS KProcess;
NTSTATUS Status;
KIRQL oldIrql;
DPRINT("ZwCreateProcess(ObjectAttributes %x)\n",ObjectAttributes);
@ -203,7 +214,11 @@ NTSTATUS STDCALL ZwCreateProcess(
Process);
MmCopyMmInfo(ParentProcess, Process);
Process->UniqueProcessId = InterlockedIncrement(&PiNextProcessUniqueId);
KeAcquireSpinLock(&PsProcessListLock, &oldIrql);
InsertHeadList(&PsProcessListHead, &KProcess->ProcessListEntry);
KeReleaseSpinLock(&PsProcessListLock, oldIrql);
/*
* FIXME: I don't what I'm supposed to know with a section handle
*/
@ -236,7 +251,71 @@ NTSTATUS STDCALL ZwOpenProcess (OUT PHANDLE ProcessHandle,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PCLIENT_ID ClientId)
{
UNIMPLEMENTED;
/*
* Not of the exact semantics
*/
if (ObjectAttributes != NULL)
{
NTSTATUS Status;
PEPROCESS Process;
Status = ObReferenceObjectByName(ObjectAttributes->ObjectName,
ObjectAttributes->Attributes,
NULL,
DesiredAccess,
PsProcessType,
UserMode,
NULL,
(PVOID*)&Process);
if (Status != STATUS_SUCCESS)
{
return(Status);
}
Status = ObCreateHandle(PsGetCurrentProcess(),
Process,
DesiredAccess,
FALSE,
ProcessHandle);
ObDereferenceObject(Process);
return(Status);
}
else
{
KIRQL oldIrql;
PLIST_ENTRY current_entry;
PEPROCESS current;
NTSTATUS Status;
KeAcquireSpinLock(&PsProcessListLock, &oldIrql);
current_entry = PsProcessListHead.Flink;
while (current_entry != &PsProcessListHead)
{
current = CONTAINING_RECORD(current_entry, EPROCESS,
Pcb.ProcessListEntry);
if (current->UniqueProcessId == (ULONG)ClientId->UniqueProcess)
{
ObReferenceObjectByPointer(current,
DesiredAccess,
PsProcessType,
UserMode);
KeReleaseSpinLock(&PsProcessListLock, oldIrql);
Status = ObCreateHandle(PsGetCurrentProcess(),
current,
DesiredAccess,
FALSE,
ProcessHandle);
ObDereferenceObject(current);
return(Status);
}
current_entry = current_entry->Flink;
}
KeReleaseSpinLock(&PsProcessListLock, oldIrql);
return(STATUS_UNSUCCESSFUL);
}
return(STATUS_UNSUCCESSFUL);
}
NTSTATUS STDCALL NtQueryInformationProcess(IN HANDLE ProcessHandle,

View file

@ -180,6 +180,10 @@ VOID PsDispatchThread(VOID)
if (Candidate == CurrentThread)
{
DPRINT("Scheduling current thread\n");
if (PiNrRunnableThreads > 2)
{
DbgPrint(".");
}
KeQueryTickCount(&TickCount);
CurrentThread->Tcb.LastTick = TickCount.u.LowPart;
CurrentThread->Tcb.State = THREAD_STATE_RUNNING;