static NTSTATUS SrvQueryFileOpenInformation( PSRV_EXEC_CONTEXT pExecContext ) { NTSTATUS ntStatus = 0; PSRV_PROTOCOL_EXEC_CONTEXT pCtxProtocol = pExecContext->pProtocolContext; PSRV_EXEC_CONTEXT_SMB_V1 pCtxSmb1 = pCtxProtocol->pSmb1Context; PSRV_OPEN_STATE_SMB_V1 pOpenState = NULL; pOpenState = (PSRV_OPEN_STATE_SMB_V1)pCtxSmb1->hState; if (!IoRtlEcpListIsAcknowledged( pOpenState->pEcpList, SRV_ECP_TYPE_NET_OPEN_INFO)) { if (!pOpenState->pNetworkOpenInfo) { pOpenState->pNetworkOpenInfo = &pOpenState->networkOpenInfo; SrvPrepareOpenStateAsync(pOpenState, pExecContext); ntStatus = IoQueryInformationFile( pOpenState->pFile->hFile, pOpenState->pAcb, &pOpenState->ioStatusBlock, pOpenState->pNetworkOpenInfo, sizeof(pOpenState->networkOpenInfo), FileNetworkOpenInformation); BAIL_ON_NT_STATUS(ntStatus); SrvReleaseOpenStateAsync(pOpenState); // completed synchronously } } else { pOpenState->pNetworkOpenInfo = &pOpenState->networkOpenInfo; } if (!(pOpenState->pNetworkOpenInfo->FileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { SrvFileBlockIdleTimeout(pOpenState->pFile); } else { SrvFileUnblockIdleTimeout(pOpenState->pFile); } if (SrvTreeIsNamedPipe(pOpenState->pTree)) { if (!IoRtlEcpListIsAcknowledged( pOpenState->pEcpList, SRV_ECP_TYPE_PIPE_INFO)) { if (!pOpenState->pFilePipeInfo) { pOpenState->pFilePipeInfo = &pOpenState->filePipeInfo; SrvPrepareOpenStateAsync(pOpenState, pExecContext); ntStatus = IoQueryInformationFile( pOpenState->pFile->hFile, pOpenState->pAcb, &pOpenState->ioStatusBlock, pOpenState->pFilePipeInfo, sizeof(pOpenState->filePipeInfo), FilePipeInformation); BAIL_ON_NT_STATUS(ntStatus); SrvReleaseOpenStateAsync(pOpenState); // completed synchronously } } else { pOpenState->pFilePipeInfo = &pOpenState->filePipeInfo; } if (!IoRtlEcpListIsAcknowledged( pOpenState->pEcpList, SRV_ECP_TYPE_PIPE_LOCAL_INFO)) { if (!pOpenState->pFilePipeLocalInfo) { pOpenState->pFilePipeLocalInfo = &pOpenState->filePipeLocalInfo; SrvPrepareOpenStateAsync(pOpenState, pExecContext); ntStatus = IoQueryInformationFile( pOpenState->pFile->hFile, pOpenState->pAcb, &pOpenState->ioStatusBlock, pOpenState->pFilePipeLocalInfo, sizeof(pOpenState->filePipeLocalInfo), FilePipeLocalInformation); BAIL_ON_NT_STATUS(ntStatus); SrvReleaseOpenStateAsync(pOpenState); // completed synchronously } } else { pOpenState->pFilePipeLocalInfo = &pOpenState->filePipeLocalInfo; } } cleanup: return ntStatus; error: goto cleanup; }
static NTSTATUS SrvQueryFileOpenInformation( PSRV_EXEC_CONTEXT pExecContext ) { NTSTATUS ntStatus = 0; PSRV_PROTOCOL_EXEC_CONTEXT pCtxProtocol = pExecContext->pProtocolContext; PSRV_EXEC_CONTEXT_SMB_V1 pCtxSmb1 = pCtxProtocol->pSmb1Context; PSRV_OPEN_STATE_SMB_V1 pOpenState = NULL; pOpenState = (PSRV_OPEN_STATE_SMB_V1)pCtxSmb1->hState; if (!pOpenState->pFileBasicInfo) { pOpenState->pFileBasicInfo = &pOpenState->fileBasicInfo; SrvPrepareOpenStateAsync(pOpenState, pExecContext); ntStatus = IoQueryInformationFile( pOpenState->pFile->hFile, pOpenState->pAcb, &pOpenState->ioStatusBlock, pOpenState->pFileBasicInfo, sizeof(pOpenState->fileBasicInfo), FileBasicInformation); BAIL_ON_NT_STATUS(ntStatus); SrvReleaseOpenStateAsync(pOpenState); // completed synchronously } if (!pOpenState->pFileStdInfo) { pOpenState->pFileStdInfo = &pOpenState->fileStdInfo; SrvPrepareOpenStateAsync(pOpenState, pExecContext); ntStatus = IoQueryInformationFile( pOpenState->pFile->hFile, pOpenState->pAcb, &pOpenState->ioStatusBlock, pOpenState->pFileStdInfo, sizeof(pOpenState->fileStdInfo), FileStandardInformation); BAIL_ON_NT_STATUS(ntStatus); SrvReleaseOpenStateAsync(pOpenState); // completed synchronously } if (SrvTreeIsNamedPipe(pOpenState->pTree)) { if (!pOpenState->pFilePipeInfo) { pOpenState->pFilePipeInfo = &pOpenState->filePipeInfo; SrvPrepareOpenStateAsync(pOpenState, pExecContext); ntStatus = IoQueryInformationFile( pOpenState->pFile->hFile, pOpenState->pAcb, &pOpenState->ioStatusBlock, pOpenState->pFilePipeInfo, sizeof(pOpenState->filePipeInfo), FilePipeInformation); BAIL_ON_NT_STATUS(ntStatus); SrvReleaseOpenStateAsync(pOpenState); // completed synchronously } if (!pOpenState->pFilePipeLocalInfo) { pOpenState->pFilePipeLocalInfo = &pOpenState->filePipeLocalInfo; SrvPrepareOpenStateAsync(pOpenState, pExecContext); ntStatus = IoQueryInformationFile( pOpenState->pFile->hFile, pOpenState->pAcb, &pOpenState->ioStatusBlock, pOpenState->pFilePipeLocalInfo, sizeof(pOpenState->filePipeLocalInfo), FilePipeLocalInformation); BAIL_ON_NT_STATUS(ntStatus); SrvReleaseOpenStateAsync(pOpenState); // completed synchronously } } cleanup: return ntStatus; error: goto cleanup; }