diff --git a/sdk/xtdk/kefuncs.h b/sdk/xtdk/kefuncs.h index 4d38b39..d55c2c8 100644 --- a/sdk/xtdk/kefuncs.h +++ b/sdk/xtdk/kefuncs.h @@ -16,6 +16,10 @@ /* Kernel services routines forward references */ +XTAPI +VOID +KeClearEvent(IN PKEVENT Event); + XTAPI VOID KeInitializeApc(IN PKAPC Apc, @@ -27,6 +31,12 @@ KeInitializeApc(IN PKAPC Apc, IN KPROCESSOR_MODE ApcMode, IN PVOID Context); +XTAPI +VOID +KeInitializeEvent(OUT PKEVENT Event, + IN KEVENT_TYPE EventType, + IN BOOLEAN InitialState); + XTAPI VOID KeInitializeSemaphore(IN PKSEMAPHORE Semaphore, @@ -57,6 +67,12 @@ KeReleaseSemaphore(IN PKSEMAPHORE Semaphore, IN LONG Adjustment, IN BOOLEAN Wait); +XTAPI +LONG +KeSetEvent(IN PKEVENT Event, + IN KPRIORITY Increment, + IN BOOLEAN Wait); + XTAPI VOID KeStartXtSystem(IN PKERNEL_INITIALIZATION_BLOCK Parameters); diff --git a/sdk/xtdk/ketypes.h b/sdk/xtdk/ketypes.h index 0d1393c..3d552c1 100644 --- a/sdk/xtdk/ketypes.h +++ b/sdk/xtdk/ketypes.h @@ -84,6 +84,13 @@ typedef enum _KDPC_IMPORTANCE MediumHighImportance } KDPC_IMPORTANCE, *PKDPC_IMPORTANCE; +/* Event types list */ +typedef enum _KEVENT_TYPE +{ + NotificationEvent, + SynchronizationEvent +} KEVENT_TYPE, *PKEVENT_TYPE; + /* Kernel objects */ typedef enum _KOBJECTS { @@ -226,6 +233,12 @@ typedef struct _KDPC_DATA ULONG DpcCount; } KDPC_DATA, *PKDPC_DATA; +/* Event object structure definition */ +typedef struct _KEVENT +{ + DISPATCHER_HEADER Header; +} KEVENT, *PKEVENT; + /* Exception registration record structure definition */ typedef struct _EXCEPTION_REGISTRATION_RECORD { diff --git a/sdk/xtdk/xtstruct.h b/sdk/xtdk/xtstruct.h index 2e3753d..e0dbfab 100644 --- a/sdk/xtdk/xtstruct.h +++ b/sdk/xtdk/xtstruct.h @@ -40,6 +40,7 @@ typedef enum _EFI_UART_STOP_BITS_TYPE EFI_UART_STOP_BITS_TYPE, *PEFI_UART_STOP_B typedef enum _EFI_UNIVERSA_GRAPHICS_BLT_OPERATION EFI_UNIVERSA_GRAPHICS_BLT_OPERATION, *PEFI_UNIVERSA_GRAPHICS_BLT_OPERATION; typedef enum _KAPC_ENVIRONMENT KAPC_ENVIRONMENT, *PKAPC_ENVIRONMENT; typedef enum _KDPC_IMPORTANCE KDPC_IMPORTANCE, *PKDPC_IMPORTANCE; +typedef enum _KEVENT_TYPE KEVENT_TYPE, *PKEVENT_TYPE; typedef enum _KOBJECTS KOBJECTS, *PKOBJECTS; typedef enum _KPROCESS_STATE KPROCESS_STATE, *PKPROCESS_STATE; typedef enum _KTHREAD_STATE KTHREAD_STATE, *PKTHREAD_STATE; @@ -204,6 +205,7 @@ typedef struct _KAPC_STATE KAPC_STATE, *PKAPC_STATE; typedef struct _KDPC KDPC, *PKDPC; typedef struct _KDPC_DATA KDPC_DATA, *PKDPC_DATA; typedef struct _KERNEL_INITIALIZATION_BLOCK KERNEL_INITIALIZATION_BLOCK, *PKERNEL_INITIALIZATION_BLOCK; +typedef struct _KEVENT KEVENT, *PKEVENT; typedef struct _KGATE KGATE, *PKGATE; typedef struct _KPROCESS KPROCESS, *PKPROCESS; typedef struct _KQUEUE KQUEUE, *PKQUEUE; diff --git a/xtoskrnl/CMakeLists.txt b/xtoskrnl/CMakeLists.txt index 7ff8b12..fcde6c9 100644 --- a/xtoskrnl/CMakeLists.txt +++ b/xtoskrnl/CMakeLists.txt @@ -18,6 +18,7 @@ list(APPEND XTOSKRNL_SOURCE ${XTOSKRNL_SOURCE_DIR}/hl/${ARCH}/ioport.c ${XTOSKRNL_SOURCE_DIR}/ke/apc.c ${XTOSKRNL_SOURCE_DIR}/ke/dpc.c + ${XTOSKRNL_SOURCE_DIR}/ke/event.c ${XTOSKRNL_SOURCE_DIR}/ke/globals.c ${XTOSKRNL_SOURCE_DIR}/ke/kprocess.c ${XTOSKRNL_SOURCE_DIR}/ke/krnlinit.c diff --git a/xtoskrnl/ke/event.c b/xtoskrnl/ke/event.c new file mode 100644 index 0000000..2cffd3e --- /dev/null +++ b/xtoskrnl/ke/event.c @@ -0,0 +1,85 @@ +/** + * PROJECT: ExectOS + * COPYRIGHT: See COPYING.md in the top level directory + * FILE: xtoskrnl/ke/event.c + * DESCRIPTION: Kernel events support + * DEVELOPERS: Rafal Kupiec + */ + +#include + + +/** + * Clears the signal state of the event. + * + * @param Event + * Supplies a pointer to the event object. + * + * @return This routine does not return any value. + * + * @since NT 3.5 + */ +XTAPI +VOID +KeClearEvent(IN PKEVENT Event) +{ + /* Clear event's signal state */ + Event->Header.SignalState = FALSE; +} + +/** + * Initializes a kernel event. + * + * @param Event + * Supplies a pointer to the event object. + * + * @param EventType + * Specifies an event type. + * + * @param InitialState + * Specifies the initial signal state of the event. + * + * @return This routine does not return any value. + * + * @since NT 3.5 + */ +XTAPI +VOID +KeInitializeEvent(OUT PKEVENT Event, + IN KEVENT_TYPE EventType, + IN BOOLEAN InitialState) +{ + /* Initialize event dispatcher header */ + Event->Header.Type = EventType; + Event->Header.SignalState = InitialState; + + /* Initialize event wait list */ + RtlInitializeListHead(&Event->Header.WaitListHead); +} + +/** + * Sets new signal state and satisfy waits if possible. + * + * @param Event + * Supplies a pointer to the event object. + * + * @param Increment + * Specifies an event priority boost value. + * + * @param Wait + * Specifies whether to call kernel wait routines or not. + * + * @return This routine returns the previous signal state of the event. + * + * @since NT 3.5 + */ +XTAPI +LONG +KeSetEvent(IN PKEVENT Event, + IN KPRIORITY Increment, + IN BOOLEAN Wait) +{ + UNIMPLEMENTED; + + return 0; +}