UINT NtEnumDhcpList(NAT *n, RPC_ENUM_DHCP *t) { UINT ret = ERR_NO_ERROR; VH *v = NULL; Lock(n->lock); { v = n->Virtual; if (n->Online == false || v == NULL) { ret = ERR_OFFLINE; } else { LockVirtual(v); { if (v->Active == false) { ret = ERR_OFFLINE; } else { FreeRpcEnumDhcp(t); Zero(t, sizeof(RPC_ENUM_DHCP)); LockList(v->DhcpLeaseList); { UINT i; t->NumItem = LIST_NUM(v->DhcpLeaseList); t->Items = ZeroMalloc(sizeof(RPC_ENUM_DHCP_ITEM) * t->NumItem); for (i = 0;i < t->NumItem;i++) { DHCP_LEASE *dhcp = LIST_DATA(v->DhcpLeaseList, i); RPC_ENUM_DHCP_ITEM *e = &t->Items[i]; e->Id = dhcp->Id; e->LeasedTime = TickToTime(dhcp->LeasedTime); e->ExpireTime = TickToTime(dhcp->ExpireTime); Copy(e->MacAddress, dhcp->MacAddress, 6); e->IpAddress = dhcp->IpAddress; e->Mask = dhcp->Mask; StrCpy(e->Hostname, sizeof(e->Hostname), dhcp->Hostname); } } UnlockList(v->DhcpLeaseList); } } UnlockVirtual(v); } } Unlock(n->lock); return ret; }
// 状態の取得 UINT NtGetStatus(NAT *n, RPC_NAT_STATUS *t) { Lock(n->lock); { VH *v = n->Virtual; FreeRpcNatStatus(t); Zero(t, sizeof(RPC_NAT_STATUS)); LockVirtual(v); { UINT i; LockList(v->NatTable); { for (i = 0;i < LIST_NUM(v->NatTable);i++) { NAT_ENTRY *e = LIST_DATA(v->NatTable, i); switch (e->Protocol) { case NAT_TCP: t->NumTcpSessions++; break; case NAT_UDP: t->NumUdpSessions++; break; } } } UnlockList(v->NatTable); t->NumDhcpClients = LIST_NUM(v->DhcpLeaseList); } UnlockVirtual(v); } Unlock(n->lock); return ERR_NO_ERROR; }
// Get the NAT list UINT NtEnumNatList(NAT *n, RPC_ENUM_NAT *t) { UINT ret = ERR_NO_ERROR; VH *v = NULL; Lock(n->lock); { v = n->Virtual; if (n->Online == false || v == NULL) { ret = ERR_OFFLINE; } else { LockVirtual(v); { if (v->Active == false) { ret = ERR_OFFLINE; } else { FreeRpcEnumNat(t); Zero(t, sizeof(RPC_ENUM_NAT)); LockList(v->NatTable); { UINT i; UINT num_usermode_nat = LIST_NUM(v->NatTable); UINT num_kernel_mode_nat = 0; NATIVE_NAT *native = NULL; if (NnIsActive(v) && (v->NativeNat != NULL)) { native = v->NativeNat; num_kernel_mode_nat = LIST_NUM(native->NatTableForSend->AllList); } t->NumItem = num_usermode_nat + num_kernel_mode_nat; t->Items = ZeroMalloc(sizeof(RPC_ENUM_NAT_ITEM) * t->NumItem); // Enumerate entries of the user mode NAT for (i = 0;i < num_usermode_nat;i++) { NAT_ENTRY *nat = LIST_DATA(v->NatTable, i); RPC_ENUM_NAT_ITEM *e = &t->Items[i]; e->Id = nat->Id; e->Protocol = nat->Protocol; e->SrcIp = nat->SrcIp; e->DestIp = nat->DestIp; e->SrcPort = nat->SrcPort; e->DestPort = nat->DestPort; e->CreatedTime = TickToTime(nat->CreatedTime); e->LastCommTime = TickToTime(nat->LastCommTime); IPToStr32(e->SrcHost, sizeof(e->SrcHost), e->SrcIp); IPToStr32(e->DestHost, sizeof(e->DestHost), e->DestIp); if (nat->Sock != NULL) { e->SendSize = nat->Sock->SendSize; e->RecvSize = nat->Sock->RecvSize; if (nat->Sock->Type == SOCK_TCP) { StrCpy(e->DestHost, sizeof(e->DestHost), nat->Sock->RemoteHostname); } } e->TcpStatus = nat->TcpStatus; } // Enumerate the entries in the kernel-mode NAT if (native != NULL) { for (i = 0;i < num_kernel_mode_nat;i++) { NATIVE_NAT_ENTRY *nat = LIST_DATA(native->NatTableForSend->AllList, i); RPC_ENUM_NAT_ITEM *e = &t->Items[num_usermode_nat + i]; e->Id = nat->Id; e->Protocol = nat->Protocol; e->SrcIp = nat->SrcIp; e->DestIp = nat->DestIp; e->SrcPort = nat->SrcPort; e->DestPort = nat->DestPort; e->CreatedTime = TickToTime(nat->CreatedTime); e->LastCommTime = TickToTime(nat->LastCommTime); IPToStr32(e->SrcHost, sizeof(e->SrcHost), e->SrcIp); IPToStr32(e->DestHost, sizeof(e->DestHost), e->DestIp); e->SendSize = nat->TotalSent; e->RecvSize = nat->TotalRecv; e->TcpStatus = nat->Status; } } } UnlockList(v->NatTable); } } UnlockVirtual(v); } } Unlock(n->lock); return ret; }
// Get the state UINT NtGetStatus(NAT *n, RPC_NAT_STATUS *t) { Lock(n->lock); { VH *v = n->Virtual; FreeRpcNatStatus(t); Zero(t, sizeof(RPC_NAT_STATUS)); LockVirtual(v); { UINT i; LockList(v->NatTable); { for (i = 0;i < LIST_NUM(v->NatTable);i++) { NAT_ENTRY *e = LIST_DATA(v->NatTable, i); switch (e->Protocol) { case NAT_TCP: t->NumTcpSessions++; break; case NAT_UDP: t->NumUdpSessions++; break; case NAT_ICMP: t->NumIcmpSessions++; break; case NAT_DNS: t->NumDnsSessions++; break; } } if (NnIsActive(v) && v->NativeNat != NULL) { NATIVE_NAT *nn = v->NativeNat; for (i = 0;i < LIST_NUM(nn->NatTableForSend->AllList);i++) { NATIVE_NAT_ENTRY *e = LIST_DATA(nn->NatTableForSend->AllList, i); switch (e->Protocol) { case NAT_TCP: t->NumTcpSessions++; break; case NAT_UDP: t->NumUdpSessions++; break; case NAT_ICMP: t->NumIcmpSessions++; break; case NAT_DNS: t->NumDnsSessions++; break; } } } } UnlockList(v->NatTable); t->NumDhcpClients = LIST_NUM(v->DhcpLeaseList); t->IsKernelMode = NnIsActiveEx(v, &t->IsRawIpMode); } UnlockVirtual(v); } Unlock(n->lock); return ERR_NO_ERROR; }
// NAT リストの取得 UINT NtEnumNatList(NAT *n, RPC_ENUM_NAT *t) { UINT ret = ERR_NO_ERROR; VH *v = NULL; Lock(n->lock); { v = n->Virtual; if (n->Online == false || v == NULL) { ret = ERR_OFFLINE; } else { LockVirtual(v); { if (v->Active == false) { ret = ERR_OFFLINE; } else { FreeRpcEnumNat(t); Zero(t, sizeof(RPC_ENUM_NAT)); LockList(v->NatTable); { UINT i; t->NumItem = LIST_NUM(v->NatTable); t->Items = ZeroMalloc(sizeof(RPC_ENUM_NAT_ITEM) * t->NumItem); for (i = 0;i < t->NumItem;i++) { NAT_ENTRY *nat = LIST_DATA(v->NatTable, i); RPC_ENUM_NAT_ITEM *e = &t->Items[i]; e->Id = nat->Id; e->Protocol = nat->Protocol; e->SrcIp = nat->SrcIp; e->DestIp = nat->DestIp; e->SrcPort = nat->SrcPort; e->DestPort = nat->DestPort; e->CreatedTime = TickToTime(nat->CreatedTime); e->LastCommTime = TickToTime(nat->LastCommTime); IPToStr32(e->SrcHost, sizeof(e->SrcHost), e->SrcIp); IPToStr32(e->DestHost, sizeof(e->DestHost), e->DestIp); if (nat->Sock != NULL) { e->SendSize = nat->Sock->SendSize; e->RecvSize = nat->Sock->RecvSize; if (nat->Sock->Type == SOCK_TCP) { StrCpy(e->DestHost, sizeof(e->DestHost), nat->Sock->RemoteHostname); } } e->TcpStatus = nat->TcpStatus; } } UnlockList(v->NatTable); } } UnlockVirtual(v); } } Unlock(n->lock); return ret; }