📄 openclos.c
字号:
PAGED_CODE();
ASSERT( NodeType(SrvOpen) == RDBSS_NTC_SRVOPEN );
ASSERT( NodeType(RxContext) == RDBSS_NTC_RX_CONTEXT );
if (*MustRegainExclusiveResource) { //this is required because of oplock breaks
RxAcquireExclusiveFcbResourceInMRx( capFcb );
*MustRegainExclusiveResource = FALSE;
}
// This Fobx should be cleaned up by the wrapper
RxContext->pFobx = RxCreateNetFobx( RxContext, SrvOpen);
if( RxContext->pFobx == NULL ) {
return STATUS_INSUFFICIENT_RESOURCES;
}
ASSERT ( RxIsFcbAcquiredExclusive ( capFcb ) );
RxDbgTrace(0, Dbg, ("Storagetype %08lx/Action %08lx\n", StorageType, CreateAction ));
RxContext->Create.ReturnedCreateInformation = CreateAction;
RxFormInitPacket(
InitPacket,
&pFileBasicInfo->FileAttributes,
&pFileStandardInfo->NumberOfLinks,
&pFileBasicInfo->CreationTime,
&pFileBasicInfo->LastAccessTime,
&pFileBasicInfo->LastWriteTime,
&pFileBasicInfo->ChangeTime,
&pFileStandardInfo->AllocationSize,
&pFileStandardInfo->EndOfFile,
&pFileStandardInfo->EndOfFile);
if (capFcb->OpenCount == 0) {
RxFinishFcbInitialization( capFcb,
RDBSS_STORAGE_NTC(StorageType),
&InitPacket
);
} else {
ASSERT( StorageType == 0 || NodeType(capFcb) == RDBSS_STORAGE_NTC(StorageType));
}
NulMRxSetSrvOpenFlags(RxContext,StorageType,SrvOpen);
RxContext->pFobx->OffsetOfNextEaToReturn = 1;
//transition happens later
return Status;
}
NTSTATUS
NulMRxCollapseOpen(
IN OUT PRX_CONTEXT RxContext
)
/*++
Routine Description:
This routine collapses a open locally
Arguments:
RxContext - the RDBSS context
Return Value:
RXSTATUS - The return status for the operation
--*/
{
NTSTATUS Status;
RxCaptureFcb;
RxCaptureRequestPacket;
PMRX_SRV_OPEN SrvOpen = RxContext->pRelevantSrvOpen;
PMRX_SRV_CALL SrvCall = RxContext->Create.pSrvCall;
PMRX_NET_ROOT NetRoot = capFcb->pNetRoot;
RxTraceEnter("NulMRxCollapseOpen");
RxContext->pFobx = (PMRX_FOBX)RxCreateNetFobx( RxContext, SrvOpen);
if (RxContext->pFobx != NULL) {
ASSERT ( RxIsFcbAcquiredExclusive ( capFcb ) );
RxContext->pFobx->OffsetOfNextEaToReturn = 1;
capReqPacket->IoStatus.Information = FILE_OPENED;
Status = STATUS_SUCCESS;
} else {
Status = (STATUS_INSUFFICIENT_RESOURCES);
DbgBreakPoint();
}
RxTraceLeave(Status);
return Status;
}
NTSTATUS
NulMRxComputeNewBufferingState(
IN OUT PMRX_SRV_OPEN pMRxSrvOpen,
IN PVOID pMRxContext,
OUT PULONG pNewBufferingState)
/*++
Routine Description:
This routine maps specific oplock levels into the appropriate RDBSS
buffering state flags
Arguments:
pMRxSrvOpen - the MRX SRV_OPEN extension
pMRxContext - the context passed to RDBSS at Oplock indication time
pNewBufferingState - the place holder for the new buffering state
Return Value:
Notes:
--*/
{
NTSTATUS Status = STATUS_NOT_IMPLEMENTED;
DbgPrint("NulMRxComputeNewBufferingState \n");
return(Status);
}
NTSTATUS
NulMRxDeallocateForFcb (
IN OUT PMRX_FCB pFcb
)
{
NTSTATUS Status = STATUS_SUCCESS;
NulMRxGetFcbExtension(pFcb,pFcbExtension);
PMRX_NET_ROOT pNetRoot = pFcb->pNetRoot;
NulMRxGetNetRootExtension(pNetRoot,pNetRootExtension);
RxTraceEnter("NulMRxDeallocateForFcb\n");
RxTraceLeave(Status);
return(Status);
}
NTSTATUS
NulMRxTruncate(
IN PRX_CONTEXT pRxContext)
/*++
Routine Description:
This routine truncates the contents of a file system object
Arguments:
pRxContext - the RDBSS context
Return Value:
RXSTATUS - The return status for the operation
--*/
{
ASSERT(!"Found a truncate");
return STATUS_NOT_IMPLEMENTED;
}
NTSTATUS
NulMRxCleanupFobx(
IN PRX_CONTEXT RxContext)
/*++
Routine Description:
This routine cleansup a file system object...normally a noop. unless it's a pipe in which case
we do the close at cleanup time and mark the file as being not open.
Arguments:
pRxContext - the RDBSS context
Return Value:
RXSTATUS - The return status for the operation
--*/
{
NTSTATUS Status = STATUS_SUCCESS;
PUNICODE_STRING RemainingName;
RxCaptureFcb; RxCaptureFobx;
NODE_TYPE_CODE TypeOfOpen = NodeType(capFcb);
PMRX_SRV_OPEN SrvOpen = capFobx->pSrvOpen;
BOOLEAN SearchHandleOpen = FALSE;
PAGED_CODE();
ASSERT( NodeType(SrvOpen) == RDBSS_NTC_SRVOPEN );
ASSERT ( NodeTypeIsFcb(capFcb) );
RxDbgTrace( 0, Dbg, ("NulMRxCleanupFobx\n"));
if (FlagOn(capFcb->FcbState,FCB_STATE_ORPHANED)) {
RxDbgTrace( 0, Dbg, ("File orphaned\n"));
return (STATUS_SUCCESS);
}
if ((capFcb->pNetRoot->Type != NET_ROOT_PIPE) && !SearchHandleOpen) {
RxDbgTrace( 0, Dbg, ("File not for closing at cleanup\n"));
return (STATUS_SUCCESS);
}
RxDbgTrace( 0, Dbg, ("NulMRxCleanup exit with status=%08lx\n", Status ));
return(Status);
}
NTSTATUS
NulMRxForcedClose(
IN PMRX_SRV_OPEN pSrvOpen)
/*++
Routine Description:
This routine closes a file system object
Arguments:
pSrvOpen - the instance to be closed
Return Value:
RXSTATUS - The return status for the operation
Notes:
--*/
{
RxDbgTrace( 0, Dbg, ("NulMRxForcedClose\n"));
return STATUS_SUCCESS;
}
//
// The local debug trace level
//
#undef Dbg
#define Dbg (DEBUG_TRACE_CLOSE)
NTSTATUS
NulMRxCloseSrvOpen(
IN PRX_CONTEXT RxContext
)
/*++
Routine Description:
This routine closes a file across the network
Arguments:
RxContext - the RDBSS context
Return Value:
RXSTATUS - The return status for the operation
--*/
{
NTSTATUS Status = STATUS_SUCCESS;
RxCaptureFcb;
RxCaptureFobx;
PMRX_SRV_OPEN pSrvOpen = capFobx->pSrvOpen;
PUNICODE_STRING RemainingName = pSrvOpen->pAlreadyPrefixedName;
PMRX_SRV_OPEN SrvOpen;
NODE_TYPE_CODE TypeOfOpen = NodeType(capFcb);
PMRX_NET_ROOT pNetRoot = capFcb->pNetRoot;
NulMRxGetNetRootExtension(pNetRoot,pNetRootExtension);
RxDbgTrace( 0, Dbg, ("NulMRxCloseSrvOpen \n"));
SrvOpen = capFobx->pSrvOpen;
return(Status);
}
NTSTATUS
NulMRxDeallocateForFobx (
IN OUT PMRX_FOBX pFobx
)
{
RxDbgTrace( 0, Dbg, ("NulMRxDeallocateForFobx\n"));
return(STATUS_SUCCESS);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -