#ifndef _NT_SEM_H_
#define _NT_SEM_H_
#include "nt_abi.h"
#include "nt_object.h"
/* semaphore commands */
#define NT_SEM_CMD_GETPID (11)
#define NT_SEM_CMD_GETVAL (12)
#define NT_SEM_CMD_GETALL (13)
#define NT_SEM_CMD_GETNCNT (14)
#define NT_SEM_CMD_GETZCNT (15)
#define NT_SEM_CMD_SETVAL (16)
#define NT_SEM_CMD_SETALL (17)
/* semaphore command flags */
#define NT_SEM_FLAG_NOWAIT (0x0800)
#define NT_SEM_FLAG_UNDO (0x1000)
/* semaphore info */
typedef struct __attr_ptr_size_aligned__ _nt_sem_info {
void * hport;
void * section;
void * section_addr;
size_t section_size;
void * hevent;
void * apc_routine;
void * apc_context;
int32_t semkey;
int32_t semslots;
int32_t semid;
int32_t semnum;
int32_t semcmd;
int32_t sempid;
int32_t semncnt;
int32_t semzcnt;
int32_t semval;
int32_t semadj;
nt_filetime semotime;
nt_filetime semctime;
uint64_t ipcuid;
uint64_t ipcgid;
uint64_t ipccuid;
uint64_t ipccgid;
uint32_t ipcmode;
int32_t ipcseq;
uint32_t ntaccess;
uint32_t ntattr;
uint32_t ntshare;
uint32_t ntoptions;
nt_iosb ntiosb;
nt_iosb * riosb;
} nt_sem_info;
/* semaphore operation */
typedef struct _nt_sem_op {
uint16_t semnum;
int16_t semop;
int16_t semflag;
} nt_sem_op;
/* semaphore client interfaces */
typedef int32_t __stdcall ntapi_sem_create(
__in void * hport,
__out nt_sem_info * sem,
__in uint32_t access,
__in nt_object_attributes * oa,
__out nt_iosb * iosb,
__in uint32_t share,
__in uint32_t nslots);
typedef int32_t __stdcall ntapi_sem_open(
__in void * hport,
__out nt_sem_info * sem,
__in uint32_t access,
__in nt_object_attributes * oa,
__out nt_iosb * iosb,
__in uint32_t share,
__in uint32_t nslots);
typedef int32_t __stdcall ntapi_sem_fcntl(
__in nt_sem_info * sem,
__in void * hevent __optional,
__in nt_io_apc_routine * apc_routine __optional,
__in void * apc_context __optional,
__out nt_iosb * iosb,
__in uint32_t tty_control_code,
__in void * input_buffer __optional,
__in uint32_t input_buffer_length,
__out void * output_buffer __optional,
__in uint32_t output_buffer_length);
typedef int32_t __stdcall ntapi_sem_ioctl(
__in nt_sem_info * sem,
__in void * hevent __optional,
__in nt_io_apc_routine * apc_routine __optional,
__in void * apc_context __optional,
__out nt_iosb * iosb,
__in uint32_t ipc_control_code,
__in void * input_buffer __optional,
__in uint32_t input_buffer_length,
__out void * output_buffer __optional,
__in uint32_t output_buffer_length);
typedef int32_t __stdcall ntapi_sem_query(
__in nt_sem_info * sem,
__out nt_io_status_block * iosb,
__out void * sem_info,
__in uint32_t sem_info_length,
__in int32_t sem_ipc_cmd);
typedef int32_t __stdcall ntapi_sem_set(
__in nt_sem_info * sem,
__out nt_io_status_block * iosb,
__in void * sem_info,
__in uint32_t sem_info_length,
__in int32_t sem_ipc_cmd);
typedef int32_t __stdcall ntapi_sem_cancel(
__in nt_sem_info * sem,
__out nt_iosb * iosb);
typedef int32_t __stdcall ntapi_sem_free(
__in nt_sem_info * sem,
__out nt_iosb * iosb);
#endif