From 5879eeb98ada379be14a53cf237979ed043a3677 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sun, 7 Nov 2004 22:55:38 +0000 Subject: [PATCH] - Export the InitSafeBootMode variable as per KB83764. - Remove KeRescheduleThread (it's not present neither on WinNT4 nor on WinXP SP2). - Fix IoOpenDeviceRegistryKey for PLUGPLAY_REGKEY_DRIVER case. (Oops) - Move IoConnectInterrupt and IoDisconnectInterrupt outside from Ke. svn path=/trunk/; revision=11588 --- reactos/ntoskrnl/Makefile | 1 + reactos/ntoskrnl/include/internal/ke.h | 3 - reactos/ntoskrnl/io/irq.c | 125 +++++++++++++++++++++++ reactos/ntoskrnl/io/pnpmgr.c | 3 +- reactos/ntoskrnl/ke/i386/irq.c | 134 ++----------------------- reactos/ntoskrnl/ke/kthread.c | 8 +- reactos/ntoskrnl/ke/main.c | 8 +- reactos/ntoskrnl/ntoskrnl.def | 4 +- 8 files changed, 143 insertions(+), 143 deletions(-) create mode 100644 reactos/ntoskrnl/io/irq.c diff --git a/reactos/ntoskrnl/Makefile b/reactos/ntoskrnl/Makefile index a84df2083e8..b62b9c4d0f1 100644 --- a/reactos/ntoskrnl/Makefile +++ b/reactos/ntoskrnl/Makefile @@ -185,6 +185,7 @@ OBJECTS_IO = \ io/iomgr.o \ io/iowork.o \ io/irp.o \ + io/irq.o \ io/lock.o \ io/mailslot.o \ io/mdl.o \ diff --git a/reactos/ntoskrnl/include/internal/ke.h b/reactos/ntoskrnl/include/internal/ke.h index 11570bf5a59..800025d306e 100644 --- a/reactos/ntoskrnl/include/internal/ke.h +++ b/reactos/ntoskrnl/include/internal/ke.h @@ -45,9 +45,6 @@ struct _KPCR; VOID STDCALL DbgBreakPointNoBugCheck(VOID); -VOID STDCALL KeRescheduleThread(); - - VOID STDCALL KeProfileInterrupt( diff --git a/reactos/ntoskrnl/io/irq.c b/reactos/ntoskrnl/io/irq.c new file mode 100644 index 00000000000..44e40901c55 --- /dev/null +++ b/reactos/ntoskrnl/io/irq.c @@ -0,0 +1,125 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: ntoskrnl/io/irq.c + * PURPOSE: IRQ handling + * PROGRAMMER: David Welch (welch@mcmail.com) + */ + +/* INCLUDES *****************************************************************/ + +#include +#define NDEBUG +#include + +/* GLOBALS *****************************************************************/ + +#define TAG_KINTERRUPT TAG('K', 'I', 'S', 'R') + +/* FUNCTIONS *****************************************************************/ + +/* + * @implemented + */ +NTSTATUS STDCALL +IoConnectInterrupt(PKINTERRUPT* InterruptObject, + PKSERVICE_ROUTINE ServiceRoutine, + PVOID ServiceContext, + PKSPIN_LOCK SpinLock, + ULONG Vector, + KIRQL Irql, + KIRQL SynchronizeIrql, + KINTERRUPT_MODE InterruptMode, + BOOLEAN ShareVector, + KAFFINITY ProcessorEnableMask, + BOOLEAN FloatingSave) +/* + * FUNCTION: Registers a driver's isr to be called when its device interrupts + * ARGUMENTS: + * InterruptObject (OUT) = Points to the interrupt object created on + * return + * ServiceRoutine = Routine to be called when the device interrupts + * ServiceContext = Parameter to be passed to ServiceRoutine + * SpinLock = Initalized spinlock that will be used to synchronize + * access between the isr and other driver routines. This is + * required if the isr handles more than one vector or the + * driver has more than one isr + * Vector = Interrupt vector to allocate + * (returned from HalGetInterruptVector) + * Irql = DIRQL returned from HalGetInterruptVector + * SynchronizeIrql = DIRQL at which the isr will execute. This must + * be the highest of all the DIRQLs returned from + * HalGetInterruptVector if the driver has multiple + * isrs + * InterruptMode = Specifies if the interrupt is LevelSensitive or + * Latched + * ShareVector = Specifies if the vector can be shared + * ProcessorEnableMask = Processors on the isr can run + * FloatingSave = TRUE if the floating point stack should be saved when + * the isr runs. Must be false for x86 drivers + * RETURNS: Status + * IRQL: PASSIVE_LEVEL + */ +{ + PKINTERRUPT Interrupt; + NTSTATUS Status = STATUS_SUCCESS; + + ASSERT_IRQL(PASSIVE_LEVEL); + + DPRINT("IoConnectInterrupt(Vector %x)\n",Vector); + + /* + * Initialize interrupt object + */ + Interrupt=ExAllocatePoolWithTag(NonPagedPool,sizeof(KINTERRUPT), + TAG_KINTERRUPT); + if (Interrupt==NULL) + { + return(STATUS_INSUFFICIENT_RESOURCES); + } + + Status = KeInitializeInterrupt(Interrupt, + ServiceRoutine, + ServiceContext, + SpinLock, + Vector, + Irql, + SynchronizeIrql, + InterruptMode, + ShareVector, + ProcessorEnableMask, + FloatingSave); + if (!NT_SUCCESS(Status)) + { + ExFreePool(Interrupt); + return Status; + } + + if (!KeConnectInterrupt(Interrupt)) + { + ExFreePool(Interrupt); + return STATUS_INVALID_PARAMETER; + } + + *InterruptObject = Interrupt; + + return(STATUS_SUCCESS); +} + + +/* + * @implemented + */ +VOID STDCALL +IoDisconnectInterrupt(PKINTERRUPT InterruptObject) +/* + * FUNCTION: Releases a drivers isr + * ARGUMENTS: + * InterruptObject = isr to release + */ +{ + KeDisconnectInterrupt(InterruptObject); + ExFreePool(InterruptObject); +} + +/* EOF */ diff --git a/reactos/ntoskrnl/io/pnpmgr.c b/reactos/ntoskrnl/io/pnpmgr.c index 9d28fdc29f0..4993d54e0e5 100644 --- a/reactos/ntoskrnl/io/pnpmgr.c +++ b/reactos/ntoskrnl/io/pnpmgr.c @@ -1,4 +1,4 @@ -/* $Id: pnpmgr.c,v 1.48 2004/11/07 21:18:33 navaraf Exp $ +/* $Id: pnpmgr.c,v 1.49 2004/11/07 22:55:38 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -378,6 +378,7 @@ IoOpenDeviceRegistryKey( ExFreePool(KeyNameBuffer); return Status; } + KeyName.Length += DriverKeyLength - sizeof(UNICODE_NULL); } else { diff --git a/reactos/ntoskrnl/ke/i386/irq.c b/reactos/ntoskrnl/ke/i386/irq.c index 668031e19a8..19a9f93958a 100644 --- a/reactos/ntoskrnl/ke/i386/irq.c +++ b/reactos/ntoskrnl/ke/i386/irq.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: irq.c,v 1.53 2004/11/01 19:01:25 hbirr Exp $ +/* $Id: irq.c,v 1.54 2004/11/07 22:55:38 navaraf Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/ke/i386/irq.c @@ -187,7 +187,6 @@ static PKSPIN_LOCK isr_lock[NR_IRQS] = {NULL,}; static KSPIN_LOCK isr_table_lock = {0,}; #define TAG_ISR_LOCK TAG('I', 'S', 'R', 'L') -#define TAG_KINTERRUPT TAG('K', 'I', 'S', 'R') /* FUNCTIONS ****************************************************************/ @@ -399,7 +398,7 @@ KeDumpIrqList(VOID) /* * @implemented */ -NTSTATUS STDCALL +BOOLEAN STDCALL KeConnectInterrupt(PKINTERRUPT InterruptObject) { KIRQL oldlvl; @@ -412,9 +411,8 @@ KeConnectInterrupt(PKINTERRUPT InterruptObject) Vector = InterruptObject->Vector; if (Vector < IRQ_BASE && Vector >= IRQ_BASE + NR_IRQS) - { - return STATUS_INVALID_PARAMETER; - } + return FALSE; + Vector -= IRQ_BASE; /* @@ -430,7 +428,7 @@ KeConnectInterrupt(PKINTERRUPT InterruptObject) (InterruptObject->Shareable == FALSE || ListHead->Shareable==FALSE)) { KeReleaseSpinLock(&isr_table_lock,oldlvl); - return(STATUS_INVALID_PARAMETER); + return FALSE; } else { @@ -462,7 +460,7 @@ KeConnectInterrupt(PKINTERRUPT InterruptObject) KeDumpIrqList(); - return STATUS_SUCCESS; + return TRUE; } @@ -514,127 +512,9 @@ KeInitializeInterrupt(PKINTERRUPT InterruptObject, InterruptObject->ProcessorEnableMask = ProcessorEnableMask; InterruptObject->SynchLevel = SynchronizeIrql; InterruptObject->Shareable = ShareVector; - InterruptObject->FloatingSave = FALSE; + InterruptObject->FloatingSave = FloatingSave; return STATUS_SUCCESS; } - -/* - * @implemented - */ -NTSTATUS STDCALL -IoConnectInterrupt(PKINTERRUPT* InterruptObject, - PKSERVICE_ROUTINE ServiceRoutine, - PVOID ServiceContext, - PKSPIN_LOCK SpinLock, - ULONG Vector, - KIRQL Irql, - KIRQL SynchronizeIrql, - KINTERRUPT_MODE InterruptMode, - BOOLEAN ShareVector, - KAFFINITY ProcessorEnableMask, - BOOLEAN FloatingSave) -/* - * FUNCTION: Registers a driver's isr to be called when its device interrupts - * ARGUMENTS: - * InterruptObject (OUT) = Points to the interrupt object created on - * return - * ServiceRoutine = Routine to be called when the device interrupts - * ServiceContext = Parameter to be passed to ServiceRoutine - * SpinLock = Initalized spinlock that will be used to synchronize - * access between the isr and other driver routines. This is - * required if the isr handles more than one vector or the - * driver has more than one isr - * Vector = Interrupt vector to allocate - * (returned from HalGetInterruptVector) - * Irql = DIRQL returned from HalGetInterruptVector - * SynchronizeIrql = DIRQL at which the isr will execute. This must - * be the highest of all the DIRQLs returned from - * HalGetInterruptVector if the driver has multiple - * isrs - * InterruptMode = Specifies if the interrupt is LevelSensitive or - * Latched - * ShareVector = Specifies if the vector can be shared - * ProcessorEnableMask = Processors on the isr can run - * FloatingSave = TRUE if the floating point stack should be saved when - * the isr runs. Must be false for x86 drivers - * RETURNS: Status - * IRQL: PASSIVE_LEVEL - */ -{ - PKINTERRUPT Interrupt; - NTSTATUS Status = STATUS_SUCCESS; - - ASSERT_IRQL(PASSIVE_LEVEL); - - DPRINT("IoConnectInterrupt(Vector %x)\n",Vector); - - /* - * Check the parameters - */ - if (Vector < IRQ_BASE || Vector >= NR_IRQS + IRQ_BASE) - { - return(STATUS_INVALID_PARAMETER); - } - if (FloatingSave == TRUE) - { - return(STATUS_INVALID_PARAMETER); - } - - /* - * Initialize interrupt object - */ - Interrupt=ExAllocatePoolWithTag(NonPagedPool,sizeof(KINTERRUPT), - TAG_KINTERRUPT); - if (Interrupt==NULL) - { - return(STATUS_INSUFFICIENT_RESOURCES); - } - - Status = KeInitializeInterrupt(Interrupt, - ServiceRoutine, - ServiceContext, - SpinLock, - Vector, - Irql, - SynchronizeIrql, - InterruptMode, - ShareVector, - ProcessorEnableMask, - FloatingSave); - if (!NT_SUCCESS(Status)) - { - ExFreePool(Interrupt); - return Status; - } - - Status = KeConnectInterrupt(Interrupt); - if (!NT_SUCCESS(Status)) - { - ExFreePool(Interrupt); - return Status; - } - - *InterruptObject = Interrupt; - - return(STATUS_SUCCESS); -} - - -/* - * @implemented - */ -VOID STDCALL -IoDisconnectInterrupt(PKINTERRUPT InterruptObject) -/* - * FUNCTION: Releases a drivers isr - * ARGUMENTS: - * InterruptObject = isr to release - */ -{ - KeDisconnectInterrupt(InterruptObject); - ExFreePool(InterruptObject); -} - /* EOF */ diff --git a/reactos/ntoskrnl/ke/kthread.c b/reactos/ntoskrnl/ke/kthread.c index 530a8d1a09b..7b9889db1da 100644 --- a/reactos/ntoskrnl/ke/kthread.c +++ b/reactos/ntoskrnl/ke/kthread.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: kthread.c,v 1.56 2004/10/30 23:48:56 navaraf Exp $ +/* $Id: kthread.c,v 1.57 2004/11/07 22:55:38 navaraf Exp $ * * FILE: ntoskrnl/ke/kthread.c * PURPOSE: Microkernel thread support @@ -326,12 +326,6 @@ crashes. I'm disabling it again, until we fix the APC implementation... */ } -VOID STDCALL -KeRescheduleThread(VOID) -{ - PsDispatchThread(THREAD_STATE_READY); -} - /* * @implemented */ diff --git a/reactos/ntoskrnl/ke/main.c b/reactos/ntoskrnl/ke/main.c index 986da1ee9bd..f58cedafecf 100644 --- a/reactos/ntoskrnl/ke/main.c +++ b/reactos/ntoskrnl/ke/main.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: main.c,v 1.203 2004/11/05 17:41:34 ekohl Exp $ +/* $Id: main.c,v 1.204 2004/11/07 22:55:38 navaraf Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/ke/main.c @@ -58,6 +58,7 @@ LOADER_PARAMETER_BLOCK EXPORTED KeLoaderBlock; ULONG EXPORTED KeDcacheFlushCount = 0; ULONG EXPORTED KeIcacheFlushCount = 0; ULONG EXPORTED KiDmaIoCoherency = 0; /* RISC Architectures only */ +ULONG EXPORTED InitSafeBootMode = 0; /* KB83764 */ #else /* Microsoft-style declarations */ EXPORTED ULONG NtBuildNumber = KERNEL_VERSION_BUILD; @@ -68,6 +69,7 @@ EXPORTED LOADER_PARAMETER_BLOCK KeLoaderBlock; EXPORTED ULONG KeDcacheFlushCount = 0; EXPORTED ULONG KeIcacheFlushCount = 0; EXPORTED ULONG KiDmaIoCoherency = 0; /* RISC Architectures only */ +EXPORTED ULONG InitSafeBootMode = 0; /* KB83764 */ #endif /* __GNUC__ */ static LOADER_MODULE KeLoaderModules[64]; @@ -1002,8 +1004,8 @@ _main (ULONG MultiBootMagic, PLOADER_PARAMETER_BLOCK _LoaderBlock) */ LdrSafePEProcessModule((PVOID)KERNEL_BASE, (PVOID)KERNEL_BASE, (PVOID)DriverBase, &DriverSize); - /* Now our imports from HAL is fixed. This is the first */ - /* time in the boot process that we can use HAL */ + /* Now our imports from HAL are fixed. This is the first */ + /* time in the boot process that we can use HAL */ FirstKrnlPhysAddr = KeLoaderModules[0].ModStart - KERNEL_BASE + 0x200000; LastKrnlPhysAddr = LastKernelAddress - KERNEL_BASE + 0x200000; diff --git a/reactos/ntoskrnl/ntoskrnl.def b/reactos/ntoskrnl/ntoskrnl.def index d78276ccea4..0f4aada183a 100644 --- a/reactos/ntoskrnl/ntoskrnl.def +++ b/reactos/ntoskrnl/ntoskrnl.def @@ -1,4 +1,4 @@ -; $Id: ntoskrnl.def,v 1.198 2004/11/07 18:45:52 hyperion Exp $ +; $Id: ntoskrnl.def,v 1.199 2004/11/07 22:55:37 navaraf Exp $ ; ; reactos/ntoskrnl/ntoskrnl.def ; @@ -303,6 +303,7 @@ InbvResetDisplay@0 InbvSetScrollRegion@16 InbvSetTextColor@4 InbvSolidColorFill@20 +InitSafeBootMode DATA @InterlockedCompareExchange@12 @InterlockedDecrement@4 @InterlockedExchange@8 @@ -592,7 +593,6 @@ KeQuerySystemTime@4 KeQueryTickCount@4 KeQueryTimeIncrement@0 KeRaiseUserException@4 -KeRescheduleThread@0 KeReadStateEvent@4 KeReadStateMutant@4 KeReadStateMutex@4