NTSTATUS TdiOpenAddressFile( PUNICODE_STRING DeviceName, PTRANSPORT_ADDRESS Name, ULONG ShareType, PHANDLE AddressHandle, PFILE_OBJECT *AddressObject) /* * FUNCTION: Opens an IPv4 address file object * ARGUMENTS: * DeviceName = Pointer to counted string with name of device * Name = Pointer to socket name (IPv4 address family) * AddressHandle = Address of buffer to place address file handle * AddressObject = Address of buffer to place address file object * RETURNS: * Status of operation */ { PFILE_FULL_EA_INFORMATION EaInfo; NTSTATUS Status; ULONG EaLength; PTRANSPORT_ADDRESS Address; AFD_DbgPrint(MAX_TRACE, ("Called. DeviceName (%wZ) Name (%p)\n", DeviceName, Name)); /* EaName must be 0-terminated, even though TDI_TRANSPORT_ADDRESS_LENGTH does *not* include the 0 */ EaLength = sizeof(FILE_FULL_EA_INFORMATION) + TDI_TRANSPORT_ADDRESS_LENGTH + TaLengthOfTransportAddress( Name ) + 1; EaInfo = (PFILE_FULL_EA_INFORMATION)ExAllocatePool(NonPagedPool, EaLength); if (!EaInfo) return STATUS_INSUFFICIENT_RESOURCES; RtlZeroMemory(EaInfo, EaLength); EaInfo->EaNameLength = TDI_TRANSPORT_ADDRESS_LENGTH; /* Don't copy the terminating 0; we have already zeroed it */ RtlCopyMemory(EaInfo->EaName, TdiTransportAddress, TDI_TRANSPORT_ADDRESS_LENGTH); EaInfo->EaValueLength = sizeof(TA_IP_ADDRESS); Address = (PTRANSPORT_ADDRESS)(EaInfo->EaName + TDI_TRANSPORT_ADDRESS_LENGTH + 1); /* 0-terminated */ TaCopyTransportAddressInPlace( Address, Name ); Status = TdiOpenDevice(DeviceName, EaLength, EaInfo, ShareType, AddressHandle, AddressObject); ExFreePool(EaInfo); return Status; }
PTRANSPORT_ADDRESS TaCopyTransportAddress( PTRANSPORT_ADDRESS OtherAddress ) { UINT AddrLen; PTRANSPORT_ADDRESS A; AddrLen = TaLengthOfTransportAddress( OtherAddress ); if (!AddrLen) return NULL; A = ExAllocatePool( NonPagedPool, AddrLen ); if( A ) TaCopyTransportAddressInPlace( A, OtherAddress ); return A; }
VOID TaCopyTransportAddressInPlace( PTRANSPORT_ADDRESS Target, PTRANSPORT_ADDRESS Source ) { UINT AddrLen = TaLengthOfTransportAddress( Source ); RtlCopyMemory( Target, Source, AddrLen ); }