📄 enumcat.cpp
字号:
printf(" Protocol: UNKNOWN: %d",
wsapi->iProtocol);
break;
case AF_IRDA:
printf("AF_IRDA\n");
printf(" Protocol: ");
switch (wsapi->iProtocol)
{
case IRDA_PROTO_SOCK_STREAM:
printf("IRDA_PROTO_SOCK_STREAM\n");
break;
}
break;
default:
printf("Unknown: %d\n", wsapi->iAddressFamily);
}
printf(" Socket Type: ");
switch (wsapi->iSocketType)
{
case SOCK_STREAM:
printf("SOCK_STREAM\n");
break;
case SOCK_DGRAM:
printf("SOCK_DGRAM\n");
break;
case SOCK_RAW:
printf("SOCK_RAW\n");
break;
case SOCK_RDM:
printf("SOCK_RDM\n");
break;
case SOCK_SEQPACKET:
printf("SOCK_SEQPACKET\n");
break;
}
printf(" Connectionless: ");
if (wsapi->dwServiceFlags1 & XP1_CONNECTIONLESS)
printf("YES\n");
else
printf("NO\n");
printf(" Guaranteed Delivery: ");
if (wsapi->dwServiceFlags1 & XP1_GUARANTEED_DELIVERY)
printf("YES\n");
else
printf("NO\n");
printf(" Guaranteed Order: ");
if (wsapi->dwServiceFlags1 & XP1_GUARANTEED_ORDER)
printf("YES\n");
else
printf("NO\n");
printf(" Message Oriented: ");
if (wsapi->dwServiceFlags1 & XP1_MESSAGE_ORIENTED)
printf("YES\n");
else
printf("NO\n");
printf(" Pseudo Stream: ");
if (wsapi->dwServiceFlags1 & XP1_PSEUDO_STREAM)
printf("YES\n");
else
printf("NO\n");
printf(" Graceful Close: ");
if (wsapi->dwServiceFlags1 & XP1_GRACEFUL_CLOSE)
printf("YES\n");
else
printf("NO\n");
printf(" Expedited Data: ");
if (wsapi->dwServiceFlags1 & XP1_EXPEDITED_DATA)
printf("YES\n");
else
printf("NO\n");
printf(" Connect Data: ");
if (wsapi->dwServiceFlags1 & XP1_CONNECT_DATA)
printf("YES\n");
else
printf("NO\n");
printf(" Disconnect Data: ");
if (wsapi->dwServiceFlags1 & XP1_DISCONNECT_DATA)
printf("YES\n");
else
printf("NO\n");
printf(" Supports Broadcast: ");
if (wsapi->dwServiceFlags1 & XP1_SUPPORT_BROADCAST)
printf("YES\n");
else
printf("NO\n");
printf(" Supports Multipoint: ");
if (wsapi->dwServiceFlags1 & XP1_SUPPORT_MULTIPOINT)
printf("YES\n");
else
printf("NO\n");
printf(" Multipoint Control Plane: ");
if (wsapi->dwServiceFlags1 & XP1_MULTIPOINT_CONTROL_PLANE)
printf("ROOTED\n");
else
printf("NON-ROOTED\n");
printf(" Multipoint Data Plane: ");
if (wsapi->dwServiceFlags1 & XP1_MULTIPOINT_DATA_PLANE)
printf("ROOTED\n");
else
printf("NON-ROOTED\n");
printf(" QoS Supported: ");
if (wsapi->dwServiceFlags1 & XP1_QOS_SUPPORTED)
printf("YES\n");
else
printf("NO\n");
printf(" Unidirectional Sends: ");
if (wsapi->dwServiceFlags1 & XP1_UNI_SEND)
printf("YES\n");
else
printf("NO\n");
printf(" Unidirection Receives: ");
if (wsapi->dwServiceFlags1 & XP1_UNI_RECV)
printf("YES\n");
else
printf("NO\n");
printf(" IFS Handles: ");
if (wsapi->dwServiceFlags1 & XP1_IFS_HANDLES)
printf("YES\n");
else
printf("NO\n");
printf(" Partial Messages: ");
if (wsapi->dwServiceFlags1 & XP1_PARTIAL_MESSAGE)
printf("YES\n");
else
printf("NO\n");
printf(" Provider Flags: ");
switch (wsapi->dwProviderFlags)
{
case PFL_MULTIPLE_PROTO_ENTRIES:
printf("This is one or more entries for a protocol\n");
printf("\t\t\t which is capable of implementing multiple\n");
printf("\t\t\t behaviors\n");
break;
case PFL_RECOMMENDED_PROTO_ENTRY:
printf("This entry is recommended for a protocol\n");
printf("\t\t\t that is capable of multple behaviors\n");
break;
case PFL_HIDDEN:
printf("\n");
printf("You shouldn't be seeing this\n");
break;
case PFL_MATCHES_PROTOCOL_ZERO:
printf("A value of zero in the protocol parameter\n");
printf("\t\t\t of socket or WSASocket matches this entry\n");
break;
default:
printf("NONE\n");
}
StringFromGUID2(wsapi->ProviderId, szGuidString, 256);
printf(" Provider Id: %S\n", szGuidString);
printf(" Catalog Entry Id: %ld\n", wsapi->dwCatalogEntryId);
printf(" Number of Chain Entries: %d {",
wsapi->ProtocolChain.ChainLen);
for(i=0; i < wsapi->ProtocolChain.ChainLen ;i++)
printf("%ld ", wsapi->ProtocolChain.ChainEntries[i]);
printf("}\n");
printf(" Version: %d\n", wsapi->iVersion);
printf("Max Socket Address Length: %d\n", wsapi->iMaxSockAddr);
printf("Min Socket Address Length: %d\n", wsapi->iMinSockAddr);
printf(" Protocol Max Offset: %d\n", wsapi->iProtocolMaxOffset);
printf(" Network Byte Order: ");
if (wsapi->iNetworkByteOrder == 0)
printf("BIG-ENDIAN\n");
else
printf("LITLE-ENDIAN\n");
printf(" Security Scheme: ");
if (wsapi->iSecurityScheme == SECURITY_PROTOCOL_NONE)
printf("NONE\n");
else
printf("%d\n", wsapi->iSecurityScheme);
printf(" Message Size: ");
if (wsapi->dwMessageSize == 0)
printf("N/A (Stream Oriented)\n");
else if (wsapi->dwMessageSize == 1)
printf("Depended on underlying MTU\n");
else if (wsapi->dwMessageSize == 0xFFFFFFFF)
printf("No limit\n");
else
printf("%ld\n", wsapi->dwMessageSize);
}
//
// Function: EnumearteProtocols
//
// Description:
// Perform the actual enumeration of protocol entries stored by
// Winsock.
//
BOOL EnumerateProtocols(WSAPROTOCOL_INFO **wsapi, DWORD *dwCount)
{
DWORD dwErr,
dwRet,
dwBufLen=0;
*dwCount = 0;
*wsapi = NULL;
if (SOCKET_ERROR != WSAEnumProtocols(NULL, *wsapi,
&dwBufLen))
{
// This should never happen as there is a NULL buffer
//
printf("WSAEnumProtocols failed!\n");
return FALSE;
}
else if (WSAENOBUFS != (dwErr = WSAGetLastError()))
{
// We failed for some reason not relating to buffer size -
// also odd
//
printf("WSAEnumProtocols failed: %d\n", dwErr);
return FALSE;
}
// Allocate the correct buffer size for WSAEnumProtocols as
// well as the buffer to return
//
*wsapi = (WSAPROTOCOL_INFO *)GlobalAlloc(GMEM_FIXED, dwBufLen);
if (*wsapi == NULL)
{
printf("GlobalAlloc failed: %d\n", GetLastError());
return FALSE;
}
dwRet = WSAEnumProtocols(NULL, *wsapi, &dwBufLen);
if (dwRet == SOCKET_ERROR)
{
printf("WSAEnumProtocols failed: %d\n", WSAGetLastError());
GlobalFree(*wsapi);
return FALSE;
}
*dwCount = dwRet;
return TRUE;
}
//
// Function: main
//
// Description:
// Load the Winsock library and call the protocol enumeration and
// printing routines. Then unload and clean up.
//
int __cdecl main(int argch, char **argv)
{
WSAPROTOCOL_INFO *wsapi=NULL;
WSADATA wsd;
DWORD dwCount,
i;
if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
{
printf("Unable to load Winsock2 DLL!\n");
return 1;
}
if (EnumerateProtocols(&wsapi, &dwCount) == FALSE)
{
printf("Failed to enumerate protocols!\n");
return 1;
}
printf("Num Protocols found: %ld\n", dwCount);
for(i=0; i < dwCount ;i++)
{
PrintProtocolInfo(&wsapi[i]);
}
WSACleanup();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -