Beispiel #1
0
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;
}
Beispiel #2
0
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;
}