mirror of
https://github.com/reactos/reactos.git
synced 2024-10-09 02:35:42 +00:00
- Import Alex's dnslib
- Add headers and definitions needed for dnslib to build - Part 2 of 2 svn path=/trunk/; revision=43469
This commit is contained in:
parent
d7ac1e87e8
commit
45c5b396f7
|
@ -171,6 +171,10 @@ typedef struct _DnsRecordFlags {
|
||||||
DWORD Unused :3;
|
DWORD Unused :3;
|
||||||
DWORD Reserved :24;
|
DWORD Reserved :24;
|
||||||
} DNS_RECORD_FLAGS;
|
} DNS_RECORD_FLAGS;
|
||||||
|
#define DNSREC_QUESTION 0
|
||||||
|
#define DNSREC_ANSWER 1
|
||||||
|
#define DNSREC_AUTHORITY 2
|
||||||
|
#define DNSREC_ADDITIONAL 3
|
||||||
typedef struct {
|
typedef struct {
|
||||||
IP4_ADDRESS IpAddress;
|
IP4_ADDRESS IpAddress;
|
||||||
} DNS_A_DATA, *PDNS_A_DATA;
|
} DNS_A_DATA, *PDNS_A_DATA;
|
||||||
|
|
333
reactos/include/psdk/ws2atm.h
Normal file
333
reactos/include/psdk/ws2atm.h
Normal file
|
@ -0,0 +1,333 @@
|
||||||
|
/**
|
||||||
|
* This file has no copyright assigned and is placed in the Public Domain.
|
||||||
|
* This file is part of the w64 mingw-runtime package.
|
||||||
|
* No warranty is given; refer to the file DISCLAIMER within this package.
|
||||||
|
*/
|
||||||
|
#ifndef _WS2ATM_H_
|
||||||
|
#define _WS2ATM_H_
|
||||||
|
|
||||||
|
#include <pshpack4.h>
|
||||||
|
|
||||||
|
#define ATMPROTO_AALUSER 0x00
|
||||||
|
#define ATMPROTO_AAL1 0x01
|
||||||
|
#define ATMPROTO_AAL2 0x02
|
||||||
|
#define ATMPROTO_AAL34 0x03
|
||||||
|
#define ATMPROTO_AAL5 0x05
|
||||||
|
|
||||||
|
#define SAP_FIELD_ABSENT 0xFFFFFFFE
|
||||||
|
#define SAP_FIELD_ANY 0xFFFFFFFF
|
||||||
|
#define SAP_FIELD_ANY_AESA_SEL 0xFFFFFFFA
|
||||||
|
#define SAP_FIELD_ANY_AESA_REST 0xFFFFFFFB
|
||||||
|
|
||||||
|
#define ATM_E164 0x01
|
||||||
|
#define ATM_NSAP 0x02
|
||||||
|
#define ATM_AESA 0x02
|
||||||
|
|
||||||
|
#define ATM_ADDR_SIZE 20
|
||||||
|
typedef struct {
|
||||||
|
DWORD AddressType;
|
||||||
|
DWORD NumofDigits;
|
||||||
|
UCHAR Addr[ATM_ADDR_SIZE];
|
||||||
|
} ATM_ADDRESS;
|
||||||
|
|
||||||
|
#define BLLI_L2_ISO_1745 0x01
|
||||||
|
#define BLLI_L2_Q921 0x02
|
||||||
|
#define BLLI_L2_X25L 0x06
|
||||||
|
#define BLLI_L2_X25M 0x07
|
||||||
|
#define BLLI_L2_ELAPB 0x08
|
||||||
|
#define BLLI_L2_HDLC_ARM 0x09
|
||||||
|
#define BLLI_L2_HDLC_NRM 0x0A
|
||||||
|
#define BLLI_L2_HDLC_ABM 0x0B
|
||||||
|
#define BLLI_L2_LLC 0x0C
|
||||||
|
#define BLLI_L2_X75 0x0D
|
||||||
|
#define BLLI_L2_Q922 0x0E
|
||||||
|
#define BLLI_L2_USER_SPECIFIED 0x10
|
||||||
|
#define BLLI_L2_ISO_7776 0x11
|
||||||
|
|
||||||
|
#define BLLI_L3_X25 0x06
|
||||||
|
#define BLLI_L3_ISO_8208 0x07
|
||||||
|
#define BLLI_L3_X223 0x08
|
||||||
|
#define BLLI_L3_SIO_8473 0x09
|
||||||
|
#define BLLI_L3_T70 0x0A
|
||||||
|
#define BLLI_L3_ISO_TR9577 0x0B
|
||||||
|
#define BLLI_L3_USER_SPECIFIED 0x10
|
||||||
|
|
||||||
|
#define BLLI_L3_IPI_SNAP 0x80
|
||||||
|
#define BLLI_L3_IPI_IP 0xCC
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
DWORD Layer2Protocol;
|
||||||
|
DWORD Layer2UserSpecifiedProtocol;
|
||||||
|
DWORD Layer3Protocol;
|
||||||
|
DWORD Layer3UserSpecifiedProtocol;
|
||||||
|
DWORD Layer3IPI;
|
||||||
|
UCHAR SnapID[5];
|
||||||
|
} ATM_BLLI;
|
||||||
|
|
||||||
|
#define BHLI_ISO 0x00
|
||||||
|
#define BHLI_UserSpecific 0x01
|
||||||
|
#define BHLI_HighLayerProfile 0x02
|
||||||
|
#define BHLI_VendorSpecificAppId 0x03
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
DWORD HighLayerInfoType;
|
||||||
|
DWORD HighLayerInfoLength;
|
||||||
|
UCHAR HighLayerInfo[8];
|
||||||
|
} ATM_BHLI;
|
||||||
|
|
||||||
|
typedef struct sockaddr_atm {
|
||||||
|
u_short satm_family;
|
||||||
|
ATM_ADDRESS satm_number;
|
||||||
|
ATM_BLLI satm_blli;
|
||||||
|
ATM_BHLI satm_bhli;
|
||||||
|
} sockaddr_atm,SOCKADDR_ATM,*PSOCKADDR_ATM,*LPSOCKADDR_ATM;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
IE_AALParameters,IE_TrafficDescriptor,IE_BroadbandBearerCapability,IE_BHLI,IE_BLLI,IE_CalledPartyNumber,IE_CalledPartySubaddress,
|
||||||
|
IE_CallingPartyNumber,IE_CallingPartySubaddress,IE_Cause,IE_QOSClass,IE_TransitNetworkSelection
|
||||||
|
} Q2931_IE_TYPE;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
Q2931_IE_TYPE IEType;
|
||||||
|
ULONG IELength;
|
||||||
|
UCHAR IE[1];
|
||||||
|
} Q2931_IE;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
AALTYPE_5 = 5,AALTYPE_USER = 16
|
||||||
|
} AAL_TYPE;
|
||||||
|
|
||||||
|
#define AAL5_MODE_MESSAGE 0x01
|
||||||
|
#define AAL5_MODE_STREAMING 0x02
|
||||||
|
|
||||||
|
#define AAL5_SSCS_NULL 0x00
|
||||||
|
#define AAL5_SSCS_SSCOP_ASSURED 0x01
|
||||||
|
#define AAL5_SSCS_SSCOP_NON_ASSURED 0x02
|
||||||
|
#define AAL5_SSCS_FRAME_RELAY 0x04
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
ULONG ForwardMaxCPCSSDUSize;
|
||||||
|
ULONG BackwardMaxCPCSSDUSize;
|
||||||
|
UCHAR Mode;
|
||||||
|
UCHAR SSCSType;
|
||||||
|
} AAL5_PARAMETERS;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
ULONG UserDefined;
|
||||||
|
} AALUSER_PARAMETERS;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
AAL_TYPE AALType;
|
||||||
|
union {
|
||||||
|
AAL5_PARAMETERS AAL5Parameters;
|
||||||
|
AALUSER_PARAMETERS AALUserParameters;
|
||||||
|
} AALSpecificParameters;
|
||||||
|
} AAL_PARAMETERS_IE;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
ULONG PeakCellRate_CLP0;
|
||||||
|
ULONG PeakCellRate_CLP01;
|
||||||
|
ULONG SustainableCellRate_CLP0;
|
||||||
|
ULONG SustainableCellRate_CLP01;
|
||||||
|
ULONG MaxBurstSize_CLP0;
|
||||||
|
ULONG MaxBurstSize_CLP01;
|
||||||
|
WINBOOL Tagging;
|
||||||
|
} ATM_TD;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
ATM_TD Forward;
|
||||||
|
ATM_TD Backward;
|
||||||
|
WINBOOL BestEffort;
|
||||||
|
} ATM_TRAFFIC_DESCRIPTOR_IE;
|
||||||
|
|
||||||
|
#define BCOB_A 0x01
|
||||||
|
#define BCOB_C 0x03
|
||||||
|
#define BCOB_X 0x10
|
||||||
|
|
||||||
|
#define TT_NOIND 0x00
|
||||||
|
#define TT_CBR 0x04
|
||||||
|
#define TT_VBR 0x08
|
||||||
|
|
||||||
|
#define TR_NOIND 0x00
|
||||||
|
#define TR_END_TO_END 0x01
|
||||||
|
#define TR_NO_END_TO_END 0x02
|
||||||
|
|
||||||
|
#define CLIP_NOT 0x00
|
||||||
|
#define CLIP_SUS 0x20
|
||||||
|
|
||||||
|
#define UP_P2P 0x00
|
||||||
|
#define UP_P2MP 0x01
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UCHAR BearerClass;
|
||||||
|
UCHAR TrafficType;
|
||||||
|
UCHAR TimingRequirements;
|
||||||
|
UCHAR ClippingSusceptability;
|
||||||
|
UCHAR UserPlaneConnectionConfig;
|
||||||
|
} ATM_BROADBAND_BEARER_CAPABILITY_IE;
|
||||||
|
|
||||||
|
typedef ATM_BHLI ATM_BHLI_IE;
|
||||||
|
|
||||||
|
#define BLLI_L2_MODE_NORMAL 0x40
|
||||||
|
#define BLLI_L2_MODE_EXT 0x80
|
||||||
|
|
||||||
|
#define BLLI_L3_MODE_NORMAL 0x40
|
||||||
|
#define BLLI_L3_MODE_EXT 0x80
|
||||||
|
|
||||||
|
#define BLLI_L3_PACKET_16 0x04
|
||||||
|
#define BLLI_L3_PACKET_32 0x05
|
||||||
|
#define BLLI_L3_PACKET_64 0x06
|
||||||
|
#define BLLI_L3_PACKET_128 0x07
|
||||||
|
#define BLLI_L3_PACKET_256 0x08
|
||||||
|
#define BLLI_L3_PACKET_512 0x09
|
||||||
|
#define BLLI_L3_PACKET_1024 0x0A
|
||||||
|
#define BLLI_L3_PACKET_2048 0x0B
|
||||||
|
#define BLLI_L3_PACKET_4096 0x0C
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
DWORD Layer2Protocol;
|
||||||
|
UCHAR Layer2Mode;
|
||||||
|
UCHAR Layer2WindowSize;
|
||||||
|
DWORD Layer2UserSpecifiedProtocol;
|
||||||
|
DWORD Layer3Protocol;
|
||||||
|
UCHAR Layer3Mode;
|
||||||
|
UCHAR Layer3DefaultPacketSize;
|
||||||
|
UCHAR Layer3PacketWindowSize;
|
||||||
|
DWORD Layer3UserSpecifiedProtocol;
|
||||||
|
DWORD Layer3IPI;
|
||||||
|
UCHAR SnapID[5];
|
||||||
|
} ATM_BLLI_IE;
|
||||||
|
|
||||||
|
typedef ATM_ADDRESS ATM_CALLED_PARTY_NUMBER_IE;
|
||||||
|
typedef ATM_ADDRESS ATM_CALLED_PARTY_SUBADDRESS_IE;
|
||||||
|
|
||||||
|
#define PI_ALLOWED 0x00
|
||||||
|
#define PI_RESTRICTED 0x40
|
||||||
|
#define PI_NUMBER_NOT_AVAILABLE 0x80
|
||||||
|
|
||||||
|
#define SI_USER_NOT_SCREENED 0x00
|
||||||
|
#define SI_USER_PASSED 0x01
|
||||||
|
#define SI_USER_FAILED 0x02
|
||||||
|
#define SI_NETWORK 0x03
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
ATM_ADDRESS ATM_Number;
|
||||||
|
UCHAR Presentation_Indication;
|
||||||
|
UCHAR Screening_Indicator;
|
||||||
|
} ATM_CALLING_PARTY_NUMBER_IE;
|
||||||
|
|
||||||
|
typedef ATM_ADDRESS ATM_CALLING_PARTY_SUBADDRESS_IE;
|
||||||
|
|
||||||
|
#define CAUSE_LOC_USER 0x00
|
||||||
|
#define CAUSE_LOC_PRIVATE_LOCAL 0x01
|
||||||
|
#define CAUSE_LOC_PUBLIC_LOCAL 0x02
|
||||||
|
#define CAUSE_LOC_TRANSIT_NETWORK 0x03
|
||||||
|
#define CAUSE_LOC_PUBLIC_REMOTE 0x04
|
||||||
|
#define CAUSE_LOC_PRIVATE_REMOTE 0x05
|
||||||
|
#define CAUSE_LOC_INTERNATIONAL_NETWORK 0x07
|
||||||
|
#define CAUSE_LOC_BEYOND_INTERWORKING 0x0A
|
||||||
|
|
||||||
|
#define CAUSE_UNALLOCATED_NUMBER 0x01
|
||||||
|
#define CAUSE_NO_ROUTE_TO_TRANSIT_NETWORK 0x02
|
||||||
|
#define CAUSE_NO_ROUTE_TO_DESTINATION 0x03
|
||||||
|
#define CAUSE_VPI_VCI_UNACCEPTABLE 0x0A
|
||||||
|
#define CAUSE_NORMAL_CALL_CLEARING 0x10
|
||||||
|
#define CAUSE_USER_BUSY 0x11
|
||||||
|
#define CAUSE_NO_USER_RESPONDING 0x12
|
||||||
|
#define CAUSE_CALL_REJECTED 0x15
|
||||||
|
#define CAUSE_NUMBER_CHANGED 0x16
|
||||||
|
#define CAUSE_USER_REJECTS_CLIR 0x17
|
||||||
|
#define CAUSE_DESTINATION_OUT_OF_ORDER 0x1B
|
||||||
|
#define CAUSE_INVALID_NUMBER_FORMAT 0x1C
|
||||||
|
#define CAUSE_STATUS_ENQUIRY_RESPONSE 0x1E
|
||||||
|
#define CAUSE_NORMAL_UNSPECIFIED 0x1F
|
||||||
|
#define CAUSE_VPI_VCI_UNAVAILABLE 0x23
|
||||||
|
#define CAUSE_NETWORK_OUT_OF_ORDER 0x26
|
||||||
|
#define CAUSE_TEMPORARY_FAILURE 0x29
|
||||||
|
#define CAUSE_ACCESS_INFORMAION_DISCARDED 0x2B
|
||||||
|
#define CAUSE_NO_VPI_VCI_AVAILABLE 0x2D
|
||||||
|
#define CAUSE_RESOURCE_UNAVAILABLE 0x2F
|
||||||
|
#define CAUSE_QOS_UNAVAILABLE 0x31
|
||||||
|
#define CAUSE_USER_CELL_RATE_UNAVAILABLE 0x33
|
||||||
|
#define CAUSE_BEARER_CAPABILITY_UNAUTHORIZED 0x39
|
||||||
|
#define CAUSE_BEARER_CAPABILITY_UNAVAILABLE 0x3A
|
||||||
|
#define CAUSE_OPTION_UNAVAILABLE 0x3F
|
||||||
|
#define CAUSE_BEARER_CAPABILITY_UNIMPLEMENTED 0x41
|
||||||
|
#define CAUSE_UNSUPPORTED_TRAFFIC_PARAMETERS 0x49
|
||||||
|
#define CAUSE_INVALID_CALL_REFERENCE 0x51
|
||||||
|
#define CAUSE_CHANNEL_NONEXISTENT 0x52
|
||||||
|
#define CAUSE_INCOMPATIBLE_DESTINATION 0x58
|
||||||
|
#define CAUSE_INVALID_ENDPOINT_REFERENCE 0x59
|
||||||
|
#define CAUSE_INVALID_TRANSIT_NETWORK_SELECTION 0x5B
|
||||||
|
#define CAUSE_TOO_MANY_PENDING_ADD_PARTY 0x5C
|
||||||
|
#define CAUSE_AAL_PARAMETERS_UNSUPPORTED 0x5D
|
||||||
|
#define CAUSE_MANDATORY_IE_MISSING 0x60
|
||||||
|
#define CAUSE_UNIMPLEMENTED_MESSAGE_TYPE 0x61
|
||||||
|
#define CAUSE_UNIMPLEMENTED_IE 0x63
|
||||||
|
#define CAUSE_INVALID_IE_CONTENTS 0x64
|
||||||
|
#define CAUSE_INVALID_STATE_FOR_MESSAGE 0x65
|
||||||
|
#define CAUSE_RECOVERY_ON_TIMEOUT 0x66
|
||||||
|
#define CAUSE_INCORRECT_MESSAGE_LENGTH 0x68
|
||||||
|
#define CAUSE_PROTOCOL_ERROR 0x6F
|
||||||
|
|
||||||
|
#define CAUSE_COND_UNKNOWN 0x00
|
||||||
|
#define CAUSE_COND_PERMANENT 0x01
|
||||||
|
#define CAUSE_COND_TRANSIENT 0x02
|
||||||
|
|
||||||
|
#define CAUSE_REASON_USER 0x00
|
||||||
|
#define CAUSE_REASON_IE_MISSING 0x04
|
||||||
|
#define CAUSE_REASON_IE_INSUFFICIENT 0x08
|
||||||
|
|
||||||
|
#define CAUSE_PU_PROVIDER 0x00
|
||||||
|
#define CAUSE_PU_USER 0x08
|
||||||
|
|
||||||
|
#define CAUSE_NA_NORMAL 0x00
|
||||||
|
#define CAUSE_NA_ABNORMAL 0x04
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UCHAR Location;
|
||||||
|
UCHAR Cause;
|
||||||
|
UCHAR DiagnosticsLength;
|
||||||
|
UCHAR Diagnostics[4];
|
||||||
|
} ATM_CAUSE_IE;
|
||||||
|
|
||||||
|
#define QOS_CLASS0 0x00
|
||||||
|
#define QOS_CLASS1 0x01
|
||||||
|
#define QOS_CLASS2 0x02
|
||||||
|
#define QOS_CLASS3 0x03
|
||||||
|
#define QOS_CLASS4 0x04
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UCHAR QOSClassForward;
|
||||||
|
UCHAR QOSClassBackward;
|
||||||
|
} ATM_QOS_CLASS_IE;
|
||||||
|
|
||||||
|
#define TNS_TYPE_NATIONAL 0x40
|
||||||
|
|
||||||
|
#define TNS_PLAN_CARRIER_ID_CODE 0x01
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UCHAR TypeOfNetworkId;
|
||||||
|
UCHAR NetworkIdPlan;
|
||||||
|
UCHAR NetworkIdLength;
|
||||||
|
UCHAR NetworkId[1];
|
||||||
|
} ATM_TRANSIT_NETWORK_SELECTION_IE;
|
||||||
|
|
||||||
|
#define SIO_GET_NUMBER_OF_ATM_DEVICES 0x50160001
|
||||||
|
#define SIO_GET_ATM_ADDRESS 0xd0160002
|
||||||
|
#define SIO_ASSOCIATE_PVC 0x90160003
|
||||||
|
#define SIO_GET_ATM_CONNECTION_ID 0x50160004
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
DWORD DeviceNumber;
|
||||||
|
DWORD VPI;
|
||||||
|
DWORD VCI;
|
||||||
|
} ATM_CONNECTION_ID;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
ATM_CONNECTION_ID PvcConnectionId;
|
||||||
|
QOS PvcQos;
|
||||||
|
} ATM_PVC_PARAMS;
|
||||||
|
|
||||||
|
#include <poppack.h>
|
||||||
|
#endif
|
65
reactos/lib/dnslib/addr.c
Normal file
65
reactos/lib/dnslib/addr.c
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
/*
|
||||||
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
|
* PROJECT: ReactOS DNS Shared Library
|
||||||
|
* FILE: lib/dnslib/addr.c
|
||||||
|
* PURPOSE: Contains the Address Family Information Tables
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* INCLUDES ******************************************************************/
|
||||||
|
#include "precomp.h"
|
||||||
|
|
||||||
|
/* DATA **********************************************************************/
|
||||||
|
|
||||||
|
DNS_FAMILY_INFO AddrFamilyTable[3] =
|
||||||
|
{
|
||||||
|
{
|
||||||
|
AF_INET,
|
||||||
|
DNS_TYPE_A,
|
||||||
|
sizeof(IP4_ADDRESS),
|
||||||
|
sizeof(SOCKADDR_IN),
|
||||||
|
FIELD_OFFSET(SOCKADDR_IN, sin_addr)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
AF_INET6,
|
||||||
|
DNS_TYPE_AAAA,
|
||||||
|
sizeof(IP6_ADDRESS),
|
||||||
|
sizeof(SOCKADDR_IN6),
|
||||||
|
FIELD_OFFSET(SOCKADDR_IN6, sin6_addr)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
AF_ATM,
|
||||||
|
DNS_TYPE_ATMA,
|
||||||
|
sizeof(ATM_ADDRESS),
|
||||||
|
sizeof(SOCKADDR_ATM),
|
||||||
|
FIELD_OFFSET(SOCKADDR_ATM, satm_number)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
|
PDNS_FAMILY_INFO
|
||||||
|
WINAPI
|
||||||
|
FamilyInfo_GetForFamily(IN WORD AddressFamily)
|
||||||
|
{
|
||||||
|
/* Check which family this is */
|
||||||
|
switch (AddressFamily)
|
||||||
|
{
|
||||||
|
case AF_INET:
|
||||||
|
/* Return IPv4 Family Info */
|
||||||
|
return &AddrFamilyTable[0];
|
||||||
|
|
||||||
|
case AF_INET6:
|
||||||
|
/* Return IPv6 Family Info */
|
||||||
|
return &AddrFamilyTable[1];
|
||||||
|
|
||||||
|
case AF_ATM:
|
||||||
|
/* Return ATM Family Info */
|
||||||
|
return &AddrFamilyTable[2];
|
||||||
|
|
||||||
|
default:
|
||||||
|
/* Invalid family */
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
14
reactos/lib/dnslib/debug.c
Normal file
14
reactos/lib/dnslib/debug.c
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
/*
|
||||||
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
|
* PROJECT: ReactOS DNS Shared Library
|
||||||
|
* FILE: lib/dnslib/debug.c
|
||||||
|
* PURPOSE: Contains helpful debugging functions for DNSLIB structures.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* INCLUDES ******************************************************************/
|
||||||
|
#include "precomp.h"
|
||||||
|
|
||||||
|
/* DATA **********************************************************************/
|
||||||
|
|
||||||
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
200
reactos/lib/dnslib/dnsaddr.c
Normal file
200
reactos/lib/dnslib/dnsaddr.c
Normal file
|
@ -0,0 +1,200 @@
|
||||||
|
/*
|
||||||
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
|
* PROJECT: ReactOS DNS Shared Library
|
||||||
|
* FILE: lib/dnslib/dnsaddr.c
|
||||||
|
* PURPOSE: Functions dealing with DNS_ADDRESS and DNS_ARRAY addresses.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* INCLUDES ******************************************************************/
|
||||||
|
#include "precomp.h"
|
||||||
|
|
||||||
|
/* DATA **********************************************************************/
|
||||||
|
|
||||||
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
|
PDNS_ARRAY
|
||||||
|
WINAPI
|
||||||
|
DnsAddrArray_Create(ULONG Count)
|
||||||
|
{
|
||||||
|
PDNS_ARRAY DnsAddrArray;
|
||||||
|
|
||||||
|
/* Allocate space for the array and the addresses within it */
|
||||||
|
DnsAddrArray = Dns_AllocZero(sizeof(DNS_ARRAY) +
|
||||||
|
(Count * sizeof(DNS_ADDRESS)));
|
||||||
|
|
||||||
|
/* Write the allocated address count */
|
||||||
|
if (DnsAddrArray) DnsAddrArray->AllocatedAddresses = Count;
|
||||||
|
|
||||||
|
/* Return it */
|
||||||
|
return DnsAddrArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
WINAPI
|
||||||
|
DnsAddrArray_Free(IN PDNS_ARRAY DnsAddrArray)
|
||||||
|
{
|
||||||
|
/* Just free the entire array */
|
||||||
|
Dns_Free(DnsAddrArray);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL
|
||||||
|
WINAPI
|
||||||
|
DnsAddrArray_AddIp4(IN PDNS_ARRAY DnsAddrArray,
|
||||||
|
IN IN_ADDR Address,
|
||||||
|
IN DWORD AddressType)
|
||||||
|
{
|
||||||
|
DNS_ADDRESS DnsAddress;
|
||||||
|
|
||||||
|
/* Build the DNS Address */
|
||||||
|
DnsAddr_BuildFromIp4(&DnsAddress, Address, 0);
|
||||||
|
|
||||||
|
/* Add it to the array */
|
||||||
|
return DnsAddrArray_AddAddr(DnsAddrArray, &DnsAddress, 0, AddressType);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL
|
||||||
|
WINAPI
|
||||||
|
DnsAddrArray_AddAddr(IN PDNS_ARRAY DnsAddrArray,
|
||||||
|
IN PDNS_ADDRESS DnsAddress,
|
||||||
|
IN WORD AddressFamily OPTIONAL,
|
||||||
|
IN DWORD AddressType OPTIONAL)
|
||||||
|
{
|
||||||
|
/* Make sure we have an array */
|
||||||
|
if (!DnsAddrArray) return FALSE;
|
||||||
|
|
||||||
|
/* Check if we should validate the Address Family */
|
||||||
|
if (AddressFamily)
|
||||||
|
{
|
||||||
|
/* Validate it */
|
||||||
|
if (AddressFamily != DnsAddress->AddressFamily) return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if we should validate the Address Type */
|
||||||
|
if (AddressType)
|
||||||
|
{
|
||||||
|
/* Make sure that this array contains this type of addresses */
|
||||||
|
if (!DnsAddrArray_ContainsAddr(DnsAddrArray, DnsAddress, AddressType))
|
||||||
|
{
|
||||||
|
/* Won't be adding it */
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Make sure we have space in the array */
|
||||||
|
if (DnsAddrArray->AllocatedAddresses < DnsAddrArray->UsedAddresses)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now add the address */
|
||||||
|
RtlCopyMemory(&DnsAddrArray->Addresses[DnsAddrArray->UsedAddresses],
|
||||||
|
DnsAddress,
|
||||||
|
sizeof(DNS_ADDRESS));
|
||||||
|
|
||||||
|
/* Return success */
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
WINAPI
|
||||||
|
DnsAddr_BuildFromIp4(IN PDNS_ADDRESS DnsAddress,
|
||||||
|
IN IN_ADDR Address,
|
||||||
|
IN WORD Port)
|
||||||
|
{
|
||||||
|
/* Clear the address */
|
||||||
|
RtlZeroMemory(DnsAddress, sizeof(DNS_ADDRESS));
|
||||||
|
|
||||||
|
/* Write data */
|
||||||
|
DnsAddress->Ip4Address.sin_family = AF_INET;
|
||||||
|
DnsAddress->Ip4Address.sin_port = Port;
|
||||||
|
DnsAddress->Ip4Address.sin_addr = Address;
|
||||||
|
DnsAddress->AddressLength = sizeof(SOCKADDR_IN);
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
WINAPI
|
||||||
|
DnsAddr_BuildFromIp6(IN PDNS_ADDRESS DnsAddress,
|
||||||
|
IN PIN6_ADDR Address,
|
||||||
|
IN ULONG ScopeId,
|
||||||
|
IN WORD Port)
|
||||||
|
{
|
||||||
|
/* Clear the address */
|
||||||
|
RtlZeroMemory(DnsAddress, sizeof(DNS_ADDRESS));
|
||||||
|
|
||||||
|
/* Write data */
|
||||||
|
DnsAddress->Ip6Address.sin6_family = AF_INET6;
|
||||||
|
DnsAddress->Ip6Address.sin6_port = Port;
|
||||||
|
DnsAddress->Ip6Address.sin6_addr = *Address;
|
||||||
|
DnsAddress->Ip6Address.sin6_scope_id = ScopeId;
|
||||||
|
DnsAddress->AddressLength = sizeof(SOCKADDR_IN6);
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
WINAPI
|
||||||
|
DnsAddr_BuildFromAtm(IN PDNS_ADDRESS DnsAddress,
|
||||||
|
IN DWORD AddressType,
|
||||||
|
IN PVOID AddressData)
|
||||||
|
{
|
||||||
|
ATM_ADDRESS Address;
|
||||||
|
|
||||||
|
/* Clear the address */
|
||||||
|
RtlZeroMemory(DnsAddress, sizeof(DNS_ADDRESS));
|
||||||
|
|
||||||
|
/* Build an ATM Address */
|
||||||
|
Address.AddressType = AddressType;
|
||||||
|
Address.NumofDigits = DNS_ATMA_MAX_ADDR_LENGTH;
|
||||||
|
RtlCopyMemory(&Address.Addr, AddressData, DNS_ATMA_MAX_ADDR_LENGTH);
|
||||||
|
|
||||||
|
/* Write data */
|
||||||
|
DnsAddress->AtmAddress = Address;
|
||||||
|
DnsAddress->AddressLength = sizeof(ATM_ADDRESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOLEAN
|
||||||
|
WINAPI
|
||||||
|
DnsAddr_BuildFromDnsRecord(IN PDNS_RECORD DnsRecord,
|
||||||
|
OUT PDNS_ADDRESS DnsAddr)
|
||||||
|
{
|
||||||
|
/* Check what kind of record this is */
|
||||||
|
switch(DnsRecord->wType)
|
||||||
|
{
|
||||||
|
/* IPv4 */
|
||||||
|
case DNS_TYPE_A:
|
||||||
|
/* Create the DNS Address */
|
||||||
|
DnsAddr_BuildFromIp4(DnsAddr,
|
||||||
|
*(PIN_ADDR)&DnsRecord->Data.A.IpAddress,
|
||||||
|
0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* IPv6 */
|
||||||
|
case DNS_TYPE_AAAA:
|
||||||
|
/* Create the DNS Address */
|
||||||
|
DnsAddr_BuildFromIp6(DnsAddr,
|
||||||
|
(PIN6_ADDR)&DnsRecord->Data.AAAA.Ip6Address,
|
||||||
|
DnsRecord->dwReserved,
|
||||||
|
0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* ATM */
|
||||||
|
case DNS_TYPE_ATMA:
|
||||||
|
/* Create the DNS Address */
|
||||||
|
DnsAddr_BuildFromAtm(DnsAddr,
|
||||||
|
DnsRecord->Data.Atma.AddressType,
|
||||||
|
&DnsRecord->Data.Atma.Address);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Done! */
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL
|
||||||
|
WINAPI
|
||||||
|
DnsAddrArray_ContainsAddr(IN PDNS_ARRAY DnsAddrArray,
|
||||||
|
IN PDNS_ADDRESS DnsAddress,
|
||||||
|
IN DWORD AddressType)
|
||||||
|
{
|
||||||
|
/* FIXME */
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
22
reactos/lib/dnslib/dnslib.rbuild
Normal file
22
reactos/lib/dnslib/dnslib.rbuild
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
|
||||||
|
<module name="dnslib" type="staticlibrary" unicode="yes">
|
||||||
|
<include base="dnslib">inc</include>
|
||||||
|
<file>addr.c</file>
|
||||||
|
<file>debug.c</file>
|
||||||
|
<file>dnsaddr.c</file>
|
||||||
|
<file>dnsutil.c</file>
|
||||||
|
<file>flatbuf.c</file>
|
||||||
|
<file>hostent.c</file>
|
||||||
|
<file>ip6.c</file>
|
||||||
|
<file>memory.c</file>
|
||||||
|
<file>name.c</file>
|
||||||
|
<file>print.c</file>
|
||||||
|
<file>record.c</file>
|
||||||
|
<file>rrprint.c</file>
|
||||||
|
<file>sablob.c</file>
|
||||||
|
<file>straddr.c</file>
|
||||||
|
<file>string.c</file>
|
||||||
|
<file>table.c</file>
|
||||||
|
<file>utf8.c</file>
|
||||||
|
</module>
|
14
reactos/lib/dnslib/dnsutil.c
Normal file
14
reactos/lib/dnslib/dnsutil.c
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
/*
|
||||||
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
|
* PROJECT: ReactOS DNS Shared Library
|
||||||
|
* FILE: lib/dnslib/dnsutil.c
|
||||||
|
* PURPOSE: Contains misc. DNS utility functions, like DNS_STATUS->String.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* INCLUDES ******************************************************************/
|
||||||
|
#include "precomp.h"
|
||||||
|
|
||||||
|
/* DATA **********************************************************************/
|
||||||
|
|
||||||
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
116
reactos/lib/dnslib/flatbuf.c
Normal file
116
reactos/lib/dnslib/flatbuf.c
Normal file
|
@ -0,0 +1,116 @@
|
||||||
|
/*
|
||||||
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
|
* PROJECT: ReactOS DNS Shared Library
|
||||||
|
* FILE: lib/dnslib/flatbuf.c
|
||||||
|
* PURPOSE: Functions for managing the Flat Buffer Implementation (FLATBUF)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* INCLUDES ******************************************************************/
|
||||||
|
#include "precomp.h"
|
||||||
|
|
||||||
|
/* DATA **********************************************************************/
|
||||||
|
|
||||||
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
|
VOID
|
||||||
|
WINAPI
|
||||||
|
FlatBuf_Init(IN PFLATBUFF FlatBuffer,
|
||||||
|
IN PVOID Buffer,
|
||||||
|
IN SIZE_T Size)
|
||||||
|
{
|
||||||
|
/* Set up the Flat Buffer start, current and ending position */
|
||||||
|
FlatBuffer->Buffer = Buffer;
|
||||||
|
FlatBuffer->BufferPos = (ULONG_PTR)Buffer;
|
||||||
|
FlatBuffer->BufferEnd = (PVOID)(FlatBuffer->BufferPos + Size);
|
||||||
|
|
||||||
|
/* Setup the current size and the available size */
|
||||||
|
FlatBuffer->BufferSize = FlatBuffer->BufferFreeSize = Size;
|
||||||
|
}
|
||||||
|
|
||||||
|
PVOID
|
||||||
|
WINAPI
|
||||||
|
FlatBuf_Arg_Reserve(IN OUT PULONG_PTR Position,
|
||||||
|
IN OUT PSIZE_T FreeSize,
|
||||||
|
IN SIZE_T Size,
|
||||||
|
IN ULONG Align)
|
||||||
|
{
|
||||||
|
ULONG_PTR NewPosition, OldPosition = *Position;
|
||||||
|
SIZE_T NewFreeSize = *FreeSize;
|
||||||
|
|
||||||
|
/* Start by aligning our position */
|
||||||
|
if (Align) OldPosition += (Align - 1) & ~Align;
|
||||||
|
|
||||||
|
/* Update it */
|
||||||
|
NewPosition = OldPosition + Size;
|
||||||
|
|
||||||
|
/* Update Free Size */
|
||||||
|
NewFreeSize += (OldPosition - NewPosition);
|
||||||
|
|
||||||
|
/* Save new values */
|
||||||
|
*Position = NewPosition;
|
||||||
|
*FreeSize = NewFreeSize;
|
||||||
|
|
||||||
|
/* Check if we're out of space or not */
|
||||||
|
if (NewFreeSize > 0) return (PVOID)OldPosition;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
PVOID
|
||||||
|
WINAPI
|
||||||
|
FlatBuf_Arg_CopyMemory(IN OUT PULONG_PTR Position,
|
||||||
|
IN OUT PSIZE_T FreeSize,
|
||||||
|
IN PVOID Buffer,
|
||||||
|
IN SIZE_T Size,
|
||||||
|
IN ULONG Align)
|
||||||
|
{
|
||||||
|
PVOID Destination;
|
||||||
|
|
||||||
|
/* First reserve the memory */
|
||||||
|
Destination = FlatBuf_Arg_Reserve(Position, FreeSize, Size, Align);
|
||||||
|
if (Destination)
|
||||||
|
{
|
||||||
|
/* We have space, do the copy */
|
||||||
|
RtlCopyMemory(Destination, Buffer, Size);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return the pointer to the data */
|
||||||
|
return Destination;
|
||||||
|
}
|
||||||
|
|
||||||
|
PVOID
|
||||||
|
WINAPI
|
||||||
|
FlatBuf_Arg_WriteString(IN OUT PULONG_PTR Position,
|
||||||
|
IN OUT PSIZE_T FreeSize,
|
||||||
|
IN PVOID String,
|
||||||
|
IN BOOLEAN IsUnicode)
|
||||||
|
{
|
||||||
|
PVOID Destination;
|
||||||
|
SIZE_T StringLength;
|
||||||
|
ULONG Align;
|
||||||
|
|
||||||
|
/* Calculate the string length */
|
||||||
|
if (IsUnicode)
|
||||||
|
{
|
||||||
|
/* Get the length in bytes and use WCHAR alignment */
|
||||||
|
StringLength = (wcslen((LPWSTR)String) + 1) * sizeof(WCHAR);
|
||||||
|
Align = sizeof(WCHAR);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Get the length in bytes and use CHAR alignment */
|
||||||
|
StringLength = strlen((LPSTR)String) + 1;
|
||||||
|
Align = sizeof(CHAR);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now reserve the memory */
|
||||||
|
Destination = FlatBuf_Arg_Reserve(Position, FreeSize, StringLength, Align);
|
||||||
|
if (Destination)
|
||||||
|
{
|
||||||
|
/* We have space, do the copy */
|
||||||
|
RtlCopyMemory(Destination, String, StringLength);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return the pointer to the data */
|
||||||
|
return Destination;
|
||||||
|
}
|
||||||
|
|
97
reactos/lib/dnslib/hostent.c
Normal file
97
reactos/lib/dnslib/hostent.c
Normal file
|
@ -0,0 +1,97 @@
|
||||||
|
/*
|
||||||
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
|
* PROJECT: ReactOS DNS Shared Library
|
||||||
|
* FILE: lib/dnslib/hostent.c
|
||||||
|
* PURPOSE: Functions for dealing with Host Entry structures
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* INCLUDES ******************************************************************/
|
||||||
|
#include "precomp.h"
|
||||||
|
|
||||||
|
/* DATA **********************************************************************/
|
||||||
|
|
||||||
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
|
PHOSTENT
|
||||||
|
WINAPI
|
||||||
|
Hostent_Init(IN PVOID *Buffer,
|
||||||
|
IN WORD AddressFamily,
|
||||||
|
IN ULONG AddressSize,
|
||||||
|
IN ULONG AddressCount,
|
||||||
|
IN ULONG AliasCount)
|
||||||
|
{
|
||||||
|
PHOSTENT Hostent;
|
||||||
|
ULONG_PTR BufferPosition = (ULONG_PTR)*Buffer;
|
||||||
|
|
||||||
|
/* Align the hostent on the buffer's 4 byte boundary */
|
||||||
|
BufferPosition += 3 & ~3;
|
||||||
|
|
||||||
|
/* Set up the basic data */
|
||||||
|
Hostent = (PHOSTENT)BufferPosition;
|
||||||
|
Hostent->h_length = (WORD)AddressSize;
|
||||||
|
Hostent->h_addrtype = AddressFamily;
|
||||||
|
|
||||||
|
/* Put aliases after Hostent */
|
||||||
|
Hostent->h_aliases = (PCHAR*)((ULONG_PTR)(Hostent + 1) & ~3);
|
||||||
|
|
||||||
|
/* Zero it out */
|
||||||
|
RtlZeroMemory(Hostent->h_aliases, AliasCount * sizeof(PCHAR));
|
||||||
|
|
||||||
|
/* Put addresses after aliases */
|
||||||
|
Hostent->h_addr_list = (PCHAR*)
|
||||||
|
((ULONG_PTR)Hostent->h_aliases +
|
||||||
|
(AliasCount * sizeof(PCHAR)) + sizeof(PCHAR));
|
||||||
|
|
||||||
|
/* Update the location */
|
||||||
|
BufferPosition = (ULONG_PTR)Hostent->h_addr_list +
|
||||||
|
((AddressCount * sizeof(PCHAR)) + sizeof(PCHAR));
|
||||||
|
|
||||||
|
/* Send it back */
|
||||||
|
*Buffer = (PVOID)BufferPosition;
|
||||||
|
|
||||||
|
/* Return the hostent */
|
||||||
|
return Hostent;
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
WINAPI
|
||||||
|
Dns_PtrArrayToOffsetArray(PCHAR *List,
|
||||||
|
ULONG_PTR Base)
|
||||||
|
{
|
||||||
|
/* Loop every pointer in the list */
|
||||||
|
do
|
||||||
|
{
|
||||||
|
/* Update the pointer */
|
||||||
|
*List = (PCHAR)((ULONG_PTR)*List - Base);
|
||||||
|
} while(*List++);
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
WINAPI
|
||||||
|
Hostent_ConvertToOffsets(IN PHOSTENT Hostent)
|
||||||
|
{
|
||||||
|
/* Do we have a name? */
|
||||||
|
if (Hostent->h_name)
|
||||||
|
{
|
||||||
|
/* Update it */
|
||||||
|
Hostent->h_name -= (ULONG_PTR)Hostent;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Do we have aliases? */
|
||||||
|
if (Hostent->h_aliases)
|
||||||
|
{
|
||||||
|
/* Update the pointer */
|
||||||
|
Hostent->h_aliases -= (ULONG_PTR)Hostent;
|
||||||
|
|
||||||
|
/* Fix them up */
|
||||||
|
Dns_PtrArrayToOffsetArray(Hostent->h_aliases, (ULONG_PTR)Hostent);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Do we have addresses? */
|
||||||
|
if (Hostent->h_addr_list)
|
||||||
|
{
|
||||||
|
/* Fix them up */
|
||||||
|
Dns_PtrArrayToOffsetArray(Hostent->h_addr_list, (ULONG_PTR)Hostent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
343
reactos/lib/dnslib/inc/dnslib.h
Normal file
343
reactos/lib/dnslib/inc/dnslib.h
Normal file
|
@ -0,0 +1,343 @@
|
||||||
|
/*
|
||||||
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
|
* PROJECT: ReactOS Ancillary Function Driver DLL
|
||||||
|
* FILE: include/mswsock.h
|
||||||
|
* PURPOSE: Ancillary Function Driver DLL header
|
||||||
|
*/
|
||||||
|
#ifndef __DNSLIB_H
|
||||||
|
#define __DNSLIB_H
|
||||||
|
|
||||||
|
/* INCLUDES ******************************************************************/
|
||||||
|
#include <ws2atm.h>
|
||||||
|
|
||||||
|
/* ENUMERATIONS **************************************************************/
|
||||||
|
|
||||||
|
typedef enum _DNS_STRING_TYPE
|
||||||
|
{
|
||||||
|
UnicodeString = 1,
|
||||||
|
Utf8String,
|
||||||
|
AnsiString,
|
||||||
|
} DNS_STRING_TYPE;
|
||||||
|
|
||||||
|
#define IpV4Address 3
|
||||||
|
|
||||||
|
/* TYPES *********************************************************************/
|
||||||
|
|
||||||
|
typedef struct _DNS_IPV6_ADDRESS
|
||||||
|
{
|
||||||
|
ULONG Unknown;
|
||||||
|
ULONG Unknown2;
|
||||||
|
IP6_ADDRESS Address;
|
||||||
|
ULONG Unknown3;
|
||||||
|
ULONG Unknown4;
|
||||||
|
DWORD Reserved;
|
||||||
|
ULONG Unknown5;
|
||||||
|
} DNS_IPV6_ADDRESS, *PDNS_IPV6_ADDRESS;
|
||||||
|
|
||||||
|
typedef struct _DNS_ADDRESS
|
||||||
|
{
|
||||||
|
union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
WORD AddressFamily;
|
||||||
|
WORD Port;
|
||||||
|
ATM_ADDRESS AtmAddress;
|
||||||
|
};
|
||||||
|
SOCKADDR_IN Ip4Address;
|
||||||
|
SOCKADDR_IN6 Ip6Address;
|
||||||
|
};
|
||||||
|
ULONG AddressLength;
|
||||||
|
DWORD Sub;
|
||||||
|
ULONG Flag;
|
||||||
|
} DNS_ADDRESS, *PDNS_ADDRESS;
|
||||||
|
|
||||||
|
typedef struct _DNS_ARRAY
|
||||||
|
{
|
||||||
|
ULONG AllocatedAddresses;
|
||||||
|
ULONG UsedAddresses;
|
||||||
|
ULONG Unknown[0x6];
|
||||||
|
DNS_ADDRESS Addresses[1];
|
||||||
|
} DNS_ARRAY, *PDNS_ARRAY;
|
||||||
|
|
||||||
|
typedef struct _DNS_BLOB
|
||||||
|
{
|
||||||
|
LPWSTR Name;
|
||||||
|
PDNS_ARRAY DnsAddrArray;
|
||||||
|
PHOSTENT Hostent;
|
||||||
|
ULONG AliasCount;
|
||||||
|
ULONG Unknown;
|
||||||
|
LPWSTR Aliases[8];
|
||||||
|
} DNS_BLOB, *PDNS_BLOB;
|
||||||
|
|
||||||
|
typedef struct _DNS_FAMILY_INFO
|
||||||
|
{
|
||||||
|
WORD AddrType;
|
||||||
|
WORD DnsType;
|
||||||
|
DWORD AddressSize;
|
||||||
|
DWORD SockaddrSize;
|
||||||
|
DWORD AddressOffset;
|
||||||
|
} DNS_FAMILY_INFO, *PDNS_FAMILY_INFO;
|
||||||
|
|
||||||
|
typedef struct _FLATBUFF
|
||||||
|
{
|
||||||
|
PVOID Buffer;
|
||||||
|
PVOID BufferEnd;
|
||||||
|
ULONG_PTR BufferPos;
|
||||||
|
SIZE_T BufferSize;
|
||||||
|
SIZE_T BufferFreeSize;
|
||||||
|
} FLATBUFF, *PFLATBUFF;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* memory.c
|
||||||
|
*/
|
||||||
|
VOID
|
||||||
|
WINAPI
|
||||||
|
Dns_Free(IN PVOID Address);
|
||||||
|
|
||||||
|
PVOID
|
||||||
|
WINAPI
|
||||||
|
Dns_AllocZero(IN SIZE_T Size);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* addr.c
|
||||||
|
*/
|
||||||
|
PDNS_FAMILY_INFO
|
||||||
|
WINAPI
|
||||||
|
FamilyInfo_GetForFamily(IN WORD AddressFamily);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* dnsaddr.c
|
||||||
|
*/
|
||||||
|
VOID
|
||||||
|
WINAPI
|
||||||
|
DnsAddr_BuildFromIp4(
|
||||||
|
IN PDNS_ADDRESS DnsAddress,
|
||||||
|
IN IN_ADDR Address,
|
||||||
|
IN WORD Unknown
|
||||||
|
);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
WINAPI
|
||||||
|
DnsAddr_BuildFromIp6(
|
||||||
|
IN PDNS_ADDRESS DnsAddress,
|
||||||
|
IN PIN6_ADDR Address,
|
||||||
|
IN ULONG ScopeId,
|
||||||
|
IN WORD Port
|
||||||
|
);
|
||||||
|
|
||||||
|
PDNS_ARRAY
|
||||||
|
WINAPI
|
||||||
|
DnsAddrArray_Create(ULONG Count);
|
||||||
|
|
||||||
|
BOOL
|
||||||
|
WINAPI
|
||||||
|
DnsAddrArray_AddAddr(
|
||||||
|
IN PDNS_ARRAY DnsAddrArray,
|
||||||
|
IN PDNS_ADDRESS DnsAddress,
|
||||||
|
IN WORD AddressFamily OPTIONAL,
|
||||||
|
IN DWORD AddressType OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
WINAPI
|
||||||
|
DnsAddrArray_Free(IN PDNS_ARRAY DnsAddrArray);
|
||||||
|
|
||||||
|
BOOL
|
||||||
|
WINAPI
|
||||||
|
DnsAddrArray_AddIp4(
|
||||||
|
IN PDNS_ARRAY DnsAddrArray,
|
||||||
|
IN IN_ADDR Address,
|
||||||
|
IN DWORD AddressType
|
||||||
|
);
|
||||||
|
|
||||||
|
BOOL
|
||||||
|
WINAPI
|
||||||
|
DnsAddrArray_ContainsAddr(
|
||||||
|
IN PDNS_ARRAY DnsAddrArray,
|
||||||
|
IN PDNS_ADDRESS DnsAddress,
|
||||||
|
IN DWORD AddressType
|
||||||
|
);
|
||||||
|
|
||||||
|
BOOLEAN
|
||||||
|
WINAPI
|
||||||
|
DnsAddr_BuildFromDnsRecord(
|
||||||
|
IN PDNS_RECORD DnsRecord,
|
||||||
|
OUT PDNS_ADDRESS DnsAddr
|
||||||
|
);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* hostent.c
|
||||||
|
*/
|
||||||
|
PHOSTENT
|
||||||
|
WINAPI
|
||||||
|
Hostent_Init(
|
||||||
|
IN PVOID *Buffer,
|
||||||
|
IN WORD AddressFamily,
|
||||||
|
IN ULONG AddressSize,
|
||||||
|
IN ULONG AddressCount,
|
||||||
|
IN ULONG AliasCount
|
||||||
|
);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
WINAPI
|
||||||
|
Hostent_ConvertToOffsets(IN PHOSTENT Hostent);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* flatbuf.c
|
||||||
|
*/
|
||||||
|
VOID
|
||||||
|
WINAPI
|
||||||
|
FlatBuf_Init(
|
||||||
|
IN PFLATBUFF FlatBuffer,
|
||||||
|
IN PVOID Buffer,
|
||||||
|
IN SIZE_T Size
|
||||||
|
);
|
||||||
|
|
||||||
|
PVOID
|
||||||
|
WINAPI
|
||||||
|
FlatBuf_Arg_CopyMemory(
|
||||||
|
IN OUT PULONG_PTR Position,
|
||||||
|
IN OUT PSIZE_T FreeSize,
|
||||||
|
IN PVOID Buffer,
|
||||||
|
IN SIZE_T Size,
|
||||||
|
IN ULONG Align
|
||||||
|
);
|
||||||
|
|
||||||
|
PVOID
|
||||||
|
WINAPI
|
||||||
|
FlatBuf_Arg_Reserve(
|
||||||
|
IN OUT PULONG_PTR Position,
|
||||||
|
IN OUT PSIZE_T FreeSize,
|
||||||
|
IN SIZE_T Size,
|
||||||
|
IN ULONG Align
|
||||||
|
);
|
||||||
|
|
||||||
|
PVOID
|
||||||
|
WINAPI
|
||||||
|
FlatBuf_Arg_WriteString(
|
||||||
|
IN OUT PULONG_PTR Position,
|
||||||
|
IN OUT PSIZE_T FreeSize,
|
||||||
|
IN PVOID String,
|
||||||
|
IN BOOLEAN IsUnicode
|
||||||
|
);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* sablob.c
|
||||||
|
*/
|
||||||
|
PDNS_BLOB
|
||||||
|
WINAPI
|
||||||
|
SaBlob_Create(
|
||||||
|
IN ULONG Count
|
||||||
|
);
|
||||||
|
|
||||||
|
PDNS_BLOB
|
||||||
|
WINAPI
|
||||||
|
SaBlob_CreateFromIp4(
|
||||||
|
IN LPWSTR Name,
|
||||||
|
IN ULONG Count,
|
||||||
|
IN PIN_ADDR AddressArray
|
||||||
|
);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
WINAPI
|
||||||
|
SaBlob_Free(IN PDNS_BLOB Blob);
|
||||||
|
|
||||||
|
PHOSTENT
|
||||||
|
WINAPI
|
||||||
|
SaBlob_CreateHostent(
|
||||||
|
IN OUT PULONG_PTR BufferPosition,
|
||||||
|
IN OUT PSIZE_T RemainingBufferSpace,
|
||||||
|
IN OUT PSIZE_T HostEntrySize,
|
||||||
|
IN PDNS_BLOB Blob,
|
||||||
|
IN DWORD StringType,
|
||||||
|
IN BOOLEAN Relative,
|
||||||
|
IN BOOLEAN BufferAllocated
|
||||||
|
);
|
||||||
|
|
||||||
|
INT
|
||||||
|
WINAPI
|
||||||
|
SaBlob_WriteNameOrAlias(
|
||||||
|
IN PDNS_BLOB Blob,
|
||||||
|
IN LPWSTR String,
|
||||||
|
IN BOOLEAN IsAlias
|
||||||
|
);
|
||||||
|
|
||||||
|
PDNS_BLOB
|
||||||
|
WINAPI
|
||||||
|
SaBlob_Query(
|
||||||
|
IN LPWSTR Name,
|
||||||
|
IN WORD DnsType,
|
||||||
|
IN ULONG Flags,
|
||||||
|
IN PVOID *Reserved,
|
||||||
|
IN DWORD AddressFamily
|
||||||
|
);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* string.c
|
||||||
|
*/
|
||||||
|
ULONG
|
||||||
|
WINAPI
|
||||||
|
Dns_StringCopy(
|
||||||
|
OUT PVOID Destination,
|
||||||
|
IN OUT PULONG DestinationSize,
|
||||||
|
IN PVOID String,
|
||||||
|
IN ULONG StringSize OPTIONAL,
|
||||||
|
IN DWORD InputType,
|
||||||
|
IN DWORD OutputType
|
||||||
|
);
|
||||||
|
|
||||||
|
LPWSTR
|
||||||
|
WINAPI
|
||||||
|
Dns_CreateStringCopy_W(IN LPWSTR Name);
|
||||||
|
|
||||||
|
ULONG
|
||||||
|
WINAPI
|
||||||
|
Dns_GetBufferLengthForStringCopy(
|
||||||
|
IN PVOID String,
|
||||||
|
IN ULONG Size OPTIONAL,
|
||||||
|
IN DWORD InputType,
|
||||||
|
IN DWORD OutputType
|
||||||
|
);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* straddr.c
|
||||||
|
*/
|
||||||
|
BOOLEAN
|
||||||
|
WINAPI
|
||||||
|
Dns_StringToAddressW(
|
||||||
|
OUT PVOID Address,
|
||||||
|
IN OUT PULONG AddressSize,
|
||||||
|
IN LPWSTR AddressName,
|
||||||
|
IN OUT PDWORD AddressFamily
|
||||||
|
);
|
||||||
|
|
||||||
|
LPWSTR
|
||||||
|
WINAPI
|
||||||
|
Dns_Ip4AddressToReverseName_W(
|
||||||
|
OUT LPWSTR Name,
|
||||||
|
IN IN_ADDR Address
|
||||||
|
);
|
||||||
|
|
||||||
|
LPWSTR
|
||||||
|
WINAPI
|
||||||
|
Dns_Ip6AddressToReverseName_W(
|
||||||
|
OUT LPWSTR Name,
|
||||||
|
IN IN6_ADDR Address
|
||||||
|
);
|
||||||
|
|
||||||
|
BOOLEAN
|
||||||
|
WINAPI
|
||||||
|
Dns_ReverseNameToDnsAddr_W(
|
||||||
|
OUT PDNS_ADDRESS DnsAddr,
|
||||||
|
IN LPWSTR Name
|
||||||
|
);
|
||||||
|
|
||||||
|
BOOLEAN
|
||||||
|
WINAPI
|
||||||
|
Dns_Ip4ReverseNameToAddress_W(
|
||||||
|
OUT PIN_ADDR Address,
|
||||||
|
IN LPWSTR Name
|
||||||
|
);
|
||||||
|
|
||||||
|
#endif
|
24
reactos/lib/dnslib/inc/precomp.h
Normal file
24
reactos/lib/dnslib/inc/precomp.h
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
/*
|
||||||
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
|
* PROJECT: ReactOS DNS Shared Library
|
||||||
|
* FILE: lib/dnslib/precomp.h
|
||||||
|
* PURPOSE: DNSLIB Precompiled Header
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define _CRT_SECURE_NO_DEPRECATE
|
||||||
|
#define _WIN32_WINNT 0x502
|
||||||
|
#define WIN32_NO_STATUS
|
||||||
|
|
||||||
|
/* PSDK Headers */
|
||||||
|
#include <winsock2.h>
|
||||||
|
#include <ws2tcpip.h>
|
||||||
|
#include <windns.h>
|
||||||
|
|
||||||
|
/* DNSLIB and DNSAPI Headers */
|
||||||
|
#include <dnslib.h>
|
||||||
|
#include <windnsp.h>
|
||||||
|
|
||||||
|
/* NDK */
|
||||||
|
#include <rtlfuncs.h>
|
||||||
|
|
||||||
|
/* EOF */
|
28
reactos/lib/dnslib/inc/windnsp.h
Normal file
28
reactos/lib/dnslib/inc/windnsp.h
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
/*
|
||||||
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
|
* PROJECT: ReactOS DNSAPI Header
|
||||||
|
* FILE: include/libs/dns/windnsp.h
|
||||||
|
* PURPOSE: DNSLIB Precompiled Header
|
||||||
|
*/
|
||||||
|
|
||||||
|
PVOID
|
||||||
|
WINAPI
|
||||||
|
DnsApiAlloc(
|
||||||
|
IN DWORD Size
|
||||||
|
);
|
||||||
|
|
||||||
|
PVOID
|
||||||
|
WINAPI
|
||||||
|
DnsQueryConfigAllocEx(
|
||||||
|
IN DNS_CONFIG_TYPE Config,
|
||||||
|
OUT PVOID pBuffer,
|
||||||
|
IN OUT PDWORD pBufferLength
|
||||||
|
);
|
||||||
|
|
||||||
|
PVOID
|
||||||
|
WINAPI
|
||||||
|
DnsApiFree(
|
||||||
|
IN PVOID pBuffer
|
||||||
|
);
|
||||||
|
|
||||||
|
/* EOF */
|
14
reactos/lib/dnslib/ip6.c
Normal file
14
reactos/lib/dnslib/ip6.c
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
/*
|
||||||
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
|
* PROJECT: ReactOS DNS Shared Library
|
||||||
|
* FILE: lib/dnslib/ip6.c
|
||||||
|
* PURPOSE: Functions for dealing with IPv6 Specific issues.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* INCLUDES ******************************************************************/
|
||||||
|
#include "precomp.h"
|
||||||
|
|
||||||
|
/* DATA **********************************************************************/
|
||||||
|
|
||||||
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
66
reactos/lib/dnslib/memory.c
Normal file
66
reactos/lib/dnslib/memory.c
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
/*
|
||||||
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
|
* PROJECT: ReactOS DNS Shared Library
|
||||||
|
* FILE: lib/dnslib/memory.c
|
||||||
|
* PURPOSE: DNS Memory Manager Implementation and Heap.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* INCLUDES ******************************************************************/
|
||||||
|
#include "precomp.h"
|
||||||
|
|
||||||
|
/* DATA **********************************************************************/
|
||||||
|
|
||||||
|
typedef PVOID
|
||||||
|
(WINAPI *PDNS_ALLOC_FUNCTION)(IN SIZE_T Size);
|
||||||
|
typedef VOID
|
||||||
|
(WINAPI *PDNS_FREE_FUNCTION)(IN PVOID Buffer);
|
||||||
|
|
||||||
|
PDNS_ALLOC_FUNCTION pDnsAllocFunction;
|
||||||
|
PDNS_FREE_FUNCTION pDnsFreeFunction;
|
||||||
|
|
||||||
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
|
VOID
|
||||||
|
WINAPI
|
||||||
|
Dns_Free(IN PVOID Address)
|
||||||
|
{
|
||||||
|
/* Check if whoever imported us specified a special free function */
|
||||||
|
if (pDnsFreeFunction)
|
||||||
|
{
|
||||||
|
/* Use it */
|
||||||
|
pDnsFreeFunction(Address);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Use our own */
|
||||||
|
LocalFree(Address);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PVOID
|
||||||
|
WINAPI
|
||||||
|
Dns_AllocZero(IN SIZE_T Size)
|
||||||
|
{
|
||||||
|
PVOID Buffer;
|
||||||
|
|
||||||
|
/* Check if whoever imported us specified a special allocation function */
|
||||||
|
if (pDnsAllocFunction)
|
||||||
|
{
|
||||||
|
/* Use it to allocate the memory */
|
||||||
|
Buffer = pDnsAllocFunction(Size);
|
||||||
|
if (Buffer)
|
||||||
|
{
|
||||||
|
/* Zero it out */
|
||||||
|
RtlZeroMemory(Buffer, Size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Use our default */
|
||||||
|
Buffer = LocalAlloc(LMEM_ZEROINIT, Size);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return the allocate pointer */
|
||||||
|
return Buffer;
|
||||||
|
}
|
||||||
|
|
14
reactos/lib/dnslib/name.c
Normal file
14
reactos/lib/dnslib/name.c
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
/*
|
||||||
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
|
* PROJECT: ReactOS DNS Shared Library
|
||||||
|
* FILE: lib/dnslib/name.c
|
||||||
|
* PURPOSE: Functions dealing with DNS (Canonical, FQDN, Host) Names
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* INCLUDES ******************************************************************/
|
||||||
|
#include "precomp.h"
|
||||||
|
|
||||||
|
/* DATA **********************************************************************/
|
||||||
|
|
||||||
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
14
reactos/lib/dnslib/print.c
Normal file
14
reactos/lib/dnslib/print.c
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
/*
|
||||||
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
|
* PROJECT: ReactOS DNS Shared Library
|
||||||
|
* FILE: lib/dnslib/print.c
|
||||||
|
* PURPOSE: Callback Functions for printing a variety of DNSLIB Structures
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* INCLUDES ******************************************************************/
|
||||||
|
#include "precomp.h"
|
||||||
|
|
||||||
|
/* DATA **********************************************************************/
|
||||||
|
|
||||||
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
14
reactos/lib/dnslib/record.c
Normal file
14
reactos/lib/dnslib/record.c
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
/*
|
||||||
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
|
* PROJECT: ReactOS DNS Shared Library
|
||||||
|
* FILE: lib/dnslib/record.c
|
||||||
|
* PURPOSE: Functions for managing DNS Record structures.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* INCLUDES ******************************************************************/
|
||||||
|
#include "precomp.h"
|
||||||
|
|
||||||
|
/* DATA **********************************************************************/
|
||||||
|
|
||||||
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
14
reactos/lib/dnslib/rrprint.c
Normal file
14
reactos/lib/dnslib/rrprint.c
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
/*
|
||||||
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
|
* PROJECT: ReactOS DNS Shared Library
|
||||||
|
* FILE: lib/dnslib/rrprint.c
|
||||||
|
* PURPOSE: Callback functions for printing RR Structures for each Record.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* INCLUDES ******************************************************************/
|
||||||
|
#include "precomp.h"
|
||||||
|
|
||||||
|
/* DATA **********************************************************************/
|
||||||
|
|
||||||
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
640
reactos/lib/dnslib/sablob.c
Normal file
640
reactos/lib/dnslib/sablob.c
Normal file
|
@ -0,0 +1,640 @@
|
||||||
|
/*
|
||||||
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
|
* PROJECT: ReactOS DNS Shared Library
|
||||||
|
* FILE: lib/dnslib/sablob.c
|
||||||
|
* PURPOSE: Functions for the Saved Answer Blob Implementation
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* INCLUDES ******************************************************************/
|
||||||
|
#include "precomp.h"
|
||||||
|
|
||||||
|
/* DATA **********************************************************************/
|
||||||
|
|
||||||
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
|
PVOID
|
||||||
|
WINAPI
|
||||||
|
FlatBuf_Arg_ReserveAlignPointer(IN PVOID Position,
|
||||||
|
IN PSIZE_T FreeSize,
|
||||||
|
IN SIZE_T Size)
|
||||||
|
{
|
||||||
|
/* Just a little helper that we use */
|
||||||
|
return FlatBuf_Arg_Reserve(Position, FreeSize, Size, sizeof(PVOID));
|
||||||
|
}
|
||||||
|
|
||||||
|
PDNS_BLOB
|
||||||
|
WINAPI
|
||||||
|
SaBlob_Create(IN ULONG Count)
|
||||||
|
{
|
||||||
|
PDNS_BLOB Blob;
|
||||||
|
PDNS_ARRAY DnsAddrArray;
|
||||||
|
|
||||||
|
/* Allocate the blob */
|
||||||
|
Blob = Dns_AllocZero(sizeof(DNS_BLOB));
|
||||||
|
if (Blob)
|
||||||
|
{
|
||||||
|
/* Check if it'll hold any addresses */
|
||||||
|
if (Count)
|
||||||
|
{
|
||||||
|
/* Create the DNS Address Array */
|
||||||
|
DnsAddrArray = DnsAddrArray_Create(Count);
|
||||||
|
if (!DnsAddrArray)
|
||||||
|
{
|
||||||
|
/* Failure, free the blob */
|
||||||
|
SaBlob_Free(Blob);
|
||||||
|
SetLastError(ERROR_OUTOFMEMORY);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Link it with the blob */
|
||||||
|
Blob->DnsAddrArray = DnsAddrArray;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return the blob */
|
||||||
|
return Blob;
|
||||||
|
}
|
||||||
|
|
||||||
|
PDNS_BLOB
|
||||||
|
WINAPI
|
||||||
|
SaBlob_CreateFromIp4(IN LPWSTR Name,
|
||||||
|
IN ULONG Count,
|
||||||
|
IN PIN_ADDR AddressArray)
|
||||||
|
{
|
||||||
|
PDNS_BLOB Blob;
|
||||||
|
LPWSTR NameCopy;
|
||||||
|
ULONG i;
|
||||||
|
|
||||||
|
/* Create the blob */
|
||||||
|
Blob = SaBlob_Create(Count);
|
||||||
|
if (!Blob) goto Quickie;
|
||||||
|
|
||||||
|
/* If we have a name */
|
||||||
|
if (Name)
|
||||||
|
{
|
||||||
|
/* Create a copy of it */
|
||||||
|
NameCopy = Dns_CreateStringCopy_W(Name);
|
||||||
|
if (!NameCopy) goto Quickie;
|
||||||
|
|
||||||
|
/* Save the pointer to the name */
|
||||||
|
Blob->Name = NameCopy;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Loop all the addresses */
|
||||||
|
for (i = 0; i < Count; i++)
|
||||||
|
{
|
||||||
|
/* Add an entry for this address */
|
||||||
|
DnsAddrArray_AddIp4(Blob->DnsAddrArray, AddressArray[i], IpV4Address);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return the blob */
|
||||||
|
return Blob;
|
||||||
|
|
||||||
|
Quickie:
|
||||||
|
/* Free the blob, set error and fail */
|
||||||
|
SaBlob_Free(Blob);
|
||||||
|
SetLastError(ERROR_OUTOFMEMORY);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
WINAPI
|
||||||
|
SaBlob_Free(IN PDNS_BLOB Blob)
|
||||||
|
{
|
||||||
|
/* Make sure we got a blob */
|
||||||
|
if (Blob)
|
||||||
|
{
|
||||||
|
/* Free the name */
|
||||||
|
Dns_Free(Blob->Name);
|
||||||
|
|
||||||
|
/* Loop the aliases */
|
||||||
|
while (Blob->AliasCount)
|
||||||
|
{
|
||||||
|
/* Free the alias */
|
||||||
|
Dns_Free(Blob->Aliases[Blob->AliasCount]);
|
||||||
|
|
||||||
|
/* Decrease number of aliases */
|
||||||
|
Blob->AliasCount--;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Free the DNS Address Array */
|
||||||
|
DnsAddrArray_Free(Blob->DnsAddrArray);
|
||||||
|
|
||||||
|
/* Free the blob itself */
|
||||||
|
Dns_Free(Blob);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PHOSTENT
|
||||||
|
WINAPI
|
||||||
|
SaBlob_CreateHostent(IN OUT PULONG_PTR BufferPosition,
|
||||||
|
IN OUT PSIZE_T FreeBufferSpace,
|
||||||
|
IN OUT PSIZE_T HostEntrySize,
|
||||||
|
IN PDNS_BLOB Blob,
|
||||||
|
IN DWORD StringType,
|
||||||
|
IN BOOLEAN Relative,
|
||||||
|
IN BOOLEAN BufferAllocated)
|
||||||
|
{
|
||||||
|
PDNS_ARRAY DnsAddrArray = Blob->DnsAddrArray;
|
||||||
|
ULONG AliasCount = Blob->AliasCount;
|
||||||
|
WORD AddressFamily = AF_UNSPEC;
|
||||||
|
ULONG AddressCount = 0, AddressSize = 0, TotalSize, NamePointerSize;
|
||||||
|
ULONG AliasPointerSize;
|
||||||
|
PDNS_FAMILY_INFO FamilyInfo = NULL;
|
||||||
|
ULONG StringLength = 0;
|
||||||
|
ULONG i;
|
||||||
|
ULONG HostentSize = 0;
|
||||||
|
PHOSTENT Hostent = NULL;
|
||||||
|
ULONG_PTR HostentPtr;
|
||||||
|
PVOID CurrentAddress;
|
||||||
|
|
||||||
|
/* Check if we actually have any addresses */
|
||||||
|
if (DnsAddrArray)
|
||||||
|
{
|
||||||
|
/* Get the address family */
|
||||||
|
AddressFamily = DnsAddrArray->Addresses[0].AddressFamily;
|
||||||
|
|
||||||
|
/* Get family information */
|
||||||
|
FamilyInfo = FamilyInfo_GetForFamily(AddressFamily);
|
||||||
|
|
||||||
|
/* Save the current address count and their size */
|
||||||
|
AddressCount = DnsAddrArray->UsedAddresses;
|
||||||
|
AddressSize = FamilyInfo->AddressSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Calculate total size for all the addresses, and their pointers */
|
||||||
|
TotalSize = AddressSize * AddressCount;
|
||||||
|
NamePointerSize = AddressCount * sizeof(PVOID) + sizeof(PVOID);
|
||||||
|
|
||||||
|
/* Check if we have a name */
|
||||||
|
if (Blob->Name)
|
||||||
|
{
|
||||||
|
/* Find out the size we'll need for a copy */
|
||||||
|
StringLength = (Dns_GetBufferLengthForStringCopy(Blob->Name,
|
||||||
|
0,
|
||||||
|
UnicodeString,
|
||||||
|
StringType) + 1) & ~1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now do the same for the aliases */
|
||||||
|
for (i = AliasCount; i; i--)
|
||||||
|
{
|
||||||
|
/* Find out the size we'll need for a copy */
|
||||||
|
HostentSize += (Dns_GetBufferLengthForStringCopy(Blob->Aliases[i],
|
||||||
|
0,
|
||||||
|
UnicodeString,
|
||||||
|
StringType) + 1) & ~1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Find out how much the pointers will take */
|
||||||
|
AliasPointerSize = AliasCount * sizeof(PVOID) + sizeof(PVOID);
|
||||||
|
|
||||||
|
/* Calculate Hostent Size */
|
||||||
|
HostentSize += TotalSize +
|
||||||
|
NamePointerSize +
|
||||||
|
AliasPointerSize +
|
||||||
|
StringLength +
|
||||||
|
sizeof(HOSTENT);
|
||||||
|
|
||||||
|
/* Check if we already have a buffer */
|
||||||
|
if (!BufferAllocated)
|
||||||
|
{
|
||||||
|
/* We don't, allocate space ourselves */
|
||||||
|
HostentPtr = (ULONG_PTR)Dns_AllocZero(HostentSize);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* We do, so allocate space in the buffer */
|
||||||
|
HostentPtr = (ULONG_PTR)FlatBuf_Arg_ReserveAlignPointer(BufferPosition,
|
||||||
|
FreeBufferSpace,
|
||||||
|
HostentSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Make sure we got space */
|
||||||
|
if (HostentPtr)
|
||||||
|
{
|
||||||
|
/* Initialize it */
|
||||||
|
Hostent = Hostent_Init((PVOID)&HostentPtr,
|
||||||
|
AddressFamily,
|
||||||
|
AddressSize,
|
||||||
|
AddressCount,
|
||||||
|
AliasCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Loop the addresses */
|
||||||
|
for (i = 0; i < AddressCount; i++)
|
||||||
|
{
|
||||||
|
/* Get the pointer of the current address */
|
||||||
|
CurrentAddress = (PVOID)((ULONG_PTR)&DnsAddrArray->Addresses[i] +
|
||||||
|
FamilyInfo->AddressOffset);
|
||||||
|
|
||||||
|
/* Write the pointer */
|
||||||
|
Hostent->h_addr_list[i] = (PCHAR)HostentPtr;
|
||||||
|
|
||||||
|
/* Copy the address */
|
||||||
|
RtlCopyMemory((PVOID)HostentPtr, CurrentAddress, AddressSize);
|
||||||
|
|
||||||
|
/* Advance the buffer */
|
||||||
|
HostentPtr += AddressSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if we have a name */
|
||||||
|
if (Blob->Name)
|
||||||
|
{
|
||||||
|
/* Align our current position */
|
||||||
|
HostentPtr += 1 & ~1;
|
||||||
|
|
||||||
|
/* Save our name here */
|
||||||
|
Hostent->h_name = (LPSTR)HostentPtr;
|
||||||
|
|
||||||
|
/* Now copy it in the blob */
|
||||||
|
HostentPtr += Dns_StringCopy((PVOID)HostentPtr,
|
||||||
|
NULL,
|
||||||
|
Blob->Name,
|
||||||
|
0,
|
||||||
|
UnicodeString,
|
||||||
|
StringType);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Loop the Aliases */
|
||||||
|
for (i = AliasCount; i; i--)
|
||||||
|
{
|
||||||
|
/* Align our current position */
|
||||||
|
HostentPtr += 1 & ~1;
|
||||||
|
|
||||||
|
/* Save our alias here */
|
||||||
|
Hostent->h_aliases[i] = (LPSTR)HostentPtr;
|
||||||
|
|
||||||
|
/* Now copy it in the blob */
|
||||||
|
HostentPtr += Dns_StringCopy((PVOID)HostentPtr,
|
||||||
|
NULL,
|
||||||
|
Blob->Aliases[i],
|
||||||
|
0,
|
||||||
|
UnicodeString,
|
||||||
|
StringType);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if the caller didn't have a buffer */
|
||||||
|
if (!BufferAllocated)
|
||||||
|
{
|
||||||
|
/* Return the size; not needed if we had a blob, since it's internal */
|
||||||
|
*HostEntrySize = *BufferPosition - (ULONG_PTR)HostentPtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Convert to Offsets if requested */
|
||||||
|
if(Relative) Hostent_ConvertToOffsets(Hostent);
|
||||||
|
|
||||||
|
/* Return the full, complete, hostent */
|
||||||
|
return Hostent;
|
||||||
|
}
|
||||||
|
|
||||||
|
INT
|
||||||
|
WINAPI
|
||||||
|
SaBlob_WriteNameOrAlias(IN PDNS_BLOB Blob,
|
||||||
|
IN LPWSTR String,
|
||||||
|
IN BOOLEAN IsAlias)
|
||||||
|
{
|
||||||
|
/* Check if this is an alias */
|
||||||
|
if (!IsAlias)
|
||||||
|
{
|
||||||
|
/* It's not. Simply create a copy of the string */
|
||||||
|
Blob->Name = Dns_CreateStringCopy_W(String);
|
||||||
|
if (!Blob->Name) return GetLastError();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Does it have a name, and less then 8 aliases? */
|
||||||
|
if ((Blob->Name) && (Blob->AliasCount <= 8))
|
||||||
|
{
|
||||||
|
/* Yup, create a copy of the string and increase the alias count */
|
||||||
|
Blob->Aliases[Blob->AliasCount] = Dns_CreateStringCopy_W(String);
|
||||||
|
Blob->AliasCount++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Invalid request! */
|
||||||
|
return ERROR_MORE_DATA;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return Success */
|
||||||
|
return ERROR_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
INT
|
||||||
|
WINAPI
|
||||||
|
SaBlob_WriteAddress(IN PDNS_BLOB Blob,
|
||||||
|
OUT PDNS_ADDRESS DnsAddr)
|
||||||
|
{
|
||||||
|
/* Check if we have an array yet */
|
||||||
|
if (!Blob->DnsAddrArray)
|
||||||
|
{
|
||||||
|
/* Allocate one! */
|
||||||
|
Blob->DnsAddrArray = DnsAddrArray_Create(1);
|
||||||
|
if (!Blob->DnsAddrArray) return ERROR_OUTOFMEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add this address */
|
||||||
|
return DnsAddrArray_AddAddr(Blob->DnsAddrArray, DnsAddr, AF_UNSPEC, 0) ?
|
||||||
|
ERROR_SUCCESS:
|
||||||
|
ERROR_MORE_DATA;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOLEAN
|
||||||
|
WINAPI
|
||||||
|
SaBlob_IsSupportedAddrType(WORD DnsType)
|
||||||
|
{
|
||||||
|
/* Check for valid Types that we support */
|
||||||
|
return (DnsType == DNS_TYPE_A ||
|
||||||
|
DnsType == DNS_TYPE_ATMA ||
|
||||||
|
DnsType == DNS_TYPE_AAAA);
|
||||||
|
}
|
||||||
|
|
||||||
|
INT
|
||||||
|
WINAPI
|
||||||
|
SaBlob_WriteRecords(OUT PDNS_BLOB Blob,
|
||||||
|
IN PDNS_RECORD DnsRecord,
|
||||||
|
IN BOOLEAN DoAlias)
|
||||||
|
{
|
||||||
|
DNS_ADDRESS DnsAddress;
|
||||||
|
INT ErrorCode = STATUS_INVALID_PARAMETER;
|
||||||
|
BOOLEAN WroteOnce = FALSE;
|
||||||
|
|
||||||
|
/* Zero out the Address */
|
||||||
|
RtlZeroMemory(&DnsAddress, sizeof(DnsAddress));
|
||||||
|
|
||||||
|
/* Loop through all the Records */
|
||||||
|
while (DnsRecord)
|
||||||
|
{
|
||||||
|
/* Is this not an answer? */
|
||||||
|
if (DnsRecord->Flags.S.Section != DNSREC_ANSWER)
|
||||||
|
{
|
||||||
|
/* Then simply move on to the next DNS Record */
|
||||||
|
DnsRecord = DnsRecord->pNext;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check the type of thsi record */
|
||||||
|
switch(DnsRecord->wType)
|
||||||
|
{
|
||||||
|
/* Regular IPv4, v6 or ATM Record */
|
||||||
|
case DNS_TYPE_A:
|
||||||
|
case DNS_TYPE_AAAA:
|
||||||
|
case DNS_TYPE_ATMA:
|
||||||
|
|
||||||
|
/* Create a DNS Address from the record */
|
||||||
|
DnsAddr_BuildFromDnsRecord(DnsRecord, &DnsAddress);
|
||||||
|
|
||||||
|
/* Add it to the DNS Blob */
|
||||||
|
ErrorCode = SaBlob_WriteAddress(Blob, &DnsAddress);
|
||||||
|
|
||||||
|
/* Add the name, if needed */
|
||||||
|
if ((DoAlias) &&
|
||||||
|
(!WroteOnce) &&
|
||||||
|
(!Blob->Name) &&
|
||||||
|
(DnsRecord->pName))
|
||||||
|
{
|
||||||
|
/* Write the name from the DNS Record */
|
||||||
|
ErrorCode = SaBlob_WriteNameOrAlias(Blob,
|
||||||
|
DnsRecord->pName,
|
||||||
|
FALSE);
|
||||||
|
WroteOnce = TRUE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DNS_TYPE_CNAME:
|
||||||
|
|
||||||
|
/* Just write the alias name */
|
||||||
|
ErrorCode = SaBlob_WriteNameOrAlias(Blob,
|
||||||
|
DnsRecord->pName,
|
||||||
|
TRUE);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DNS_TYPE_PTR:
|
||||||
|
|
||||||
|
/* Check if we already have a name */
|
||||||
|
if (Blob->Name)
|
||||||
|
{
|
||||||
|
/* We don't, so add this as a name */
|
||||||
|
ErrorCode = SaBlob_WriteNameOrAlias(Blob,
|
||||||
|
DnsRecord->pName,
|
||||||
|
FALSE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* We do, so add it as an alias */
|
||||||
|
ErrorCode = SaBlob_WriteNameOrAlias(Blob,
|
||||||
|
DnsRecord->pName,
|
||||||
|
TRUE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Next record */
|
||||||
|
DnsRecord = DnsRecord->pNext;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return error code */
|
||||||
|
return ErrorCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
PDNS_BLOB
|
||||||
|
WINAPI
|
||||||
|
SaBlob_CreateFromRecords(IN PDNS_RECORD DnsRecord,
|
||||||
|
IN BOOLEAN DoAliases,
|
||||||
|
IN DWORD DnsType)
|
||||||
|
{
|
||||||
|
PDNS_RECORD LocalDnsRecord;
|
||||||
|
ULONG ProcessedCount = 0;
|
||||||
|
PDNS_BLOB DnsBlob;
|
||||||
|
INT ErrorCode;
|
||||||
|
DNS_ADDRESS DnsAddress;
|
||||||
|
|
||||||
|
/* Find out how many DNS Addresses to allocate */
|
||||||
|
LocalDnsRecord = DnsRecord;
|
||||||
|
while (LocalDnsRecord)
|
||||||
|
{
|
||||||
|
/* Make sure this record is an answer */
|
||||||
|
if ((LocalDnsRecord->Flags.S.Section == DNSREC_ANSWER) &&
|
||||||
|
(SaBlob_IsSupportedAddrType(LocalDnsRecord->wType)))
|
||||||
|
{
|
||||||
|
/* Increase number of records to process */
|
||||||
|
ProcessedCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Move to the next record */
|
||||||
|
LocalDnsRecord = LocalDnsRecord->pNext;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Create the DNS Blob */
|
||||||
|
DnsBlob = SaBlob_Create(ProcessedCount);
|
||||||
|
if (!DnsBlob)
|
||||||
|
{
|
||||||
|
/* Fail */
|
||||||
|
ErrorCode = GetLastError();
|
||||||
|
goto Quickie;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Write the record to the DNS Blob */
|
||||||
|
ErrorCode = SaBlob_WriteRecords(DnsBlob, DnsRecord, TRUE);
|
||||||
|
if (ErrorCode != NO_ERROR)
|
||||||
|
{
|
||||||
|
/* We failed... but do we still have valid data? */
|
||||||
|
if ((DnsBlob->Name) || (DnsBlob->AliasCount))
|
||||||
|
{
|
||||||
|
/* We'll just assume success then */
|
||||||
|
ErrorCode = NO_ERROR;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Ok, last chance..do you have a DNS Address Array? */
|
||||||
|
if ((DnsBlob->DnsAddrArray) &&
|
||||||
|
(DnsBlob->DnsAddrArray->UsedAddresses))
|
||||||
|
{
|
||||||
|
/* Boy are you lucky! */
|
||||||
|
ErrorCode = NO_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Buh-bye! */
|
||||||
|
goto Quickie;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if this is a PTR record */
|
||||||
|
if ((DnsRecord->wType == DNS_TYPE_PTR) ||
|
||||||
|
((DnsType == DNS_TYPE_PTR) &&
|
||||||
|
(DnsRecord->wType == DNS_TYPE_CNAME) &&
|
||||||
|
(DnsRecord->Flags.S.Section == DNSREC_ANSWER)))
|
||||||
|
{
|
||||||
|
/* Get a DNS Address Structure */
|
||||||
|
if (Dns_ReverseNameToDnsAddr_W(&DnsAddress, DnsRecord->pName))
|
||||||
|
{
|
||||||
|
/* Add it to the Blob */
|
||||||
|
if (SaBlob_WriteAddress(DnsBlob, &DnsAddress)) ErrorCode = NO_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Ok...do we still not have a name? */
|
||||||
|
if (!(DnsBlob->Name) && (DoAliases) && (LocalDnsRecord))
|
||||||
|
{
|
||||||
|
/* We have an local DNS Record, so just use it to write the name */
|
||||||
|
ErrorCode = SaBlob_WriteNameOrAlias(DnsBlob,
|
||||||
|
LocalDnsRecord->pName,
|
||||||
|
FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
Quickie:
|
||||||
|
/* Check error code */
|
||||||
|
if (ErrorCode != NO_ERROR)
|
||||||
|
{
|
||||||
|
/* Free the blob and set the error */
|
||||||
|
SaBlob_Free(DnsBlob);
|
||||||
|
DnsBlob = NULL;
|
||||||
|
SetLastError(ErrorCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return */
|
||||||
|
return DnsBlob;
|
||||||
|
}
|
||||||
|
|
||||||
|
PDNS_BLOB
|
||||||
|
WINAPI
|
||||||
|
SaBlob_Query(IN LPWSTR Name,
|
||||||
|
IN WORD DnsType,
|
||||||
|
IN ULONG Flags,
|
||||||
|
IN PVOID *Reserved,
|
||||||
|
IN DWORD AddressFamily)
|
||||||
|
{
|
||||||
|
PDNS_RECORD DnsRecord = NULL;
|
||||||
|
INT ErrorCode;
|
||||||
|
PDNS_BLOB DnsBlob = NULL;
|
||||||
|
LPWSTR LocalName, LocalNameCopy;
|
||||||
|
|
||||||
|
/* If they want reserved data back, clear it out in case we fail */
|
||||||
|
if (Reserved) *Reserved = NULL;
|
||||||
|
|
||||||
|
/* Query DNS */
|
||||||
|
ErrorCode = DnsQuery_W(Name,
|
||||||
|
DnsType,
|
||||||
|
Flags,
|
||||||
|
NULL,
|
||||||
|
&DnsRecord,
|
||||||
|
Reserved);
|
||||||
|
if (ErrorCode != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
/* We failed... did the caller use reserved data? */
|
||||||
|
if (Reserved && *Reserved)
|
||||||
|
{
|
||||||
|
/* He did, and it was valid. Free it */
|
||||||
|
DnsApiFree(*Reserved);
|
||||||
|
*Reserved = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Normalize error code */
|
||||||
|
if (ErrorCode == RPC_S_SERVER_UNAVAILABLE) ErrorCode = WSATRY_AGAIN;
|
||||||
|
goto Quickie;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now create the Blob from the DNS Records */
|
||||||
|
DnsBlob = SaBlob_CreateFromRecords(DnsRecord, TRUE, DnsType);
|
||||||
|
if (!DnsBlob)
|
||||||
|
{
|
||||||
|
/* Failed, get error code */
|
||||||
|
ErrorCode = GetLastError();
|
||||||
|
goto Quickie;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Make sure it has a name */
|
||||||
|
if (!DnsBlob->Name)
|
||||||
|
{
|
||||||
|
/* It doesn't, fail */
|
||||||
|
ErrorCode = DNS_INFO_NO_RECORDS;
|
||||||
|
goto Quickie;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if the name is local or loopback */
|
||||||
|
if (!(DnsNameCompare_W(DnsBlob->Name, L"localhost")) &&
|
||||||
|
!(DnsNameCompare_W(DnsBlob->Name, L"loopback")))
|
||||||
|
{
|
||||||
|
/* Nothing left to do, exit! */
|
||||||
|
goto Quickie;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This is a local name...query it */
|
||||||
|
LocalName = DnsQueryConfigAllocEx(DnsConfigFullHostName_W, NULL, NULL);
|
||||||
|
if (LocalName)
|
||||||
|
{
|
||||||
|
/* Create a copy for the caller */
|
||||||
|
LocalNameCopy = Dns_CreateStringCopy_W(LocalName);
|
||||||
|
if (LocalNameCopy)
|
||||||
|
{
|
||||||
|
/* Overwrite the one in the blob */
|
||||||
|
DnsBlob->Name = LocalNameCopy;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* We failed to make a copy, free memory */
|
||||||
|
DnsApiFree(LocalName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Quickie:
|
||||||
|
/* Free the DNS Record if we have one */
|
||||||
|
if (DnsRecord) DnsRecordListFree(DnsRecord, DnsFreeRecordList);
|
||||||
|
|
||||||
|
/* Check if this is a failure path with an active blob */
|
||||||
|
if ((ErrorCode != ERROR_SUCCESS) && (DnsBlob))
|
||||||
|
{
|
||||||
|
/* Free the blob */
|
||||||
|
SaBlob_Free(DnsBlob);
|
||||||
|
DnsBlob = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set the last error and return */
|
||||||
|
SetLastError(ErrorCode);
|
||||||
|
return DnsBlob;
|
||||||
|
}
|
||||||
|
|
462
reactos/lib/dnslib/straddr.c
Normal file
462
reactos/lib/dnslib/straddr.c
Normal file
|
@ -0,0 +1,462 @@
|
||||||
|
/*
|
||||||
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
|
* PROJECT: ReactOS DNS Shared Library
|
||||||
|
* FILE: lib/dnslib/straddr.c
|
||||||
|
* PURPOSE: Functions for address<->string conversion.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* INCLUDES ******************************************************************/
|
||||||
|
#include "precomp.h"
|
||||||
|
|
||||||
|
/* DATA **********************************************************************/
|
||||||
|
|
||||||
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
|
LPWSTR
|
||||||
|
WINAPI
|
||||||
|
Dns_Ip6AddressToReverseName_W(OUT LPWSTR Name,
|
||||||
|
IN IN6_ADDR Address)
|
||||||
|
{
|
||||||
|
/* FIXME */
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
LPWSTR
|
||||||
|
WINAPI
|
||||||
|
Dns_Ip4AddressToReverseName_W(OUT LPWSTR Name,
|
||||||
|
IN IN_ADDR Address)
|
||||||
|
{
|
||||||
|
/* Simply append the ARPA string */
|
||||||
|
return Name + (wsprintfW(Name,
|
||||||
|
L"%u.%u.%u.%u.in-addr.arpa.",
|
||||||
|
Address.S_un.S_addr >> 24,
|
||||||
|
Address.S_un.S_addr >> 10,
|
||||||
|
Address.S_un.S_addr >> 8,
|
||||||
|
Address.S_un.S_addr) * sizeof(WCHAR));
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOLEAN
|
||||||
|
WINAPI
|
||||||
|
Dns_Ip4ReverseNameToAddress_A(OUT PIN_ADDR Address,
|
||||||
|
IN LPSTR Name)
|
||||||
|
{
|
||||||
|
/* FIXME */
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOLEAN
|
||||||
|
WINAPI
|
||||||
|
Dns_Ip6ReverseNameToAddress_A(OUT PIN6_ADDR Address,
|
||||||
|
IN LPSTR Name)
|
||||||
|
{
|
||||||
|
/* FIXME */
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOLEAN
|
||||||
|
WINAPI
|
||||||
|
Dns_Ip6StringToAddress_A(OUT PIN6_ADDR Address,
|
||||||
|
IN LPSTR Name)
|
||||||
|
{
|
||||||
|
PCHAR Terminator;
|
||||||
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
/* Let RTL Do it for us */
|
||||||
|
Status = RtlIpv6StringToAddressA(Name, &Terminator, Address);
|
||||||
|
if (NT_SUCCESS(Status)) return TRUE;
|
||||||
|
|
||||||
|
/* We failed */
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOLEAN
|
||||||
|
WINAPI
|
||||||
|
Dns_Ip6StringToAddress_W(OUT PIN6_ADDR Address,
|
||||||
|
IN LPWSTR Name)
|
||||||
|
{
|
||||||
|
PCHAR Terminator;
|
||||||
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
/* Let RTL Do it for us */
|
||||||
|
Status = RtlIpv6StringToAddressW(Name, &Terminator, Address);
|
||||||
|
if (NT_SUCCESS(Status)) return TRUE;
|
||||||
|
|
||||||
|
/* We failed */
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOLEAN
|
||||||
|
WINAPI
|
||||||
|
Dns_Ip4StringToAddress_A(OUT PIN_ADDR Address,
|
||||||
|
IN LPSTR Name)
|
||||||
|
{
|
||||||
|
ULONG Addr;
|
||||||
|
|
||||||
|
/* Use inet_addr to convert it... */
|
||||||
|
Addr = inet_addr(Name);
|
||||||
|
if (Addr == -1)
|
||||||
|
{
|
||||||
|
/* Check if it's the wildcard (which is ok...) */
|
||||||
|
if (strcmp("255.255.255.255", Name)) return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If we got here, then we suceeded... return the address */
|
||||||
|
Address->S_un.S_addr = Addr;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOLEAN
|
||||||
|
WINAPI
|
||||||
|
Dns_Ip4StringToAddress_W(OUT PIN_ADDR Address,
|
||||||
|
IN LPWSTR Name)
|
||||||
|
{
|
||||||
|
CHAR AnsiName[16];
|
||||||
|
ULONG Size = sizeof(AnsiName);
|
||||||
|
INT ErrorCode;
|
||||||
|
|
||||||
|
/* Make a copy of the name in ANSI */
|
||||||
|
ErrorCode = Dns_StringCopy(&AnsiName,
|
||||||
|
&Size,
|
||||||
|
Name,
|
||||||
|
0,
|
||||||
|
UnicodeString,
|
||||||
|
AnsiString);
|
||||||
|
if (ErrorCode)
|
||||||
|
{
|
||||||
|
/* Copy made sucesfully, now convert it */
|
||||||
|
ErrorCode = Dns_Ip4StringToAddress_A(Address, AnsiName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return either 0 bytes copied (failure == false) or conversion status */
|
||||||
|
return ErrorCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOLEAN
|
||||||
|
WINAPI
|
||||||
|
Dns_Ip4ReverseNameToAddress_W(OUT PIN_ADDR Address,
|
||||||
|
IN LPWSTR Name)
|
||||||
|
{
|
||||||
|
CHAR AnsiName[32];
|
||||||
|
ULONG Size = sizeof(AnsiName);
|
||||||
|
INT ErrorCode;
|
||||||
|
|
||||||
|
/* Make a copy of the name in ANSI */
|
||||||
|
ErrorCode = Dns_StringCopy(&AnsiName,
|
||||||
|
&Size,
|
||||||
|
Name,
|
||||||
|
0,
|
||||||
|
UnicodeString,
|
||||||
|
AnsiString);
|
||||||
|
if (ErrorCode)
|
||||||
|
{
|
||||||
|
/* Copy made sucesfully, now convert it */
|
||||||
|
ErrorCode = Dns_Ip4ReverseNameToAddress_A(Address, AnsiName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return either 0 bytes copied (failure == false) or conversion status */
|
||||||
|
return ErrorCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOLEAN
|
||||||
|
WINAPI
|
||||||
|
Dns_StringToAddressEx(OUT PVOID Address,
|
||||||
|
IN OUT PULONG AddressSize,
|
||||||
|
IN PVOID AddressName,
|
||||||
|
IN OUT PDWORD AddressFamily,
|
||||||
|
IN BOOLEAN Unicode,
|
||||||
|
IN BOOLEAN Reverse)
|
||||||
|
{
|
||||||
|
DWORD Af = *AddressFamily;
|
||||||
|
ULONG AddrSize = *AddressSize;
|
||||||
|
IN6_ADDR Addr;
|
||||||
|
BOOLEAN Return;
|
||||||
|
INT ErrorCode;
|
||||||
|
CHAR AnsiName[INET6_ADDRSTRLEN + sizeof("ip6.arpa.")];
|
||||||
|
ULONG Size = sizeof(AnsiName);
|
||||||
|
|
||||||
|
/* First check if this is a reverse address string */
|
||||||
|
if (Reverse)
|
||||||
|
{
|
||||||
|
/* Convert it right now to ANSI as an optimization */
|
||||||
|
Dns_StringCopy(AnsiName,
|
||||||
|
&Size,
|
||||||
|
AddressName,
|
||||||
|
0,
|
||||||
|
UnicodeString,
|
||||||
|
AnsiString);
|
||||||
|
|
||||||
|
/* Use the ANSI Name instead */
|
||||||
|
AddressName = AnsiName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If the caller doesn't know what the family is, we'll assume IPv4 and
|
||||||
|
* check if we failed or not. If the caller told us it's IPv4, then just
|
||||||
|
* do IPv4...
|
||||||
|
*/
|
||||||
|
if ((Af == AF_UNSPEC) || (Af == AF_INET))
|
||||||
|
{
|
||||||
|
/* Now check if the caller gave us the reverse name or not */
|
||||||
|
if (Reverse)
|
||||||
|
{
|
||||||
|
/* Get the Address */
|
||||||
|
Return = Dns_Ip4ReverseNameToAddress_A((PIN_ADDR)&Addr, AddressName);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Check if the caller gave us unicode or not */
|
||||||
|
if (Unicode)
|
||||||
|
{
|
||||||
|
/* Get the Address */
|
||||||
|
Return = Dns_Ip4StringToAddress_W((PIN_ADDR)&Addr, AddressName);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Get the Address */
|
||||||
|
Return = Dns_Ip4StringToAddress_A((PIN_ADDR)&Addr, AddressName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if we suceeded */
|
||||||
|
if (Return)
|
||||||
|
{
|
||||||
|
/* Save address family */
|
||||||
|
Af = AF_INET;
|
||||||
|
|
||||||
|
/* Check if the address size matches */
|
||||||
|
if (AddrSize < sizeof(IN_ADDR))
|
||||||
|
{
|
||||||
|
/* Invalid match, set error code */
|
||||||
|
ErrorCode = ERROR_MORE_DATA;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* It matches, save the address! */
|
||||||
|
*(PIN_ADDR)Address = *(PIN_ADDR)&Addr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If we are here, either AF_INET6 was specified or IPv4 failed */
|
||||||
|
if ((Af == AF_UNSPEC) || (Af == AF_INET6))
|
||||||
|
{
|
||||||
|
/* Now check if the caller gave us the reverse name or not */
|
||||||
|
if (Reverse)
|
||||||
|
{
|
||||||
|
/* Get the Address */
|
||||||
|
Return = Dns_Ip6ReverseNameToAddress_A(&Addr, AddressName);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Check if the caller gave us unicode or not */
|
||||||
|
if (Unicode)
|
||||||
|
{
|
||||||
|
/* Get the Address */
|
||||||
|
Return = Dns_Ip6StringToAddress_W(&Addr, AddressName);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Get the Address */
|
||||||
|
Return = Dns_Ip6StringToAddress_A(&Addr, AddressName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if we suceeded */
|
||||||
|
if (Return)
|
||||||
|
{
|
||||||
|
/* Save address family */
|
||||||
|
Af = AF_INET6;
|
||||||
|
|
||||||
|
/* Check if the address size matches */
|
||||||
|
if (AddrSize < sizeof(IN6_ADDR))
|
||||||
|
{
|
||||||
|
/* Invalid match, set error code */
|
||||||
|
ErrorCode = ERROR_MORE_DATA;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* It matches, save the address! */
|
||||||
|
*(PIN6_ADDR)Address = Addr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (Af != AF_INET)
|
||||||
|
{
|
||||||
|
/* You're like.. ATM or something? Get outta here! */
|
||||||
|
Af = AF_UNSPEC;
|
||||||
|
ErrorCode = WSA_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set error if we had one */
|
||||||
|
if (ErrorCode) SetLastError(ErrorCode);
|
||||||
|
|
||||||
|
/* Return the address family and size */
|
||||||
|
*AddressFamily = Af;
|
||||||
|
*AddressSize = AddrSize;
|
||||||
|
|
||||||
|
/* Return success or failure */
|
||||||
|
return (ErrorCode == ERROR_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOLEAN
|
||||||
|
WINAPI
|
||||||
|
Dns_StringToAddressW(OUT PVOID Address,
|
||||||
|
IN OUT PULONG AddressSize,
|
||||||
|
IN LPWSTR AddressName,
|
||||||
|
IN OUT PDWORD AddressFamily)
|
||||||
|
{
|
||||||
|
/* Call the common API */
|
||||||
|
return Dns_StringToAddressEx(Address,
|
||||||
|
AddressSize,
|
||||||
|
AddressName,
|
||||||
|
AddressFamily,
|
||||||
|
TRUE,
|
||||||
|
FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOLEAN
|
||||||
|
WINAPI
|
||||||
|
Dns_StringToDnsAddrEx(OUT PDNS_ADDRESS DnsAddr,
|
||||||
|
IN PVOID AddressName,
|
||||||
|
IN DWORD AddressFamily,
|
||||||
|
IN BOOLEAN Unicode,
|
||||||
|
IN BOOLEAN Reverse)
|
||||||
|
{
|
||||||
|
IN6_ADDR Addr;
|
||||||
|
BOOLEAN Return;
|
||||||
|
INT ErrorCode = ERROR_SUCCESS;
|
||||||
|
CHAR AnsiName[INET6_ADDRSTRLEN + sizeof("ip6.arpa.")];
|
||||||
|
ULONG Size = sizeof(AnsiName);
|
||||||
|
|
||||||
|
/* First check if this is a reverse address string */
|
||||||
|
if ((Reverse) && (Unicode))
|
||||||
|
{
|
||||||
|
/* Convert it right now to ANSI as an optimization */
|
||||||
|
Dns_StringCopy(AnsiName,
|
||||||
|
&Size,
|
||||||
|
AddressName,
|
||||||
|
0,
|
||||||
|
UnicodeString,
|
||||||
|
AnsiString);
|
||||||
|
|
||||||
|
/* Use the ANSI Name instead */
|
||||||
|
AddressName = AnsiName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If the caller doesn't know what the family is, we'll assume IPv4 and
|
||||||
|
* check if we failed or not. If the caller told us it's IPv4, then just
|
||||||
|
* do IPv4...
|
||||||
|
*/
|
||||||
|
if ((AddressFamily == AF_UNSPEC) || (AddressFamily == AF_INET))
|
||||||
|
{
|
||||||
|
/* Now check if the caller gave us the reverse name or not */
|
||||||
|
if (Reverse)
|
||||||
|
{
|
||||||
|
/* Get the Address */
|
||||||
|
Return = Dns_Ip4ReverseNameToAddress_A((PIN_ADDR)&Addr, AddressName);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Check if the caller gave us unicode or not */
|
||||||
|
if (Unicode)
|
||||||
|
{
|
||||||
|
/* Get the Address */
|
||||||
|
Return = Dns_Ip4StringToAddress_W((PIN_ADDR)&Addr, AddressName);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Get the Address */
|
||||||
|
Return = Dns_Ip4StringToAddress_A((PIN_ADDR)&Addr, AddressName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if we suceeded */
|
||||||
|
if (Return)
|
||||||
|
{
|
||||||
|
/* Build the IPv4 Address */
|
||||||
|
DnsAddr_BuildFromIp4(DnsAddr, *(PIN_ADDR)&Addr, 0);
|
||||||
|
|
||||||
|
/* So we don't go in the code below... */
|
||||||
|
AddressFamily = AF_INET;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If we are here, either AF_INET6 was specified or IPv4 failed */
|
||||||
|
if ((AddressFamily == AF_UNSPEC) || (AddressFamily == AF_INET6))
|
||||||
|
{
|
||||||
|
/* Now check if the caller gave us the reverse name or not */
|
||||||
|
if (Reverse)
|
||||||
|
{
|
||||||
|
/* Get the Address */
|
||||||
|
Return = Dns_Ip6ReverseNameToAddress_A(&Addr, AddressName);
|
||||||
|
if (Return)
|
||||||
|
{
|
||||||
|
/* Build the IPv6 Address */
|
||||||
|
DnsAddr_BuildFromIp6(DnsAddr, &Addr, 0, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
goto Quickie;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Check if the caller gave us unicode or not */
|
||||||
|
if (Unicode)
|
||||||
|
{
|
||||||
|
/* Get the Address */
|
||||||
|
if (NT_SUCCESS(RtlIpv6StringToAddressExW(AddressName,
|
||||||
|
&DnsAddr->Ip6Address.sin6_addr,
|
||||||
|
&DnsAddr->Ip6Address.sin6_scope_id,
|
||||||
|
&DnsAddr->Ip6Address.sin6_port)))
|
||||||
|
Return = TRUE;
|
||||||
|
else
|
||||||
|
Return = FALSE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Get the Address */
|
||||||
|
if (NT_SUCCESS(RtlIpv6StringToAddressExA(AddressName,
|
||||||
|
&DnsAddr->Ip6Address.sin6_addr,
|
||||||
|
&DnsAddr->Ip6Address.sin6_scope_id,
|
||||||
|
&DnsAddr->Ip6Address.sin6_port)))
|
||||||
|
Return = TRUE;
|
||||||
|
else
|
||||||
|
Return = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if we suceeded */
|
||||||
|
if (Return)
|
||||||
|
{
|
||||||
|
/* Finish setting up the structure */
|
||||||
|
DnsAddr->Ip6Address.sin6_family = AF_INET6;
|
||||||
|
DnsAddr->AddressLength = sizeof(SOCKADDR_IN6);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (AddressFamily != AF_INET)
|
||||||
|
{
|
||||||
|
/* You're like.. ATM or something? Get outta here! */
|
||||||
|
RtlZeroMemory(DnsAddr, sizeof(DNS_ADDRESS));
|
||||||
|
SetLastError(WSA_INVALID_PARAMETER);
|
||||||
|
}
|
||||||
|
|
||||||
|
Quickie:
|
||||||
|
/* Return success or failure */
|
||||||
|
return (ErrorCode == ERROR_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOLEAN
|
||||||
|
WINAPI
|
||||||
|
Dns_ReverseNameToDnsAddr_W(OUT PDNS_ADDRESS DnsAddr,
|
||||||
|
IN LPWSTR Name)
|
||||||
|
{
|
||||||
|
/* Call the common API */
|
||||||
|
return Dns_StringToDnsAddrEx(DnsAddr,
|
||||||
|
Name,
|
||||||
|
AF_UNSPEC,
|
||||||
|
TRUE,
|
||||||
|
TRUE);
|
||||||
|
}
|
||||||
|
|
257
reactos/lib/dnslib/string.c
Normal file
257
reactos/lib/dnslib/string.c
Normal file
|
@ -0,0 +1,257 @@
|
||||||
|
/*
|
||||||
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
|
* PROJECT: ReactOS DNS Shared Library
|
||||||
|
* FILE: lib/dnslib/string.c
|
||||||
|
* PURPOSE: functions for string manipulation and conversion.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* INCLUDES ******************************************************************/
|
||||||
|
#include "precomp.h"
|
||||||
|
|
||||||
|
/* DATA **********************************************************************/
|
||||||
|
|
||||||
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
|
ULONG
|
||||||
|
WINAPI
|
||||||
|
Dns_StringCopy(OUT PVOID Destination,
|
||||||
|
IN OUT PULONG DestinationSize,
|
||||||
|
IN PVOID String,
|
||||||
|
IN ULONG StringSize OPTIONAL,
|
||||||
|
IN DWORD InputType,
|
||||||
|
IN DWORD OutputType)
|
||||||
|
{
|
||||||
|
ULONG DestSize;
|
||||||
|
ULONG OutputSize = 0;
|
||||||
|
|
||||||
|
/* Check if the caller already gave us the string size */
|
||||||
|
if (!StringSize)
|
||||||
|
{
|
||||||
|
/* He didn't, get the input type */
|
||||||
|
if (InputType == UnicodeString)
|
||||||
|
{
|
||||||
|
/* Unicode string, calculate the size */
|
||||||
|
StringSize = (ULONG)wcslen((LPWSTR)String);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* ANSI or UTF-8 sting, get the size */
|
||||||
|
StringSize = (ULONG)strlen((LPSTR)String);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if we have a limit on the desination size */
|
||||||
|
if (DestinationSize)
|
||||||
|
{
|
||||||
|
/* Make sure that we can respect it */
|
||||||
|
DestSize = Dns_GetBufferLengthForStringCopy(String,
|
||||||
|
StringSize,
|
||||||
|
InputType,
|
||||||
|
OutputType);
|
||||||
|
if (*DestinationSize < DestSize)
|
||||||
|
{
|
||||||
|
/* Fail due to missing buffer space */
|
||||||
|
SetLastError(ERROR_MORE_DATA);
|
||||||
|
|
||||||
|
/* Return how much data we actually need */
|
||||||
|
*DestinationSize = DestSize;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else if (!DestSize)
|
||||||
|
{
|
||||||
|
/* Fail due to invalid data */
|
||||||
|
SetLastError(ERROR_INVALID_DATA);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return how much data we actually need */
|
||||||
|
*DestinationSize = DestSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now check if this is a Unicode String as input */
|
||||||
|
if (InputType == UnicodeString)
|
||||||
|
{
|
||||||
|
/* Check if the output is ANSI */
|
||||||
|
if (OutputType == AnsiString)
|
||||||
|
{
|
||||||
|
/* Convert and return the final desination size */
|
||||||
|
OutputSize = WideCharToMultiByte(CP_ACP,
|
||||||
|
0,
|
||||||
|
String,
|
||||||
|
StringSize,
|
||||||
|
Destination,
|
||||||
|
-1,
|
||||||
|
NULL,
|
||||||
|
NULL) + 1;
|
||||||
|
}
|
||||||
|
else if (OutputType == UnicodeString)
|
||||||
|
{
|
||||||
|
/* Copy the string */
|
||||||
|
StringSize = StringSize * sizeof(WCHAR);
|
||||||
|
RtlMoveMemory(Destination, String, StringSize);
|
||||||
|
|
||||||
|
/* Return output length */
|
||||||
|
OutputSize = StringSize + 2;
|
||||||
|
}
|
||||||
|
else if (OutputType == Utf8String)
|
||||||
|
{
|
||||||
|
/* FIXME */
|
||||||
|
OutputSize = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (InputType == AnsiString)
|
||||||
|
{
|
||||||
|
/* It's ANSI, is the output ansi too? */
|
||||||
|
if (OutputType == AnsiString)
|
||||||
|
{
|
||||||
|
/* Copy the string */
|
||||||
|
RtlMoveMemory(Destination, String, StringSize);
|
||||||
|
|
||||||
|
/* Return output length */
|
||||||
|
OutputSize = StringSize + 1;
|
||||||
|
}
|
||||||
|
else if (OutputType == UnicodeString)
|
||||||
|
{
|
||||||
|
/* Convert to Unicode and return size */
|
||||||
|
OutputSize = MultiByteToWideChar(CP_ACP,
|
||||||
|
0,
|
||||||
|
String,
|
||||||
|
StringSize,
|
||||||
|
Destination,
|
||||||
|
-1) * sizeof(WCHAR) + 2;
|
||||||
|
}
|
||||||
|
else if (OutputType == Utf8String)
|
||||||
|
{
|
||||||
|
/* FIXME */
|
||||||
|
OutputSize = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (InputType == Utf8String)
|
||||||
|
{
|
||||||
|
/* FIXME */
|
||||||
|
OutputSize = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return the output size */
|
||||||
|
return OutputSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
LPWSTR
|
||||||
|
WINAPI
|
||||||
|
Dns_CreateStringCopy_W(IN LPWSTR Name)
|
||||||
|
{
|
||||||
|
SIZE_T StringLength;
|
||||||
|
LPWSTR NameCopy;
|
||||||
|
|
||||||
|
/* Make sure that we have a name */
|
||||||
|
if (!Name)
|
||||||
|
{
|
||||||
|
/* Fail */
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Find out the size of the string */
|
||||||
|
StringLength = (wcslen(Name) + 1) * sizeof(WCHAR);
|
||||||
|
|
||||||
|
/* Allocate space for the copy */
|
||||||
|
NameCopy = Dns_AllocZero(StringLength);
|
||||||
|
if (NameCopy)
|
||||||
|
{
|
||||||
|
/* Copy it */
|
||||||
|
RtlCopyMemory(NameCopy, Name, StringLength);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Fail */
|
||||||
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return the copy */
|
||||||
|
return NameCopy;
|
||||||
|
}
|
||||||
|
|
||||||
|
ULONG
|
||||||
|
WINAPI
|
||||||
|
Dns_GetBufferLengthForStringCopy(IN PVOID String,
|
||||||
|
IN ULONG Size OPTIONAL,
|
||||||
|
IN DWORD InputType,
|
||||||
|
IN DWORD OutputType)
|
||||||
|
{
|
||||||
|
ULONG OutputSize = 0;
|
||||||
|
|
||||||
|
/* Check what kind of string this is */
|
||||||
|
if (InputType == UnicodeString)
|
||||||
|
{
|
||||||
|
/* Check if we have a size */
|
||||||
|
if (!Size)
|
||||||
|
{
|
||||||
|
/* Get it ourselves */
|
||||||
|
Size = (ULONG)wcslen(String);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check the output type */
|
||||||
|
if (OutputType == UnicodeString)
|
||||||
|
{
|
||||||
|
/* Convert the size to bytes */
|
||||||
|
OutputSize = (Size + 1) * sizeof(WCHAR);
|
||||||
|
}
|
||||||
|
else if (OutputType == Utf8String)
|
||||||
|
{
|
||||||
|
/* FIXME */
|
||||||
|
OutputSize = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Find out how much it will be in ANSI bytes */
|
||||||
|
OutputSize = WideCharToMultiByte(CP_ACP,
|
||||||
|
0,
|
||||||
|
String,
|
||||||
|
Size,
|
||||||
|
NULL,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
NULL) + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (InputType == AnsiString)
|
||||||
|
{
|
||||||
|
/* Check if we have a size */
|
||||||
|
if (!Size)
|
||||||
|
{
|
||||||
|
/* Get it ourselves */
|
||||||
|
Size = (ULONG)strlen(String);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check the output type */
|
||||||
|
if (OutputType == AnsiString)
|
||||||
|
{
|
||||||
|
/* Just add a byte for the null char */
|
||||||
|
OutputSize = Size + 1;
|
||||||
|
}
|
||||||
|
else if (OutputType == UnicodeString)
|
||||||
|
{
|
||||||
|
/* Calculate the bytes for a Unicode string */
|
||||||
|
OutputSize = (MultiByteToWideChar(CP_ACP,
|
||||||
|
0,
|
||||||
|
String,
|
||||||
|
Size,
|
||||||
|
NULL,
|
||||||
|
0) + 1) * sizeof(WCHAR);
|
||||||
|
}
|
||||||
|
else if (OutputType == Utf8String)
|
||||||
|
{
|
||||||
|
/* FIXME */
|
||||||
|
OutputSize = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (InputType == Utf8String)
|
||||||
|
{
|
||||||
|
/* FIXME */
|
||||||
|
OutputSize = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return the size required */
|
||||||
|
return OutputSize;
|
||||||
|
}
|
||||||
|
|
14
reactos/lib/dnslib/table.c
Normal file
14
reactos/lib/dnslib/table.c
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
/*
|
||||||
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
|
* PROJECT: ReactOS DNS Shared Library
|
||||||
|
* FILE: lib/dnslib/table.c
|
||||||
|
* PURPOSE: Functions for doing Table lookups, such as LUP Flags.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* INCLUDES ******************************************************************/
|
||||||
|
#include "precomp.h"
|
||||||
|
|
||||||
|
/* DATA **********************************************************************/
|
||||||
|
|
||||||
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
14
reactos/lib/dnslib/utf8.c
Normal file
14
reactos/lib/dnslib/utf8.c
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
/*
|
||||||
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
|
* PROJECT: ReactOS DNS Shared Library
|
||||||
|
* FILE: lib/dnslib/utf8.c
|
||||||
|
* PURPOSE: Functions for doing UTF8 string conversion and manipulation.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* INCLUDES ******************************************************************/
|
||||||
|
#include "precomp.h"
|
||||||
|
|
||||||
|
/* DATA **********************************************************************/
|
||||||
|
|
||||||
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
|
@ -13,6 +13,9 @@
|
||||||
<directory name="debugsup">
|
<directory name="debugsup">
|
||||||
<xi:include href="debugsup/debugsup.rbuild" />
|
<xi:include href="debugsup/debugsup.rbuild" />
|
||||||
</directory>
|
</directory>
|
||||||
|
<directory name="dnslib">
|
||||||
|
<xi:include href="dnslib/dnslib.rbuild" />
|
||||||
|
</directory>
|
||||||
<directory name="drivers">
|
<directory name="drivers">
|
||||||
<xi:include href="drivers/directory.rbuild" />
|
<xi:include href="drivers/directory.rbuild" />
|
||||||
</directory>
|
</directory>
|
||||||
|
|
Loading…
Reference in a new issue