/* * @implemented */ INT WSAAPI WSANtohl(IN SOCKET s, IN ULONG netlong, OUT ULONG FAR* lphostlong) { INT ErrorCode; PWSSOCKET Socket; DPRINT("WSANtohl: %p, %lx, %p\n", s, netlong, lphostlong); /* Check for WSAStartup */ if ((ErrorCode = WsQuickProlog()) == ERROR_SUCCESS) { /* Make sure we got a parameter */ if (!lphostlong) { /* Fail */ SetLastError(WSAEFAULT); return SOCKET_ERROR; } /* Get the Socket Context */ if ((Socket = WsSockGetSocket(s))) { /* Check which byte order to use */ if (Socket->CatalogEntry->ProtocolInfo.iNetworkByteOrder == LITTLEENDIAN) { /* No conversion needed */ *lphostlong = netlong; } else { /* Use a swap */ *lphostlong = DN2H(netlong); } /* Dereference the socket */ WsSockDereference(Socket); /* Return success */ return ERROR_SUCCESS; } else { /* Set the error code */ ErrorCode = WSAENOTSOCK; } } /* Return with error */ SetLastError(ErrorCode); return SOCKET_ERROR; }
NTSTATUS TdiQueryAddress( PFILE_OBJECT FileObject, PULONG Address) /* * FUNCTION: Queries for a local IP address * ARGUMENTS: * FileObject = Pointer to file object * Address = Address of buffer to place local address * RETURNS: * Status of operation */ { UINT i; TDIEntityID *Entities; ULONG EntityCount; ULONG EntityType; IPSNMPInfo SnmpInfo; PIPADDR_ENTRY IpAddress; ULONG BufferSize; NTSTATUS Status = STATUS_SUCCESS; AFD_DbgPrint(MAX_TRACE, ("Called\n")); BufferSize = sizeof(TDIEntityID) * 20; Entities = (TDIEntityID*)ExAllocatePool(NonPagedPool, BufferSize); if (!Entities) { AFD_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); return STATUS_INSUFFICIENT_RESOURCES; } /* Query device for supported entities */ Status = TdiQueryInformationEx(FileObject, /* File object */ GENERIC_ENTITY, /* Entity */ TL_INSTANCE, /* Instance */ INFO_CLASS_GENERIC, /* Entity class */ INFO_TYPE_PROVIDER, /* Entity type */ ENTITY_LIST_ID, /* Entity id */ Entities, /* Output buffer */ &BufferSize); /* Output buffer size */ if (!NT_SUCCESS(Status)) { AFD_DbgPrint(MIN_TRACE, ("Unable to get list of supported entities (Status = 0x%X).\n", Status)); ExFreePool(Entities); return Status; } /* Locate an IP entity */ EntityCount = BufferSize / sizeof(TDIEntityID); AFD_DbgPrint(MAX_TRACE, ("EntityCount = %u\n", EntityCount)); for (i = 0; i < EntityCount; i++) { if (Entities[i].tei_entity == CL_NL_ENTITY) { /* Query device for entity type */ BufferSize = sizeof(EntityType); Status = TdiQueryInformationEx(FileObject, /* File object */ CL_NL_ENTITY, /* Entity */ Entities[i].tei_instance, /* Instance */ INFO_CLASS_GENERIC, /* Entity class */ INFO_TYPE_PROVIDER, /* Entity type */ ENTITY_TYPE_ID, /* Entity id */ &EntityType, /* Output buffer */ &BufferSize); /* Output buffer size */ if (!NT_SUCCESS(Status) || (EntityType != CL_NL_IP)) { AFD_DbgPrint(MIN_TRACE, ("Unable to get entity of type IP (Status = 0x%X).\n", Status)); break; } /* Query device for SNMP information */ BufferSize = sizeof(SnmpInfo); Status = TdiQueryInformationEx(FileObject, /* File object */ CL_NL_ENTITY, /* Entity */ Entities[i].tei_instance, /* Instance */ INFO_CLASS_PROTOCOL, /* Entity class */ INFO_TYPE_PROVIDER, /* Entity type */ IP_MIB_STATS_ID, /* Entity id */ &SnmpInfo, /* Output buffer */ &BufferSize); /* Output buffer size */ if (!NT_SUCCESS(Status) || (SnmpInfo.ipsi_numaddr == 0)) { AFD_DbgPrint(MIN_TRACE, ("Unable to get SNMP information or no IP addresses available (Status = 0x%X).\n", Status)); break; } /* Query device for all IP addresses */ if (SnmpInfo.ipsi_numaddr != 0) { BufferSize = SnmpInfo.ipsi_numaddr * sizeof(IPADDR_ENTRY); IpAddress = (PIPADDR_ENTRY)ExAllocatePool(NonPagedPool, BufferSize); if (!IpAddress) { AFD_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); break; } Status = TdiQueryInformationEx(FileObject, /* File object */ CL_NL_ENTITY, /* Entity */ Entities[i].tei_instance, /* Instance */ INFO_CLASS_PROTOCOL, /* Entity class */ INFO_TYPE_PROVIDER, /* Entity type */ IP_MIB_ADDRTABLE_ENTRY_ID, /* Entity id */ IpAddress, /* Output buffer */ &BufferSize); /* Output buffer size */ if (!NT_SUCCESS(Status)) { AFD_DbgPrint(MIN_TRACE, ("Unable to get IP address (Status = 0x%X).\n", Status)); ExFreePool(IpAddress); break; } if (SnmpInfo.ipsi_numaddr != 1) { /* Skip loopback address */ *Address = DN2H(IpAddress[1].Addr); } else { /* Select the first address returned */ *Address = DN2H(IpAddress->Addr); } ExFreePool(IpAddress); } else { Status = STATUS_UNSUCCESSFUL; break; } } } ExFreePool(Entities); AFD_DbgPrint(MAX_TRACE, ("Leaving\n")); return Status; }
/* * @implemented */ ULONG WSAAPI ntohl(IN ULONG netlong) { return DN2H(netlong); }
unsigned long L2PNet_ntohl( unsigned long netlong ) { return DN2H(netlong); }