/*
* COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
+ * PROJECT: ReactOS Kernel
* FILE: ntoskrnl/ke/process.c
- * PURPOSE: Attaching/Detaching and System Call Tables
- *
- * PROGRAMMERS: Alex Ionescu (Implemented Attach/Detach and KeRemoveSystemServiceTable)
- * Gregor Anich (Bugfixes to Attach Functions)
+ * PURPOSE: Kernel Process Management and System Call Tables
+ * PROGRAMMERS: Alex Ionescu
+ * Gregor Anich
*/
/* INCLUDES *****************************************************************/
#include <ntoskrnl.h>
-#include <ntdll/napi.h>
+#include <internal/napi.h>
#define NDEBUG
#include <internal/debug.h>
/* GLOBALS *****************************************************************/
-SSDT_ENTRY
+KSERVICE_TABLE_DESCRIPTOR
__declspec(dllexport)
-KeServiceDescriptorTable[SSDT_MAX_ENTRIES] = {
+KeServiceDescriptorTable[SSDT_MAX_ENTRIES] =
+{
{ MainSSDT, NULL, NUMBER_OF_SYSCALLS, MainSSPT },
{ NULL, NULL, 0, NULL },
- { NULL, NULL, 0, NULL },
- { NULL, NULL, 0, NULL }
};
-SSDT_ENTRY
-KeServiceDescriptorTableShadow[SSDT_MAX_ENTRIES] = {
+KSERVICE_TABLE_DESCRIPTOR
+KeServiceDescriptorTableShadow[SSDT_MAX_ENTRIES] =
+{
{ MainSSDT, NULL, NUMBER_OF_SYSCALLS, MainSSPT },
{ NULL, NULL, 0, NULL },
- { NULL, NULL, 0, NULL },
- { NULL, NULL, 0, NULL }
};
/* FUNCTIONS *****************************************************************/
-static inline void
-UpdatePageDirs(PKTHREAD Thread, PKPROCESS Process)
+PKPROCESS
+STDCALL
+KeGetCurrentProcess(VOID)
{
- /*
- * The stack and the thread structure of the current process may be
- * located in a page which is not present in the page directory of
- * the process we're attaching to. That would lead to a page fault
- * when this function returns. However, since the processor can't
- * call the page fault handler 'cause it can't push EIP on the stack,
+ return(&(PsGetCurrentProcess()->Pcb));
+}
+
+static __inline
+VOID
+NTAPI
+UpdatePageDirs(IN PKTHREAD Thread,
+ IN PKPROCESS Process)
+{
+ /*
+ * The stack and the thread structure of the current process may be
+ * located in a page which is not present in the page directory of
+ * the process we're attaching to. That would lead to a page fault
+ * when this function returns. However, since the processor can't
+ * call the page fault handler 'cause it can't push EIP on the stack,
* this will show up as a stack fault which will crash the entire system.
* To prevent this, make sure the page directory of the process we're
- * attaching to is up-to-date.
+ * attaching to is up-to-date.
*/
- MmUpdatePageDir((PEPROCESS)Process, (PVOID)Thread->StackLimit, MM_STACK_SIZE);
- MmUpdatePageDir((PEPROCESS)Process, (PVOID)Thread, sizeof(ETHREAD));
+ MmUpdatePageDir((PROS_EPROCESS)Process, (PVOID)Thread->StackLimit, KERNEL_STACK_SIZE);
+ MmUpdatePageDir((PROS_EPROCESS)Process, (PVOID)Thread, sizeof(ETHREAD));
}
VOID
-STDCALL
+NTAPI
+KiAttachProcess(PKTHREAD Thread,
+ PKPROCESS Process,
+ KIRQL OldIrql,
+ PRKAPC_STATE SavedApcState)
+{
+ ASSERT(Process != Thread->ApcState.Process);
+ DPRINT("KiAttachProcess(Thread: %x, Process: %x, SavedApcState: %x\n",
+ Thread, Process, SavedApcState);
+
+ /* Increase Stack Count */
+ Process->StackCount++;
+
+ /* Swap the APC Environment */
+ KiMoveApcState(&Thread->ApcState, SavedApcState);
+
+ /* Reinitialize Apc State */
+ InitializeListHead(&Thread->ApcState.ApcListHead[KernelMode]);
+ InitializeListHead(&Thread->ApcState.ApcListHead[UserMode]);
+ Thread->ApcState.Process = Process;
+ Thread->ApcState.KernelApcInProgress = FALSE;
+ Thread->ApcState.KernelApcPending = FALSE;
+ Thread->ApcState.UserApcPending = FALSE;
+
+ /* Update Environment Pointers if needed*/
+ if (SavedApcState == &Thread->SavedApcState)
+ {
+ Thread->ApcStatePointer[OriginalApcEnvironment] = &Thread->SavedApcState;
+ Thread->ApcStatePointer[AttachedApcEnvironment] = &Thread->ApcState;
+ Thread->ApcStateIndex = AttachedApcEnvironment;
+ }
+
+ /* Check if the process is paged in */
+ if (Process->State == ProcessInMemory)
+ {
+ /* FIXME: Scan the Ready Thread List once new scheduler is in */
+
+ /* Swap the Processes */
+ KiSwapProcess(Process, SavedApcState->Process);
+
+ /* Return to old IRQL*/
+ KeReleaseDispatcherDatabaseLock(OldIrql);
+ }
+ else
+ {
+ DPRINT1("Errr. ReactOS doesn't support paging out processes yet...\n");
+ DbgBreakPoint();
+ }
+}
+
+VOID
+NTAPI
KeInitializeProcess(PKPROCESS Process,
KPRIORITY Priority,
KAFFINITY Affinity,
LARGE_INTEGER DirectoryTableBase)
{
- DPRINT1("KeInitializeProcess. Process: %x, DirectoryTableBase: %x\n", Process, DirectoryTableBase);
-
+ DPRINT("KeInitializeProcess. Process: %x, DirectoryTableBase: %x\n",
+ Process, DirectoryTableBase);
+
/* Initialize the Dispatcher Header */
- KeInitializeDispatcherHeader(&Process->DispatcherHeader,
+ KeInitializeDispatcherHeader(&Process->Header,
ProcessObject,
sizeof(KPROCESS),
FALSE);
-
+
/* Initialize Scheduler Data, Disable Alignment Faults and Set the PDE */
Process->Affinity = Affinity;
Process->BasePriority = Priority;
- Process->ThreadQuantum = 6;
+ Process->QuantumReset = 6;
Process->DirectoryTableBase = DirectoryTableBase;
Process->AutoAlignment = TRUE;
Process->IopmOffset = 0xFFFF;
- Process->State = PROCESS_STATE_ACTIVE;
-
+ Process->State = ProcessInMemory;
+
/* Initialize the Thread List */
- InitializeListHead(&Process->ThreadListHead);
- DPRINT1("The Process has now been initalized with the Kernel\n");
+ InitializeListHead(&Process->ThreadListHead);
+ KeInitializeSpinLock(&Process->ProcessLock);
+ DPRINT("The Process has now been initalized with the Kernel\n");
}
ULONG
-STDCALL
-KeSetProcess(PKPROCESS Process,
+NTAPI
+KeSetProcess(PKPROCESS Process,
KPRIORITY Increment)
{
KIRQL OldIrql;
ULONG OldState;
-
+
/* Lock Dispatcher */
OldIrql = KeAcquireDispatcherDatabaseLock();
-
+
/* Get Old State */
- OldState = Process->DispatcherHeader.SignalState;
-
+ OldState = Process->Header.SignalState;
+
/* Signal the Process */
- Process->DispatcherHeader.SignalState = TRUE;
- if ((OldState == 0) && IsListEmpty(&Process->DispatcherHeader.WaitListHead) != TRUE) {
-
+ Process->Header.SignalState = TRUE;
+ if ((OldState == 0) && IsListEmpty(&Process->Header.WaitListHead) != TRUE)
+ {
/* Satisfy waits */
KiWaitTest((PVOID)Process, Increment);
}
-
- /* Release Dispatcher Database */
+
+ /* Release Dispatcher Database */
KeReleaseDispatcherDatabaseLock(OldIrql);
-
+
/* Return the previous State */
- return OldState;
+ return OldState;
+}
+
+VOID
+NTAPI
+KiSwapProcess(PKPROCESS NewProcess,
+ PKPROCESS OldProcess)
+{
+ DPRINT("Switching CR3 to: %x\n", NewProcess->DirectoryTableBase.u.LowPart);
+ Ke386SetPageTableDirectory(NewProcess->DirectoryTableBase.u.LowPart);
}
/*
* @implemented
*/
-VOID
-STDCALL
+VOID
+NTAPI
KeAttachProcess(PKPROCESS Process)
{
KIRQL OldIrql;
- PKTHREAD Thread = KeGetCurrentThread();
-
+ PKTHREAD Thread;
+ ASSERT_IRQL_LESS_OR_EQUAL(DISPATCH_LEVEL);
DPRINT("KeAttachProcess: %x\n", Process);
/* Make sure that we are in the right page directory */
+ Thread = KeGetCurrentThread();
UpdatePageDirs(Thread, Process);
/* Lock Dispatcher */
OldIrql = KeAcquireDispatcherDatabaseLock();
- /* Crash system if DPC is being executed! */
- if (KeIsExecutingDpc()) {
-
- DPRINT1("Invalid attach (Thread is executing a DPC!)\n");
- KEBUGCHECK(INVALID_PROCESS_ATTACH_ATTEMPT);
- }
-
- /* Check if the Target Process is already attached */
- if (Thread->ApcState.Process == Process || Thread->ApcStateIndex != OriginalApcEnvironment) {
-
- DPRINT("Process already Attached. Exitting\n");
+ /* Check if we're already in that process */
+ if (Thread->ApcState.Process == Process)
+ {
+ /* Unlock the dispatcher, nothing to do */
KeReleaseDispatcherDatabaseLock(OldIrql);
- } else {
-
+ }
+ else if ((Thread->ApcStateIndex != OriginalApcEnvironment) ||
+ (KeIsExecutingDpc()))
+ {
+ /* Executing a DPC or already attached, crash! */
+ KEBUGCHECKEX(INVALID_PROCESS_ATTACH_ATTEMPT,
+ (ULONG_PTR)Process,
+ (ULONG_PTR)Thread->ApcState.Process,
+ Thread->ApcStateIndex,
+ KeIsExecutingDpc());
+ }
+ else
+ {
+ /* Legit attach attempt: do it! */
KiAttachProcess(Thread, Process, OldIrql, &Thread->SavedApcState);
}
}
+/*
+ * @implemented
+ */
VOID
-STDCALL
-KiAttachProcess(PKTHREAD Thread, PKPROCESS Process, KIRQL ApcLock, PRKAPC_STATE SavedApcState)
+NTAPI
+KeDetachProcess (VOID)
{
-
- DPRINT("KiAttachProcess(Thread: %x, Process: %x, SavedApcState: %x\n", Thread, Process, SavedApcState);
-
- /* Increase Stack Count */
- Process->StackCount++;
+ PKTHREAD Thread;
+ KIRQL OldIrql;
+ ASSERT_IRQL_LESS_OR_EQUAL(DISPATCH_LEVEL);
+ DPRINT("KeDetachProcess()\n");
- /* Swap the APC Environment */
- KiMoveApcState(&Thread->ApcState, SavedApcState);
-
- /* Reinitialize Apc State */
- InitializeListHead(&Thread->ApcState.ApcListHead[KernelMode]);
- InitializeListHead(&Thread->ApcState.ApcListHead[UserMode]);
- Thread->ApcState.Process = Process;
- Thread->ApcState.KernelApcInProgress = FALSE;
- Thread->ApcState.KernelApcPending = FALSE;
- Thread->ApcState.UserApcPending = FALSE;
-
- /* Update Environment Pointers if needed*/
- if (SavedApcState == &Thread->SavedApcState) {
-
- Thread->ApcStatePointer[OriginalApcEnvironment] = &Thread->SavedApcState;
- Thread->ApcStatePointer[AttachedApcEnvironment] = &Thread->ApcState;
- Thread->ApcStateIndex = AttachedApcEnvironment;
- }
-
- /* Swap the Processes */
- DPRINT("Swapping\n");
- KiSwapProcess(Process, SavedApcState->Process);
-
- /* Return to old IRQL*/
- KeReleaseDispatcherDatabaseLock(ApcLock);
-
- DPRINT("KiAttachProcess Completed Sucesfully\n");
-}
+ /* Get Current Thread and lock the dispatcher */
+ Thread = KeGetCurrentThread();
+ OldIrql = KeAcquireDispatcherDatabaseLock();
-VOID
-STDCALL
-KiSwapProcess(PKPROCESS NewProcess, PKPROCESS OldProcess)
-{
- //PKPCR Pcr = KeGetCurrentKpcr();
+ /* Check if it's attached */
+ if (Thread->ApcStateIndex != OriginalApcEnvironment)
+ {
+ /* It is, decrease Stack Count */
+ if(!(--Thread->ApcState.Process->StackCount))
+ {
+ /* FIXME: Swap the process out */
+ }
- /* Do they have an LDT? */
- if ((NewProcess->LdtDescriptor) || (OldProcess->LdtDescriptor)) {
-
- /* FIXME : SWitch GDT/IDT */
+ /* Restore the APC State */
+ KiMoveApcState(&Thread->SavedApcState, &Thread->ApcState);
+ Thread->SavedApcState.Process = NULL;
+ Thread->ApcStatePointer[OriginalApcEnvironment] = &Thread->ApcState;
+ Thread->ApcStatePointer[AttachedApcEnvironment] = &Thread->SavedApcState;
+ Thread->ApcStateIndex = OriginalApcEnvironment;
+
+ /* Check if we have pending APCs */
+ if (IsListEmpty(&Thread->ApcState.ApcListHead[KernelMode]))
+ {
+ /* What do you know, we do! Request them to be delivered */
+ Thread->ApcState.KernelApcPending = TRUE;
+ HalRequestSoftwareInterrupt(APC_LEVEL);
+ }
+
+ /* Swap Processes */
+ KiSwapProcess(Thread->ApcState.Process, Thread->ApcState.Process);
}
- DPRINT("Switching CR3 to: %x\n", NewProcess->DirectoryTableBase.u.LowPart);
- Ke386SetPageTableDirectory(NewProcess->DirectoryTableBase.u.LowPart);
-
- /* FIXME: Set IopmOffset in TSS */
+
+ /* Unlock Dispatcher */
+ KeReleaseDispatcherDatabaseLock(OldIrql);
}
/*
* @implemented
*/
BOOLEAN
-STDCALL
+NTAPI
KeIsAttachedProcess(VOID)
{
/* Return the APC State */
* @implemented
*/
VOID
-STDCALL
+NTAPI
KeStackAttachProcess(IN PKPROCESS Process,
OUT PRKAPC_STATE ApcState)
{
KIRQL OldIrql;
- PKTHREAD Thread = KeGetCurrentThread();
+ PKTHREAD Thread;
+ ASSERT_IRQL_LESS_OR_EQUAL(DISPATCH_LEVEL);
/* Make sure that we are in the right page directory */
+ Thread = KeGetCurrentThread();
UpdatePageDirs(Thread, Process);
+ /* Acquire the dispatcher lock */
OldIrql = KeAcquireDispatcherDatabaseLock();
-
+
/* Crash system if DPC is being executed! */
- if (KeIsExecutingDpc()) {
-
- DPRINT1("Invalid attach (Thread is executing a DPC!)\n");
- KEBUGCHECK(INVALID_PROCESS_ATTACH_ATTEMPT);
+ if (KeIsExecutingDpc())
+ {
+ /* Executing a DPC, crash! */
+ KEBUGCHECKEX(INVALID_PROCESS_ATTACH_ATTEMPT,
+ (ULONG_PTR)Process,
+ (ULONG_PTR)Thread->ApcState.Process,
+ Thread->ApcStateIndex,
+ KeIsExecutingDpc());
+ }
+
+ /* Check if we are already in the target process */
+ if (Thread->ApcState.Process == Process)
+ {
+ /* Unlock the dispatcher database */
+ KeReleaseDispatcherDatabaseLock(OldIrql);
+
+ /* Set magic value so we don't crash later when detaching */
+ ApcState->Process = (PKPROCESS)1;
}
-
- /* Check if the Target Process is already attached */
- if (Thread->ApcState.Process == Process) {
-
- ApcState->Process = (PKPROCESS)1; /* Meaning already attached to the same Process */
-
- } else {
-
- /* Check if the Current Thread is already attached and call the Internal Function*/
- if (Thread->ApcStateIndex != OriginalApcEnvironment) {
-
+ else
+ {
+ /* Check if the Current Thread is already attached */
+ if (Thread->ApcStateIndex != OriginalApcEnvironment)
+ {
+ /* We're already attached, so save the APC State into what we got */
KiAttachProcess(Thread, Process, OldIrql, ApcState);
- } else {
-
+ }
+ else
+ {
+ /* We're not attached, so save the APC State into SavedApcState */
KiAttachProcess(Thread, Process, OldIrql, &Thread->SavedApcState);
- ApcState->Process = NULL;
+ ApcState->Process = NULL;
}
}
}
-/*
- * @implemented
- */
-VOID STDCALL
-KeDetachProcess (VOID)
-{
- PKTHREAD Thread;
- KIRQL OldIrql;
-
- DPRINT("KeDetachProcess()\n");
-
- /* Get Current Thread and Lock */
- Thread = KeGetCurrentThread();
- OldIrql = KeAcquireDispatcherDatabaseLock();
-
- /* Check if it's attached */
- DPRINT("Current ApcStateIndex: %x\n", Thread->ApcStateIndex);
-
- if (Thread->ApcStateIndex == OriginalApcEnvironment) {
-
- DPRINT1("Invalid detach (thread was not attached)\n");
- KEBUGCHECK(INVALID_PROCESS_DETACH_ATTEMPT);
- }
-
- /* Decrease Stack Count */
- Thread->ApcState.Process->StackCount--;
-
- /* Restore the APC State */
- KiMoveApcState(&Thread->SavedApcState, &Thread->ApcState);
- Thread->SavedApcState.Process = NULL;
- Thread->ApcStatePointer[OriginalApcEnvironment] = &Thread->ApcState;
- Thread->ApcStatePointer[AttachedApcEnvironment] = &Thread->SavedApcState;
- Thread->ApcStateIndex = OriginalApcEnvironment;
-
- /* Swap Processes */
- KiSwapProcess(Thread->ApcState.Process, Thread->ApcState.Process);
-
- /* Unlock Dispatcher */
- KeReleaseDispatcherDatabaseLock(OldIrql);
-}
-
/*
* @implemented
*/
VOID
-STDCALL
-KeUnstackDetachProcess (
- IN PRKAPC_STATE ApcState
- )
+NTAPI
+KeUnstackDetachProcess(IN PRKAPC_STATE ApcState)
{
KIRQL OldIrql;
PKTHREAD Thread;
+ ASSERT_IRQL_LESS_OR_EQUAL(DISPATCH_LEVEL);
- /*
- * If the special "We tried to attach to the process already being
- * attached to" flag is there, don't do anything
- */
- if (ApcState->Process == (PKPROCESS)1) return;
-
+ /* Get the current thread and acquire the dispatcher lock */
Thread = KeGetCurrentThread();
OldIrql = KeAcquireDispatcherDatabaseLock();
-
- /* Sorry Buddy, can't help you if you've got APCs or just aren't attached */
- if ((Thread->ApcStateIndex == OriginalApcEnvironment) || (Thread->ApcState.KernelApcInProgress)) {
-
- DPRINT1("Invalid detach (Thread not Attached, or Kernel APC in Progress!)\n");
- KEBUGCHECK(INVALID_PROCESS_DETACH_ATTEMPT);
- }
-
- /* Restore the Old APC State if a Process was present */
- if (ApcState->Process) {
-
- KiMoveApcState(ApcState, &Thread->ApcState);
-
- } else {
-
- /* The ApcState parameter is useless, so use the saved data and reset it */
- KiMoveApcState(&Thread->SavedApcState, &Thread->ApcState);
- Thread->SavedApcState.Process = NULL;
- Thread->ApcStateIndex = OriginalApcEnvironment;
- Thread->ApcStatePointer[OriginalApcEnvironment] = &Thread->ApcState;
- Thread->ApcStatePointer[AttachedApcEnvironment] = &Thread->SavedApcState;
- }
- /* Swap Processes */
- KiSwapProcess(Thread->ApcState.Process, Thread->ApcState.Process);
+ /* Check for magic value meaning we were already in the same process */
+ if (ApcState->Process != (PKPROCESS)1)
+ {
+ /*
+ * Check if the process isn't attacked, or has a Kernel APC in progress
+ * or has pending APC of any kind.
+ */
+ if ((Thread->ApcStateIndex == OriginalApcEnvironment) ||
+ (Thread->ApcState.KernelApcInProgress) ||
+ (!IsListEmpty(&Thread->ApcState.ApcListHead[KernelMode])) ||
+ (!IsListEmpty(&Thread->ApcState.ApcListHead[UserMode])))
+ {
+ KEBUGCHECK(INVALID_PROCESS_DETACH_ATTEMPT);
+ }
+
+ /* Decrease Stack Count */
+ if(!(--Thread->ApcState.Process->StackCount))
+ {
+ /* FIXME: Swap the process out */
+ }
+
+ if (ApcState->Process != NULL)
+ {
+ /* Restore the APC State */
+ KiMoveApcState(ApcState, &Thread->ApcState);
+ }
+ else
+ {
+ /* The ApcState parameter is useless, so use the saved data and reset it */
+ KiMoveApcState(&Thread->SavedApcState, &Thread->ApcState);
+ Thread->SavedApcState.Process = NULL;
+ Thread->ApcStateIndex = OriginalApcEnvironment;
+ Thread->ApcStatePointer[OriginalApcEnvironment] = &Thread->ApcState;
+ Thread->ApcStatePointer[AttachedApcEnvironment] = &Thread->SavedApcState;
+ }
+
+ /* Check if we have pending APCs */
+ if (IsListEmpty(&Thread->ApcState.ApcListHead[KernelMode]))
+ {
+ /* What do you know, we do! Request them to be delivered */
+ Thread->ApcState.KernelApcPending = TRUE;
+ HalRequestSoftwareInterrupt(APC_LEVEL);
+ }
+
+ /* Swap Processes */
+ KiSwapProcess(Thread->ApcState.Process, Thread->ApcState.Process);
+ }
/* Return to old IRQL*/
KeReleaseDispatcherDatabaseLock(OldIrql);
/*
* @implemented
*/
-BOOLEAN STDCALL
-KeAddSystemServiceTable(PSSDT SSDT,
- PULONG ServiceCounterTable,
- ULONG NumberOfServices,
- PSSPT SSPT,
- ULONG TableIndex)
+BOOLEAN
+NTAPI
+KeAddSystemServiceTable(PULONG_PTR Base,
+ PULONG Count OPTIONAL,
+ ULONG Limit,
+ PUCHAR Number,
+ ULONG Index)
{
- /* check if descriptor table entry is free */
- if ((TableIndex > SSDT_MAX_ENTRIES - 1) ||
- (KeServiceDescriptorTable[TableIndex].SSDT != NULL) ||
- (KeServiceDescriptorTableShadow[TableIndex].SSDT != NULL))
+ /* Check if descriptor table entry is free */
+ if ((Index > SSDT_MAX_ENTRIES - 1) ||
+ (KeServiceDescriptorTable[Index].Base) ||
+ (KeServiceDescriptorTableShadow[Index].Base))
+ {
return FALSE;
+ }
+
+ /* Initialize the shadow service descriptor table */
+ KeServiceDescriptorTableShadow[Index].Base = Base;
+ KeServiceDescriptorTableShadow[Index].Limit = Limit;
+ KeServiceDescriptorTableShadow[Index].Number = Number;
+ KeServiceDescriptorTableShadow[Index].Count = Count;
- /* initialize the shadow service descriptor table */
- KeServiceDescriptorTableShadow[TableIndex].SSDT = SSDT;
- KeServiceDescriptorTableShadow[TableIndex].SSPT = SSPT;
- KeServiceDescriptorTableShadow[TableIndex].NumberOfServices = NumberOfServices;
- KeServiceDescriptorTableShadow[TableIndex].ServiceCounterTable = ServiceCounterTable;
-
return TRUE;
}
* @implemented
*/
BOOLEAN
-STDCALL
-KeRemoveSystemServiceTable(IN ULONG TableIndex)
+NTAPI
+KeRemoveSystemServiceTable(IN ULONG Index)
{
/* Make sure the Index is valid */
- if (TableIndex > SSDT_MAX_ENTRIES - 1) return FALSE;
-
+ if (Index > SSDT_MAX_ENTRIES - 1) return FALSE;
+
/* Is there a Normal Descriptor Table? */
- if (!KeServiceDescriptorTable[TableIndex].SSDT) {
-
+ if (!KeServiceDescriptorTable[Index].Base)
+ {
/* Not with the index, is there a shadow at least? */
- if (!KeServiceDescriptorTableShadow[TableIndex].SSDT) return FALSE;
+ if (!KeServiceDescriptorTableShadow[Index].Base) return FALSE;
}
-
+
/* Now clear from the Shadow Table. */
- KeServiceDescriptorTableShadow[TableIndex].SSDT = NULL;
- KeServiceDescriptorTableShadow[TableIndex].SSPT = NULL;
- KeServiceDescriptorTableShadow[TableIndex].NumberOfServices = 0;
- KeServiceDescriptorTableShadow[TableIndex].ServiceCounterTable = NULL;
-
+ KeServiceDescriptorTableShadow[Index].Base = NULL;
+ KeServiceDescriptorTableShadow[Index].Number = NULL;
+ KeServiceDescriptorTableShadow[Index].Limit = 0;
+ KeServiceDescriptorTableShadow[Index].Count = NULL;
+
/* Check if we should clean from the Master one too */
- if (TableIndex == 1) {
-
- KeServiceDescriptorTable[TableIndex].SSDT = NULL;
- KeServiceDescriptorTable[TableIndex].SSPT = NULL;
- KeServiceDescriptorTable[TableIndex].NumberOfServices = 0;
- KeServiceDescriptorTable[TableIndex].ServiceCounterTable = NULL;
+ if (Index == 1)
+ {
+ KeServiceDescriptorTable[Index].Base = NULL;
+ KeServiceDescriptorTable[Index].Number = NULL;
+ KeServiceDescriptorTable[Index].Limit = 0;
+ KeServiceDescriptorTable[Index].Count = NULL;
}
return TRUE;