/*++ Copyright (c) 1996-2001 Microsoft Corporation Module Name: dnslibp.h Abstract: Domain Name System (DNS) Library Private DNS Library Routines Author: Jim Gilroy (jamesg) December 7, 1996 Revision History: --*/ #ifndef _DNSLIBP_INCLUDED_ #define _DNSLIBP_INCLUDED_ #include #include #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif // __cplusplus // headers are screwed up // neither ntdef.h nor winnt.h brings in complete set, so depending // on whether you include nt.h or not you end up with different set #define MINCHAR 0x80 #define MAXCHAR 0x7f #define MINSHORT 0x8000 #define MAXSHORT 0x7fff #define MINLONG 0x80000000 #define MAXLONG 0x7fffffff #define MAXBYTE 0xff #define MAXUCHAR 0xff #define MAXWORD 0xffff #define MAXUSHORT 0xffff #define MAXDWORD 0xffffffff #define MAXULONG 0xffffffff // // Handy bad ptr // #define DNS_BAD_PTR ((PVOID)(-1)) // // "Wire" char set // // Explicitly create wire char set in case the ACE format // wins out. // #define DnsCharSetWire DnsCharSetUtf8 // // DCR: move these to windns.h // #define DNS_IP4_REVERSE_DOMAIN_STRING_W (L"in-addr.arpa.") #define DNS_IP6_REVERSE_DOMAIN_STRING_W (L"ip6.arpa.") // // Private DNS_RECORD Flag field structure definition and macros // typedef struct _PrivateRecordFlags { DWORD Section : 2; DWORD Delete : 1; DWORD CharSet : 2; DWORD Cached : 1; // or maybe a "Source" field DWORD HostsFile : 1; DWORD Cluster : 1; DWORD Unused : 3; DWORD Matched : 1; DWORD FreeData : 1; DWORD FreeOwner : 1; DWORD Reserved : 18; } PRIV_RR_FLAGS, *PPRIV_RR_FLAGS; #define RRFLAGS( pRecord ) ((PPRIV_RR_FLAGS)&pRecord->Flags.DW) // Defined in dnslib.h too late to pull now //#define FLAG_Section( pRecord ) (RRFLAGS( pRecord )->Section) //#define FLAG_Delete( pRecord ) (RRFLAGS( pRecord )->Delete) //#define FLAG_CharSet( pRecord ) (RRFLAGS( pRecord )->CharSet) //#define FLAG_FreeData( pRecord ) (RRFLAGS( pRecord )->FreeData) //#define FLAG_FreeOwner( pRecord ) (RRFLAGS( pRecord )->FreeOwner) //#define FLAG_Matched( pRecord ) (RRFLAGS( pRecord )->Matched) //#define FLAG_Cached( pRecord ) (RRFLAGS( pRecord )->Cached) #define FLAG_HostsFile( pRecord ) (RRFLAGS( pRecord )->HostsFile) #define FLAG_Cluster( pRecord ) (RRFLAGS( pRecord )->Cluster) //#define SET_FREE_OWNER(pRR) (FLAG_FreeOwner(pRR) = TRUE) //#define SET_FREE_DATA(pRR) (FLAG_FreeData(pRR) = TRUE) //#define SET_RR_MATCHED(pRR) (FLAG_Matched(pRR) = TRUE) #define SET_RR_HOSTS_FILE(pRR) (FLAG_HostsFile(pRR) = TRUE) #define SET_RR_CLUSTER(pRR) (FLAG_Cluster(pRR) = TRUE) //#define CLEAR_FREE_OWNER(pRR) (FLAG_FreeOwner(pRR) = FALSE) //#define CLEAR_FREE_DATA(pRR) (FLAG_FreeData(pRR) = FALSE) //#define CLEAR_RR_MATCHED(pRR) (FLAG_Matched(pRR) = FALSE) #define CLEAR_RR_HOSTS_FILE(pRR) (FLAG_HostsFile(pRR) = FALSE) //#define IS_FREE_OWNER(pRR) (FLAG_FreeOwner(pRR)) //#define IS_FREE_DATA(pRR) (FLAG_FreeData(pRR)) //#define IS_RR_MATCHED(pRR) (FLAG_Matched(pRR)) #define IS_HOSTS_FILE_RR(pRR) (FLAG_HostsFile(pRR)) #define IS_CLUSTER_RR(pRR) (FLAG_Cluster(pRR)) //#define IS_ANSWER_RR(pRR) (FLAG_Section(pRR) == DNSREC_ANSWER) //#define IS_AUTHORITY_RR(pRR) (FLAG_Section(pRR) == DNSREC_AUTHORITY) //#define IS_ADDITIONAL_RR(pRR) (FLAG_Section(pRR) == DNSREC_ADDITIONAL) // // DWORD flag definitions // #defines to match the windns.h ones for private fields // Charset #define DNSREC_CHARSET (0x00000018) // bits 4 and 5 #define DNSREC_UNICODE (0x00000008) // DnsCharSetUnicode = 1 #define DNSREC_UTF8 (0x00000010) // DnsCharSetUtf8 = 2 #define DNSREC_ANSI (0x00000018) // DnsCharSetAnsi = 3 // // Address family info (addr.c) // typedef struct _AddrFamilyInfo { WORD Family; WORD DnsType; DWORD LengthAddr; DWORD LengthSockaddr; DWORD OffsetToAddrInSockaddr; } FAMILY_INFO, *PFAMILY_INFO; extern FAMILY_INFO AddrFamilyTable[]; #define FamilyInfoIp4 (AddrFamilyTable[0]) #define FamilyInfoIp6 (AddrFamilyTable[1]) #define FamilyInfoAtm (AddrFamilyTable[2]) #define pFamilyInfoIp4 (&AddrFamilyTable[0]) #define pFamilyInfoIp6 (&AddrFamilyTable[1]) #define pFamilyInfoAtm (&AddrFamilyTable[2]) PFAMILY_INFO FamilyInfo_GetForFamily( IN DWORD Family ); #define FamilyInfo_GetForSockaddr(pSA) \ FamilyInfo_GetForFamily( (pSA)->sa_family ) WORD Family_DnsType( IN WORD Family ); DWORD Family_SockaddrLength( IN WORD Family ); DWORD Family_GetFromDnsType( IN WORD wType ); // // Sockaddr // DWORD Sockaddr_Length( IN PSOCKADDR pSockaddr ); IP6_ADDRESS Sockaddr_GetIp6( IN PSOCKADDR pSockaddr ); VOID Sockaddr_BuildFromIp6( OUT PSOCKADDR pSockaddr, IN IP6_ADDRESS Ip6Addr, IN WORD Port ); DNS_STATUS Sockaddr_BuildFromFlatAddr( OUT PSOCKADDR pSockaddr, IN OUT PDWORD pSockaddrLength, IN BOOL fClearSockaddr, IN PBYTE pAddr, IN DWORD AddrLength, IN DWORD AddrFamily ); // // Hostents (hostent.c) // (used by sablob.c) // PHOSTENT Hostent_Init( IN OUT PBYTE * ppBuffer, IN INT Family, IN INT AddrLength, IN DWORD AddrCount, IN DWORD AliasCount ); VOID Hostent_ConvertToOffsets( IN OUT PHOSTENT pHostent ); // // Sting to address (straddr.c) // // // Need for hostent routine which doesn't unicode\ANSI. // BOOL Dns_StringToAddressEx( OUT PCHAR pAddrBuf, IN OUT PDWORD pBufLength, IN PCSTR pString, IN OUT PDWORD pAddrFamily, IN BOOL fUnicode, IN BOOL fReverse ); BOOL Dns_StringToDnsAddrEx( OUT PDNS_ADDR pAddr, IN PCSTR pString, IN DWORD Family, OPTIONAL IN BOOL fUnicode, IN BOOL fReverse ); // // Handle non-NULL terminated strings for DNS server file load. // BOOL Dns_Ip4StringToAddressEx_A( OUT PIP4_ADDRESS pIp4Addr, IN PCSTR pchString, IN DWORD StringLength ); BOOL Dns_Ip6StringToAddressEx_A( OUT PIP6_ADDRESS pIp6Addr, IN PCSTR pchString, IN DWORD StringLength ); // // Random // BOOL Dns_ReverseNameToSockaddrPrivate( OUT PSOCKADDR pSockaddr, IN OUT PDWORD pSockaddrLength, IN PCSTR pString, IN BOOL fUnicode ); // // UPNP IP6 literal hack // VOID Dns_Ip6AddressToLiteralName( OUT PWCHAR pBuffer, IN PIP6_ADDRESS pIp6 ); BOOL Dns_Ip6LiteralNameToAddress( OUT PSOCKADDR_IN6 pSockAddr, IN PCWSTR pwsString ); // // Mcast address build (dnsaddr.c) // BOOL DnsAddr_BuildMcast( OUT PDNS_ADDR pAddr, IN DWORD Family, IN PWSTR pName ); // // IP6 mcast address (ip6.c) // BOOL Ip6_McastCreate( OUT PIP6_ADDRESS pIp, IN PWSTR pName ); // // IP4 networking (dnsutil.c) // BOOL Dns_AreIp4InSameDefaultNetwork( IN IP4_ADDRESS IpAddr1, IN IP4_ADDRESS IpAddr2 ); // // RPC-able type (record.c) // BOOL Dns_IsRpcRecordType( IN WORD wType ); // // Record copy (rrcopy.c) // PDNS_RECORD WINAPI Dns_RecordCopy_W( IN PDNS_RECORD pRecord ); PDNS_RECORD WINAPI Dns_RecordCopy_A( IN PDNS_RECORD pRecord ); PDNS_RECORD Dns_RecordListCopyEx( IN PDNS_RECORD pRR, IN DWORD ScreenFlag, IN DNS_CHARSET CharSetIn, IN DNS_CHARSET CharSetOut ); // // Record list routines (rrlist.c) // // // Record screening (rrlist.c) // #define SCREEN_OUT_ANSWER (0x00000001) #define SCREEN_OUT_AUTHORITY (0x00000010) #define SCREEN_OUT_ADDITIONAL (0x00000100) #define SCREEN_OUT_NON_RPC (0x00100000) #define SCREEN_OUT_SECTION \ (SCREEN_OUT_ANSWER | SCREEN_OUT_AUTHORITY | SCREEN_OUT_ADDITIONAL) BOOL Dns_ScreenRecord( IN PDNS_RECORD pRR, IN DWORD ScreenFlag ); PDNS_RECORD Dns_RecordListScreen( IN PDNS_RECORD pRR, IN DWORD ScreenFlag ); DWORD Dns_RecordListGetMinimumTtl( IN PDNS_RECORD pRRList ); // // Record priorities (rrlist.c) // PDNS_RECORD Dns_PrioritizeSingleRecordSet( IN OUT PDNS_RECORD pRecordSet, IN PDNS_ADDR_ARRAY pArray ); PDNS_RECORD Dns_PrioritizeRecordList( IN OUT PDNS_RECORD pRecordList, IN PDNS_ADDR_ARRAY pArray ); // // Record comparison (rrcomp.c) // BOOL WINAPI Dns_DeleteRecordFromList( IN OUT PDNS_RECORD * ppRRList, IN PDNS_RECORD pRRDelete ); // // New free // DCR: switch to dnslib.h when world builds clean // #undef Dns_RecordListFree VOID WINAPI Dns_RecordListFree( IN OUT PDNS_RECORD pRRList ); // // String (string.c) // DWORD MultiSz_Size_A( IN PCSTR pmszString ); PSTR MultiSz_NextString_A( IN PCSTR pmszString ); PSTR MultiSz_Copy_A( IN PCSTR pmszString ); BOOL MultiSz_Equal_A( IN PCSTR pmszString1, IN PCSTR pmszString2 ); DWORD MultiSz_Size_W( IN PCWSTR pmszString ); PWSTR MultiSz_NextString_W( IN PCWSTR pmszString ); PWSTR MultiSz_Copy_W( IN PCWSTR pmszString ); BOOL MultiSz_Equal_W( IN PCWSTR pmszString1, IN PCWSTR pmszString2 ); BOOL MultiSz_ContainsName_W( IN PCWSTR pmszString, IN PCWSTR pString ); DWORD String_ReplaceCharW( IN OUT PWSTR pwsString, IN WCHAR TargetChar, IN WCHAR ReplaceChar ); DWORD String_ReplaceCharA( IN OUT PSTR pszString, IN CHAR TargetChar, IN CHAR ReplaceChar ); PSTR * Argv_CopyEx( IN DWORD Argc, IN PCHAR * Argv, IN DNS_CHARSET CharSetIn, IN DNS_CHARSET CharSetOut ); VOID Argv_Free( IN OUT PSTR * Argv ); // // Timed locks (locks.c) // typedef struct _TimedLock { HANDLE hEvent; DWORD ThreadId; LONG RecursionCount; DWORD WaitTime; } TIMED_LOCK, *PTIMED_LOCK; #define TIMED_LOCK_DEFAULT_WAIT (0xf0000000) DWORD TimedLock_Initialize( OUT PTIMED_LOCK pTimedLock, IN DWORD DefaultWait ); BOOL TimedLock_Enter( IN OUT PTIMED_LOCK pTimedLock, IN DWORD WaitTime ); VOID TimedLock_Leave( IN OUT PTIMED_LOCK pTimedLock ); VOID TimedLock_Cleanup( IN OUT PTIMED_LOCK pTimedLock ); // // Name utilities (name.c) // DWORD Dns_MakeCanonicalNameW( OUT PWSTR pBuffer, IN DWORD BufLength, IN PWSTR pwsString, IN DWORD StringLength ); DWORD Dns_MakeCanonicalNameInPlaceW( IN PWCHAR pwString, IN DWORD StringLength ); INT Dns_DowncaseNameLabel( OUT PCHAR pchResult, IN PCHAR pchLabel, IN DWORD cchLabel, IN DWORD dwFlags ); // // Name checking -- server name checking levels // #define DNS_ALLOW_RFC_NAMES_ONLY (0) #define DNS_ALLOW_NONRFC_NAMES (1) #define DNS_ALLOW_MULTIBYTE_NAMES (2) #define DNS_ALLOW_ALL_NAMES (3) PCHAR _fastcall Dns_GetDomainNameA( IN PCSTR pszName ); PWSTR _fastcall Dns_GetDomainNameW( IN PCWSTR pwsName ); PSTR _fastcall Dns_GetTldForNameA( IN PCSTR pszName ); PWSTR _fastcall Dns_GetTldForNameW( IN PCWSTR pszName ); BOOL _fastcall Dns_IsNameShortA( IN PCSTR pszName ); BOOL _fastcall Dns_IsNameShortW( IN PCWSTR pszName ); BOOL _fastcall Dns_IsNameNumericA( IN PCSTR pszName ); BOOL _fastcall Dns_IsNameNumericW( IN PCWSTR pszName ); BOOL _fastcall Dns_IsNameFQDN_A( IN PCSTR pszName ); BOOL _fastcall Dns_IsNameFQDN_W( IN PCWSTR pszName ); DWORD _fastcall Dns_GetNameAttributesA( IN PCSTR pszName ); DWORD _fastcall Dns_GetNameAttributesW( IN PCWSTR pszName ); DNS_STATUS Dns_ValidateAndCategorizeDnsNameA( IN PCSTR pszName, OUT PDWORD pLabelCount ); DNS_STATUS Dns_ValidateAndCategorizeDnsNameW( IN PCWSTR pszName, OUT PDWORD pLabelCount ); DWORD Dns_NameLabelCountA( IN PCSTR pszName ); DWORD Dns_NameLabelCountW( IN PCWSTR pszName ); PSTR Dns_NameAppend_A( OUT PCHAR pNameBuffer, IN DWORD BufferLength, IN PSTR pszName, IN PSTR pszDomain ); PWSTR Dns_NameAppend_W( OUT PWCHAR pNameBuffer, IN DWORD BufferLength, IN PWSTR pwsName, IN PWSTR pwsDomain ); PSTR Dns_SplitHostFromDomainNameA( IN PSTR pszName ); PWSTR Dns_SplitHostFromDomainNameW( IN PWSTR pszName ); BOOL Dns_CopyNameLabelA( OUT PCHAR pBuffer, IN PCSTR pszName ); BOOL Dns_CopyNameLabelW( OUT PWCHAR pBuffer, IN PCWSTR pszName ); // // Common name transformations // DWORD Dns_NameCopyWireToUnicode( OUT PWCHAR pBufferUnicode, IN PCSTR pszNameWire ); DWORD Dns_NameCopyUnicodeToWire( OUT PCHAR pBufferWire, IN PCWSTR pwsNameUnicode ); DWORD Dns_NameCopyStandard_W( OUT PWCHAR pBuffer, IN PCWSTR pwsNameUnicode ); DWORD Dns_NameCopyStandard_A( OUT PCHAR pBuffer, IN PCSTR pszName ); // // Special record creation (rralloc.c) // PDNS_RECORD Dns_CreateFlatRecord( IN PDNS_NAME pOwnerName, IN WORD wType, IN PCHAR pData, IN DWORD DataLength, IN DWORD Ttl, IN DNS_CHARSET NameCharSet, IN DNS_CHARSET RecordCharSet ); PDNS_RECORD Dns_CreatePtrTypeRecord( IN PDNS_NAME pOwnerName, IN BOOL fCopyName, IN PDNS_NAME pTargetName, IN WORD wType, IN DWORD Ttl, IN DNS_CHARSET NameCharSet, IN DNS_CHARSET RecordCharSet ); PDNS_RECORD Dns_CreatePtrRecordEx( IN PDNS_ADDR pAddr, IN PDNS_NAME pszHostName, IN DWORD Ttl, IN DNS_CHARSET NameCharSet, IN DNS_CHARSET RecordCharSet ); PDNS_RECORD Dns_CreatePtrRecordExEx( IN PDNS_ADDR pAddr, IN PSTR pszHostName, IN PSTR pszDomainName, IN DWORD Ttl, IN DNS_CHARSET NameCharSet, IN DNS_CHARSET RecordCharSet ); PDNS_RECORD Dns_CreateARecord( IN PDNS_NAME pOwnerName, IN IP4_ADDRESS Ip4Address, IN DWORD Ttl, IN DNS_CHARSET NameCharSet, IN DNS_CHARSET RecordCharSet ); PDNS_RECORD Dns_CreateAAAARecord( IN PDNS_NAME pOwnerName, IN IP6_ADDRESS Ip6Address, IN DWORD Ttl, IN DNS_CHARSET NameCharSet, IN DNS_CHARSET RecordCharSet ); PDNS_RECORD Dns_CreateForwardRecord( IN PDNS_NAME pOwnerName, IN WORD wType, OPTIONAL IN PDNS_ADDR pAddr, IN DWORD Ttl, IN DNS_CHARSET NameCharSet, IN DNS_CHARSET RecordCharSet ); PDNS_RECORD Dns_CreateForwardRecordFromIp6( IN PDNS_NAME pOwnerName, IN PIP6_ADDRESS pIp, IN DWORD Ttl, IN DNS_CHARSET NameCharSet, IN DNS_CHARSET RecordCharSet ); PDNS_RECORD Dns_CreateForwardRecordFromSockaddr( IN PDNS_NAME pOwnerName, IN PSOCKADDR pSockaddr, IN DWORD Ttl, IN DNS_CHARSET NameCharSet, IN DNS_CHARSET RecordCharSet ); PDNS_RECORD Dns_CreateRecordForIpString_W( IN PCWSTR pwsName, IN WORD wType, IN DWORD Ttl ); // // Record read\write (rrwrite.c rrread.c) // // Need here to export to dnsapi\packet.c // typedef PCHAR (* RR_WRITE_FUNCTION)( PDNS_RECORD, PCHAR, PCHAR ); extern RR_WRITE_FUNCTION RR_WriteTable[]; typedef PDNS_RECORD (* RR_READ_FUNCTION)( PDNS_RECORD, DNS_CHARSET, PCHAR, PCHAR, PCHAR ); extern RR_READ_FUNCTION RR_ReadTable[]; // // Security stuff (security.c) // #define SECURITY_WIN32 #include #define DNS_SPN_SERVICE_CLASS "DNS" #define DNS_SPN_SERVICE_CLASS_W L"DNS" // // Some useful stats // extern DWORD SecContextCreate; extern DWORD SecContextFree; extern DWORD SecContextQueue; extern DWORD SecContextQueueInNego; extern DWORD SecContextDequeue; extern DWORD SecContextTimeout; extern DWORD SecPackAlloc; extern DWORD SecPackFree; // Security packet verifications extern DWORD SecTkeyInvalid; extern DWORD SecTkeyBadTime; extern DWORD SecTsigFormerr; extern DWORD SecTsigEcho; extern DWORD SecTsigBadKey; extern DWORD SecTsigVerifySuccess; extern DWORD SecTsigVerifyOldSig; extern DWORD SecTsigVerifyFailed; // Hacks // Allowing old TSIG off by default, server can turn on. // Big Time skew on by default extern BOOL SecAllowOldTsig; extern DWORD SecTsigVerifyOldSig; extern DWORD SecTsigVerifyOldFailed; extern DWORD SecBigTimeSkew; extern DWORD SecBigTimeSkewBypass; // // Security globals // expose some of these which may be accessed by update library // extern BOOL g_fSecurityPackageInitialized; extern DWORD g_SecurityTokenMaxLength; // // Security context cache // VOID Dns_TimeoutSecurityContextList( IN BOOL fClearList ); // // Security API // BOOL Dns_DnsNameToKerberosTargetName( IN LPSTR pszDnsName, IN LPSTR pszKerberosTargetName ); DNS_STATUS Dns_StartSecurity( IN BOOL fProcessAttach ); DNS_STATUS Dns_StartServerSecurity( VOID ); VOID Dns_TerminateSecurityPackage( VOID ); HANDLE Dns_CreateAPIContext( IN DWORD Flags, IN PVOID Credentials, OPTIONAL IN BOOL fUnicode ); VOID Dns_FreeAPIContext( IN OUT HANDLE hContextHandle ); PVOID Dns_GetApiContextCredentials( IN HANDLE hContextHandle ); DWORD Dns_GetCurrentRid( VOID ); BOOL Dns_CreateUserCredentials( IN PCHAR pszUser, IN DWORD dwUserLength, IN PCHAR pszDomain, IN DWORD dwDomainLength, IN PCHAR pszPassword, IN DWORD dwPasswordLength, IN BOOL FromWide, OUT PCHAR * ppCreds ); PSEC_WINNT_AUTH_IDENTITY_W Dns_AllocateAndInitializeCredentialsW( IN PSEC_WINNT_AUTH_IDENTITY_W pAuthIn ); PSEC_WINNT_AUTH_IDENTITY_A Dns_AllocateAndInitializeCredentialsA( IN PSEC_WINNT_AUTH_IDENTITY_A pAuthIn ); VOID Dns_FreeAuthIdentityCredentials( IN PVOID pAuthIn ); DNS_STATUS Dns_SignMessageWithGssTsig( IN HANDLE hContext, IN PDNS_HEADER pMsgHead, IN PCHAR pMsgBufEnd, IN OUT PCHAR * ppCurrent ); #if 1 DNS_STATUS Dns_RefreshSSpiCredentialsHandle( IN BOOL bDnsSvr, IN PCHAR pCreds ); #endif VOID Dns_FreeSecurityContextList( VOID ); // // Server security routines // DNS_STATUS Dns_FindSecurityContextFromAndVerifySignature( OUT PHANDLE phContext, IN PDNS_ADDR pRemoteAddr, IN PDNS_HEADER pMsgHead, IN PCHAR pMsgEnd ); DNS_STATUS Dns_FindSecurityContextFromAndVerifySignature_Ip4( IN PHANDLE phContext, IN IP4_ADDRESS IpRemote, IN PDNS_HEADER pMsgHead, IN PCHAR pMsgEnd ); DNS_STATUS Dns_ServerNegotiateTkey( IN PDNS_ADDR pRemoteAddr, IN PDNS_HEADER pMsgHead, IN PCHAR pMsgEnd, IN PCHAR pMsgBufEnd, IN BOOL fBreakOnAscFailure, OUT PCHAR * ppCurrent ); DNS_STATUS Dns_ServerNegotiateTkey_Ip4( IN IP4_ADDRESS IpRemote, IN PDNS_HEADER pMsgHead, IN PCHAR pMsgEnd, IN PCHAR pMsgBufEnd, IN BOOL fBreakOnAscFailure, OUT PCHAR * ppCurrent ); DNS_STATUS Dns_SrvImpersonateClient( IN HANDLE hContext ); DNS_STATUS Dns_SrvRevertToSelf( IN HANDLE hContext ); VOID Dns_CleanupSessionAndEnlistContext( IN OUT HANDLE hSession ); DWORD Dns_GetKeyVersion( IN LPSTR pszContext ); // // Security utilities // DNS_STATUS Dns_CreateSecurityDescriptor( OUT PSECURITY_DESCRIPTOR * ppSD, IN DWORD AclCount, IN PSID * SidPtrArray, IN DWORD * AccessMaskArray ); // // Security credentials // // Only defined if WINNT_AUTH_IDENTITY defined #ifdef __RPCDCE_H__ PSEC_WINNT_AUTH_IDENTITY_W Dns_AllocateCredentials( IN PWSTR pwsUserName, IN PWSTR pwsDomain, IN PWSTR pwsPassword ); #endif DNS_STATUS Dns_ImpersonateUser( IN PDNS_CREDENTIALS pCreds ); VOID Dns_FreeCredentials( IN PDNS_CREDENTIALS pCreds ); PDNS_CREDENTIALS Dns_CopyCredentials( IN PDNS_CREDENTIALS pCreds ); // // Debug globals // // Expose here to allow debug file sharing // typedef struct _DnsDebugInfo { DWORD Flag; HANDLE hFile; DWORD FileCurrentSize; DWORD FileWrapCount; DWORD FileWrapSize; DWORD LastThreadId; DWORD LastSecond; BOOL fConsole; CHAR FileName[ MAX_PATH ]; } DNS_DEBUG_INFO, *PDNS_DEBUG_INFO; // WANING: MUST ONLY be called in dnsapi.dll PDNS_DEBUG_INFO Dns_SetDebugGlobals( IN OUT PDNS_DEBUG_INFO pInfo ); #ifdef __cplusplus } #endif // __cplusplus #endif // _DNSLIBP_INCLUDED_