static inline void netif_get_addrs_win32(struct netif_saddr_data *ifaddrs) { PIP_ADAPTER_ADDRESSES adapter = get_adapters(); PIP_ADAPTER_UNICAST_ADDRESS unicast = NULL; PIP_ADAPTER_ADDRESSES cur_adap = NULL; SOCKET_ADDRESS socket_addr; int family; if (!adapter) return; for (cur_adap = adapter; !!cur_adap; cur_adap = cur_adap->Next) { char *adap_name = NULL; if (cur_adap->OperStatus != IfOperStatusUp || cur_adap->IfType == IF_TYPE_SOFTWARE_LOOPBACK) continue; os_wcs_to_utf8_ptr(cur_adap->FriendlyName, 0, &adap_name); unicast = cur_adap->FirstUnicastAddress; for (; !!unicast; unicast = unicast->Next) { socket_addr = unicast->Address; family = socket_addr.lpSockaddr->sa_family; if (family == AF_INET || family == AF_INET6) netif_push(socket_addr.lpSockaddr, ifaddrs, adap_name); } bfree(adap_name); } bfree(adapter); }
static SST_GraphicsEnumerator Win32_CreateGraphicsEnumerator(void) { DISPLAY_DEVICEA* devsFound = NULL; char* adapterNames; char* adapterGUIDs; size_t* screenCount; size_t adapterCount; size_t devCount = 0; size_t ASPairCount = 0; size_t i; SST_GraphicsEnumerator_Win32* enumerator; ASMapEntry* ASMap; HANDLE hProcessHeap; /* Get a list of Win32 display devices */ devsFound = get_win32devs(&devCount); if(devsFound == NULL) return NULL; hProcessHeap = GetProcessHeap(); /* Get a list of the graphics adapters' names */ adapterNames = get_adapters(devsFound, devCount, &adapterCount, &adapterGUIDs); if(adapterNames == NULL) { HeapFree(hProcessHeap, 0, devsFound); return NULL; } /* Make a map of adapter->screen count */ screenCount = HeapAlloc(hProcessHeap, 0, adapterCount*sizeof(size_t)); if(screenCount == NULL) { HeapFree(hProcessHeap, 0, adapterGUIDs); HeapFree(hProcessHeap, 0, adapterNames); HeapFree(hProcessHeap, 0, devsFound); return NULL; } for(i=0; i<adapterCount; i++) screenCount[i] = 0; /* Attempt to build the adapter-screen map */ ASMap = build_asmap(devsFound, adapterGUIDs, devCount, adapterCount, screenCount, &ASPairCount); if(ASMap == NULL) { HeapFree(hProcessHeap, 0, adapterGUIDs); HeapFree(hProcessHeap, 0, adapterNames); HeapFree(hProcessHeap, 0, devsFound); HeapFree(hProcessHeap, 0, screenCount); return NULL; } /* Done with GUIDs */ HeapFree(hProcessHeap, 0, adapterGUIDs); /* Get the list of video modes for each adapter-screen pair */ for(i=0; i<ASPairCount; i++) { size_t vmodeCount; SST_VideoMode* vmodes; vmodes = get_vmodes(ASMap[i].dev, &vmodeCount, &ASMap[i].defaultVmode); if(vmodes == NULL) { size_t j; for(j=0; j<i; j++) HeapFree(hProcessHeap, 0, ASMap[i].vmodes); HeapFree(hProcessHeap, 0, adapterNames); HeapFree(hProcessHeap, 0, devsFound); HeapFree(hProcessHeap, 0, screenCount); HeapFree(hProcessHeap, 0, ASMap); return NULL; } /* Save the screens for this */ ASMap[i].vmodeCount = vmodeCount; ASMap[i].vmodes = vmodes; } /* Prepare a structure to return... */ enumerator = HeapAlloc(hProcessHeap, 0, sizeof(SST_GraphicsEnumerator_Win32)); if(enumerator == NULL) { /* Doh! So close :\ */ size_t j; for(j=0; j<i; j++) HeapFree(hProcessHeap, 0, ASMap[i].vmodes); HeapFree(hProcessHeap, 0, adapterNames); HeapFree(hProcessHeap, 0, devsFound); HeapFree(hProcessHeap, 0, screenCount); HeapFree(hProcessHeap, 0, ASMap); return NULL; } /* Save fields */ enumerator->adapterNames = adapterNames; enumerator->adapterCount = adapterCount; enumerator->devCount = devCount; enumerator->devsFound = devsFound; enumerator->screenCount = screenCount; enumerator->ASMap = ASMap; enumerator->ASPairCount = ASPairCount; return enumerator; }