#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