DWORD DNSUpdateCreateUpdateRequest( PDNS_UPDATE_REQUEST * ppDNSRequest ) { DWORD dwError = 0; PDNS_UPDATE_REQUEST pDNSRequest = NULL; dwError = DNSAllocateMemory( sizeof(DNS_UPDATE_REQUEST), (PVOID *)&pDNSRequest); BAIL_ON_LWDNS_ERROR(dwError); dwError = DNSGenerateIdentifier(&pDNSRequest->wIdentification); BAIL_ON_LWDNS_ERROR(dwError); pDNSRequest->wParameter = 0x2800; *ppDNSRequest = pDNSRequest; cleanup: return dwError; error: if (pDNSRequest){ DNSUpdateFreeRequest(pDNSRequest); } *ppDNSRequest = NULL; goto cleanup; }
DWORD DNSSendSecureUpdate( HANDLE hDNSServer, PCtxtHandle pGSSContext, PCSTR pszKeyName, PCSTR pszZoneName, PCSTR pszHostnameFQDN, DWORD dwNumAddrs, PSOCKADDR_IN pAddrArray, PDNS_UPDATE_RESPONSE * ppDNSUpdateResponse ) { DWORD dwError = 0; PDNS_UPDATE_REQUEST pDNSUpdateRequest = NULL; PDNS_UPDATE_RESPONSE pDNSUpdateResponse = NULL; LWDNS_LOG_INFO("Attempting DNS Update (secure)"); dwError = DNSUpdateCreateARUpdateRequest( &pDNSUpdateRequest, pszZoneName, pszHostnameFQDN, dwNumAddrs, pAddrArray); BAIL_ON_LWDNS_ERROR(dwError); // // Now Sign the Record // dwError = DNSUpdateGenerateSignature( pGSSContext, pDNSUpdateRequest, pszKeyName); BAIL_ON_LWDNS_ERROR(dwError); dwError = DNSUpdateSendUpdateRequest2( hDNSServer, pDNSUpdateRequest); BAIL_ON_LWDNS_ERROR(dwError); dwError = DNSUpdateReceiveUpdateResponse( hDNSServer, &pDNSUpdateResponse); BAIL_ON_LWDNS_ERROR(dwError); *ppDNSUpdateResponse = pDNSUpdateResponse; LWDNS_LOG_INFO("DNS Update (secure) succeeded"); cleanup: if (pDNSUpdateRequest) { DNSUpdateFreeRequest(pDNSUpdateRequest); } return(dwError); error: if (pDNSUpdateResponse) { DNSUpdateFreeResponse(pDNSUpdateResponse); } *ppDNSUpdateResponse = NULL; LWDNS_LOG_ERROR("DNS Update (secure) failed. [Error code:%d]", dwError); goto cleanup; }
DWORD DNSSendUpdate( HANDLE hDNSServer, PCSTR pszZoneName, PCSTR pszHostnameFQDN, DWORD dwNumAddrs, PSOCKADDR_IN pAddrArray, PDNS_UPDATE_RESPONSE * ppDNSUpdateResponse ) { DWORD dwError = 0; PDNS_UPDATE_REQUEST pDNSUpdateRequest = NULL; PDNS_UPDATE_RESPONSE pDNSUpdateResponse = NULL; PDNS_ZONE_RECORD pDNSZoneRecord = NULL; PDNS_RR_RECORD pDNSARecord = NULL; dwError = DNSUpdateCreateARUpdateRequest( &pDNSUpdateRequest, pszZoneName, pszHostnameFQDN, dwNumAddrs, pAddrArray); BAIL_ON_LWDNS_ERROR(dwError); dwError = DNSUpdateSendUpdateRequest2( hDNSServer, pDNSUpdateRequest); BAIL_ON_LWDNS_ERROR(dwError); dwError = DNSUpdateReceiveUpdateResponse( hDNSServer, &pDNSUpdateResponse); BAIL_ON_LWDNS_ERROR(dwError); *ppDNSUpdateResponse = pDNSUpdateResponse; cleanup: if (pDNSZoneRecord) { DNSFreeZoneRecord(pDNSZoneRecord); } if (pDNSARecord) { DNSFreeRecord(pDNSARecord); } if (pDNSUpdateRequest) { DNSUpdateFreeRequest(pDNSUpdateRequest); } return(dwError); error: *ppDNSUpdateResponse = NULL; if (pDNSUpdateResponse) { DNSUpdateFreeResponse(pDNSUpdateResponse); } LWDNS_LOG_ERROR("DNS Update (in-secure) failed. [Error code:%d]", dwError); goto cleanup; }
DWORD DNSUpdateCreateARUpdateRequest( PDNS_UPDATE_REQUEST* ppDNSUpdateRequest, PCSTR pszZoneName, PCSTR pszHostnameFQDN, DWORD dwNumAddrs, PSOCKADDR_IN pAddrArray ) { DWORD dwError = 0; PDNS_UPDATE_REQUEST pDNSUpdateRequest = NULL; PDNS_ZONE_RECORD pDNSZoneRecord = NULL; PDNS_RR_RECORD pDNSPRRecord = NULL; PDNS_RR_RECORD pDNSARecord = NULL; DWORD iAddr = 0; // Allocate pDNSUpdateRequest and fill in wIdentification and wParameter dwError = DNSUpdateCreateUpdateRequest( &pDNSUpdateRequest); BAIL_ON_LWDNS_ERROR(dwError); dwError = DNSCreateZoneRecord( pszZoneName, &pDNSZoneRecord); BAIL_ON_LWDNS_ERROR(dwError); dwError = DNSUpdateAddZoneSection( pDNSUpdateRequest, pDNSZoneRecord); BAIL_ON_LWDNS_ERROR(dwError); pDNSZoneRecord = NULL; // Creates a prerequisite saying that the fqdn does not already exist as a // CNAME. The prequisite will pass if the record exists as another type // (such as an A record). // This prerequisite stops the tool from replacing a CNAME with an A // record. dwError = DNSCreateNameNotInUseRecord( pszHostnameFQDN, &pDNSPRRecord); BAIL_ON_LWDNS_ERROR(dwError); dwError = DNSUpdateAddPRSection( pDNSUpdateRequest, pDNSPRRecord); BAIL_ON_LWDNS_ERROR(dwError); pDNSPRRecord = NULL; // Delete all A records associated with the fqdn. // This deletes IP addresses that do not belong to the computer. dwError = DNSCreateDeleteRecord( pszHostnameFQDN, DNS_CLASS_ANY, QTYPE_A, &pDNSARecord); BAIL_ON_LWDNS_ERROR(dwError); dwError = DNSUpdateAddUpdateSection( pDNSUpdateRequest, pDNSARecord); BAIL_ON_LWDNS_ERROR(dwError); pDNSARecord = NULL; // Add an A record for every IP address that belongs to the computer. If // the delete operation above deleted IP addresses that actually belong to // the computer, this will recreate them. for (; iAddr < dwNumAddrs; iAddr++) { PSOCKADDR_IN pSockAddr = NULL; PCSTR pszAddress = NULL; pSockAddr = &pAddrArray[iAddr]; pszAddress = inet_ntoa(pSockAddr->sin_addr); LWDNS_LOG_INFO("Adding IP Address [%s] to DNS Update request", pszAddress); dwError = DNSCreateARecord( pszHostnameFQDN, DNS_CLASS_IN, QTYPE_A, htonl(pSockAddr->sin_addr.s_addr), &pDNSARecord); BAIL_ON_LWDNS_ERROR(dwError); dwError = DNSUpdateAddUpdateSection( pDNSUpdateRequest, pDNSARecord); BAIL_ON_LWDNS_ERROR(dwError); pDNSARecord = NULL; } *ppDNSUpdateRequest = pDNSUpdateRequest; cleanup: if (pDNSZoneRecord) { DNSFreeZoneRecord(pDNSZoneRecord); } if (pDNSARecord) { DNSFreeRecord(pDNSARecord); } if (pDNSPRRecord) { DNSFreeRecord(pDNSPRRecord); } return(dwError); error: *ppDNSUpdateRequest = NULL; if (pDNSUpdateRequest) { DNSUpdateFreeRequest(pDNSUpdateRequest); } goto cleanup; }
DWORD DNSUpdateCreatePtrRUpdateRequest( PDNS_UPDATE_REQUEST* ppDNSUpdateRequest, PCSTR pszZoneName, PCSTR pszPtrName, PCSTR pszHostnameFQDN ) { DWORD dwError = 0; PDNS_UPDATE_REQUEST pDNSUpdateRequest = NULL; PDNS_ZONE_RECORD pDNSZoneRecord = NULL; PDNS_RR_RECORD pDNSPtrRecord = NULL; // Allocate pDNSUpdateRequest and fill in wIdentification and wParameter dwError = DNSUpdateCreateUpdateRequest( &pDNSUpdateRequest); BAIL_ON_LWDNS_ERROR(dwError); dwError = DNSCreateZoneRecord( pszZoneName, &pDNSZoneRecord); BAIL_ON_LWDNS_ERROR(dwError); dwError = DNSUpdateAddZoneSection( pDNSUpdateRequest, pDNSZoneRecord); BAIL_ON_LWDNS_ERROR(dwError); pDNSZoneRecord = NULL; // Delete all PTR records associated with the fqdn. // This deletes hostnames that do not belong to the computer. dwError = DNSCreateDeleteRecord( pszPtrName, DNS_CLASS_ANY, QTYPE_PTR, &pDNSPtrRecord); BAIL_ON_LWDNS_ERROR(dwError); dwError = DNSUpdateAddUpdateSection( pDNSUpdateRequest, pDNSPtrRecord); BAIL_ON_LWDNS_ERROR(dwError); pDNSPtrRecord = NULL; dwError = DNSCreatePtrRecord( pszPtrName, DNS_CLASS_IN, pszHostnameFQDN, &pDNSPtrRecord); BAIL_ON_LWDNS_ERROR(dwError); dwError = DNSUpdateAddUpdateSection( pDNSUpdateRequest, pDNSPtrRecord); BAIL_ON_LWDNS_ERROR(dwError); pDNSPtrRecord = NULL; *ppDNSUpdateRequest = pDNSUpdateRequest; cleanup: if (pDNSZoneRecord) { DNSFreeZoneRecord(pDNSZoneRecord); } if (pDNSPtrRecord) { DNSFreeRecord(pDNSPtrRecord); } return(dwError); error: *ppDNSUpdateRequest = NULL; if (pDNSUpdateRequest) { DNSUpdateFreeRequest(pDNSUpdateRequest); } goto cleanup; }
DWORD DNSSendPtrUpdate( HANDLE hDNSServer, PCSTR pszZoneName, PCSTR pszPtrName, PCSTR pszHostNameFQDN, PDNS_UPDATE_RESPONSE * ppDNSUpdateResponse ) { DWORD dwError = 0; PDNS_UPDATE_REQUEST pDNSUpdateRequest = NULL; PDNS_UPDATE_RESPONSE pDNSUpdateResponse = NULL; PDNS_ZONE_RECORD pDNSZoneRecord = NULL; PDNS_RR_RECORD pDNSARecord = NULL; LWDNS_LOG_INFO("Attempting DNS Update (in-secure)"); dwError = DNSUpdateCreatePtrRUpdateRequest( &pDNSUpdateRequest, pszZoneName, pszPtrName, pszHostNameFQDN); BAIL_ON_LWDNS_ERROR(dwError); dwError = DNSUpdateSendUpdateRequest2( hDNSServer, pDNSUpdateRequest); BAIL_ON_LWDNS_ERROR(dwError); dwError = DNSUpdateReceiveUpdateResponse( hDNSServer, &pDNSUpdateResponse); BAIL_ON_LWDNS_ERROR(dwError); *ppDNSUpdateResponse = pDNSUpdateResponse; LWDNS_LOG_INFO("DNS Update (in-secure) succeeded"); cleanup: if (pDNSZoneRecord) { DNSFreeZoneRecord(pDNSZoneRecord); } if (pDNSARecord) { DNSFreeRecord(pDNSARecord); } if (pDNSUpdateRequest) { DNSUpdateFreeRequest(pDNSUpdateRequest); } return(dwError); error: *ppDNSUpdateResponse = NULL; if (pDNSUpdateResponse) { DNSUpdateFreeResponse(pDNSUpdateResponse); } LWDNS_LOG_ERROR("DNS Update (in-secure) failed. [Error code:%d]", dwError); goto cleanup; }