static NTSTATUS NetrAllocateChallengeResponse( OUT PVOID pOut, IN OUT PDWORD pdwOffset, IN OUT PDWORD pdwSpaceLeft, IN PBYTE pResponse, IN DWORD dwResponseLen, IN OUT PDWORD pdwSize ) { NTSTATUS ntStatus = STATUS_SUCCESS; DWORD dwError = ERROR_SUCCESS; PVOID pBuffer = pOut; PVOID pCursor = NULL; PVOID pRespData = NULL; PBYTE *ppRespData = NULL; DWORD dwResponseSize = dwResponseLen; DWORD dwResponseSpaceLeft = 0; DWORD dwResponseOffset = 0; BAIL_ON_INVALID_PTR(pdwOffset, ntStatus); BAIL_ON_INVALID_PTR(pdwSize, ntStatus); LWBUF_ALIGN(pdwOffset, pdwSize, pdwSpaceLeft); LWBUF_ALLOC_WORD(pBuffer, dwResponseLen); LWBUF_ALLOC_WORD(pBuffer, dwResponseLen); LWBUF_ALIGN(pdwOffset, pdwSize, pdwSpaceLeft); if (pBuffer && pdwSpaceLeft) { BAIL_IF_NOT_ENOUGH_SPACE(dwResponseSize, pdwSpaceLeft, dwError); pCursor = pBuffer + (*pdwOffset); if (pResponse) { pRespData = LWBUF_TARGET_PTR(pBuffer, dwResponseSize, pdwSpaceLeft); /* sanity check - the data pointer and current buffer cursor must not overlap */ BAIL_IF_PTR_OVERLAP(PBYTE, pRespData, dwError); dwResponseSpaceLeft = dwResponseSize; dwResponseOffset = 0; dwError = LwBufferAllocFixedBlob(pRespData, &dwResponseOffset, &dwResponseSpaceLeft, pResponse, dwResponseSize, pdwSize); BAIL_ON_WIN_ERROR(dwError); } ppRespData = (PBYTE*)pCursor; *ppRespData = pRespData; (*pdwSpaceLeft) -= (pRespData) ? LWBUF_ALIGN_SIZE(dwResponseSize) : 0; /* recalculate space after setting the pointer */ (*pdwSpaceLeft) -= sizeof(PBYTE); } else { (*pdwSize) += LWBUF_ALIGN_SIZE(dwResponseSize); } /* include size of the pointer */ (*pdwOffset) += sizeof(PBYTE); (*pdwSize) += sizeof(PBYTE); cleanup: if (ntStatus == STATUS_SUCCESS && dwError != ERROR_SUCCESS) { ntStatus = LwWin32ErrorToNtStatus(dwError); } return ntStatus; error: goto cleanup; }
static NTSTATUS LsaAllocateAuditEventsInfo( OUT PVOID pOut, IN OUT PDWORD pdwOffset, IN OUT PDWORD pdwSpaceLeft, IN AuditEventsInfo *pIn, IN OUT PDWORD pdwSize ) { NTSTATUS ntStatus = STATUS_SUCCESS; DWORD dwError = ERROR_SUCCESS; PVOID pBuffer = pOut; PVOID pCursor = NULL; PVOID pBlob = NULL; PVOID *ppBlob = NULL; DWORD dwBlobSize = 0; DWORD dwBlobSpaceLeft = 0; DWORD dwBlobOffset = 0; LWBUF_ALLOC_DWORD(pBuffer, pIn->auditing_mode); LWBUF_ALIGN_PTR(pdwOffset, pdwSize, pdwSpaceLeft); if (pIn->count) { dwBlobSize = sizeof(pIn->settings[0]) * pIn->count; } /* Set pointer to the entries array */ if (pBuffer && pdwSpaceLeft) { BAIL_IF_NOT_ENOUGH_SPACE(dwBlobSize, pdwSpaceLeft, dwError); pCursor = pBuffer + (*pdwOffset); if (pIn->count) { pBlob = LWBUF_TARGET_PTR(pBuffer, dwBlobSize, pdwSpaceLeft); /* sanity check - the blob and current buffer cursor must not overlap */ BAIL_IF_PTR_OVERLAP(AuditEventsInfo*, pBlob, dwError); dwBlobSpaceLeft = dwBlobSize; dwBlobSize = 0; dwBlobOffset = 0; dwError = LwBufferAllocFixedBlob( pBlob, &dwBlobSize, &dwBlobSpaceLeft, (PBYTE)pIn->settings, sizeof(pIn->settings[0]) * pIn->count, &dwBlobSize); BAIL_ON_WIN_ERROR(dwError); } ppBlob = (PVOID*)pCursor; *ppBlob = (PVOID)pBlob; (*pdwSpaceLeft) -= (pBlob) ? LWBUF_ALIGN_SIZE(dwBlobSize) : 0; /* recalculate space after setting the pointer */ (*pdwSpaceLeft) -= sizeof(PVOID); } else { (*pdwSize) += LWBUF_ALIGN_SIZE(dwBlobSize); } /* include size of the pointer */ (*pdwOffset) += sizeof(PVOID); (*pdwSize) += sizeof(PVOID); LWBUF_ALLOC_DWORD(pBuffer, pIn->count); cleanup: if (ntStatus == STATUS_SUCCESS && dwError != ERROR_SUCCESS) { ntStatus = LwWin32ErrorToNtStatus(dwError); } return ntStatus; error: goto cleanup; }