| |
| |
| |
| |
| |
| static int32_t ptyc_grant(nt_pty * hptm) |
| { |
| nt_tty_sigctl_info ctlinfo; |
| nt_iosb iosb; |
| |
| ntapi->tt_aligned_block_memset( |
| &ctlinfo,0,sizeof(ctlinfo)); |
| |
| return ntapi->pty_ioctl( |
| hptm, |
| 0,0,0, |
| &iosb,TTY_TIOCSPTLCK, |
| &ctlinfo,sizeof(ctlinfo), |
| &ctlinfo,sizeof(ctlinfo)); |
| } |
| |
| static int32_t ptyc_set_client_info( |
| nt_pty * hpty, |
| nt_pty_client_info * clinfo) |
| { |
| int32_t status; |
| nt_iosb iosb; |
| nt_large_integer ticks; |
| nt_large_integer freq; |
| nt_pty_client_info ptyinfo; |
| |
| if ((status = ntapi->zw_query_performance_counter( |
| &ticks,&freq))) |
| return status; |
| |
| ptyinfo.any[0] = (ticks.ulow << 19) | (ticks.ulow >> 13); |
| |
| if ((status = ntapi->zw_query_performance_counter( |
| &ticks,&freq))) |
| return status; |
| |
| ptyinfo.any[1] = (ticks.ulow << 15) | (ticks.ulow >> 17); |
| |
| if ((status = ntapi->zw_query_performance_counter( |
| &ticks,&freq))) |
| return status; |
| |
| ptyinfo.any[1] = (ticks.ulow << 11) | (ticks.ulow >> 21); |
| |
| if ((status = ntapi->zw_query_performance_counter( |
| &ticks,&freq))) |
| return status; |
| |
| ptyinfo.any[1] = (ticks.ulow << 17) | (ticks.ulow >> 15); |
| |
| if ((status = ntapi->pty_set( |
| hpty,&iosb, |
| &ptyinfo,sizeof(ptyinfo), |
| NT_PTY_CLIENT_INFORMATION))) |
| return status; |
| |
| clinfo->any[0] = ptyinfo.any[0]; |
| clinfo->any[1] = ptyinfo.any[1]; |
| clinfo->any[2] = ptyinfo.any[2]; |
| clinfo->any[3] = ptyinfo.any[3]; |
| |
| return NT_STATUS_SUCCESS; |
| } |
| |
| static int32_t ptyc_pty_own( |
| nt_pty * hpty, |
| nt_runtime_data * rtdata) |
| { |
| int32_t status; |
| nt_tty_session_info sessioninfo; |
| nt_tty_sigctl_info ctlinfo; |
| nt_pty_client_info ptyinfo; |
| nt_iosb iosb; |
| |
| |
| if ((status = ntapi->tty_client_session_query( |
| rtdata->hsession, |
| &sessioninfo))) |
| return status; |
| |
| |
| sessioninfo.pid = (int32_t)rtdata->cid_self.process_id; |
| sessioninfo.pgid = sessioninfo.pgid ? sessioninfo.pgid : -1; |
| sessioninfo.sid = 0; |
| sessioninfo.syspid = 0; |
| |
| if ((status = ntapi->tty_client_session_set( |
| rtdata->hsession, |
| &sessioninfo))) |
| return status; |
| |
| |
| sessioninfo.pid = (int32_t)rtdata->cid_self.process_id; |
| sessioninfo.pgid = (int32_t)rtdata->cid_self.process_id; |
| sessioninfo.sid = (int32_t)rtdata->cid_self.process_id; |
| sessioninfo.syspid = 0; |
| |
| if ((status = ntapi->tty_client_session_set( |
| rtdata->hsession, |
| &sessioninfo))) |
| return status; |
| |
| |
| ntapi->tt_aligned_block_memset( |
| &ctlinfo,0,sizeof(ctlinfo)); |
| |
| if ((status = ntapi->pty_ioctl( |
| hpty, |
| 0,0,0, |
| &iosb, |
| TTY_TIOCSCTTY, |
| &ctlinfo,sizeof(ctlinfo), |
| &ctlinfo,sizeof(ctlinfo)))) |
| return status; |
| |
| |
| ntapi->tt_aligned_block_memset( |
| &ctlinfo,0,sizeof(ctlinfo)); |
| |
| ctlinfo.ctxarg[0] = rtdata->cid_self.process_id; |
| |
| if ((status = ntapi->pty_ioctl( |
| hpty, |
| 0,0,0, |
| &iosb, |
| TTY_TIOCSPGRP, |
| &ctlinfo,sizeof(ctlinfo), |
| &ctlinfo,sizeof(ctlinfo)))) |
| return status; |
| |
| |
| ntapi->tt_aligned_block_memset( |
| &ptyinfo,0,sizeof(ptyinfo)); |
| |
| if ((status = ntapi->pty_set( |
| hpty,&iosb, |
| &ptyinfo,sizeof(ptyinfo), |
| NT_PTY_CLIENT_INFORMATION))) |
| return status; |
| |
| return NT_STATUS_SUCCESS; |
| } |
| |
| |