#ifndef _NT_SYMLINK_H_
#define _NT_SYMLINK_H_
#include "nt_abi.h"
#include "nt_compiler.h"
#include "nt_object.h"
#include "nt_port.h"
typedef enum _nt_symlinkd_opcode {
NT_SYMLINKD_OPCODE_BASE = 0x200000,
/* primary connection */
NT_SYMLINKD_CONNECT = NT_SYMLINKD_OPCODE_BASE,
NT_SYMLINKD_DISCONNECT,
NT_SYMLINKD_QUERY,
NT_SYMLINKD_SET,
/* daemon information */
NT_SYMLINKD_QUERY_INFORMATION_SERVER,
NT_SYMLINKD_QUERY_INFORMATION_SESSION,
NT_SYMLINKD_QUERY_INFORMATION_PROCESS,
NT_SYMLINKD_QUERY_INFORMATION_THREAD,
NT_SYMLINKD_QUERY_INFORMATION_DEVICE,
NT_SYMLINKD_QUERY_INFORMATION_VOLUME,
NT_SYMLINKD_QUERY_INFORMATION_DIRECTORY,
NT_SYMLINKD_QUERY_INFORMATION_FILE,
/* symlink creation */
NT_SYMLINKD_CREATE_SYMLINK,
NT_SYMLINKD_CREATE_JUNCTION,
/* exclusive upper limit */
NT_SYMLINKD_OPCODE_CAP
} nt_symlinkd_opcode;
typedef struct __attr_ptr_size_aligned__ _nt_symlinkd_reparse_data {
void * hdstdir;
uint16_t dir_name_offset;
uint16_t dir_name_length;
uint16_t base_name_offset;
uint16_t base_name_length;
uint16_t reparse_data_offset;
uint16_t reparse_data_length;
uint32_t flags;
wchar16_t path_buffer[];
} nt_symlinkd_reparse_data;
typedef struct __attr_ptr_size_aligned__ _nt_symlinkd_msg_info {
uintptr_t msg_id;
uint32_t opcode;
int32_t status;
void * reserved;
} nt_symlinkd_msg_info;
typedef struct __attr_ptr_size_aligned__ _nt_symlinkd_create_info {
void * hdstdir;
void * hsection;
uint32_t mapsize;
uint32_t offset;
void * hsymlink;
nt_iosb iosb;
} nt_symlinkd_create_info;
typedef struct __attr_ptr_size_aligned__ _nt_symlinkd_create_msg {
nt_port_message header;
struct {
nt_symlinkd_msg_info msginfo;
nt_symlinkd_create_info lnkinfo;
} data;
} nt_symlinkd_create_msg;
__assert_aligned_size(nt_symlinkd_reparse_data, __SIZEOF_POINTER__);
__assert_aligned_size(nt_symlinkd_msg_info, __SIZEOF_POINTER__);
__assert_aligned_size(nt_symlinkd_create_msg, __SIZEOF_POINTER__);
/* symlink creation bits */
#define NT_SYMLINK_CREATE_DEFAULT 0x0000
#define NT_SYMLINK_CREATE_CURRENT_PROCESS 0x0000
#define NT_SYMLINK_CREATE_ALLOW_CHILD_DAEMON 0x0001
#define NT_SYMLINK_CREATE_ALLOW_SESSION_DAEMON 0x0002
#define NT_SYMLINK_CREATE_ALLOW_SYSTEM_DAEMON 0x0004
#define NT_SYMLINK_CREATE_ALLOW_ANY_DAEMON NT_SYMLINK_CREATE_ALLOW_CHILD_DAEMON \
| NT_SYMLINK_CREATE_ALLOW_SESSION_DAEMON \
| NT_SYMLINK_CREATE_ALLOW_SYSTEM_DAEMON
typedef int32_t __stdcall ntapi_tt_create_symlink(
__out void ** hsymlink __optional,
__in void * hevent __optional,
__in nt_io_apc_routine * apc_routine __optional,
__in void * apc_context __optional,
__out nt_iosb * iosb,
__in uint32_t options,
__in void * input_buffer,
__in uint32_t input_buffer_length,
__out void * output_buffer __optional,
__in uint32_t output_buffer_length);
#endif