#ifndef _NT_SYNC_H_
#define _NT_SYNC_H_
#include <psxtypes/psxtypes.h>
#include "nt_object.h"
typedef enum _nt_wait_type {
NT_WAIT_ALL,
NT_WAIT_ANY
} nt_wait_type;
typedef enum _nt_timer_type {
NT_NOTIFICATION_TIMER,
NT_SYNCHRONIZATION_TIMER
} nt_timer_type;
typedef enum _nt_timer_info_class {
NT_TIMER_BASIC_INFORMATION
} nt_timer_info_class;
typedef enum _nt_event_type {
NT_NOTIFICATION_EVENT,
NT_SYNCHRONIZATION_EVENT
} nt_event_type;
typedef enum _nt_event_states {
NT_EVENT_NOT_SIGNALED,
NT_EVENT_SIGNALED
} nt_event_states;
typedef enum _nt_event_info_class {
NT_EVENT_BASIC_INFORMATION
} nt_event_info_class;
typedef enum _nt_semaphore_info_class {
NT_SEMAPHORE_BASIC_INFORMATION
} nt_semaphore_info_class;
typedef enum _nt_mutant_info_class {
NT_MUTANT_BASIC_INFORMATION
} nt_mutant_info_class;
typedef enum _nt_io_completion_info_class {
NT_IO_COMPLETION_BASIC_INFORMATION
} nt_io_completion_info_class;
/* cache block size */
#define NT_SYNC_BLOCK_SIZE 64
/* timer access bits */
#define NT_TIMER_QUERY_STATE 0x00000001U
#define NT_TIMER_MODIFY_STATE 0x00000002U
#define NT_TIMER_ALL_ACCESS 0x001F0003U
/* event access bits */
#define NT_EVENT_QUERY_STATE 0x00000001U
#define NT_EVENT_MODIFY_STATE 0x00000002U
#define NT_EVENT_ALL_ACCESS 0x001F0003U
/* semaphore access bits */
#define NT_SEMAPHORE_QUERY_STATE 0x00000001U
#define NT_SEMAPHORE_MODIFY_STATE 0x00000002U
#define NT_SEMAPHORE_ALL_ACCESS 0x001F0003U
/* mutant access bits */
#define NT_MUTANT_QUERY_STATE 0x00000001U
#define NT_MUTANT_ALL_ACCESS 0x001F0001U
/* io completion access bits */
#define NT_IO_COMPLETION_QUERY_STATE 0x00000001U
#define NT_IO_COMPLETION_MODIFY_STATE 0x00000002U
#define NT_IO_COMPLETION_ALL_ACCESS 0x001F0003U
/* alertable threads */
#define NT_SYNC_NON_ALERTABLE 0x00000000U
#define NT_SYNC_ALERTABLE 0x00000001U
/* sync block flag bits */
#define NT_SYNC_BLOCK_YIELD_TO_SERVER 0x00000001U
typedef struct _nt_timer_basic_information {
nt_large_integer timer_remaining;
int32_t signal_state;
} nt_timer_basic_information;
typedef struct _nt_event_basic_information {
nt_event_type event_type;
int32_t signal_state;
} nt_event_basic_information, nt_ebi;
typedef struct _nt_semaphore_basic_information {
int32_t current_count;
int32_t max_count;
} nt_semaphore_basic_information;
typedef struct _nt_mutant_basic_information {
int32_t signal_state;
int32_t owned;
int32_t abandoned;
} nt_mutant_basic_information;
typedef struct _nt_io_completion_basic_information {
int32_t signal_state;
} nt_io_completion_basic_information;
typedef union __attr_aligned__(NT_SYNC_BLOCK_SIZE) _nt_sync_block {
intptr_t cache_line[NT_SYNC_BLOCK_SIZE/sizeof(intptr_t)];
struct {
int32_t tid;
int32_t pid;
uint32_t flags;
uint32_t srvtid;
int32_t lock_tries;
uint32_t ref_cnt;
uint32_t busy;
int32_t invalid;
nt_timeout lock_wait;
void * hwait;
void * hsignal;
void * hserver;
};
} nt_sync_block;
typedef void __stdcall nt_timer_apc_routine(
void * timer_context,
uint32_t timer_low_value,
uint32_t timer_high_value);
typedef int32_t __stdcall ntapi_zw_wait_for_single_object(
__in void * handle,
__in int32_t alertable,
__in nt_large_integer * timeout __optional);
typedef int32_t __stdcall ntapi_zw_signal_and_wait_for_single_object(
__in void * handle_to_signal,
__in void * handle_to_wait,
__in int32_t alertable,
__in nt_large_integer * timeout __optional);
typedef int32_t __stdcall ntapi_zw_wait_for_multiple_objects(
__in uint32_t handle_count,
__in void ** handles,
__in nt_wait_type wait_type,
__in int32_t alertable,
__in nt_large_integer * timeout __optional);
typedef int32_t __stdcall ntapi_zw_create_timer(
__out void ** htimer,
__in uint32_t desired_access,
__in nt_object_attributes * obj_attr,
__in nt_timer_type timer_type);
typedef int32_t __stdcall ntapi_zw_open_timer(
__out void ** htimer,
__in uint32_t desired_access,
__in nt_object_attributes * obj_attr);
typedef int32_t __stdcall ntapi_zw_cancel_timer(
__in void * htimer,
__out int32_t * previous_state __optional);
typedef int32_t __stdcall ntapi_zw_set_timer(
__in void * htimer,
__in nt_large_integer * due_time,
__in nt_timer_apc_routine * timer_apc_routine __optional,
__in void * timer_context,
__in int32_t resume,
__in int32_t period,
__out int32_t * previous_state __optional);
typedef int32_t __stdcall ntapi_zw_query_timer(
__in void * htimer,
__in nt_timer_info_class timer_info_class,
__out void * timer_info,
__in size_t timer_info_length,
__out size_t * returned_length __optional);
typedef int32_t __stdcall ntapi_zw_create_event(
__out void ** hevent,
__in uint32_t desired_access,
__in nt_object_attributes * obj_attr,
__in nt_event_type event_type,
__in int32_t initial_state);
typedef int32_t __stdcall ntapi_zw_open_event(
__out void ** hevent,
__in uint32_t desired_access,
__in nt_object_attributes * obj_attr);
typedef int32_t __stdcall ntapi_zw_set_event(
__in void * hevent,
__out int32_t * previous_state);
typedef int32_t __stdcall ntapi_zw_pulse_event(
__in void * hevent,
__out int32_t * previous_state);
typedef int32_t __stdcall ntapi_zw_reset_event(
__in void * hevent,
__out int32_t * previous_state);
typedef int32_t __stdcall ntapi_zw_clear_event(
__in void * hevent);
typedef int32_t __stdcall ntapi_zw_query_event(
__in void * hevent,
__in nt_event_info_class event_info_class,
__out void * event_info,
__in size_t event_info_length,
__out size_t * returned_length __optional);
typedef int32_t __stdcall ntapi_zw_create_semaphore(
__out void ** hsemaphore,
__in uint32_t desired_access,
__in nt_object_attributes * obj_attr,
__in int32_t initial_count,
__in int32_t max_count);
typedef int32_t __stdcall ntapi_zw_open_semaphore(
__out void ** hsemaphore,
__in uint32_t desired_access,
__in nt_object_attributes * obj_attr);
typedef int32_t __stdcall ntapi_zw_release_semaphore(
__in void * hsemaphore,
__in int32_t release_count,
__out int32_t * previous_count);
typedef int32_t __stdcall ntapi_zw_query_semaphore(
__in void * hsemaphore,
__in nt_semaphore_info_class semaphore_info_class,
__out void * semaphore_info,
__in size_t semaphore_info_length,
__out size_t * returned_length __optional);
typedef int32_t __stdcall ntapi_zw_create_mutant(
__out void ** hmutant,
__in uint32_t desired_access,
__in nt_object_attributes * obj_attr,
__in int32_t initial_owner);
typedef int32_t __stdcall ntapi_zw_open_mutant(
__out void ** hmutant,
__in uint32_t desired_access,
__in nt_object_attributes * obj_attr);
typedef int32_t __stdcall ntapi_zw_release_mutant(
__in void * hmutant,
__out int32_t * previous_state);
typedef int32_t __stdcall ntapi_zw_query_mutant(
__in void * hmutant,
__in nt_mutant_info_class mutant_info_class,
__out void * mutant_info,
__in size_t mutant_info_length,
__out size_t * returned_length __optional);
typedef int32_t __stdcall ntapi_zw_create_io_completion(
__out void ** hio_completion,
__in uint32_t desired_access,
__in nt_object_attributes * obj_attr,
__in uint32_t max_concurrent_threads);
typedef int32_t __stdcall ntapi_zw_open_io_completion(
__out void ** hio_completion,
__in uint32_t desired_access,
__in nt_object_attributes * obj_attr);
typedef int32_t __stdcall ntapi_zw_set_io_completion(
__in void * hio_completion,
__in uint32_t completion_key,
__in uint32_t completion_value,
__in int32_t status,
__in uint32_t information);
typedef int32_t __stdcall ntapi_zw_remove_io_completion(
__in void * hio_completion,
__out uint32_t * completion_key,
__out uint32_t * completion_value,
__out nt_io_status_block * io_status_block,
__in nt_large_integer * timeout);
typedef int32_t __stdcall ntapi_zw_query_io_completion(
__in void * hio_completion,
__in nt_io_completion_info_class io_completion_info_class,
__out void * io_completion_info,
__in size_t io_completion_info_length,
__out size_t * returned_length __optional);
typedef int32_t __stdcall ntapi_zw_create_event_pair(
__out void ** hevent_pair,
__in uint32_t desired_access,
__in nt_object_attributes * obj_attr);
typedef int32_t __stdcall ntapi_zw_open_event_pair(
__out void ** hevent_pair,
__in uint32_t desired_access,
__in nt_object_attributes * obj_attr);
typedef int32_t __stdcall ntapi_zw_wait_low_event_pair(
__in void * hevent_pair);
typedef int32_t __stdcall ntapi_zw_set_low_event_pair(
__in void * hevent_pair);
typedef int32_t __stdcall ntapi_zw_wait_high_event_pair(
__in void * hevent_pair);
typedef int32_t __stdcall ntapi_zw_set_high_event_pair(
__in void * hevent_pair);
typedef int32_t __stdcall ntapi_zw_set_low_wait_high_event_pair(
__in void * hevent_pair);
typedef int32_t __stdcall ntapi_zw_set_high_wait_low_event_pair(
__in void * hevent_pair);
/* extensions */
typedef int32_t __stdcall ntapi_tt_create_inheritable_event(
__out void ** hevent,
__in nt_event_type event_type,
__in int32_t initial_state);
typedef int32_t __stdcall ntapi_tt_create_private_event(
__out void ** hevent,
__in nt_event_type event_type,
__in int32_t initial_state);
typedef void __stdcall ntapi_tt_sync_block_init(
__in nt_sync_block * sync_block,
__in uint32_t flags __optional,
__in int32_t srvtid __optional,
__in int32_t default_lock_tries __optional,
__in int64_t default_lock_wait __optional,
__in void * hsignal __optional);
typedef int32_t __stdcall ntapi_tt_sync_block_discard(
__in nt_sync_block * sync_block);
typedef int32_t __stdcall ntapi_tt_sync_block_lock(
__in nt_sync_block * sync_block,
__in int32_t lock_tries __optional,
__in int64_t lock_wait __optional,
__in uint32_t * sig_flag __optional);
typedef int32_t __stdcall ntapi_tt_sync_block_unlock(
__in nt_sync_block * sync_block);
typedef int32_t __stdcall ntapi_tt_sync_block_server_lock(
__in nt_sync_block * sync_block,
__in int32_t lock_tries __optional,
__in int64_t lock_wait __optional,
__in uint32_t * sig_flag __optional);
typedef int32_t __stdcall ntapi_tt_wait_for_dummy_event(void);
#endif