windows-nt/Source/XPSP1/NT/ds/nw/rdr/callback.c
2020-09-26 16:20:57 +08:00

191 lines
3.9 KiB
C

/*++
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;
}