/* Editor Settings: expandtabs and use 4 spaces for indentation * ex: set softtabstop=4 tabstop=8 expandtab shiftwidth=4: * */ /* * Copyright Likewise Software * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. You should have received a copy of the GNU General * Public License along with this program. If not, see * . * * LIKEWISE SOFTWARE MAKES THIS SOFTWARE AVAILABLE UNDER OTHER LICENSING * TERMS AS WELL. IF YOU HAVE ENTERED INTO A SEPARATE LICENSE AGREEMENT * WITH LIKEWISE SOFTWARE, THEN YOU MAY ELECT TO USE THE SOFTWARE UNDER THE * TERMS OF THAT SOFTWARE LICENSE AGREEMENT INSTEAD OF THE TERMS OF THE GNU * GENERAL PUBLIC LICENSE, NOTWITHSTANDING THE ABOVE NOTICE. IF YOU * HAVE QUESTIONS, OR WISH TO REQUEST A COPY OF THE ALTERNATE LICENSING * TERMS OFFERED BY LIKEWISE SOFTWARE, PLEASE CONTACT LIKEWISE SOFTWARE AT * license@likewisesoftware.com */ /* * Copyright (C) Likewise Software. All rights reserved. * * Module Name: * * error.c * * Abstract: * * Likewise IO (LWIO) - SRV * * Protocols API - SMBV2 * * Error * * Authors: Sriram Nambakam (snambakam@likewise.com) * */ #include "includes.h" NTSTATUS SrvSetErrorMessage_SMB_V2( PSRV_EXEC_CONTEXT_SMB_V2 pSmb2Context, PBYTE pErrorMessage, ULONG ulErrorMessageLength ) { SrvFreeErrorMessage_SMB_V2(pSmb2Context); pSmb2Context->pErrorMessage = pErrorMessage; pSmb2Context->ulErrorMessageLength = ulErrorMessageLength; return STATUS_SUCCESS; } VOID SrvFreeErrorMessage_SMB_V2( PSRV_EXEC_CONTEXT_SMB_V2 pSmb2Context ) { if (pSmb2Context->pErrorMessage) { SrvFreeMemory(pSmb2Context->pErrorMessage); pSmb2Context->pErrorMessage = NULL; pSmb2Context->ulErrorMessageLength = 0; } } NTSTATUS SrvBuildErrorResponse_SMB_V2( PSRV_EXEC_CONTEXT pExecContext, ULONG64 ullAsyncId, NTSTATUS errorStatus ) { NTSTATUS ntStatus = 0; PSRV_PROTOCOL_EXEC_CONTEXT pCtxProtocol = pExecContext->pProtocolContext; PSRV_EXEC_CONTEXT_SMB_V2 pCtxSmb2 = pCtxProtocol->pSmb2Context; ULONG iMsg = pCtxSmb2->iMsg; PSRV_MESSAGE_SMB_V2 pSmbRequest = &pCtxSmb2->pRequests[iMsg]; PSRV_MESSAGE_SMB_V2 pSmbResponse = &pCtxSmb2->pResponses[iMsg]; PBYTE pOutBuffer = pSmbResponse->pBuffer; ULONG ulOffset = 0; ULONG ulBytesAvailable = pSmbResponse->ulBytesAvailable; ULONG ulBytesUsed = 0; ULONG ulTotalBytesUsed = 0; ntStatus = SMB2MarshalHeader( pOutBuffer, ulOffset, ulBytesAvailable, pSmbRequest->pHeader->command, pSmbRequest->pHeader->usEpoch, pSmbRequest->pHeader->usCredits, /* TODO: Figure out this one */ pSmbRequest->pHeader->ulPid, pSmbRequest->pHeader->ullCommandSequence, pSmbRequest->pHeader->ulTid, pSmbRequest->pHeader->ullSessionId, ullAsyncId, errorStatus, TRUE, LwIsSetFlag( pSmbRequest->pHeader->ulFlags, SMB2_FLAGS_RELATED_OPERATION), &pSmbResponse->pHeader, &pSmbResponse->ulHeaderSize); BAIL_ON_NT_STATUS(ntStatus); pOutBuffer += pSmbResponse->ulHeaderSize; ulOffset += pSmbResponse->ulHeaderSize; ulBytesAvailable -= pSmbResponse->ulHeaderSize; ulTotalBytesUsed += pSmbResponse->ulHeaderSize; pSmbResponse->pHeader->error = errorStatus; ntStatus = SMB2MarshalError( pOutBuffer, ulOffset, ulBytesAvailable, pCtxSmb2->pErrorMessage, pCtxSmb2->ulErrorMessageLength, &ulBytesUsed); BAIL_ON_NT_STATUS(ntStatus); // pOutBuffer += ulBytesUsed; // ulOffset += ulBytesUsed; // ulBytesAvailable -= ulBytesUsed; ulTotalBytesUsed += ulBytesUsed; pSmbResponse->ulMessageSize = ulTotalBytesUsed; cleanup: return ntStatus; error: if (ulTotalBytesUsed) { pSmbResponse->pHeader = NULL; pSmbResponse->ulHeaderSize = 0; memset(pSmbResponse->pBuffer, 0, ulTotalBytesUsed); } pSmbResponse->ulMessageSize = 0; goto cleanup; }