📄 openclos.c
字号:
{
Status = STATUS_ACCESS_DENIED;
}
}
}
FINALLY:
if (*MustRegainExclusiveResource) {
RxAcquireExclusiveFcbResourceInMRx( capFcb );
}
// now that we have the fcb exclusive, we can do some updates
if (FlagOn(smbSrvOpen->Flags,SMB_SRVOPEN_FLAG_WRITE_ONLY_HANDLE)) {
smbFcb->WriteOnlySrvOpenCount++;
}
MRxSmbMungeBufferingIfWriteOnlyHandles(
smbFcb->WriteOnlySrvOpenCount,
SrvOpen
);
RxDbgTrace(-1, Dbg, ("SmbPseExchangeStart_Create exit w %08lx\n", Status ));
return Status;
}
VOID
MRxSmbSetSrvOpenFlags (
PRX_CONTEXT RxContext,
RX_FILE_TYPE StorageType,
PMRX_SRV_OPEN SrvOpen,
PMRX_SMB_SRV_OPEN smbSrvOpen
)
{
PAGED_CODE();
RxDbgTrace( 0, Dbg, ("MRxSmbSetSrvOpenFlags oplockstate =%08lx\n", smbSrvOpen->OplockLevel ));
SrvOpen->BufferingFlags = 0;
switch (smbSrvOpen->OplockLevel) {
case SMB_OPLOCK_LEVEL_II:
SrvOpen->BufferingFlags |= (FCB_STATE_READBUFFERING_ENABLED |
FCB_STATE_READCACHING_ENABLED);
break;
case SMB_OPLOCK_LEVEL_BATCH:
if (StorageType == FileTypeFile) {
SrvOpen->BufferingFlags |= FCB_STATE_COLLAPSING_ENABLED;
}
// lack of break intentional
case SMB_OPLOCK_LEVEL_EXCLUSIVE:
SrvOpen->BufferingFlags |= (FCB_STATE_WRITECACHING_ENABLED |
FCB_STATE_FILESIZECACHEING_ENABLED |
FCB_STATE_FILETIMECACHEING_ENABLED |
FCB_STATE_WRITEBUFFERING_ENABLED |
FCB_STATE_LOCK_BUFFERING_ENABLED |
FCB_STATE_READBUFFERING_ENABLED |
FCB_STATE_READCACHING_ENABLED);
break;
default:
ASSERT(!"Valid Oplock Level for Open");
case SMB_OPLOCK_LEVEL_NONE:
break;
}
SrvOpen->Flags |= MRxSmbInitialSrvOpenFlags;
}
NTSTATUS
MRxSmbCreateFileSuccessTail (
PRX_CONTEXT RxContext,
PBOOLEAN MustRegainExclusiveResource,
RX_FILE_TYPE StorageType,
SMB_FILE_ID Fid,
ULONG ServerVersion,
UCHAR OplockLevel,
ULONG CreateAction,
PSMBPSE_FILEINFO_BUNDLE FileInfo
)
/*++
Routine Description:
This routine finishes the initialization of the fcb and srvopen for a successful open.
Arguments:
Return Value:
NTSTATUS - The return status for the operation
--*/
{
NTSTATUS Status = STATUS_SUCCESS;
RxCaptureFcb;
PMRX_SMB_FCB smbFcb = MRxSmbGetFcbExtension(capFcb);
PMRX_SRV_OPEN SrvOpen = RxContext->pRelevantSrvOpen;
PMRX_SMB_SRV_OPEN smbSrvOpen = MRxSmbGetSrvOpenExtension(SrvOpen);
PSMBCEDB_SERVER_ENTRY pServerEntry = (PSMBCEDB_SERVER_ENTRY)RxContext->Create.pSrvCall->Context;
PSMBCE_V_NET_ROOT_CONTEXT pVNetRootContext = (PSMBCE_V_NET_ROOT_CONTEXT)SrvOpen->pVNetRoot->Context;
BOOLEAN ThisIsAPseudoOpen;
FCB_INIT_PACKET LocalInitPacket, *InitPacket;
PAGED_CODE();
RxDbgTrace(+1, Dbg, ("MRxSmbCreateFileSuccessTail\n", 0 ));
smbSrvOpen->Fid = Fid;
smbSrvOpen->Version = ServerVersion;
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;
}
if (RxContext->pFobx==NULL) {
RxContext->pFobx = RxCreateNetFobx(RxContext, SrvOpen);
}
ASSERT ( RxIsFcbAcquiredExclusive ( capFcb ) );
RxDbgTrace(
0, Dbg,
("Storagetype %08lx/Fid %08lx/Action %08lx\n", StorageType, Fid, CreateAction ));
pVNetRootContext = SmbCeGetAssociatedVNetRootContext(SrvOpen->pVNetRoot);
SrvOpen->Key = MRxSmbMakeSrvOpenKey(pVNetRootContext->TreeId,Fid);
smbSrvOpen->OplockLevel = OplockLevel;
RxContext->Create.ReturnedCreateInformation = CreateAction;
if ( ((FileInfo->Standard.AllocationSize.HighPart == FileInfo->Standard.EndOfFile.HighPart)
&& (FileInfo->Standard.AllocationSize.LowPart < FileInfo->Standard.EndOfFile.LowPart))
|| (FileInfo->Standard.AllocationSize.HighPart < FileInfo->Standard.EndOfFile.HighPart)
) {
FileInfo->Standard.AllocationSize = FileInfo->Standard.EndOfFile;
}
smbFcb->dwFileAttributes = FileInfo->Basic.FileAttributes;
if (smbSrvOpen->OplockLevel > smbFcb->LastOplockLevel) {
ClearFlag(
capFcb->FcbState,
FCB_STATE_TIME_AND_SIZE_ALREADY_SET);
}
smbFcb->LastOplockLevel = smbSrvOpen->OplockLevel;
//the thing is this: if we have good info (not a pseudoopen) then we make the
//finish call passing the init packet; otherwise, we make the call NOT passing an init packet
ThisIsAPseudoOpen = BooleanFlagOn(smbSrvOpen->Flags,SMB_SRVOPEN_FLAG_NOT_REALLY_OPEN);
if (!ThisIsAPseudoOpen) {
MRxSmbIncrementSrvOpenCount(pServerEntry,SrvOpen);
}
if ((capFcb->OpenCount == 0) ||
(!ThisIsAPseudoOpen &&
!FlagOn(capFcb->FcbState,FCB_STATE_TIME_AND_SIZE_ALREADY_SET))) {
if (!ThisIsAPseudoOpen) {
RxFormInitPacket(
LocalInitPacket,
&FileInfo->Basic.FileAttributes,
&FileInfo->Standard.NumberOfLinks,
&FileInfo->Basic.CreationTime,
&FileInfo->Basic.LastAccessTime,
&FileInfo->Basic.LastWriteTime,
&FileInfo->Basic.ChangeTime,
&FileInfo->Standard.AllocationSize,
&FileInfo->Standard.EndOfFile,
&FileInfo->Standard.EndOfFile);
InitPacket = &LocalInitPacket;
} else {
InitPacket = NULL;
}
RxFinishFcbInitialization( capFcb,
RDBSS_STORAGE_NTC(StorageType),
InitPacket
);
if (FlagOn( capFcb->FcbState, FCB_STATE_PAGING_FILE )) {
PPAGING_FILE_CONTEXT PagingFileContext;
ASSERT(FALSE);
PagingFileContext = RxAllocatePoolWithTag(NonPagedPool,
sizeof(PAGING_FILE_CONTEXT),
MRXSMB_MISC_POOLTAG);
if (PagingFileContext != NULL) {
PagingFileContext->pSrvOpen = SrvOpen;
PagingFileContext->pFobx = RxContext->pFobx;
InsertHeadList(
&MRxSmbPagingFilesSrvOpenList,
&PagingFileContext->ContextList);
} else {
Status = STATUS_INSUFFICIENT_RESOURCES;
}
}
}
MRxSmbSetSrvOpenFlags(RxContext,StorageType,SrvOpen,smbSrvOpen);
//(wrapperFcb->Condition) = Condition_Good;
if (RxContext->pFobx) {
RxContext->pFobx->OffsetOfNextEaToReturn = 1;
}
//transition happens later
RxDbgTrace(-1, Dbg, ("MRxSmbFinishCreateFile returning %08lx, fcbstate =%08lx\n", Status, capFcb->FcbState ));
return Status;
}
NTSTATUS
MRxSmbFinishNTCreateAndX (
PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange,
PRESP_NT_CREATE_ANDX Response
)
/*++
Routine Description:
This routine actually gets the stuff out of the NTCreate_AndX response.
Arguments:
OrdinaryExchange - the exchange instance
Response - the response
Return Value:
RXSTATUS - The return status for the operation
--*/
{
NTSTATUS Status = STATUS_SUCCESS;
PRX_CONTEXT RxContext = OrdinaryExchange->RxContext;
RxCaptureFcb;
PMRX_SRV_OPEN SrvOpen = RxContext->pRelevantSrvOpen;
PMRX_SMB_SRV_OPEN smbSrvOpen = MRxSmbGetSrvOpenExtension(SrvOpen);
PSMBCE_SESSION pSession = SmbCeGetExchangeSession(OrdinaryExchange);
PSMBCEDB_NET_ROOT_ENTRY pNetRootEntry = SmbCeGetExchangeNetRootEntry(OrdinaryExchange);
RX_FILE_TYPE StorageType;
SMB_FILE_ID Fid;
ULONG CreateAction;
PSMBPSE_FILEINFO_BUNDLE pFileInfo = &smbSrvOpen->FileInfo;
PAGED_CODE();
RxDbgTrace(+1, Dbg, ("MRxSmbFinishNTCreateAndX\n", 0 ));
ASSERT( NodeType(RxContext) == RDBSS_NTC_RX_CONTEXT );
if (RxContext->Create.NtCreateParameters.CreateOptions & FILE_DELETE_ON_CLOSE) {
PMRX_SMB_FCB smbFcb = MRxSmbGetFcbExtension(capFcb);
SetFlag((smbFcb)->MFlags,SMB_FCB_FLAG_SENT_DISPOSITION_INFO);
}
StorageType = RxInferFileType(RxContext);
if (StorageType == 0) {
StorageType = Response->Directory
?(FileTypeDirectory)
:(FileTypeFile);
RxDbgTrace( 0, Dbg, ("ChangedStoragetype %08lx\n", StorageType ));
}
Fid = SmbGetUshort(&Response->Fid);
CreateAction = SmbGetUlong(&Response->CreateAction);
pFileInfo->Basic.FileAttributes = SmbGetUlong(&Response->FileAttributes);
pFileInfo->Standard.NumberOfLinks = 1;
pFileInfo->Basic.CreationTime.LowPart = SmbGetUlong(&Response->CreationTime.LowPart);
pFileInfo->Basic.CreationTime.HighPart = SmbGetUlong(&Response->CreationTime.HighPart);
pFileInfo->Basic.LastAccessTime.LowPart = SmbGetUlong(&Response->LastAccessTime.LowPart);
pFileInfo->Basic.LastAccessTime.HighPart = SmbGetUlong(&Response->LastAccessTime.HighPart);
pFileInfo->Basic.LastWriteTime.LowPart = SmbGetUlong(&Response->LastWriteTime.LowPart);
pFileInfo->Basic.LastWriteTime.HighPart = SmbGetUlong(&Response->LastWriteTime.HighPart);
pFileInfo->Basic.ChangeTime.LowPart = SmbGetUlong(&Response->ChangeTime.LowPart);
pFileInfo->Basic.ChangeTime.HighPart = SmbGetUlong(&Response->ChangeTime.HighPart);
pFileInfo->Standard.AllocationSize.LowPart = SmbGetUlong(&Response->AllocationSize.LowPart);
pFileInfo->Standard.AllocationSize.HighPart = SmbGetUlong(&Response->AllocationSize.HighPart);
pFileInfo->Standard.EndOfFile.LowPart = SmbGetUlong(&Response->EndOfFile.LowPart);
pFileInfo->Standard.EndOfFile.HighPart = SmbGetUlong(&Response->EndOfFile.HighPart);
pFileInfo->Standard.Directory = Response->Directory;
// If the NT_CREATE_ANDX was to a downlevel server the access rights
// information is not available. Currently we default to maximum
// access for the current user and no access to other users in the
// disconnected mode for such files
smbSrvOpen->MaximalAccessRights = FILE_ALL_ACCESS;
smbSrvOpen->GuestMaximalAccessRights = 0;
if (Response->OplockLevel > SMB_OPLOCK_LEVEL_NONE) {
smbSrvOpen->FileStatusFlags = Response->FileStatusFlags;
smbSrvOpen->IsNtCreate = TRUE;
}
MRxSmbCreateFileSuccessTail (
RxContext,
&OrdinaryExchange->Create.MustRegainExclusiveResource,
StorageType,
Fid,
OrdinaryExchange->ServerVersion,
Response->OplockLevel,
CreateAction,
pFileInfo
);
RxDbgTrace(-1, Dbg, ("MRxSmbFinishNTCreateAndX returning %08lx, fcbstate =%08lx\n", Status, capFcb->FcbState ));
return Status;
}
NTSTATUS
MRxSmbFinishOpenAndX (
PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange,
PRESP_OPEN_ANDX Response
)
/*++
Routine Description:
This routine actually gets the stuff out of the NTCreate_AndX response.
Arguments:
OrdinaryExchange - the exchange instance
Response - the response
Return Value:
NTSTATUS - The return status for the operation
--*/
{
NTSTATUS Status = STATUS_SUCCESS;
PRX_CONTEXT RxContext = OrdinaryExchange->RxContext;
ULONG Disposition = RxContext->Create.NtCreateParameters.Disposition;
RxCaptureFcb;
RX_FILE_TYPE StorageType;
SMB_FILE_ID Fid;
UCHAR OplockLevel = SMB_OPLOCK_LEVEL_NONE;
ULONG CreateAction;
PMRX_SRV_OPEN SrvOpen = RxContext->pRelevantSrvOpen;
PMRX_SMB_SRV_OPEN smbSrvOpen = MRxSmbGetSrvOpenExtension(SrvOpen);
PSMBPSE_FILEINFO_BUNDLE pFileInfo = &smbSrvOpen->FileInfo;
PAGED_CODE();
RxDbgTrace(+1, Dbg, ("MRxSmbFinishOpenAndX\n", 0 ));
ASSERT( NodeType(RxContext) == RDBSS_NTC_RX_CONTEXT );
StorageType = RxInferFileType(RxContext);
if (StorageType == 0) {
StorageType = FileTypeFile;
RxDbgTrace(
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -