Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

202 lines
5.3 KiB

/*++
Copyright (c) 1989 Microsoft Corporation
Module Name:
read.c
Abstract:
This module implements the mini redirector call down routines pertaining to read
of file system objects.
Author:
Balan Sethu Raman [SethuR] 7-March-1995
Revision History:
--*/
#include "precomp.h"
#pragma hdrstop
//
// The local debug trace level
//
#define Dbg (DEBUG_TRACE_READ)
//
// External declartions
//
NTSTATUS
MRxProxyReadContinuation(
MRXPROXY_ASYNCENGINE_ARGUMENT_SIGNATURE
);
NTSTATUS
MRxProxyRead(
IN PRX_CONTEXT RxContext
)
/*++
Routine Description:
This routine handles network read requests.
Arguments:
RxContext - the RDBSS context
Return Value:
RXSTATUS - The return status for the operation
--*/
{
NTSTATUS Status = STATUS_SUCCESS;
//RxCaptureFcb; RxCaptureFobx;
//PMRXPROXY_ASYNCENGINE_CONTEXT AsyncEngineContext;
PAGED_CODE();
RxDbgTrace(+1, Dbg, ("MRxProxyRead\n", 0 ));
//in outerwrapper ASSERT( NodeType(capFobx->pSrvOpen) == RDBSS_NTC_SRVOPEN );
Status = MRxProxyAsyncEngineOuterWrapper(
RxContext,
MRXPROXY_ASYNCENG_CTX_FROM_READ,
MRxProxyReadContinuation,
"MRxProxyRead",
FALSE, //loudprocessing
FALSE
);
RxDbgTrace(-1, Dbg, ("MRxProxyRead exit with status=%08lx\n", Status ));
return(Status);
} // MRxProxyRead
NTSTATUS
MRxProxyReadContinuation(
MRXPROXY_ASYNCENGINE_ARGUMENT_SIGNATURE
)
/*++
Routine Description:
This is the start routine for read.
Arguments:
Return Value:
RXSTATUS - The return status for the operation
--*/
{
NTSTATUS Status; //this is initialized to proxybufstatus on a reenter
PLOWIO_CONTEXT LowIoContext = &RxContext->LowIoContext;
ULONG ContinueEntryCount;
RxCaptureFcb; RxCaptureFobx;
PMRX_SRV_OPEN SrvOpen = capFobx->pSrvOpen;
BOOLEAN SynchronousIo =
!BooleanFlagOn(RxContext->Flags,RX_CONTEXT_FLAG_ASYNC_OPERATION);
PAGED_CODE(); RxDbgTrace(+1, Dbg, ("MRxProxyReadContinuation\n", 0 ));
ASSERT_ASYNCENG_CONTEXT(AsyncEngineContext);
AsyncEngineContext->ContinueEntryCount++;
ContinueEntryCount = AsyncEngineContext->ContinueEntryCount;
for (;;) {
//
// Case on the current state
//
switch (AsyncEngineContext->OpSpecificState) {
case MRxProxyAsyncEngOEInnerIoStates_Initial:
AsyncEngineContext->OpSpecificState = MRxProxyAsyncEngOEInnerIoStates_ReadyToSend;
//
// If not a synchronous read, then continue here when resumed
//
//CODE.IMPROVEMENT don't use presense of continuation as the async marker...use a flag
if (!SynchronousIo) {
SetFlag(AsyncEngineContext->Flags,MRXPROXY_ASYNCENG_CTX_FLAG_ASYNC_OPERATION);
AsyncEngineContext->Continuation = MRxProxyReadContinuation;
}
//lack of break is intentional
case MRxProxyAsyncEngOEInnerIoStates_ReadyToSend:
AsyncEngineContext->OpSpecificState = MRxProxyAsyncEngOEInnerIoStates_OperationOutstanding;
if (FALSE && FlagOn(LowIoContext->ParamsFor.ReadWrite.Flags,LOWIO_READWRITEFLAG_PAGING_IO)) {
RxLog(("PagingRead: rx/off/len %lx/%lx/%lx",
RxContext,
(ULONG)(LowIoContext->ParamsFor.ReadWrite.ByteOffset),
LowIoContext->ParamsFor.ReadWrite.ByteCount
));
}
Status = MRxProxyBuildAsynchronousRequest(
RxContext, // IN PVOID Context
MRxProxyAsyncEngineCalldownIrpCompletion // IN PIO_COMPLETION_ROUTINE CompletionRoutine OPTIONAL,
);
if (Status != STATUS_SUCCESS) {
goto FINALLY;
}
Status = MRxProxySubmitAsyncEngRequest(
MRXPROXY_ASYNCENGINE_ARGUMENTS,
MRXPROXY_ASYNCENG_AECTXTYPE_READ
);
//
// If the status is PENDING, then we're done for now. We must
// wait until we're re-entered when the receive happens.
//
if (Status==(STATUS_PENDING)) {
ASSERT(!SynchronousIo);
goto FINALLY;
}
AsyncEngineContext->Status = Status;
//lack of break is intentional
case MRxProxyAsyncEngOEInnerIoStates_OperationOutstanding:
AsyncEngineContext->OpSpecificState = MRxProxyAsyncEngOEInnerIoStates_ReadyToSend;
Status = AsyncEngineContext->Status;
RxContext->InformationToReturn += AsyncEngineContext->Information;
goto FINALLY;
break;
}
}
FINALLY:
//CODE.IMPROVEMENT read_start and write_start and locks_start should be combined.....we use this
//macro until then to keep the async stuff identical
if ( Status != (STATUS_PENDING) ) {
MRxProxyAsyncEngAsyncCompletionIfNecessary(AsyncEngineContext,RxContext);
}
RxDbgTrace(-1, Dbg, ("MRxProxyReadContinuation exit w %08lx\n", Status ));
return Status;
} // ProxyPseExchangeStart_Read