Add an ARC Header for future purposes (PPC, ARM, etc, ARCLoader) and implement KeFind...
[reactos.git] / reactos / include / ddk / kefuncs.h
index 1dba251..1ba1f8e 100644 (file)
@@ -1,17 +1,38 @@
+
 #ifndef __INCLUDE_DDK_KEFUNCS_H
 #define __INCLUDE_DDK_KEFUNCS_H
 
+#define KEBUGCHECK(a) DbgPrint("KeBugCheck (0x%X) at %s:%i\n", a, __FILE__,__LINE__), KeBugCheck(a)
 
 /* KERNEL FUNCTIONS ********************************************************/
 
+NTSTATUS
+STDCALL
+KeRestoreFloatingPointState(
+  IN PKFLOATING_SAVE  FloatSave);
+
+NTSTATUS
+STDCALL
+KeSaveFloatingPointState(
+  OUT PKFLOATING_SAVE  FloatSave);
+
 #ifndef KeFlushIoBuffers
 #define KeFlushIoBuffers(Mdl, ReadOperation, DmaOperation)
 #endif
 
-VOID STDCALL KeAttachProcess (struct _EPROCESS*        Process);
+VOID STDCALL KeAttachProcess(struct _KPROCESS *Process);
+
+BOOLEAN
+STDCALL
+KeIsAttachedProcess(VOID);
+
+VOID FASTCALL KiAcquireSpinLock(PKSPIN_LOCK SpinLock);
+
+VOID FASTCALL KiReleaseSpinLock(PKSPIN_LOCK SpinLock);
 
 VOID KeDrainApcQueue(VOID);
