Имеется функция по считыванию ARP в массив. Если запустить из под администратора, то работает замечательно. Но стоит исполняемый файл завести как сервис, то считывание ARP значений в массив происходит только 1 раз. Дальше ничего не происходит. В чём может быть дело?
P.s. Функция честно найдена на просторах интернета.
Код:
While 1
_arp()
Sleep (3000)
WEnd
Func _arp ()
Local $aCall = DllCall("iphlpapi.dll", "dword", "GetIpNetTable", _
"ptr*", 0, _
"dword*", 0, _
"bool", 1)
If @error Then Return SetError(1, 0, 0)
If $aCall[0] <> 122 Then Return SetError(2, 0, 0)
Local $iSize = $aCall[2]
Local $tByteStructure = DllStructCreate("byte[" & $iSize & "]")
Local $pPointer = DllStructGetPtr($tByteStructure)
$aCall = DllCall("iphlpapi.dll", "dword", "GetIpNetTable", _
"ptr", $pPointer, _
"dword*", $iSize, _
"bool", 1)
Local $tMIB_IPNETTABLE_NumEnries = DllStructCreate("dword dwNumEntries;", $pPointer)
Local $iNumEntries = DllStructGetData($tMIB_IPNETTABLE_NumEnries, "dwNumEntries")
$pPointer += 4 ;
Local Const $MAXLEN_PHYSADDR = 8
Local $tMIB_IPNETROW
Local $aARPTable[$iNumEntries][3]
For $i = 0 To $iNumEntries - 1
$tMIB_IPNETROW = DllStructCreate("dword dwIndex;" & _
"dword dwPhysAddrLen;" & _
"byte bPhysAddr[" & $MAXLEN_PHYSADDR & "];" & _
"dword dwAddr;" & _
"dword dwType;", _
$pPointer)
$aARPTable[$i][1] = _BinToMAC(DllStructGetData($tMIB_IPNETROW, "bPhysAddr"), DllStructGetData($tMIB_IPNETROW, "dwPhysAddrLen"))
$aARPTable[$i][0] = _NumToIP(DllStructGetData($tMIB_IPNETROW, "dwAddr"))
$pPointer += DllStructGetSize($tMIB_IPNETROW)
Next
$aARPTable = _ClearArray ($aARPTable)
Return $aARPTable
EndFunc
P.s. Функция честно найдена на просторах интернета.