summaryrefslogtreecommitdiffstats
path: root/private/nw/rdr/callback.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/nw/rdr/callback.c')
-rw-r--r--private/nw/rdr/callback.c190
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;
+}
+
+