NTSTATUS transact_named_pipe(HANDLE pipe_handle, const void *inbuf, uintptr_t inbufsz, void *outbuf, uintptr_t outbufsz, uintptr_t *written) { if(pNtFsControlFile == NULL && pNtWaitForSingleObject == NULL) { DWORD _written = 0; TransactNamedPipe(pipe_handle, (void *) inbuf, inbufsz, (void *) outbuf, outbufsz, &_written, NULL); if(written != NULL) { *written = _written; } return 0; } assert(pNtFsControlFile != NULL, "pNtFsControlFile is NULL!", 0); assert(pNtWaitForSingleObject != NULL, "pNtWaitForSingleObject is NULL!", 0); IO_STATUS_BLOCK status_block; NTSTATUS ret = pNtFsControlFile(pipe_handle, NULL, NULL, NULL, &status_block, FSCTL_PIPE_TRANSCEIVE, inbuf, inbufsz, outbuf, outbufsz); if(ret == STATUS_PENDING) { ret = pNtWaitForSingleObject(pipe_handle, FALSE, NULL); if(NT_SUCCESS(ret) != FALSE) { ret = status_block._.Status; } } if(NT_SUCCESS(ret) != FALSE && written != NULL) { *written = status_block.Information; } return ret; }
static NTSTATUS listen_pipe(HANDLE hPipe, HANDLE hEvent, PIO_STATUS_BLOCK iosb, BOOL use_apc) { int dummy; ioapc_called = FALSE; return pNtFsControlFile(hPipe, hEvent, use_apc ? &ioapc: NULL, use_apc ? &dummy: NULL, iosb, FSCTL_PIPE_LISTEN, 0, 0, 0, 0); }