TDI_STATUS InfoTdiQueryGetArptableMIB(TDIEntityID ID, PIP_INTERFACE Interface, PNDIS_BUFFER Buffer, PUINT BufferSize) { NTSTATUS Status; ULONG NumNeighbors = NBCopyNeighbors( Interface, NULL ); ULONG MemSize = NumNeighbors * sizeof(IPARP_ENTRY); PIPARP_ENTRY ArpEntries; if (MemSize != 0) { ArpEntries = ExAllocatePool( NonPagedPool, MemSize ); if( !ArpEntries ) return STATUS_NO_MEMORY; NBCopyNeighbors( Interface, ArpEntries ); Status = InfoCopyOut( (PVOID)ArpEntries, MemSize, Buffer, BufferSize ); ExFreePool( ArpEntries ); } else { Status = InfoCopyOut(NULL, 0, NULL, BufferSize); } return Status; }
TDI_STATUS InfoTdiQueryEntityType(TDIEntityID ID, PNDIS_BUFFER Buffer, PUINT BufferSize) { KIRQL OldIrql; UINT i, Flags = 0; TcpipAcquireSpinLock(&EntityListLock, &OldIrql); for (i = 0; i < EntityCount; i++) { if (EntityList[i].tei_entity == ID.tei_entity && EntityList[i].tei_instance == ID.tei_instance) break; } if (i == EntityCount) { TcpipReleaseSpinLock(&EntityListLock, OldIrql); return TDI_INVALID_PARAMETER; } Flags = EntityList[i].flags; InfoCopyOut((PCHAR)&Flags, sizeof(ULONG), Buffer, BufferSize); TcpipReleaseSpinLock(&EntityListLock, OldIrql); return TDI_SUCCESS; }
TDI_STATUS InfoTdiQueryGetATInfo( TDIEntityID ID, PIP_INTERFACE Interface, PNDIS_BUFFER Buffer, PUINT BufferSize) { ULONG ATInfo[2]; TDI_STATUS Status; TI_DbgPrint(DEBUG_INFO, ("Called.\n")); if (!Interface) return TDI_INVALID_PARAMETER; if (*BufferSize < sizeof(ATInfo)) return STATUS_BUFFER_TOO_SMALL; /* FIXME: I have no idea what the first field should contain... */ ATInfo[0] = 0; ATInfo[1] = Interface->Index; Status = InfoCopyOut((PCHAR)ATInfo, sizeof(ATInfo), Buffer, BufferSize); TI_DbgPrint(DEBUG_INFO, ("Returning %08x\n", Status)); return Status; }
TDI_STATUS InfoTdiQueryGetAddrTable(TDIEntityID ID, PNDIS_BUFFER Buffer, PUINT BufferSize) { KIRQL OldIrql; PIPADDR_ENTRY IPEntry; PIP_INTERFACE CurrentIF; UINT i; TI_DbgPrint(DEBUG_INFO, ("Called.\n")); TcpipAcquireSpinLock(&EntityListLock, &OldIrql); for (i = 0; i < EntityCount; i++) { if (EntityList[i].tei_entity == ID.tei_entity && EntityList[i].tei_instance == ID.tei_instance) break; } if (i == EntityCount) { TcpipReleaseSpinLock(&EntityListLock, OldIrql); return TDI_INVALID_PARAMETER; } IPEntry = ExAllocatePool(NonPagedPool, sizeof(IPADDR_ENTRY)); if (!IPEntry) { TcpipReleaseSpinLock(&EntityListLock, OldIrql); return TDI_NO_RESOURCES; } CurrentIF = EntityList[i].context; IPEntry->Index = CurrentIF->Index; GetInterfaceIPv4Address(CurrentIF, ADE_UNICAST, &IPEntry->Addr); GetInterfaceIPv4Address(CurrentIF, ADE_ADDRMASK, &IPEntry->Mask); GetInterfaceIPv4Address(CurrentIF, ADE_BROADCAST, &IPEntry->BcastAddr); TcpipReleaseSpinLock(&EntityListLock, OldIrql); InfoCopyOut((PCHAR)IPEntry, sizeof(IPADDR_ENTRY), Buffer, BufferSize); ExFreePool(IPEntry); return TDI_SUCCESS; }
TDI_STATUS InfoTransportLayerTdiQueryEx( UINT InfoClass, UINT InfoType, UINT InfoId, PVOID Context, TDIEntityID *id, PNDIS_BUFFER Buffer, PUINT BufferSize ) { if( InfoClass == INFO_CLASS_GENERIC && InfoType == INFO_TYPE_PROVIDER && InfoId == ENTITY_TYPE_ID ) { ULONG Temp = CL_TL_UDP; return InfoCopyOut( (PCHAR)&Temp, sizeof(Temp), Buffer, BufferSize ); } return TDI_INVALID_REQUEST; }
TDI_STATUS InfoTdiQueryGetIPSnmpInfo( TDIEntityID ID, PIP_INTERFACE IF, PNDIS_BUFFER Buffer, PUINT BufferSize ) { IPSNMP_INFO SnmpInfo; UINT IfCount = CountInterfaces(); UINT RouteCount = CountFIBs(IF); TDI_STATUS Status = TDI_INVALID_REQUEST; TI_DbgPrint(DEBUG_INFO, ("Called.\n")); RtlZeroMemory(&SnmpInfo, sizeof(IPSNMP_INFO)); SnmpInfo.NumIf = IfCount; SnmpInfo.NumAddr = 1; SnmpInfo.NumRoutes = RouteCount; Status = InfoCopyOut( (PCHAR)&SnmpInfo, sizeof(SnmpInfo), Buffer, BufferSize ); TI_DbgPrint(DEBUG_INFO, ("Returning %08x\n", Status)); return Status; }
/* Get IPRouteEntry s for each of the routes in the system */ TDI_STATUS InfoTdiQueryGetRouteTable( PIP_INTERFACE IF, PNDIS_BUFFER Buffer, PUINT BufferSize ) { TDI_STATUS Status; KIRQL OldIrql; UINT RtCount = CountFIBs(IF); UINT Size = sizeof( IPROUTE_ENTRY ) * RtCount; PFIB_ENTRY RCache, RCacheCur; PIPROUTE_ENTRY RouteEntries, RtCurrent; UINT i; TI_DbgPrint(DEBUG_INFO, ("Called, routes = %d\n", RtCount)); if (RtCount == 0) return InfoCopyOut(NULL, 0, NULL, BufferSize); RouteEntries = ExAllocatePool( NonPagedPool, Size ); RtCurrent = RouteEntries; RCache = ExAllocatePool( NonPagedPool, sizeof( FIB_ENTRY ) * RtCount ); RCacheCur = RCache; if( !RCache || !RouteEntries ) { if( RCache ) ExFreePool( RCache ); if( RouteEntries ) ExFreePool( RouteEntries ); return TDI_NO_RESOURCES; } RtlZeroMemory( RouteEntries, Size ); RtCount = CopyFIBs( IF, RCache ); while( RtCurrent < RouteEntries + RtCount ) { ASSERT(RCacheCur->Router); RtlCopyMemory( &RtCurrent->Dest, &RCacheCur->NetworkAddress.Address, sizeof(RtCurrent->Dest) ); RtlCopyMemory( &RtCurrent->Mask, &RCacheCur->Netmask.Address, sizeof(RtCurrent->Mask) ); RtlCopyMemory( &RtCurrent->Gw, &RCacheCur->Router->Address.Address, sizeof(RtCurrent->Gw) ); RtCurrent->Metric1 = RCacheCur->Metric; RtCurrent->Type = TDI_ADDRESS_TYPE_IP; TI_DbgPrint (DEBUG_INFO, ("%d: NA %08x NM %08x GW %08x MT %x\n", RtCurrent - RouteEntries, RtCurrent->Dest, RtCurrent->Mask, RtCurrent->Gw, RtCurrent->Metric1 )); TcpipAcquireSpinLock(&EntityListLock, &OldIrql); for (i = 0; i < EntityCount; i++) if (EntityList[i].context == IF) break; if (i < EntityCount) RtCurrent->Index = EntityList[i].tei_instance; else RtCurrent->Index = 0; TcpipReleaseSpinLock(&EntityListLock, OldIrql); RtCurrent++; RCacheCur++; } Status = InfoCopyOut( (PCHAR)RouteEntries, Size, Buffer, BufferSize ); ExFreePool( RouteEntries ); ExFreePool( RCache ); TI_DbgPrint(DEBUG_INFO, ("Returning %08x\n", Status)); return Status; }
TDI_STATUS InfoTdiQueryGetInterfaceMIB(TDIEntityID ID, PIP_INTERFACE Interface, PNDIS_BUFFER Buffer, PUINT BufferSize) { TDI_STATUS Status = TDI_INVALID_REQUEST; PIFENTRY OutData; PLAN_ADAPTER IF; PCHAR IFDescr; ULONG Size; UINT DescrLenMax = MAX_IFDESCR_LEN - 1; NDIS_STATUS NdisStatus; if (!Interface) return TDI_INVALID_PARAMETER; IF = (PLAN_ADAPTER)Interface->Context; TI_DbgPrint(DEBUG_INFO, ("Getting IFEntry MIB (IF %08x LA %08x) (%04x:%d)\n", Interface, IF, ID.tei_entity, ID.tei_instance)); OutData = (PIFENTRY)ExAllocatePool( NonPagedPool, sizeof(IFENTRY) + MAX_IFDESCR_LEN ); if( !OutData ) return TDI_NO_RESOURCES; /* Out of memory */ RtlZeroMemory( OutData, sizeof(IFENTRY) + MAX_IFDESCR_LEN ); OutData->Index = Interface->Index; /* viz: tcpip keeps those indices */ OutData->Type = Interface == Loopback ? MIB_IF_TYPE_LOOPBACK : MIB_IF_TYPE_ETHERNET; OutData->Mtu = Interface->MTU; TI_DbgPrint(DEBUG_INFO, ("Getting interface speed\n")); OutData->PhysAddrLen = Interface->AddressLength; OutData->AdminStatus = MIB_IF_ADMIN_STATUS_UP; /* NDIS_HARDWARE_STATUS -> ROUTER_CONNECTION_STATE */ Status = GetInterfaceConnectionStatus( Interface, &OutData->OperStatus ); /* Not sure what to do here, but not ready seems a safe bet on failure */ if( !NT_SUCCESS(Status) ) OutData->OperStatus = NdisHardwareStatusNotReady; IFDescr = (PCHAR)&OutData[1]; if( IF ) { GetInterfaceSpeed( Interface, (PUINT)&OutData->Speed ); TI_DbgPrint(DEBUG_INFO, ("IF Speed = %d * 100bps\n", OutData->Speed)); memcpy(OutData->PhysAddr,Interface->Address,Interface->AddressLength); TI_DbgPrint(DEBUG_INFO, ("Got HWAddr\n")); memcpy(&OutData->InOctets, &Interface->Stats, sizeof(SEND_RECV_STATS)); NdisStatus = NDISCall(IF, NdisRequestQueryInformation, OID_GEN_XMIT_ERROR, &OutData->OutErrors, sizeof(ULONG)); if (NdisStatus != NDIS_STATUS_SUCCESS) OutData->OutErrors = 0; TI_DbgPrint(DEBUG_INFO, ("OutErrors = %d\n", OutData->OutErrors)); NdisStatus = NDISCall(IF, NdisRequestQueryInformation, OID_GEN_RCV_ERROR, &OutData->InErrors, sizeof(ULONG)); if (NdisStatus != NDIS_STATUS_SUCCESS) OutData->InErrors = 0; TI_DbgPrint(DEBUG_INFO, ("InErrors = %d\n", OutData->InErrors)); } GetInterfaceName( Interface, IFDescr, MAX_IFDESCR_LEN - 1 ); DescrLenMax = strlen( IFDescr ) + 1; TI_DbgPrint(DEBUG_INFO, ("Copied in name %s\n", IFDescr)); OutData->DescrLen = DescrLenMax; IFDescr += DescrLenMax; Size = IFDescr - (PCHAR)OutData + 1; TI_DbgPrint(DEBUG_INFO, ("Finished IFEntry MIB (%04x:%d) size %d\n", ID.tei_entity, ID.tei_instance, Size)); Status = InfoCopyOut( (PCHAR)OutData, Size, Buffer, BufferSize ); ExFreePool( OutData ); TI_DbgPrint(DEBUG_INFO,("Returning %x\n", Status)); return Status; }
TDI_STATUS InfoTdiQueryGetInterfaceMIB(TDIEntityID ID, PIP_INTERFACE Interface, PNDIS_BUFFER Buffer, PUINT BufferSize) { TDI_STATUS Status = TDI_INVALID_REQUEST; IFEntry* OutData; PLAN_ADAPTER IF; PCHAR IFDescr; ULONG Size; NDIS_STATUS NdisStatus; if (!Interface) return TDI_INVALID_PARAMETER; IF = (PLAN_ADAPTER)Interface->Context; TI_DbgPrint(DEBUG_INFO, ("Getting IFEntry MIB (IF %08x LA %08x) (%04x:%d)\n", Interface, IF, ID.tei_entity, ID.tei_instance)); OutData = ExAllocatePool( NonPagedPool, FIELD_OFFSET(IFEntry, if_descr[MAX_ADAPTER_DESCRIPTION_LENGTH + 1])); if( !OutData ) return TDI_NO_RESOURCES; /* Out of memory */ RtlZeroMemory( OutData, FIELD_OFFSET(IFEntry, if_descr[MAX_ADAPTER_DESCRIPTION_LENGTH + 1])); OutData->if_index = Interface->Index; /* viz: tcpip keeps those indices */ OutData->if_type = Interface == Loopback ? MIB_IF_TYPE_LOOPBACK : MIB_IF_TYPE_ETHERNET; OutData->if_mtu = Interface->MTU; TI_DbgPrint(DEBUG_INFO, ("Getting interface speed\n")); OutData->if_physaddrlen = Interface->AddressLength; OutData->if_adminstatus = MIB_IF_ADMIN_STATUS_UP; /* NDIS_HARDWARE_STATUS -> ROUTER_CONNECTION_STATE */ GetInterfaceConnectionStatus( Interface, &OutData->if_operstatus ); IFDescr = (PCHAR)&OutData->if_descr[0]; if( IF ) { GetInterfaceSpeed( Interface, (PUINT)&OutData->if_speed ); TI_DbgPrint(DEBUG_INFO, ("IF Speed = %d * 100bps\n", OutData->if_speed)); memcpy(OutData->if_physaddr, Interface->Address, Interface->AddressLength); TI_DbgPrint(DEBUG_INFO, ("Got HWAddr\n")); memcpy(&OutData->if_inoctets, &Interface->Stats, sizeof(SEND_RECV_STATS)); NdisStatus = NDISCall(IF, NdisRequestQueryInformation, OID_GEN_XMIT_ERROR, &OutData->if_outerrors, sizeof(ULONG)); if (NdisStatus != NDIS_STATUS_SUCCESS) OutData->if_outerrors = 0; TI_DbgPrint(DEBUG_INFO, ("OutErrors = %d\n", OutData->if_outerrors)); NdisStatus = NDISCall(IF, NdisRequestQueryInformation, OID_GEN_RCV_ERROR, &OutData->if_inerrors, sizeof(ULONG)); if (NdisStatus != NDIS_STATUS_SUCCESS) OutData->if_inerrors = 0; TI_DbgPrint(DEBUG_INFO, ("InErrors = %d\n", OutData->if_inerrors)); } GetInterfaceName( Interface, IFDescr, MAX_ADAPTER_DESCRIPTION_LENGTH ); TI_DbgPrint(DEBUG_INFO, ("Copied in name %s\n", IFDescr)); OutData->if_descrlen = strlen(IFDescr); Size = FIELD_OFFSET(IFEntry, if_descr[OutData->if_descrlen + 1]); TI_DbgPrint(DEBUG_INFO, ("Finished IFEntry MIB (%04x:%d) size %d\n", ID.tei_entity, ID.tei_instance, Size)); Status = InfoCopyOut( (PCHAR)OutData, Size, Buffer, BufferSize ); ExFreePool( OutData ); TI_DbgPrint(DEBUG_INFO,("Returning %x\n", Status)); return Status; }