DWORD VmDnsDeserializeDnsPtrRecord( PVMDNS_MESSAGE_BUFFER pVmDnsBuffer, PVMDNS_RECORD_DATA pData ) { DWORD dwError = 0; UINT16 dwRDataLength = 0; UINT16 uReceivedRDataLength = 0; if (!pVmDnsBuffer || !pData) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_VMDNS_ERROR(dwError); } dwError = VmDnsReadUINT16FromBuffer( pVmDnsBuffer, &dwRDataLength ); BAIL_ON_VMDNS_ERROR(dwError); if (!dwRDataLength) { dwError = ERROR_EMPTY; BAIL_ON_VMDNS_ERROR(dwError); } dwError = VmDnsReadDomainNameFromBuffer( pVmDnsBuffer, &pData->NS.pNameHost ); BAIL_ON_VMDNS_ERROR(dwError); dwError = VmDnsPtrRecordGetRDataLength( *pData, &uReceivedRDataLength, pVmDnsBuffer->bTokenizeDomainName ); BAIL_ON_VMDNS_ERROR(dwError); if (dwRDataLength != uReceivedRDataLength) { dwError = ERROR_INVALID_USER_BUFFER; BAIL_ON_VMDNS_ERROR(dwError); } cleanup: return dwError; error: goto cleanup; }
DWORD VmDnsReadRecordFromBuffer( PVMDNS_MESSAGE_BUFFER pVmDnsBuffer, PVMDNS_RECORD *ppDnsRecord ) { DWORD dwError = 0; PVMDNS_RECORD pDnsRecord = NULL; DWORD dwIndex = 0; if (!pVmDnsBuffer || !ppDnsRecord) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_VMDNS_ERROR(dwError); } dwError = VmDnsAllocateMemory( sizeof(VMDNS_RECORD), (PVOID *)&pDnsRecord ); BAIL_ON_VMDNS_ERROR(dwError); dwError = VmDnsReadDomainNameFromBuffer( pVmDnsBuffer, &pDnsRecord->pszName ); BAIL_ON_VMDNS_ERROR(dwError); dwError = VmDnsReadUINT16FromBuffer( pVmDnsBuffer, &pDnsRecord->dwType ); BAIL_ON_VMDNS_ERROR(dwError); dwError = VmDnsReadUINT16FromBuffer( pVmDnsBuffer, &pDnsRecord->iClass ); BAIL_ON_VMDNS_ERROR(dwError); dwError = VmDnsReadUINT32FromBuffer( pVmDnsBuffer, &pDnsRecord->dwTtl ); BAIL_ON_VMDNS_ERROR(dwError); for (; dwIndex < gRecordMethodMapSize; ++dwIndex) { if (pDnsRecord->dwType == gRecordMethods[dwIndex].type) { dwError = gRecordMethods[dwIndex].pfnDeSerialize( pVmDnsBuffer, &pDnsRecord->Data ); BAIL_ON_VMDNS_ERROR(dwError); } } *ppDnsRecord = pDnsRecord; cleanup: return dwError; error: if (ppDnsRecord) { *ppDnsRecord = NULL; } VMDNS_FREE_RECORD(pDnsRecord); goto cleanup; }
DWORD VmDnsDeserializeDnsSrvRecord( PVMDNS_MESSAGE_BUFFER pVmDnsBuffer, PVMDNS_RECORD_DATA pData ) { DWORD dwError = 0; UINT16 dwRDataLength = 0; UINT16 uReceivedRDataLength = 0; if (!pVmDnsBuffer || !pData ) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_VMDNS_ERROR(dwError); } dwError = VmDnsReadUINT16FromBuffer( pVmDnsBuffer, &dwRDataLength ); BAIL_ON_VMDNS_ERROR(dwError); if (!dwRDataLength) { dwError = ERROR_EMPTY; BAIL_ON_VMDNS_ERROR(dwError); } dwError = VmDnsReadUINT16FromBuffer( pVmDnsBuffer, &pData->SRV.wPriority ); BAIL_ON_VMDNS_ERROR(dwError); dwError = VmDnsReadUINT16FromBuffer( pVmDnsBuffer, &pData->SRV.wWeight ); BAIL_ON_VMDNS_ERROR(dwError); dwError = VmDnsReadUINT16FromBuffer( pVmDnsBuffer, &pData->SRV.wPort ); BAIL_ON_VMDNS_ERROR(dwError); dwError = VmDnsReadDomainNameFromBuffer( pVmDnsBuffer, &pData->SRV.pNameTarget ); BAIL_ON_VMDNS_ERROR(dwError); dwError = VmDnsSrvGetRDataLength( *pData, &uReceivedRDataLength, pVmDnsBuffer->bTokenizeDomainName ); BAIL_ON_VMDNS_ERROR(dwError); cleanup: return dwError; error: goto cleanup; }