windows-nt/Source/XPSP1/NT/net/tcpip/apis/iphlpapi/lib/entity.c
2020-09-26 16:20:57 +08:00

121 lines
2.9 KiB
C

/*++
Copyright (c) 1994 Microsoft Corporation
Module Name:
entity.c
Abstract:
This module contains functions to get the entity list from the TCP/IP
device driver
Contents:
GetEntityList
Author:
Richard L Firth (rfirth) 20-May-1994
Revision History:
20-May-1994 rfirth
Created
--*/
#include "precomp.h"
#pragma hdrstop
/*******************************************************************************
*
* GetEntityList
*
* Allocates a buffer for, and retrieves, the list of entities supported by the
* TCP/IP device driver
*
* ENTRY nothing
*
* EXIT EntityCount - number of entities in the buffer
*
* RETURNS Success - pointer to allocated buffer containing list of entities
* Failure - NULL
*
* ASSUMES
*
******************************************************************************/
TDIEntityID* GetEntityList(UINT* EntityCount) {
TCP_REQUEST_QUERY_INFORMATION_EX req;
DWORD status;
DWORD inputLen;
DWORD outputLen;
LPVOID buffer = NULL;
TDIEntityID* pEntity = NULL;
memset(&req, 0, sizeof(req));
req.ID.toi_entity.tei_entity = GENERIC_ENTITY;
req.ID.toi_entity.tei_instance = 0;
req.ID.toi_class = INFO_CLASS_GENERIC;
req.ID.toi_type = INFO_TYPE_PROVIDER;
req.ID.toi_id = ENTITY_LIST_ID;
inputLen = sizeof(req);
outputLen = sizeof(TDIEntityID) * DEFAULT_MINIMUM_ENTITIES;
//
// this is over-engineered - its very unlikely that we'll ever get >32
// entities returned, never mind >64K's worth
//
do {
DWORD previousOutputLen;
previousOutputLen = outputLen;
if (pEntity) {
ReleaseMemory((void*)pEntity);
}
pEntity = (TDIEntityID*)NEW_MEMORY((size_t)outputLen);
if (!pEntity) {
DEBUG_PRINT(("GetEntityList: failed to allocate entity buffer (%ld bytes)\n",
outputLen
));
return NULL;
}
status = WsControl(IPPROTO_TCP,
WSCNTL_TCPIP_QUERY_INFO,
(LPVOID)&req,
&inputLen,
(LPVOID)pEntity,
&outputLen
);
if (status == NO_ERROR) {
break;
} else if (status == ERROR_INSUFFICIENT_BUFFER) {
outputLen = previousOutputLen +
sizeof(TDIEntityID) * DEFAULT_MINIMUM_ENTITIES;
} else {
DEBUG_PRINT(("GetEntityList: WsControl(GENERIC_ENTITY) returns %ld, outputLen = %ld\n",
status,
outputLen
));
ReleaseMemory((void*)pEntity);
return NULL;
}
} while ( TRUE );
DEBUG_PRINT(("%d entities returned\n", (outputLen / sizeof(TDIEntityID))));
*EntityCount = (UINT)(outputLen / sizeof(TDIEntityID));
return pEntity;
}