- 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
This commit is contained in:
Filip Navara 2004-11-07 22:55:38 +00:00
parent da8cb9fe17
commit 5879eeb98a
8 changed files with 143 additions and 143 deletions

View file

@ -185,6 +185,7 @@ OBJECTS_IO = \
io/iomgr.o \ io/iomgr.o \
io/iowork.o \ io/iowork.o \
io/irp.o \ io/irp.o \
io/irq.o \
io/lock.o \ io/lock.o \
io/mailslot.o \ io/mailslot.o \
io/mdl.o \ io/mdl.o \

View file

@ -45,9 +45,6 @@ struct _KPCR;
VOID STDCALL VOID STDCALL
DbgBreakPointNoBugCheck(VOID); DbgBreakPointNoBugCheck(VOID);
VOID STDCALL KeRescheduleThread();
VOID VOID
STDCALL STDCALL
KeProfileInterrupt( KeProfileInterrupt(

125
reactos/ntoskrnl/io/irq.c Normal file
View file

@ -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 <ntoskrnl.h>
#define NDEBUG
#include <internal/debug.h>
/* 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 */

View file

@ -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 * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -378,6 +378,7 @@ IoOpenDeviceRegistryKey(
ExFreePool(KeyNameBuffer); ExFreePool(KeyNameBuffer);
return Status; return Status;
} }
KeyName.Length += DriverKeyLength - sizeof(UNICODE_NULL);
} }
else else
{ {

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: 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 * PROJECT: ReactOS kernel
* FILE: ntoskrnl/ke/i386/irq.c * 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,}; static KSPIN_LOCK isr_table_lock = {0,};
#define TAG_ISR_LOCK TAG('I', 'S', 'R', 'L') #define TAG_ISR_LOCK TAG('I', 'S', 'R', 'L')
#define TAG_KINTERRUPT TAG('K', 'I', 'S', 'R')
/* FUNCTIONS ****************************************************************/ /* FUNCTIONS ****************************************************************/
@ -399,7 +398,7 @@ KeDumpIrqList(VOID)
/* /*
* @implemented * @implemented
*/ */
NTSTATUS STDCALL BOOLEAN STDCALL
KeConnectInterrupt(PKINTERRUPT InterruptObject) KeConnectInterrupt(PKINTERRUPT InterruptObject)
{ {
KIRQL oldlvl; KIRQL oldlvl;
@ -412,9 +411,8 @@ KeConnectInterrupt(PKINTERRUPT InterruptObject)
Vector = InterruptObject->Vector; Vector = InterruptObject->Vector;
if (Vector < IRQ_BASE && Vector >= IRQ_BASE + NR_IRQS) if (Vector < IRQ_BASE && Vector >= IRQ_BASE + NR_IRQS)
{ return FALSE;
return STATUS_INVALID_PARAMETER;
}
Vector -= IRQ_BASE; Vector -= IRQ_BASE;
/* /*
@ -430,7 +428,7 @@ KeConnectInterrupt(PKINTERRUPT InterruptObject)
(InterruptObject->Shareable == FALSE || ListHead->Shareable==FALSE)) (InterruptObject->Shareable == FALSE || ListHead->Shareable==FALSE))
{ {
KeReleaseSpinLock(&isr_table_lock,oldlvl); KeReleaseSpinLock(&isr_table_lock,oldlvl);
return(STATUS_INVALID_PARAMETER); return FALSE;
} }
else else
{ {
@ -462,7 +460,7 @@ KeConnectInterrupt(PKINTERRUPT InterruptObject)
KeDumpIrqList(); KeDumpIrqList();
return STATUS_SUCCESS; return TRUE;
} }
@ -514,127 +512,9 @@ KeInitializeInterrupt(PKINTERRUPT InterruptObject,
InterruptObject->ProcessorEnableMask = ProcessorEnableMask; InterruptObject->ProcessorEnableMask = ProcessorEnableMask;
InterruptObject->SynchLevel = SynchronizeIrql; InterruptObject->SynchLevel = SynchronizeIrql;
InterruptObject->Shareable = ShareVector; InterruptObject->Shareable = ShareVector;
InterruptObject->FloatingSave = FALSE; InterruptObject->FloatingSave = FloatingSave;
return STATUS_SUCCESS; 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 */ /* EOF */

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: 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 * FILE: ntoskrnl/ke/kthread.c
* PURPOSE: Microkernel thread support * 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 * @implemented
*/ */

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.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 * PROJECT: ReactOS kernel
* FILE: ntoskrnl/ke/main.c * FILE: ntoskrnl/ke/main.c
@ -58,6 +58,7 @@ LOADER_PARAMETER_BLOCK EXPORTED KeLoaderBlock;
ULONG EXPORTED KeDcacheFlushCount = 0; ULONG EXPORTED KeDcacheFlushCount = 0;
ULONG EXPORTED KeIcacheFlushCount = 0; ULONG EXPORTED KeIcacheFlushCount = 0;
ULONG EXPORTED KiDmaIoCoherency = 0; /* RISC Architectures only */ ULONG EXPORTED KiDmaIoCoherency = 0; /* RISC Architectures only */
ULONG EXPORTED InitSafeBootMode = 0; /* KB83764 */
#else #else
/* Microsoft-style declarations */ /* Microsoft-style declarations */
EXPORTED ULONG NtBuildNumber = KERNEL_VERSION_BUILD; EXPORTED ULONG NtBuildNumber = KERNEL_VERSION_BUILD;
@ -68,6 +69,7 @@ EXPORTED LOADER_PARAMETER_BLOCK KeLoaderBlock;
EXPORTED ULONG KeDcacheFlushCount = 0; EXPORTED ULONG KeDcacheFlushCount = 0;
EXPORTED ULONG KeIcacheFlushCount = 0; EXPORTED ULONG KeIcacheFlushCount = 0;
EXPORTED ULONG KiDmaIoCoherency = 0; /* RISC Architectures only */ EXPORTED ULONG KiDmaIoCoherency = 0; /* RISC Architectures only */
EXPORTED ULONG InitSafeBootMode = 0; /* KB83764 */
#endif /* __GNUC__ */ #endif /* __GNUC__ */
static LOADER_MODULE KeLoaderModules[64]; 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); LdrSafePEProcessModule((PVOID)KERNEL_BASE, (PVOID)KERNEL_BASE, (PVOID)DriverBase, &DriverSize);
/* Now our imports from HAL is fixed. This is the first */ /* Now our imports from HAL are fixed. This is the first */
/* time in the boot process that we can use HAL */ /* time in the boot process that we can use HAL */
FirstKrnlPhysAddr = KeLoaderModules[0].ModStart - KERNEL_BASE + 0x200000; FirstKrnlPhysAddr = KeLoaderModules[0].ModStart - KERNEL_BASE + 0x200000;
LastKrnlPhysAddr = LastKernelAddress - KERNEL_BASE + 0x200000; LastKrnlPhysAddr = LastKernelAddress - KERNEL_BASE + 0x200000;

View file

@ -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 ; reactos/ntoskrnl/ntoskrnl.def
; ;
@ -303,6 +303,7 @@ InbvResetDisplay@0
InbvSetScrollRegion@16 InbvSetScrollRegion@16
InbvSetTextColor@4 InbvSetTextColor@4
InbvSolidColorFill@20 InbvSolidColorFill@20
InitSafeBootMode DATA
@InterlockedCompareExchange@12 @InterlockedCompareExchange@12
@InterlockedDecrement@4 @InterlockedDecrement@4
@InterlockedExchange@8 @InterlockedExchange@8
@ -592,7 +593,6 @@ KeQuerySystemTime@4
KeQueryTickCount@4 KeQueryTickCount@4
KeQueryTimeIncrement@0 KeQueryTimeIncrement@0
KeRaiseUserException@4 KeRaiseUserException@4
KeRescheduleThread@0
KeReadStateEvent@4 KeReadStateEvent@4
KeReadStateMutant@4 KeReadStateMutant@4
KeReadStateMutex@4 KeReadStateMutex@4