/********************************************************/ /* ntapi: Native API core library */ /* Copyright (C) 2013--2017 Z. Gilboa */ /* Released under GPLv2 and GPLv3; see COPYING.NTAPI. */ /********************************************************/ #include #include #include #include #include #include "ntapi_impl.h" int32_t __stdcall __ntapi_ipc_create_pipe_v2( __out void ** hpipe_read, __out void ** hpipe_write, __in uint32_t advisory_buffer_size) { int32_t status; void * hdevpipes; void * hwrite; void * hread; nt_object_attributes oa; nt_io_status_block iosb; nt_sqos sqos; nt_unicode_string nt_name; nt_timeout timeout; const wchar16_t pipe_dir[] = { '\\','D','e','v','i','c','e', '\\','N','a','m','e','d','P','i','p','e','\\',0 }; /* nt_name: pipe device directory */ nt_name.strlen = (uint16_t)(sizeof(pipe_dir) - sizeof(wchar16_t)); nt_name.maxlen = 0; nt_name.buffer = (uint16_t *)pipe_dir; /* init security structure */ sqos.length = sizeof(sqos); sqos.impersonation_level = NT_SECURITY_ANONYMOUS; sqos.context_tracking_mode = NT_SECURITY_TRACKING_STATIC; sqos.effective_only = 1; /* oa */ oa.len = sizeof(oa); oa.root_dir = (void *)0; oa.obj_name = &nt_name; oa.obj_attr = NT_OBJ_CASE_INSENSITIVE | NT_OBJ_INHERIT; oa.sec_desc = (nt_security_descriptor *)0; oa.sec_qos = &sqos; if ((status = __ntapi->zw_open_file( &hdevpipes, NT_GENERIC_READ | NT_SEC_SYNCHRONIZE, &oa, &iosb, NT_FILE_SHARE_READ | NT_FILE_SHARE_WRITE, NT_FILE_DIRECTORY_FILE))) return status; timeout.ihigh = 0xffffffff; timeout.ulow = 0x0; oa.root_dir = hdevpipes; nt_name.strlen = 0; nt_name.buffer = 0; status = __ntapi->zw_create_named_pipe_file( &hread, NT_GENERIC_READ | NT_SEC_SYNCHRONIZE | NT_FILE_WRITE_ATTRIBUTES, &oa, &iosb, NT_FILE_SHARE_READ | NT_FILE_SHARE_WRITE, NT_FILE_CREATE, NT_FILE_ASYNCHRONOUS_IO, NT_FILE_PIPE_BYTE_STREAM_TYPE, NT_FILE_PIPE_BYTE_STREAM_MODE, NT_FILE_PIPE_QUEUE_OPERATION, 1, advisory_buffer_size, advisory_buffer_size, &timeout); __ntapi->zw_close( hdevpipes); if (status) return status; /* the pipe is now our root directory */ oa.root_dir = hread; status = __ntapi->zw_open_file( &hwrite, NT_GENERIC_WRITE | NT_SEC_SYNCHRONIZE | NT_FILE_READ_ATTRIBUTES, &oa, &iosb, NT_FILE_SHARE_READ | NT_FILE_SHARE_WRITE, NT_FILE_WRITE_THROUGH | NT_FILE_SYNCHRONOUS_IO_ALERT | NT_FILE_NON_DIRECTORY_FILE); if (status) { __ntapi->zw_close(hread); return status; } *hpipe_read = hread; *hpipe_write = hwrite; return status; }