+BOOL
+IsReconnectHackNeeded(PDHCP_ADAPTER Adapter, const MIB_IFROW* IfEntry)
+{
+ struct protocol *proto;
+ PIP_ADAPTER_INFO AdapterInfo, Orig;
+ DWORD Size, Ret;
+ char *ZeroAddress = "0.0.0.0";
+
+ proto = find_protocol_by_adapter(&Adapter->DhclientInfo);
+
+ if (!proto)
+ return FALSE;
+
+ if (Adapter->DhclientInfo.client->state != S_BOUND)
+ return FALSE;
+
+ ApiUnlock();
+
+ Orig = AdapterInfo = HeapAlloc(GetProcessHeap(), 0, sizeof(IP_ADAPTER_INFO));
+ Size = sizeof(IP_ADAPTER_INFO);
+ if (!AdapterInfo)
+ {
+ ApiLock();
+ return FALSE;
+ }
+
+ Ret = GetAdaptersInfo(AdapterInfo, &Size);
+ if (Ret == ERROR_BUFFER_OVERFLOW)
+ {
+ HeapFree(GetProcessHeap(), 0, AdapterInfo);
+ AdapterInfo = HeapAlloc(GetProcessHeap(), 0, Size);
+ if (!AdapterInfo)
+ {
+ ApiLock();
+ return FALSE;
+ }
+
+ if (GetAdaptersInfo(AdapterInfo, &Size) != NO_ERROR)
+ {
+ ApiLock();
+ return FALSE;
+ }
+
+ Orig = AdapterInfo;
+ for (; AdapterInfo != NULL; AdapterInfo = AdapterInfo->Next)
+ {
+ if (AdapterInfo->Index == IfEntry->dwIndex)
+ break;
+ }
+
+ if (AdapterInfo == NULL)
+ {
+ HeapFree(GetProcessHeap(), 0, Orig);
+ ApiLock();
+ return FALSE;
+ }
+ }
+ else if (Ret != NO_ERROR)
+ {
+ HeapFree(GetProcessHeap(), 0, Orig);
+ ApiLock();
+ return FALSE;
+ }
+
+ if (!strcmp(AdapterInfo->IpAddressList.IpAddress.String, ZeroAddress))
+ {
+ HeapFree(GetProcessHeap(), 0, Orig);
+ ApiLock();
+ return TRUE;
+ }
+ else
+ {
+ HeapFree(GetProcessHeap(), 0, Orig);
+ ApiLock();
+ return FALSE;
+ }
+}
+