|
|
Definition at line 131 of file sablob.c.
{
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;
if (DnsAddrArray)
{
AddressFamily = DnsAddrArray->Addresses[0].AddressFamily;
FamilyInfo = FamilyInfo_GetForFamily(AddressFamily);
AddressCount = DnsAddrArray->UsedAddresses;
AddressSize = FamilyInfo->AddressSize;
}
TotalSize = AddressSize * AddressCount;
NamePointerSize = AddressCount * sizeof(PVOID) + sizeof(PVOID);
if (Blob->Name)
{
StringLength = (Dns_GetBufferLengthForStringCopy(Blob->Name,
0,
UnicodeString,
StringType) + 1) & ~1;
}
for (i = AliasCount; i; i--)
{
HostentSize += (Dns_GetBufferLengthForStringCopy(Blob->Aliases[i],
0,
UnicodeString,
StringType) + 1) & ~1;
}
AliasPointerSize = AliasCount * sizeof(PVOID) + sizeof(PVOID);
HostentSize += TotalSize +
NamePointerSize +
AliasPointerSize +
StringLength +
sizeof(HOSTENT);
if (!BufferAllocated)
{
HostentPtr = (ULONG_PTR)Dns_AllocZero(HostentSize);
}
else
{
HostentPtr = (ULONG_PTR)FlatBuf_Arg_ReserveAlignPointer(BufferPosition,
FreeBufferSpace,
HostentSize);
}
if (HostentPtr)
{
Hostent = Hostent_Init((PVOID)&HostentPtr,
AddressFamily,
AddressSize,
AddressCount,
AliasCount);
}
for (i = 0; i < AddressCount; i++)
{
CurrentAddress = (PVOID)((ULONG_PTR)&DnsAddrArray->Addresses[i] +
FamilyInfo->AddressOffset);
Hostent->h_addr_list[i] = (PCHAR)HostentPtr;
RtlCopyMemory((PVOID)HostentPtr, CurrentAddress, AddressSize);
HostentPtr += AddressSize;
}
if (Blob->Name)
{
HostentPtr += 1 & ~1;
Hostent->h_name = (LPSTR)HostentPtr;
HostentPtr += Dns_StringCopy((PVOID)HostentPtr,
NULL,
Blob->Name,
0,
UnicodeString,
StringType);
}
for (i = AliasCount; i; i--)
{
HostentPtr += 1 & ~1;
Hostent->h_aliases[i] = (LPSTR)HostentPtr;
HostentPtr += Dns_StringCopy((PVOID)HostentPtr,
NULL,
Blob->Aliases[i],
0,
UnicodeString,
StringType);
}
if (!BufferAllocated)
{
*HostEntrySize = *BufferPosition - (ULONG_PTR)HostentPtr;
}
if(Relative) Hostent_ConvertToOffsets(Hostent);
return Hostent;
}
|