DWORD VmDnsDeserializeDnsRecord( PBYTE pBytes, DWORD dwSize, PVMDNS_RECORD *ppDnsRecord, BOOL bTokenizeDomainName ) { DWORD dwError = 0; PVMDNS_RECORD pDnsRecord = NULL; PVMDNS_MESSAGE_BUFFER pVmDnsBuffer = NULL; if (!pBytes || !dwSize || !ppDnsRecord) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_VMDNS_ERROR(dwError); } dwError = VmDnsAllocateBufferStreamWithBuffer( pBytes, dwSize, 0, FALSE, &pVmDnsBuffer ); BAIL_ON_VMDNS_ERROR(dwError); pVmDnsBuffer->bTokenizeDomainName = bTokenizeDomainName; dwError = VmDnsReadRecordFromBuffer( pVmDnsBuffer, &pDnsRecord ); BAIL_ON_VMDNS_ERROR(dwError); *ppDnsRecord = pDnsRecord; cleanup: if (pVmDnsBuffer) { VmDnsFreeBufferStream(pVmDnsBuffer); } return dwError; error: if (ppDnsRecord) { *ppDnsRecord = NULL; } VMDNS_FREE_RECORD(pDnsRecord); goto cleanup; }
static DWORD VmDnsPeekResponseCode( DWORD dwResponseSize, PBYTE pResponseBytes, PDWORD pdwResponseCode ) { DWORD dwError = ERROR_SUCCESS; PVMDNS_HEADER pDnsHeader = NULL; PVMDNS_MESSAGE_BUFFER pDnsMessageBuffer = NULL; if (!pdwResponseCode) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_VMDNS_ERROR(dwError); } dwError = VmDnsGetDnsMessageBuffer( pResponseBytes, dwResponseSize, &pDnsMessageBuffer ); BAIL_ON_VMDNS_ERROR(dwError); dwError = VmDnsReadDnsHeaderFromBuffer( pDnsMessageBuffer, &pDnsHeader ); BAIL_ON_VMDNS_ERROR(dwError); *pdwResponseCode = pDnsHeader->codes.RCODE; cleanup: if (pDnsMessageBuffer) { VmDnsFreeBufferStream(pDnsMessageBuffer); } VMDNS_SAFE_FREE_MEMORY(pDnsHeader); return dwError; error : goto cleanup; }
DWORD VmDnsSerializeDnsRecord( PVMDNS_RECORD pDnsRecord, PBYTE* ppBytes, DWORD* pdwSize, BOOL bTokenizeDomainName ) { DWORD dwError = 0; PVMDNS_MESSAGE_BUFFER pVmDnsBuffer = NULL; PBYTE pBytes = NULL; DWORD dwSize = 0; if (!pDnsRecord || !ppBytes || !pdwSize ) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_VMDNS_ERROR (dwError); } dwError = VmDnsAllocateBufferStream( 0, &pVmDnsBuffer ); BAIL_ON_VMDNS_ERROR(dwError); pVmDnsBuffer->bTokenizeDomainName = bTokenizeDomainName; dwError = VmDnsWriteRecordToBuffer( pDnsRecord, pVmDnsBuffer ); BAIL_ON_VMDNS_ERROR(dwError); dwError = VmDnsCopyBufferFromBufferStream( pVmDnsBuffer, NULL, &dwSize ); BAIL_ON_VMDNS_ERROR(dwError); dwError = VmDnsAllocateMemory( dwSize, (PVOID *)&pBytes ); BAIL_ON_VMDNS_ERROR(dwError); dwError = VmDnsCopyBufferFromBufferStream( pVmDnsBuffer, pBytes, &dwSize ); BAIL_ON_VMDNS_ERROR(dwError); *ppBytes = pBytes; *pdwSize = dwSize; cleanup: if (pVmDnsBuffer) { VmDnsFreeBufferStream(pVmDnsBuffer); } return dwError; error: if (ppBytes) { *ppBytes = NULL; } if (pdwSize) { *pdwSize = 0; } VMDNS_SAFE_FREE_MEMORY(pBytes); goto cleanup; }