Я пытаюсь создать программу, которая выполняет те же функции, что и запуск команды ipconfg / all в Windows. Мне удалось реализовать практически все функциональные возможности, но у меня возникли трудности с получением правильной даты и времени истечения срока аренды. Я пытаюсь получить эту информацию, вызывая GetAdapterInfo и получая значение LeaseExpires из возвращаемого объекта PIP_ADAPTER_INFO. Однако значение срока действия аренды не только не совпадает с показанным в ipconfig / all, но также изменяется при каждом запуске программы. Кто-нибудь может определить, почему это происходит?
#include <WinSock2.h>
#include <iphlpapi.h>
#include <stdio.h>
#pragma comment(lib, "Iphlpapi.lib")
PIP_ADAPTER_INFO getAdaptersInfo();
void outputFormatedTime(time_t * ttp);
int main()
{
PIP_ADAPTER_INFO pai = getAdaptersInfo();
if (pai)
{
for (; pai != NULL; pai = pai->Next)
{
if (pai->DhcpEnabled && pai->LeaseObtained)
{
printf("Lease Obtained: %llu - ", pai->LeaseObtained);
outputFormatedTime(&pai->LeaseObtained);
printf("Lease Expires: %llu - ", pai->LeaseExpires);
outputFormatedTime(&pai->LeaseExpires);
}
}
HeapFree(GetProcessHeap(), 0, pai);
pai = NULL;
}
return 0;
}
PIP_ADAPTER_INFO getAdaptersInfo()
{
PIP_ADAPTER_INFO paiResult;
ULONG ulOutputBufferLength = sizeof(IP_ADAPTER_INFO);
paiResult = (IP_ADAPTER_INFO *)HeapAlloc(GetProcessHeap(), 0, sizeof(IP_ADAPTER_INFO));
if (paiResult == NULL)
{
printf("Error allocating memory needed to call GetAdaptersInfo\n");
return paiResult;
}
if (GetAdaptersInfo(paiResult, &ulOutputBufferLength) == ERROR_BUFFER_OVERFLOW)
{
HeapFree(GetProcessHeap(), 0, paiResult);
paiResult = (IP_ADAPTER_INFO *)HeapAlloc(GetProcessHeap(), 0, ulOutputBufferLength);
if (paiResult == NULL)
{
printf("Error allocating memory needed to call GetAdaptersInfo\n");
return paiResult;
}
}
if (!GetAdaptersInfo(paiResult, &ulOutputBufferLength) == NO_ERROR)
{
printf("Error calling GetAdaptersInfo\n");
HeapFree(GetProcessHeap(), 0, paiResult);
paiResult = NULL;
return paiResult;
}
return paiResult;
}
void outputFormatedTime(time_t * ttp)
{
struct tm newtime;
char buffer[32];
errno_t error;
error = _localtime32_s(&newtime, (__time32_t *)ttp);
if (error)
{
printf("Invalid Argument to _localtime32_s\n");
}
else
{
error = asctime_s(buffer, 32, &newtime);
if (error)
{
printf("Invalid Argument to asctime_s\n");
}
else
{
printf("%s", buffer);
}
}
}
Задача ещё не решена.
Других решений пока нет …