diff options
author | Adam <you@example.com> | 2020-05-17 05:51:50 +0200 |
---|---|---|
committer | Adam <you@example.com> | 2020-05-17 05:51:50 +0200 |
commit | e611b132f9b8abe35b362e5870b74bce94a1e58e (patch) | |
tree | a5781d2ec0e085eeca33cf350cf878f2efea6fe5 /private/nw/rdr/callback.c | |
download | NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.gz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.bz2 NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.lz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.xz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.zst NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.zip |
Diffstat (limited to 'private/nw/rdr/callback.c')
-rw-r--r-- | private/nw/rdr/callback.c | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/private/nw/rdr/callback.c b/private/nw/rdr/callback.c new file mode 100644 index 000000000..7228813ea --- /dev/null +++ b/private/nw/rdr/callback.c @@ -0,0 +1,190 @@ +/*++ + +Copyright (c) 1993 Microsoft Corporation + +Module Name: + + callback.c + +Abstract: + + This module implements NCP Response callback routines. + +Author: + + Manny Weiser [MannyW] 3-Mar-1993 + +Revision History: + +--*/ + +#include "procs.h" + +#define Dbg (DEBUG_TRACE_EXCHANGE) + +#ifdef ALLOC_PRAGMA +#ifndef QFE_BUILD +#pragma alloc_text( PAGE1, SynchronousResponseCallback ) +#pragma alloc_text( PAGE1, AsynchResponseCallback ) +#endif +#endif + +#if 0 // Not pageable + +// see ifndef QFE_BUILD above + +#endif + + +NTSTATUS +SynchronousResponseCallback ( + IN PIRP_CONTEXT pIrpContext, + IN ULONG BytesAvailable, + IN PUCHAR RspData + ) +/*++ + +Routine Description: + + This routine is the callback routine for an NCP which has no + return parameters and the caller blocks waiting for a response. + +Arguments: + + pIrpContext - A pointer to the context information for this IRP. + + BytesAvailable - Actual number of bytes in the received message. + + RspData - Points to the receive buffer. + +Return Value: + + NTSTATUS - Status of the operation. + +--*/ + +{ + PEPrequest *pNcpHeader; + PEPresponse *pNcpResponse; + + DebugTrace( 0, Dbg, "SynchronousResponseCallback\n", 0 ); + ASSERT( pIrpContext->pNpScb->Requests.Flink == &pIrpContext->NextRequest ); + + if ( BytesAvailable == 0) { + + // + // No response from server. Status is in pIrpContext-> + // ResponseParameters.Error + // + +#ifdef MSWDBG + ASSERT( pIrpContext->Event.Header.SignalState == 0 ); + pIrpContext->DebugValue = 0x103; +#endif + pIrpContext->pOriginalIrp->IoStatus.Status = STATUS_REMOTE_NOT_LISTENING; + NwSetIrpContextEvent( pIrpContext ); + + return STATUS_REMOTE_NOT_LISTENING; + } + + pIrpContext->ResponseLength = BytesAvailable; + + // + // Simply copy the data into the response buffer, if it is not + // already there (because we used an IRP to receive the data). + // + + if ( RspData != pIrpContext->rsp ) { + CopyBufferToMdl( pIrpContext->RxMdl, 0, RspData, pIrpContext->ResponseLength ); + } + + // + // Remember the returned error code. + // + + pNcpHeader = (PEPrequest *)pIrpContext->rsp; + pNcpResponse = (PEPresponse *)(pNcpHeader + 1); + + pIrpContext->ResponseParameters.Error = pNcpResponse->error; + + // + // Tell the caller that the response has been received. + // + +#ifdef MSWDBG + ASSERT( pIrpContext->Event.Header.SignalState == 0 ); + pIrpContext->DebugValue = 0x104; +#endif + + pIrpContext->pOriginalIrp->IoStatus.Status = STATUS_SUCCESS; + pIrpContext->pOriginalIrp->IoStatus.Information = BytesAvailable; + + NwSetIrpContextEvent( pIrpContext ); + return STATUS_SUCCESS; +} + +NTSTATUS +AsynchResponseCallback ( + IN PIRP_CONTEXT pIrpContext, + IN ULONG BytesAvailable, + IN PUCHAR RspData + ) +/*++ + +Routine Description: + + This routine is the callback routine for an NCP which has no + return parameters and the caller DOES NOT BLOCK waiting for a + response. + +Arguments: + + pIrpContext - A pointer to the context information for this IRP. + + BytesAvailable - Actual number of bytes in the received message. + + RspData - Points to the receive buffer. + +Return Value: + + NTSTATUS - Status of the operation. + +--*/ + +{ + NTSTATUS Status; + + if ( BytesAvailable == 0) { + + // + // No response from server. Status is in pIrpContext-> + // ResponseParameters.Error + // + + Status = STATUS_REMOTE_NOT_LISTENING; + + } else { + + if ( ((PNCP_RESPONSE)RspData)->Status != 0 ) { + + Status = STATUS_LINK_FAILED; + + } else { + + Status = NwErrorToNtStatus( ((PNCP_RESPONSE)RspData)->Error ); + + } + } + + // + // We're done with this request. Dequeue the IRP context from + // SCB and complete the request. + // + + NwDequeueIrpContext( pIrpContext, FALSE ); + NwCompleteRequest( pIrpContext, Status ); + + return STATUS_SUCCESS; +} + + |