-struct _KPROCESS* KeGetCurrentProcess(VOID);
+
+struct _KPROCESS* STDCALL KeGetCurrentProcess(VOID);
 
 /*
  * FUNCTION: Acquires a spinlock so the caller can synchronize access to 
@@ -25,6 +46,15 @@ VOID STDCALL KeAcquireSpinLock (PKSPIN_LOCK  SpinLock,
 
 #ifndef __USE_W32API
 
+static __inline
+VOID
+KeMemoryBarrier(
+  VOID)
+{
+  volatile LONG Barrier;
+  __asm__ __volatile__ ("xchg %%eax, %0" : : "m" (Barrier) : "%eax");
+}
+
 VOID STDCALL KeAcquireSpinLockAtDpcLevel (IN PKSPIN_LOCK       SpinLock);
 
 #define KefAcquireSpinLockAtDpcLevel KeAcquireSpinLockAtDpcLevel
@@ -69,7 +99,7 @@ BOOLEAN STDCALL KeCancelTimer (PKTIMER        Timer);
 
 VOID STDCALL KeClearEvent (PKEVENT     Event);
 
-NTSTATUS STDCALL KeConnectInterrupt(PKINTERRUPT InterruptObject);
+BOOLEAN STDCALL KeConnectInterrupt(PKINTERRUPT InterruptObject);
 
 NTSTATUS STDCALL KeDelayExecutionThread (KPROCESSOR_MODE       WaitMode,
                                         BOOLEAN                Alertable,
@@ -94,20 +124,20 @@ VOID STDCALL KeEnterKernelDebugger (VOID);
 KIRQL STDCALL KeGetCurrentIrql (VOID);
 
 #ifndef __USE_W32API
-ULONG KeGetCurrentProcessorNumber(VOID);
+#define KeGetCurrentProcessorNumber() (KeGetCurrentKPCR()->Number)
 ULONG KeGetDcacheFillSize(VOID);
-ULONG STDCALL KeGetPreviousMode (VOID);
+KPROCESSOR_MODE STDCALL KeGetPreviousMode (VOID);
 #endif
 
 struct _KTHREAD* STDCALL KeGetCurrentThread (VOID);
 
 VOID STDCALL KeInitializeApc (IN PKAPC  Apc,
        IN PKTHREAD  Thread,
-       IN UCHAR  StateIndex,
+  IN KAPC_ENVIRONMENT TargetEnvironment,
        IN PKKERNEL_ROUTINE  KernelRoutine,
        IN PKRUNDOWN_ROUTINE  RundownRoutine,
        IN PKNORMAL_ROUTINE  NormalRoutine,
-       IN UCHAR  Mode,
+  IN KPROCESSOR_MODE  Mode,
        IN PVOID  Context);
 
 
@@ -132,17 +162,17 @@ VOID STDCALL KeInitializeEvent (PKEVENT           Event,
                                EVENT_TYPE      Type,
                                BOOLEAN         State);
 
-NTSTATUS STDCALL KeInitializeInterrupt(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);
+VOID STDCALL KeInitializeInterrupt(PKINTERRUPT InterruptObject,
+                                  PKSERVICE_ROUTINE ServiceRoutine,
+                                  PVOID ServiceContext,
+                                  PKSPIN_LOCK SpinLock,
+                                  ULONG Vector,
+                                  KIRQL Irql,
+                                  KIRQL SynchronizeIrql,
+                                  KINTERRUPT_MODE InterruptMode,
+                                  BOOLEAN ShareVector,
+                                  CHAR ProcessorNumber,
+                                  BOOLEAN FloatingSave);
 
 VOID STDCALL KeInitializeMutant(IN PKMUTANT Mutant,
                                IN BOOLEAN InitialOwner);
@@ -201,9 +231,9 @@ VOID STDCALL KeLeaveCriticalRegion (VOID);
 
 VOID STDCALL KeLowerIrql (KIRQL        NewIrql);
 
-NTSTATUS STDCALL KePulseEvent (PKEVENT         Event,
-                              KPRIORITY        Increment,
-                              BOOLEAN          Wait);
+LONG STDCALL KePulseEvent (PKEVENT             Event,
+                          KPRIORITY    Increment,
+                          BOOLEAN              Wait);
 
 LARGE_INTEGER
 STDCALL
@@ -229,6 +259,12 @@ KeQueryTimeIncrement (
        VOID
        );
 
+ULONGLONG 
+STDCALL
+KeQueryInterruptTime(
+    VOID
+    );
+            
 VOID
 STDCALL
 KeRaiseIrql (
@@ -242,17 +278,6 @@ KeRaiseIrqlToDpcLevel (
        VOID
        );
 
-/*
- * FUNCTION: Raises a user mode exception
- * ARGUMENTS:
- *     ExceptionCode = Status code of the exception
- */
-VOID
-STDCALL
-KeRaiseUserException (
-       IN      NTSTATUS        ExceptionCode
-       );
-
 LONG
 STDCALL
 KeReadStateEvent (
@@ -352,6 +377,16 @@ KeRemoveQueueDpc(IN PKDPC Dpc);
 LONG STDCALL
 KeResetEvent(IN PKEVENT Event);
 
+VOID STDCALL
+KeRosDumpStackFrames ( PULONG Frame, ULONG FrameCount );
+
+ULONG STDCALL
+KeRosGetStackFrames ( PULONG Frames, ULONG FrameCount );
+
+NTSTATUS STDCALL
+KeSetAffinityThread(PKTHREAD   Thread,
+                   KAFFINITY   Affinity);
+
 LONG STDCALL
 KeSetBasePriorityThread(struct _KTHREAD* Thread,
                        LONG Increment);
@@ -413,10 +448,10 @@ KeWaitForSingleObject (
 
 
 
-// io permission map has a 8k size
-// Each bit in the IOPM corresponds to an io port byte address. The bitmap
-// is initialized to allow IO at any port. [ all bits set ]. 
-
+/* io permission map has a 8k size
+ * Each bit in the IOPM corresponds to an io port byte address. The bitmap
+ * is initialized to allow IO at any port. [ all bits set ]. 
+ */
 typedef struct _IOPM
 {
        UCHAR Bitmap[8192];
@@ -433,7 +468,8 @@ typedef struct _IOPM
  *     is initialized to allow IO at any port. [ all bits set ]. The IOPL determines
  *     the minium privilege level required to perform IO prior to checking the permission map.
  */
-VOID Ke386SetIoAccessMap(ULONG NewMap, PIOPM *IoPermissionMap);
+BOOL STDCALL
+Ke386SetIoAccessMap(ULONG NewMap, PULONG IoPermissionMap);
 
 /*
  * FUNCTION: Queries the io permission  map.
@@ -446,7 +482,8 @@ VOID Ke386SetIoAccessMap(ULONG NewMap, PIOPM *IoPermissionMap);
  *     is initialized to allow IO at any port. [ all bits set ]. The IOPL determines
  *     the minium privilege level required to perform IO prior to checking the permission map.
  */
-VOID Ke386QueryIoAccessMap(BOOLEAN NewMap, PIOPM *IoPermissionMap);
+BOOL STDCALL
+Ke386QueryIoAccessMap(ULONG NewMap, PULONG IoPermissionMap);
 
 /*
  * FUNCTION: Set the process IOPL
@@ -454,7 +491,22 @@ VOID Ke386QueryIoAccessMap(BOOLEAN NewMap, PIOPM *IoPermissionMap);
  *     Eprocess = Pointer to a executive process object
  *     EnableIo = Specify TRUE to enable IO and FALSE to disable 
  */
-NTSTATUS Ke386IoSetAccessProcess(struct _EPROCESS* Eprocess, BOOLEAN EnableIo);
+BOOL STDCALL
+Ke386IoSetAccessProcess(struct _EPROCESS* Eprocess, BOOL EnableIo);
+
+/*
+ * FUNCTION: Sets the contents of a gdt descriptor.
+ * ARGUMENTS:
+ *     Entry = The selector to set.
+ *     Value1 = The value of the low dword of the descriptor.
+ *     Value2 = The value of the high dword of the descriptor.
+ */
+VOID
+KeSetGdtSelector(
+       ULONG Entry,
+       ULONG Value1,
+       ULONG Value2
+);
 
 /*
  * FUNCTION: Releases a set of Global Descriptor Table Selectors
@@ -462,8 +514,11 @@ NTSTATUS Ke386IoSetAccessProcess(struct _EPROCESS* Eprocess, BOOLEAN EnableIo);
  *     SelArray = 
  *     NumOfSelectors = 
  */
-NTSTATUS KeI386ReleaseGdtSelectors(OUT PULONG SelArray,
-                                  IN ULONG NumOfSelectors);
+NTSTATUS 
+KeI386ReleaseGdtSelectors(
+       OUT PULONG SelArray,
+       IN ULONG NumOfSelectors
+);
 
 /*
  * FUNCTION: Allocates a set of Global Descriptor Table Selectors
@@ -471,8 +526,11 @@ NTSTATUS KeI386ReleaseGdtSelectors(OUT PULONG SelArray,
  *     SelArray = 
  *     NumOfSelectors = 
  */
-NTSTATUS KeI386AllocateGdtSelectors(OUT PULONG SelArray,
-                                   IN ULONG NumOfSelectors);
+NTSTATUS
+KeI386AllocateGdtSelectors(
+       OUT PULONG SelArray,
+    IN ULONG NumOfSelectors
+);
 
 
 KIRQL
@@ -502,10 +560,298 @@ KfReleaseSpinLock (
        );
 
 
-VOID STDCALL KiDeliverApc(ULONG Unknown1,
-                         ULONG Unknown2,
-                         ULONG Unknown3);
-
 VOID STDCALL KiDispatchInterrupt(VOID);
 
+/* Stubs Start here */
+
+VOID
+STDCALL
+KeReleaseInterruptSpinLock(
+       IN PKINTERRUPT Interrupt,
+       IN KIRQL OldIrql
+       );
+
+BOOLEAN
+STDCALL
+KeAreApcsDisabled(
+       VOID
+       );
+
+VOID
+STDCALL
+KeFlushQueuedDpcs(
+       VOID
+       );
+
+ULONG
+STDCALL
+KeGetRecommendedSharedDataAlignment(
+       VOID
+       );
+
+ULONG
+STDCALL
+KeQueryRuntimeThread(
+       IN PKTHREAD Thread,
+       OUT PULONG UserTime
+       );    
+
+BOOLEAN
+STDCALL
+KeSetKernelStackSwapEnable(
+       IN BOOLEAN Enable
+       );
+
+BOOLEAN
+STDCALL
+KeDeregisterBugCheckReasonCallback(
+    IN PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord
+    );
+
+BOOLEAN
+STDCALL
+KeRegisterBugCheckReasonCallback(
+    IN PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord,
+    IN PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine,
+    IN KBUGCHECK_CALLBACK_REASON Reason,
+    IN PUCHAR Component
+    );
+
+VOID 
+STDCALL
+KeTerminateThread(
+       IN KPRIORITY     Increment       
+);
+
+BOOLEAN
+STDCALL
+KeIsExecutingDpc(
+       VOID
+);
+
+VOID
+STDCALL
+KeSetEventBoostPriority(
+       IN PKEVENT Event,
+       IN PKTHREAD *Thread OPTIONAL
+);
+
+PCONFIGURATION_COMPONENT_DATA
+STDCALL
+KeFindConfigurationNextEntry(
+    IN PCONFIGURATION_COMPONENT_DATA Child,
+    IN CONFIGURATION_CLASS Class,
+    IN CONFIGURATION_TYPE Type,
+    IN PULONG ComponentKey OPTIONAL,
+    IN PCONFIGURATION_COMPONENT_DATA *NextLink
+);
+                             
+PCONFIGURATION_COMPONENT_DATA
+STDCALL
+KeFindConfigurationEntry(
+    IN PCONFIGURATION_COMPONENT_DATA Child,
+    IN CONFIGURATION_CLASS Class,
+    IN CONFIGURATION_TYPE Type,
+    IN PULONG ComponentKey OPTIONAL
+);
+                         
+VOID
+STDCALL
+KeFlushEntireTb(
+    IN BOOLEAN Unknown,
+    IN BOOLEAN CurrentCpuOnly
+);
+
+VOID
+STDCALL
+KeRevertToUserAffinityThread(
+    VOID
+);
+
+VOID
+STDCALL
+KiCoprocessorError(
+    VOID
+);
+
+VOID
+STDCALL
+KiUnexpectedInterrupt(
+    VOID
+);
+
+VOID
+STDCALL
+KeSetDmaIoCoherency(
+    IN ULONG Coherency
+);
+
+VOID
+STDCALL
+KeSetProfileIrql(
+    IN KIRQL ProfileIrql
+);
+
+VOID
+STDCALL
+KeSetSystemAffinityThread(
+    IN KAFFINITY Affinity
+);
+
+NTSTATUS
+STDCALL
+KeUserModeCallback(
+    IN ULONG   FunctionID,
+    IN PVOID   InputBuffer,
+    IN ULONG   InputLength,
+    OUT PVOID  *OutputBuffer,
+    OUT PULONG OutputLength
+);
+
+VOID
+STDCALL
+KeSetTimeIncrement(
+    IN ULONG MaxIncrement,
+    IN ULONG MinIncrement
+);
+
+VOID
+STDCALL
+KeCapturePersistentThreadState(
+       IN PVOID        CurrentThread,
+       IN ULONG        Setting1,
+       IN ULONG        Setting2,
+       IN ULONG        Setting3,
+       IN ULONG        Setting4,
+       IN ULONG        Setting5,
+       IN PVOID        ThreadState
+);
+
+BOOLEAN
+STDCALL
+KeRemoveSystemServiceTable(
+    IN ULONG TableIndex
+);
+
+NTSTATUS
+KeI386FlatToGdtSelector(
+       IN ULONG        Base,
+       IN USHORT       Length,
+       IN USHORT       Selector
+);
+
+CCHAR
+STDCALL
+KeSetIdealProcessorThread (
+       IN PKTHREAD Thread,
+       IN CCHAR Processor
+       );
+
+typedef
+VOID
+(FASTCALL *PTIME_UPDATE_NOTIFY_ROUTINE)(
+    IN HANDLE ThreadId,
+    IN KPROCESSOR_MODE Mode
+    );
+
+VOID
+FASTCALL
+KeSetTimeUpdateNotifyRoutine(
+    IN PTIME_UPDATE_NOTIFY_ROUTINE NotifyRoutine
+    );
+
+PKDEVICE_QUEUE_ENTRY
+STDCALL
+KeRemoveByKeyDeviceQueueIfBusy (
+    IN PKDEVICE_QUEUE DeviceQueue,
+    IN ULONG SortKey
+    );
+
+KAFFINITY
+STDCALL
+KeQueryActiveProcessors (
+    VOID
+    );
+
+VOID
+FASTCALL
+KeAcquireInStackQueuedSpinLockAtDpcLevel(
+    IN PKSPIN_LOCK SpinLock,
+    IN PKLOCK_QUEUE_HANDLE LockHandle
+    );
+
+VOID
+FASTCALL
+KeReleaseInStackQueuedSpinLockFromDpcLevel(
+    IN PKLOCK_QUEUE_HANDLE LockHandle
+    );
+
+KPRIORITY
+STDCALL
+KeQueryPriorityThread (
+    IN PKTHREAD Thread
+    );  
+
+KIRQL
+STDCALL
+KeAcquireInterruptSpinLock(
+    IN PKINTERRUPT Interrupt
+    );
+
+VOID
+__cdecl
+KeSaveStateForHibernate(
+    IN PVOID State
+);
+
+NTSTATUS
+STDCALL
+KeRaiseUserException(
+       IN NTSTATUS     ExceptionCode
+);
+
+VOID 
+FASTCALL
+KeAcquireGuardedMutex(
+    PKGUARDED_MUTEX GuardedMutex
+);
+
+VOID
+FASTCALL
+KeAcquireGuardedMutexUnsafe(
+    PKGUARDED_MUTEX GuardedMutex
+);
+
+VOID 
+STDCALL
+KeEnterGuardedRegion(VOID);
+
+VOID
+STDCALL
+KeLeaveGuardedRegion(VOID);
+
+VOID 
+FASTCALL
+KeInitializeGuardedMutex(
+    PKGUARDED_MUTEX GuardedMutex
+);
+
+VOID 
+FASTCALL
+KeReleaseGuardedMutexUnsafe(
+    PKGUARDED_MUTEX GuardedMutex
+);
+
+VOID 
+FASTCALL
+KeReleaseGuardedMutex(
+    PKGUARDED_MUTEX GuardedMutex
+);
+
+BOOL 
+FASTCALL
+KeTryToAcquireGuardedMutex(
+    PKGUARDED_MUTEX GuardedMutex
+);
+
 #endif /* __INCLUDE_DDK_KEFUNCS_H */