Esempio n. 1
0
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;
}
Esempio n. 2
0
File: pipe.c Progetto: Barrell/wine
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);
}