static uint16_t DNSCreateIPv4QueryDN(const LLADP * pLLAdp, const uint8_t * pBase, const uint8_t * pName, const uint8_t * pEnd, DNSDG * pDNSDG) { return(DNSCreateIPv4Query(pLLAdp, DNSCopyDomainName(pBase, pName, pEnd, pDNSDG->rrRecords, sizeof(pLLAdp->pDNSMem->rgbDNSData)), pDNSDG)); }
DWORD DNSBuildMessageBuffer( PDNS_UPDATE_REQUEST pDNSUpdateRequest, PCSTR pszKeyName, DWORD * pdwTimeSigned, WORD * pwFudge, PBYTE * ppMessageBuffer, PDWORD pdwMessageSize ) { DWORD dwError = 0; PBYTE pSrcBuffer = NULL; DWORD dwReqMsgSize = 0; DWORD dwAlgorithmLen = 0; DWORD dwNameLen = 0; PBYTE pMessageBuffer = NULL; DWORD dwMessageSize = 0; PBYTE pOffset = NULL; WORD wnError, wError = 0; WORD wnFudge = 0; WORD wFudge = DNS_ONE_HOUR_IN_SECS; WORD wnOtherLen = 0, wOtherLen = 0; DWORD dwBytesCopied = 0; WORD wnClass = 0, wClass = DNS_CLASS_ANY; DWORD dwnTTL = 0, dwTTL = 0; DWORD dwnTimeSigned, dwTimeSigned = 0; HANDLE hSendBuffer = (HANDLE)NULL; PDNS_DOMAIN_NAME pDomainName = NULL; PDNS_DOMAIN_NAME pAlgorithmName = NULL; //PBYTE pOtherLen = NULL; WORD wTimePrefix = 0; WORD wnTimePrefix = 0; dwError = DNSDomainNameFromString(pszKeyName, &pDomainName); BAIL_ON_LWDNS_ERROR(dwError); dwError = DNSGetDomainNameLength(pDomainName, &dwNameLen); BAIL_ON_LWDNS_ERROR(dwError); dwError = DNSDomainNameFromString(DNS_GSS_ALGORITHM, &pAlgorithmName); BAIL_ON_LWDNS_ERROR(dwError); dwError = DNSGetDomainNameLength(pAlgorithmName, &dwAlgorithmLen); BAIL_ON_LWDNS_ERROR(dwError); dwError = DNSUpdateBuildRequestMessage( pDNSUpdateRequest, &hSendBuffer); BAIL_ON_LWDNS_ERROR(dwError); dwReqMsgSize = DNSGetSendBufferContextSize(hSendBuffer); dwMessageSize += dwReqMsgSize; dwMessageSize += dwNameLen; dwMessageSize += sizeof(WORD); //CLASS dwMessageSize += sizeof(DWORD); //TTL dwMessageSize += dwAlgorithmLen; dwMessageSize += (sizeof(WORD) + sizeof(DWORD)); //Time Signed dwMessageSize += sizeof(WORD); //Fudge dwMessageSize += sizeof(WORD); //wError dwMessageSize += sizeof(WORD); //Other Len dwMessageSize += wOtherLen; dwError = DNSAllocateMemory( dwMessageSize, (PVOID *)&pMessageBuffer); BAIL_ON_LWDNS_ERROR(dwError); pOffset = pMessageBuffer; pSrcBuffer = DNSGetSendBufferContextBuffer(hSendBuffer); memcpy(pOffset, pSrcBuffer, dwReqMsgSize); pOffset += dwReqMsgSize; dwError = DNSCopyDomainName(pOffset, pDomainName, &dwBytesCopied); BAIL_ON_LWDNS_ERROR(dwError); pOffset += dwBytesCopied; wnClass = htons(wClass); memcpy(pOffset, &wnClass, sizeof(WORD)); pOffset += sizeof(WORD); dwnTTL = htonl(dwTTL); memcpy(pOffset, &dwnTTL, sizeof(DWORD)); pOffset += sizeof(DWORD); dwError = DNSCopyDomainName(pOffset, pAlgorithmName, &dwBytesCopied); BAIL_ON_LWDNS_ERROR(dwError); pOffset += dwBytesCopied; wnTimePrefix = htons(wTimePrefix); memcpy(pOffset, &wnTimePrefix, sizeof(WORD)); pOffset += sizeof(WORD); time((time_t*)&dwTimeSigned); dwnTimeSigned = htonl(dwTimeSigned); memcpy(pOffset, &dwnTimeSigned, sizeof(DWORD)); pOffset += sizeof(DWORD); wnFudge = htons(wFudge); memcpy(pOffset, &wnFudge, sizeof(WORD)); pOffset += sizeof(WORD); wnError = htons(wError); memcpy(pOffset, &wnError, sizeof(WORD)); pOffset += sizeof(WORD); wnOtherLen = htons(wOtherLen); memcpy(pOffset, &wnOtherLen, sizeof(WORD)); pOffset += sizeof(WORD); *ppMessageBuffer = pMessageBuffer; *pdwMessageSize = dwMessageSize; *pdwTimeSigned = dwTimeSigned; *pwFudge = wFudge; cleanup: if (pAlgorithmName) { DNSFreeDomainName(pAlgorithmName); } if (pDomainName) { DNSFreeDomainName(pDomainName); } if (hSendBuffer != (HANDLE)NULL) { DNSFreeSendBufferContext(hSendBuffer); } return(dwError); error: if (pMessageBuffer) { DNSFreeMemory(pMessageBuffer); } *ppMessageBuffer = NULL; *pdwMessageSize = 0; *pdwTimeSigned = dwTimeSigned; *pwFudge = wFudge; goto cleanup; }