/*++ Copyright (c) 1997 Microsoft Corporation Module Name: remote.c Abstract: Domain Name System (DNS) Server -- Admin Client API Remote API that are not direct calls to RPC stubs. Author: Jim Gilroy (jamesg) April 1997 Environment: User Mode - Win32 Revision History: --*/ #include "dnsclip.h" // // Error indicating talking to old server // #define DNS_ERROR_NT4 RPC_S_UNKNOWN_IF // // Macro to set up RPC structure header fields. // // Sample: // DNS_RPC_FORWARDERS forwarders; // INITIALIZE_RPC_STRUCT( FORWARDERS, forwarders ); // #define INITIALIZE_RPC_STRUCT( rpcStructType, rpcStruct ) \ * ( DWORD * ) &( rpcStruct ) = \ DNS_RPC_## rpcStructType ##_VER; \ * ( ( ( DWORD * ) &( rpcStruct ) ) + 1 ) = 0; // // General Server\Zone, Query\Operation for DWORD properties // DNS_STATUS DNS_API_FUNCTION DnssrvQueryDwordPropertyEx( IN DWORD dwClientVersion, IN DWORD dwSettingFlags, IN LPCWSTR Server, IN LPCSTR pszZone, IN LPCSTR pszProperty, OUT PDWORD pdwResult ) { DNS_STATUS status; DWORD typeId; DNSDBG( STUB, ( "Enter DnssrvQueryDwordProperty()\n" "\tClient ver = 0x%X\n" "\tServer = %s\n" "\tZoneName = %s\n" "\tProperty = %s\n" "\tpResult = %p\n", dwClientVersion, Server, pszZone, pszProperty, pdwResult )); status = DnssrvComplexOperationEx( dwClientVersion, dwSettingFlags, Server, pszZone, DNSSRV_QUERY_DWORD_PROPERTY, DNSSRV_TYPEID_LPSTR, // property name as string (LPSTR) pszProperty, & typeId, // DWORD property value back out (PVOID *) pdwResult ); DNSDBG( STUB, ( "Leave DnssrvQueryDwordProperty(): status %d (%p)\n" "\tServer = %s\n" "\tZoneName = %s\n" "\tProperty = %s\n" "\tTypeId = %d\n" "\tResult = %d (%p)\n", status, status, Server, pszZone, pszProperty, typeId, *pdwResult, *pdwResult )); ASSERT( (status == ERROR_SUCCESS && typeId == DNSSRV_TYPEID_DWORD) || (status != ERROR_SUCCESS && *pdwResult == 0 ) ); return( status ); } DNS_STATUS DNS_API_FUNCTION DnssrvResetDwordPropertyEx( IN DWORD dwClientVersion, IN DWORD dwSettingFlags, IN LPCWSTR Server, IN LPCSTR pszZone, IN DWORD dwContext, IN LPCSTR pszProperty, IN DWORD dwPropertyValue ) { DNS_STATUS status; DNS_RPC_NAME_AND_PARAM param; param.dwParam = dwPropertyValue; param.pszNodeName = (LPSTR) pszProperty; DNSDBG( STUB, ( "Enter DnssrvResetDwordPropertyEx()\n" "\tClient ver = 0x%X\n" "\tServer = %S\n" "\tZoneName = %s\n" "\tContext = %p\n" "\tPropertyName = %s\n" "\tPropertyValue = %d (%p)\n", dwClientVersion, Server, pszZone, dwContext, pszProperty, dwPropertyValue, dwPropertyValue )); status = DnssrvOperationEx( dwClientVersion, dwSettingFlags, Server, pszZone, dwContext, DNSSRV_OP_RESET_DWORD_PROPERTY, DNSSRV_TYPEID_NAME_AND_PARAM, ¶m ); DNSDBG( STUB, ( "Leaving DnssrvResetDwordPropertyEx(): status = %d (%p)\n", status, status )); return( status ); } DNS_STATUS DNS_API_FUNCTION DnssrvResetStringPropertyEx( IN DWORD dwClientVersion, IN DWORD dwSettingFlags, IN LPCWSTR pwszServerName, IN LPCSTR pszZone, IN DWORD dwContext, IN LPCSTR pszProperty, IN LPCWSTR pswzPropertyValue, IN DWORD dwFlags ) /*++ Routine Description: Set a string property on the server. The property value is unicode. Arguments: Server - server name pszZone - pointer to zone dwContext - context pszProperty - name of property to set pswzPropertyValue - unicode property value dwFlags - flags, may be combination of: DNSSRV_OP_PARAM_APPLY_ALL_ZONES Return Value: None --*/ { DNS_STATUS status; DNSDBG( STUB, ( "Enter DnssrvResetStringPropertyEx()\n" "\tClient ver = 0x%X\n" "\tServer = %S\n" "\tZoneName = %s\n" "\tContext = %p\n" "\tPropertyName = %s\n" "\tPropertyValue = %S\n", dwClientVersion, pwszServerName, pszZone, dwContext, pszProperty, pswzPropertyValue )); status = DnssrvOperationEx( dwClientVersion, dwSettingFlags, pwszServerName, pszZone, dwContext, pszProperty, DNSSRV_TYPEID_LPWSTR, ( PVOID ) pswzPropertyValue ); DNSDBG( STUB, ( "Leaving DnssrvResetDwordPropertyEx(): status = %d (%p)\n", status, status )); return status; } DNS_STATUS DNS_API_FUNCTION DnssrvResetIPListPropertyEx( IN DWORD dwClientVersion, IN DWORD dwSettingFlags, IN LPCWSTR pwszServerName, IN LPCSTR pszZone, IN DWORD dwContext, IN LPCSTR pszProperty, IN PIP_ARRAY pipArray, IN DWORD dwFlags ) /*++ Routine Description: Set an IP list property on the server. Arguments: Server - server name pszZone - pointer to zone dwContext - context pszProperty - name of property to set pipArray - new IP array property value dwFlags - flags, may be combination of: DNSSRV_OP_PARAM_APPLY_ALL_ZONES Return Value: None --*/ { DNS_STATUS status; DNSDBG( STUB, ( "Enter DnssrvResetIPListPropertyEx()\n" "\tClient ver = 0x%X\n" "\tServer = %S\n" "\tZoneName = %s\n" "\tContext = %p\n" "\tPropertyName = %s\n" "\tpipArray = %p\n", dwClientVersion, pwszServerName, pszZone, dwContext, pszProperty, pipArray )); DnsDbg_IpArray( "DnssrvResetIPListPropertyEx\n", NULL, pipArray ); status = DnssrvOperationEx( dwClientVersion, dwSettingFlags, pwszServerName, pszZone, dwContext, pszProperty, DNSSRV_TYPEID_IPARRAY, ( pipArray && pipArray->AddrCount ) ? pipArray : NULL ); DNSDBG( STUB, ( "Leaving DnssrvResetIPListPropertyEx(): status = %d (%p)\n", status, status )); return status; } // DnssrvResetIPListPropertyEx // // Server Queries // DNS_STATUS DNS_API_FUNCTION DnssrvGetServerInfo( IN LPCWSTR Server, OUT PDNS_RPC_SERVER_INFO * ppServerInfo ) { DNS_STATUS status; DWORD typeId; status = DnssrvQuery( Server, NULL, DNSSRV_QUERY_SERVER_INFO, &typeId, ppServerInfo ); ASSERT( (status == ERROR_SUCCESS && typeId == DNSSRV_TYPEID_SERVER_INFO) || (status != ERROR_SUCCESS && *ppServerInfo == NULL ) ); return( status ); } DNS_STATUS DNS_API_FUNCTION DnssrvQueryZoneDwordProperty( IN LPCWSTR Server, IN LPCSTR pszZoneName, IN LPCSTR pszProperty, OUT PDWORD pdwResult ) { DNS_STATUS status; DWORD typeId; IF_DNSDBG( STUB ) { DNS_PRINT(( "Enter DnssrvQueryDwordProperty()\n" "\tServer = %s\n" "\tpszProperty = %s\n" "\tpResult = %p\n", Server, pszZoneName, pszProperty, pdwResult )); } status = DnssrvQuery( Server, pszZoneName, pszProperty, & typeId, (PVOID *) pdwResult ); IF_DNSDBG( STUB ) { DNS_PRINT(( "Leave DnssrvQueryZoneDwordProperty(): status %d (%p)\n" "\tServer = %s\n" "\tpszProperty = %s\n" "\tTypeId = %d\n" "\tResult = %d (%p)\n", status, status, Server, pszProperty, typeId, *pdwResult, *pdwResult )); ASSERT( (status == ERROR_SUCCESS && typeId == DNSSRV_TYPEID_DWORD) || (status != ERROR_SUCCESS && *pdwResult == 0 ) ); } return( status ); } // // Server Operations // DNS_STATUS DNS_API_FUNCTION DnssrvResetServerDwordProperty( IN LPCWSTR Server, IN LPCSTR pszProperty, IN DWORD dwPropertyValue ) { DNS_STATUS status; DNSDBG( STUB, ( "Enter DnssrvResetServerDwordProperty()\n" "\tServer = %s\n" "\tpszPropertyName = %s\n" "\tdwPropertyValue = %p\n", Server, pszProperty, dwPropertyValue )); status = DnssrvOperation( Server, NULL, pszProperty, DNSSRV_TYPEID_DWORD, (PVOID) (DWORD_PTR) dwPropertyValue ); DNSDBG( STUB, ( "Leaving DnssrvResetServerDwordProperty: status = %d (%p)\n", status, status )); return( status ); } DNS_STATUS DNS_API_FUNCTION DnssrvCreateZoneEx( IN LPCWSTR Server, IN LPCSTR pszZoneName, IN DWORD dwZoneType, IN DWORD fAllowUpdate, IN DWORD dwCreateFlags, IN LPCSTR pszAdminEmailName, IN DWORD cMasters, IN PIP_ADDRESS aipMasters, IN BOOL bDsIntegrated, IN LPCSTR pszDataFile, IN DWORD dwTimeout, // for forwarder zones IN DWORD fSlave, // for forwarder zones IN DWORD dwDpFlags, // for directory partition IN LPCSTR pszDpFqdn // for directory partition ) { DNS_STATUS status; DNS_RPC_ZONE_CREATE_INFO zoneInfo; PIP_ARRAY arrayIp = NULL; RtlZeroMemory( &zoneInfo, sizeof( DNS_RPC_ZONE_CREATE_INFO ) ); INITIALIZE_RPC_STRUCT( ZONE_CREATE_INFO, zoneInfo ); if ( cMasters && aipMasters ) { arrayIp = Dns_BuildIpArray( cMasters, aipMasters ); if ( !arrayIp && cMasters ) { return( DNS_ERROR_NO_MEMORY ); } } zoneInfo.pszZoneName = (LPSTR) pszZoneName; zoneInfo.dwZoneType = dwZoneType; zoneInfo.fAllowUpdate = fAllowUpdate; zoneInfo.fAging = 0; zoneInfo.dwFlags = dwCreateFlags; zoneInfo.fDsIntegrated = (DWORD) bDsIntegrated; // temp backward compat zoneInfo.fLoadExisting = !!(dwCreateFlags & DNS_ZONE_LOAD_EXISTING); // JJW WTF??? zoneInfo.pszDataFile = (LPSTR) pszDataFile; zoneInfo.pszAdmin = (LPSTR) pszAdminEmailName; zoneInfo.aipMasters = arrayIp; zoneInfo.dwTimeout = dwTimeout; zoneInfo.fSlave = fSlave; zoneInfo.dwDpFlags = dwDpFlags; zoneInfo.pszDpFqdn = ( LPSTR ) pszDpFqdn; status = DnssrvOperation( Server, NULL, // server operation DNSSRV_OP_ZONE_CREATE, DNSSRV_TYPEID_ZONE_CREATE, (PVOID) &zoneInfo ); FREE_HEAP( arrayIp ); return( status ); } DNS_STATUS DNS_API_FUNCTION DnssrvCreateZone( IN LPCWSTR Server, IN LPCSTR pszZoneName, IN DWORD dwZoneType, IN LPCSTR pszAdminEmailName, IN DWORD cMasters, IN PIP_ADDRESS aipMasters, IN DWORD fLoadExisting, IN DWORD fDsIntegrated, IN LPCSTR pszDataFile, IN DWORD dwTimeout, IN DWORD fSlave ) { DWORD flags = 0; DWORD dpFlags = 0; if ( fLoadExisting ) { flags = DNS_ZONE_LOAD_EXISTING; } return DnssrvCreateZoneEx( Server, pszZoneName, dwZoneType, 0, // update unknown, send off flags, // load flags pszAdminEmailName, cMasters, aipMasters, fDsIntegrated, pszDataFile, dwTimeout, fSlave, dpFlags, // dwDirPartFlag NULL // pszDirPartFqdn ); } DNS_STATUS DNS_API_FUNCTION DnssrvCreateZoneForDcPromo( IN LPCWSTR Server, IN LPCSTR pszZoneName, IN LPCSTR pszDataFile ) { return DnssrvCreateZoneEx( Server, pszZoneName, 1, // primary 0, // update unknown, send off DNS_ZONE_CREATE_FOR_DCPROMO, NULL, // no admin name 0, // no masters NULL, FALSE, // not DS integrated pszDataFile, 0, // timeout - for forwarder zones 0, // slave - for forwarder zones 0, // dwDirPartFlag NULL // pszDirPartFqdn ); } DNS_STATUS DNS_API_FUNCTION DnssrvCreateZoneInDirectoryPartition( IN LPCWSTR pwszServer, IN LPCSTR pszZoneName, IN DWORD dwZoneType, IN LPCSTR pszAdminEmailName, IN DWORD cMasters, IN PIP_ADDRESS aipMasters, IN DWORD fLoadExisting, IN DWORD dwTimeout, IN DWORD fSlave, IN DWORD dwDirPartFlags, IN LPCSTR pszDirPartFqdn ) { DWORD dwFlags = 0; if ( fLoadExisting ) { dwFlags = DNS_ZONE_LOAD_EXISTING; } return DnssrvCreateZoneEx( pwszServer, pszZoneName, dwZoneType, 0, // allow update dwFlags, pszAdminEmailName, 0, // masters count NULL, // masters array TRUE, // DS integrated NULL, // data file dwTimeout, // for forwarder zones fSlave, // for forwarder zones dwDirPartFlags, pszDirPartFqdn ); } DNS_STATUS DNS_API_FUNCTION DnssrvClearStatistics( IN LPCWSTR Server ) { DNS_STATUS status; status = DnssrvOperation( Server, NULL, DNSSRV_OP_CLEAR_STATISTICS, DNSSRV_TYPEID_NULL, (PVOID) NULL ); return( status ); } DNS_STATUS DNS_API_FUNCTION DnssrvResetServerListenAddresses( IN LPCWSTR Server, IN DWORD cListenAddrs, IN PIP_ADDRESS aipListenAddrs ) { DNS_STATUS status; PIP_ARRAY arrayIp; arrayIp = Dns_BuildIpArray( cListenAddrs, aipListenAddrs ); if ( !arrayIp && cListenAddrs ) { return( DNS_ERROR_NO_MEMORY ); } status = DnssrvOperation( Server, NULL, DNS_REGKEY_LISTEN_ADDRESSES, DNSSRV_TYPEID_IPARRAY, (PVOID) arrayIp ); FREE_HEAP( arrayIp ); return( status ); } DNS_STATUS DNS_API_FUNCTION DnssrvResetForwarders( IN LPCWSTR Server, IN DWORD cForwarders, IN PIP_ADDRESS aipForwarders, IN DWORD dwForwardTimeout, IN DWORD fSlave ) { DNS_STATUS status; DNS_RPC_FORWARDERS forwarders; PIP_ARRAY arrayIp; INITIALIZE_RPC_STRUCT( FORWARDERS, forwarders ); arrayIp = Dns_BuildIpArray( cForwarders, aipForwarders ); if ( !arrayIp && cForwarders ) { return( DNS_ERROR_NO_MEMORY ); } forwarders.fSlave = fSlave; forwarders.dwForwardTimeout = dwForwardTimeout; forwarders.aipForwarders = arrayIp; status = DnssrvOperation( Server, NULL, DNS_REGKEY_FORWARDERS, DNSSRV_TYPEID_FORWARDERS, (PVOID) &forwarders ); FREE_HEAP( arrayIp ); return( status ); } // // Zone Queries // DNS_STATUS DNS_API_FUNCTION DnssrvGetZoneInfo( IN LPCWSTR Server, IN LPCSTR pszZone, OUT PDNS_RPC_ZONE_INFO * ppZoneInfo ) { DNS_STATUS status; DWORD typeId; status = DnssrvQuery( Server, pszZone, DNSSRV_QUERY_ZONE_INFO, & typeId, ppZoneInfo ); ASSERT( (status == ERROR_SUCCESS && typeId == DNSSRV_TYPEID_ZONE_INFO) || (status != ERROR_SUCCESS && *ppZoneInfo == NULL ) ); return( status ); } // // Zone Operations // DNS_STATUS DNS_API_FUNCTION DnssrvResetZoneTypeEx( IN LPCWSTR Server, IN LPCSTR pszZoneName, IN DWORD dwZoneType, IN DWORD cMasters, IN PIP_ADDRESS aipMasters, IN DWORD dwLoadOptions, IN DWORD fDsIntegrated, IN LPCSTR pszDataFile ) { DNS_STATUS status; DNS_RPC_ZONE_CREATE_INFO zoneInfo; PIP_ARRAY arrayIp = NULL; RtlZeroMemory( &zoneInfo, sizeof(DNS_RPC_ZONE_CREATE_INFO) ); INITIALIZE_RPC_STRUCT( ZONE_CREATE_INFO, zoneInfo ); if ( cMasters ) { arrayIp = Dns_BuildIpArray( cMasters, aipMasters ); if ( !arrayIp ) { return( DNS_ERROR_NO_MEMORY ); } } zoneInfo.pszZoneName = (LPSTR) pszZoneName; zoneInfo.dwZoneType = dwZoneType; zoneInfo.fDsIntegrated = fDsIntegrated; zoneInfo.fLoadExisting = dwLoadOptions; zoneInfo.pszDataFile = (LPSTR) pszDataFile; zoneInfo.pszAdmin = NULL; zoneInfo.aipMasters = arrayIp; status = DnssrvOperation( Server, pszZoneName, DNSSRV_OP_ZONE_TYPE_RESET, DNSSRV_TYPEID_ZONE_CREATE, (PVOID) &zoneInfo ); FREE_HEAP( arrayIp ); return( status ); } DNS_STATUS DNS_API_FUNCTION DnssrvRenameZone( IN LPCWSTR Server, IN LPCSTR pszCurrentZoneName, IN LPCSTR pszNewZoneName, IN LPCSTR pszNewFileName ) { DNS_STATUS status; DNS_RPC_ZONE_RENAME_INFO renameInfo; RtlZeroMemory( &renameInfo, sizeof( DNS_RPC_ZONE_RENAME_INFO ) ); INITIALIZE_RPC_STRUCT( ZONE_RENAME_INFO, renameInfo ); renameInfo.pszNewZoneName = ( LPSTR ) pszNewZoneName; renameInfo.pszNewFileName = ( LPSTR ) pszNewFileName; status = DnssrvOperation( Server, pszCurrentZoneName, DNSSRV_OP_ZONE_RENAME, DNSSRV_TYPEID_ZONE_RENAME, ( PVOID ) &renameInfo ); return status; } DNS_STATUS DNS_API_FUNCTION DnssrvChangeZoneDirectoryPartition( IN LPCWSTR Server, IN LPCSTR pszZoneName, IN LPCSTR pszNewPartitionName ) { DNS_STATUS status; DNS_RPC_ZONE_CHANGE_DP rpcInfo; RtlZeroMemory( &rpcInfo, sizeof( DNS_RPC_ZONE_CHANGE_DP ) ); INITIALIZE_RPC_STRUCT( ZONE_RENAME_INFO, rpcInfo ); rpcInfo.pszDestPartition = ( LPSTR ) pszNewPartitionName; status = DnssrvOperation( Server, pszZoneName, DNSSRV_OP_ZONE_CHANGE_DP, DNSSRV_TYPEID_ZONE_CHANGE_DP, ( PVOID ) &rpcInfo ); return status; } DNS_STATUS DNS_API_FUNCTION DnssrvExportZone( IN LPCWSTR Server, IN LPCSTR pszZoneName, IN LPCSTR pszZoneExportFile ) { DNS_STATUS status; DNS_RPC_ZONE_EXPORT_INFO info; RtlZeroMemory( &info, sizeof( DNS_RPC_ZONE_EXPORT_INFO ) ); INITIALIZE_RPC_STRUCT( ZONE_EXPORT_INFO, info ); info.pszZoneExportFile = ( LPSTR ) pszZoneExportFile; status = DnssrvOperation( Server, pszZoneName, DNSSRV_OP_ZONE_EXPORT, DNSSRV_TYPEID_ZONE_EXPORT, ( PVOID ) &info ); return status; } DNS_STATUS DNS_API_FUNCTION DnssrvResetZoneMastersEx( IN LPCWSTR Server, IN LPCSTR pszZone, IN DWORD cMasters, IN PIP_ADDRESS aipMasters, IN DWORD fSetLocalMasters ) { DNS_STATUS status; PIP_ARRAY arrayIp; arrayIp = Dns_BuildIpArray( cMasters, aipMasters ); if ( !arrayIp && cMasters ) { return( DNS_ERROR_NO_MEMORY ); } status = DnssrvOperation( Server, pszZone, fSetLocalMasters ? DNS_REGKEY_ZONE_LOCAL_MASTERS : DNS_REGKEY_ZONE_MASTERS, DNSSRV_TYPEID_IPARRAY, (PVOID) arrayIp ); FREE_HEAP( arrayIp ); return( status ); } DNS_STATUS DNS_API_FUNCTION DnssrvResetZoneMasters( IN LPCWSTR Server, IN LPCSTR pszZone, IN DWORD cMasters, IN PIP_ADDRESS aipMasters ) { DNS_STATUS status; PIP_ARRAY arrayIp; arrayIp = Dns_BuildIpArray( cMasters, aipMasters ); if ( !arrayIp && cMasters ) { return( DNS_ERROR_NO_MEMORY ); } status = DnssrvOperation( Server, pszZone, DNS_REGKEY_ZONE_MASTERS, DNSSRV_TYPEID_IPARRAY, (PVOID) arrayIp ); FREE_HEAP( arrayIp ); return( status ); } DNS_STATUS DNS_API_FUNCTION DnssrvResetZoneSecondaries( IN LPCWSTR Server, IN LPCSTR pszZone, IN DWORD fSecureSecondaries, IN DWORD cSecondaries, IN PIP_ADDRESS aipSecondaries, IN DWORD fNotifyLevel, IN DWORD cNotify, IN PIP_ADDRESS aipNotify ) { DNS_STATUS status; DNS_RPC_ZONE_SECONDARIES secondaryInfo; PIP_ARRAY arrayIp; INITIALIZE_RPC_STRUCT( ZONE_SECONDARIES, secondaryInfo ); arrayIp = Dns_BuildIpArray( cSecondaries, aipSecondaries ); if ( !arrayIp && cSecondaries ) { return( DNS_ERROR_NO_MEMORY ); } secondaryInfo.fSecureSecondaries = fSecureSecondaries; secondaryInfo.aipSecondaries = arrayIp; arrayIp = Dns_BuildIpArray( cNotify, aipNotify ); if ( !arrayIp && cNotify ) { return( DNS_ERROR_NO_MEMORY ); } secondaryInfo.aipNotify = arrayIp; secondaryInfo.fNotifyLevel = fNotifyLevel; status = DnssrvOperation( Server, pszZone, DNS_REGKEY_ZONE_SECONDARIES, DNSSRV_TYPEID_ZONE_SECONDARIES, (PVOID) &secondaryInfo ); FREE_HEAP( secondaryInfo.aipNotify ); FREE_HEAP( secondaryInfo.aipSecondaries ); return( status ); } #if 0 DNS_STATUS DNS_API_FUNCTION DnssrvResetZoneScavengeServers( IN LPCWSTR Server, IN LPCSTR pszZone, IN DWORD cServers, IN PIP_ADDRESS aipServers ) { DNS_STATUS status; PIP_ARRAY arrayIp; arrayIp = Dns_BuildIpArray( cServers, aipServers ); if ( !arrayIp && cSecondaries ) { return( DNS_ERROR_NO_MEMORY ); } status = DnssrvOperation( Server, pszZone, DNS_REGKEY_ZONE_SCAVENGE_SERVERS, DNSSRV_TYPEID_IPARRAY, arrayIp ); FREE_HEAP( arrayIp ); return( status ); } #endif // // Zone management API // DNS_STATUS DNS_API_FUNCTION DnssrvIncrementZoneVersion( IN LPCWSTR Server, IN LPCSTR pszZone ) { return DnssrvOperation( Server, pszZone, DNSSRV_OP_ZONE_INCREMENT_VERSION, DNSSRV_TYPEID_NULL, (PVOID) NULL ); } DNS_STATUS DNS_API_FUNCTION DnssrvDeleteZone( IN LPCWSTR Server, IN LPCSTR pszZone ) { return DnssrvOperation( Server, pszZone, DNSSRV_OP_ZONE_DELETE, DNSSRV_TYPEID_NULL, (PVOID) NULL ); } DNS_STATUS DNS_API_FUNCTION DnssrvPauseZone( IN LPCWSTR Server, IN LPCSTR pszZone ) { return DnssrvOperation( Server, pszZone, DNSSRV_OP_ZONE_PAUSE, DNSSRV_TYPEID_NULL, (PVOID) NULL ); } DNS_STATUS DNS_API_FUNCTION DnssrvResumeZone( IN LPCWSTR Server, IN LPCSTR pszZone ) { return DnssrvOperation( Server, pszZone, DNSSRV_OP_ZONE_RESUME, DNSSRV_TYPEID_NULL, (PVOID) NULL ); } // // Record viewing API // DNS_STATUS DNS_API_FUNCTION DnssrvEnumRecordsAndConvertNodes( IN LPCWSTR pszServer, IN LPCSTR pszZoneName, IN LPCSTR pszNodeName, IN LPCSTR pszStartChild, IN WORD wRecordType, IN DWORD dwSelectFlag, IN LPCSTR pszFilterStart, IN LPCSTR pszFilterStop, OUT PDNS_NODE * ppNodeFirst, OUT PDNS_NODE * ppNodeLast ) { DNS_STATUS status; PDNS_NODE pnode; PDNS_NODE pnodeLast; PBYTE pbuffer; DWORD bufferLength; // // get records from server // status = DnssrvEnumRecords( pszServer, pszZoneName, pszNodeName, pszStartChild, wRecordType, dwSelectFlag, pszFilterStart, pszFilterStop, & bufferLength, & pbuffer ); if ( status != ERROR_SUCCESS && status != ERROR_MORE_DATA ) { return( status ); } // // pull nodes and records out of RPC buffer // pnode = DnsConvertRpcBuffer( & pnodeLast, bufferLength, pbuffer, TRUE // convert unicode ); if ( !pnode ) { DNS_PRINT(( "ERROR: failure converting RPC buffer to DNS records\n" "\tstatus = %p\n", GetLastError() )); ASSERT( FALSE ); return( ERROR_INVALID_DATA ); } *ppNodeFirst = pnode; *ppNodeLast = pnodeLast; return( status ); } // // Record management API // DNS_STATUS DNS_API_FUNCTION DnssrvDeleteNode( IN LPCWSTR Server, IN LPCSTR pszZoneName, IN LPCSTR pszNodeName, IN BOOL bDeleteSubtree ) { DNS_RPC_NAME_AND_PARAM param; param.dwParam = (DWORD) bDeleteSubtree; param.pszNodeName = (LPSTR) pszNodeName; return DnssrvOperation( Server, pszZoneName, DNSSRV_OP_DELETE_NODE, DNSSRV_TYPEID_NAME_AND_PARAM, (PVOID) ¶m ); } DNS_STATUS DNS_API_FUNCTION DnssrvDeleteRecordSet( IN LPCWSTR Server, IN LPCSTR pszZoneName, IN LPCSTR pszNodeName, IN WORD wType ) { DNS_RPC_NAME_AND_PARAM param; param.dwParam = (DWORD) wType; param.pszNodeName = (LPSTR) pszNodeName; return DnssrvOperation( Server, pszZoneName, DNSSRV_OP_DELETE_RECORD_SET, DNSSRV_TYPEID_NAME_AND_PARAM, (PVOID) ¶m ); } DNS_STATUS DNS_API_FUNCTION DnssrvForceAging( IN LPCWSTR Server, IN LPCSTR pszZoneName, IN LPCSTR pszNodeName, IN BOOL bAgeSubtree ) { DNS_RPC_NAME_AND_PARAM param; param.dwParam = (DWORD) bAgeSubtree; param.pszNodeName = (LPSTR) pszNodeName; return DnssrvOperation( Server, pszZoneName, DNSSRV_OP_FORCE_AGING_ON_NODE, DNSSRV_TYPEID_NAME_AND_PARAM, (PVOID) ¶m ); } // // Server API // DNS_STATUS DNS_API_FUNCTION DnssrvEnumZones( IN LPCWSTR Server, IN DWORD dwFilter, IN LPCSTR pszLastZone, OUT PDNS_RPC_ZONE_LIST * ppZoneList ) { DNS_STATUS status; DWORD typeId; PDNS_RPC_ZONE_LIST pzoneEnum = NULL; IF_DNSDBG( STUB ) { DNS_PRINT(( "Enter DnssrvEnumZones()\n" "\tServer = %s\n" "\tFilter = %p\n" "\tLastZone = %s\n" //"\tpdwZoneCount = %p\n" "\tppZoneList = %p\n", Server, dwFilter, pszLastZone, // pdwZoneCount, ppZoneList )); } status = DnssrvComplexOperation( Server, NULL, DNSSRV_OP_ENUM_ZONES, DNSSRV_TYPEID_DWORD, // DWORD filter in (PVOID) (DWORD_PTR) dwFilter, & typeId, // enumeration out (PVOID*) &pzoneEnum ); if ( status != DNS_ERROR_NT4 ) { ASSERT( ( status == ERROR_SUCCESS && typeId == DNSSRV_TYPEID_ZONE_LIST ) || ( status != ERROR_SUCCESS && pzoneEnum == NULL ) ); if ( pzoneEnum ) { *ppZoneList = pzoneEnum; } else { *ppZoneList = NULL; } } return( status ); } DNS_STATUS DNS_API_FUNCTION DnssrvEnumDirectoryPartitions( IN LPCWSTR Server, IN DWORD dwFilter, OUT PDNS_RPC_DP_LIST * ppDpList ) { DNS_STATUS status; DWORD dwTypeId; PDNS_RPC_DP_LIST pDpList = NULL; IF_DNSDBG( STUB ) { DNS_PRINT(( "Enter DnssrvEnumDirectoryPartitions()\n" "\tServer = %S\n" "\tppDpList = %p\n", Server, ppDpList )); } status = DnssrvComplexOperation( Server, NULL, DNSSRV_OP_ENUM_DPS, DNSSRV_TYPEID_DWORD, ( PVOID ) ( DWORD_PTR ) dwFilter, &dwTypeId, ( PVOID * ) &pDpList ); ASSERT( ( status == ERROR_SUCCESS && dwTypeId == DNSSRV_TYPEID_DP_LIST ) || ( status != ERROR_SUCCESS && pDpList == NULL ) ); *ppDpList = pDpList; return status; } // DnssrvEnumDirectoryPartitions DNS_STATUS DNS_API_FUNCTION DnssrvDirectoryPartitionInfo( IN LPCWSTR Server, IN LPSTR pszDpFqdn, OUT PDNS_RPC_DP_INFO * ppDpInfo ) { DNS_STATUS status; DWORD dwTypeId; PDNS_RPC_DP_INFO pDpInfo = NULL; IF_DNSDBG( STUB ) { DNS_PRINT(( "Enter DnssrvDirectoryPartitionInfo()\n" "\tServer = %S\n" "\tpszDpFqdn = %s\n" "\tppDpInfo = %p\n", Server, pszDpFqdn, ppDpInfo )); } status = DnssrvComplexOperation( Server, NULL, DNSSRV_OP_DP_INFO, DNSSRV_TYPEID_LPSTR, ( PVOID ) ( DWORD_PTR ) pszDpFqdn, &dwTypeId, ( PVOID * ) &pDpInfo ); ASSERT( ( status == ERROR_SUCCESS && dwTypeId == DNSSRV_TYPEID_DP_INFO ) || status != ERROR_SUCCESS ); *ppDpInfo = pDpInfo; return status; } // DnssrvDirectoryPartitionInfo DNS_STATUS DNS_API_FUNCTION DnssrvEnlistDirectoryPartition( IN LPCWSTR pszServer, IN DWORD dwOperation, IN LPCSTR pszDirPartFqdn ) { DNS_STATUS status; DWORD dwTypeId; DNS_RPC_ENLIST_DP param = { 0 }; INITIALIZE_RPC_STRUCT( ENLIST_DP, param ); IF_DNSDBG( STUB ) { DNS_PRINT(( "Enter DnssrvEnlistDirectoryPartition()\n" "\tpszServer = %S\n" "\tdwOperation = %d\n" "\tpszDirPartFqdn = %s\n", pszServer, dwOperation, pszDirPartFqdn )); } param.pszDpFqdn = ( LPSTR ) pszDirPartFqdn; param.dwOperation = dwOperation; status = DnssrvOperation( pszServer, NULL, DNSSRV_OP_ENLIST_DP, DNSSRV_TYPEID_ENLIST_DP, ¶m ); return status; } // DnssrvEnlistDirectoryPartition DNS_STATUS DNS_API_FUNCTION DnssrvSetupDefaultDirectoryPartitions( IN LPCWSTR pszServer, IN DWORD dwParam ) { DNS_STATUS status; DWORD dwTypeId; IF_DNSDBG( STUB ) { DNS_PRINT(( "Enter DnssrvSetupDefaultDirectoryPartitions()\n" "\tpszServer = %S\n" "\tdwParam = %d\n", pszServer, dwParam )); } status = DnssrvOperation( pszServer, NULL, DNSSRV_OP_ENLIST_DP, DNSSRV_TYPEID_DWORD, ( PVOID ) ( DWORD_PTR) dwParam ); return status; } // DnssrvSetupDefaultDirectoryPartitions DNS_STATUS DNS_API_FUNCTION DnssrvGetStatistics( IN LPCWSTR Server, IN DWORD dwFilter, OUT PDNS_RPC_BUFFER * ppStatsBuffer ) { DNS_STATUS status; DWORD typeId; PDNS_RPC_BUFFER pstatsBuf = NULL; IF_DNSDBG( STUB ) { DNS_PRINT(( "Enter DnssrvGetStatistics()\n" "\tServer = %s\n" "\tFilter = %p\n" "\tppStatsBuf = %p\n", Server, dwFilter, ppStatsBuffer )); } status = DnssrvComplexOperation( Server, NULL, DNSSRV_QUERY_STATISTICS, DNSSRV_TYPEID_DWORD, // DWORD filter in (PVOID) (DWORD_PTR) dwFilter, & typeId, // enumeration out (PVOID*) &pstatsBuf ); ASSERT( (status == ERROR_SUCCESS && typeId == DNSSRV_TYPEID_BUFFER ) || (status != ERROR_SUCCESS && pstatsBuf == NULL ) ); *ppStatsBuffer = pstatsBuf; return( status ); } DNS_STATUS DNS_API_FUNCTION DnssrvWriteDirtyZones( IN LPCWSTR Server ) { DNS_STATUS status; status = DnssrvOperation( Server, NULL, DNSSRV_OP_WRITE_DIRTY_ZONES, DNSSRV_TYPEID_NULL, NULL ); return( status ); } // // Old zone API -- discontinued // DNS_STATUS DNS_API_FUNCTION DnssrvResetZoneType( IN LPCWSTR Server, IN LPCSTR pszZone, IN DWORD dwZoneType, IN DWORD cMasters, IN PIP_ADDRESS aipMasters ) { DNS_STATUS status; DNS_RPC_ZONE_TYPE_RESET typeReset; PIP_ARRAY arrayIp; INITIALIZE_RPC_STRUCT( ZONE_TYPE_RESET, typeReset ); arrayIp = Dns_BuildIpArray( cMasters, aipMasters ); if ( !arrayIp && cMasters ) { return( DNS_ERROR_NO_MEMORY ); } typeReset.dwZoneType = dwZoneType; typeReset.aipMasters = arrayIp; status = DnssrvOperation( Server, pszZone, DNS_REGKEY_ZONE_TYPE, DNSSRV_TYPEID_ZONE_TYPE_RESET, (PVOID) &typeReset ); FREE_HEAP( arrayIp ); return( status ); } DNS_STATUS DNS_API_FUNCTION DnssrvResetZoneDatabase( IN LPCWSTR Server, IN LPCSTR pszZone, IN DWORD fDsIntegrated, IN LPCSTR pszDataFile ) { DNS_STATUS status; DNS_RPC_ZONE_DATABASE dbase; INITIALIZE_RPC_STRUCT( ZONE_DATABASE, dbase ); dbase.fDsIntegrated = fDsIntegrated; dbase.pszFileName = (LPSTR) pszDataFile; return DnssrvOperation( Server, pszZone, DNS_REGKEY_ZONE_FILE, DNSSRV_TYPEID_ZONE_DATABASE, (PVOID) &dbase ); } // // End remote.c //