00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include <winsock2.h>
00016 #include <ws2spi.h>
00017 #include <windows.h>
00018 #include <objbase.h>
00019 #include <stdio.h>
00020 #include <stdlib.h>
00021
00022 #ifndef _WIN32_WINNT
00023 #define _WIN32_WINNT
00024 #endif
00025
00026 #include <af_irda.h>
00027 #include <wsrm.h>
00028 #include <ws2atm.h>
00029 #include <wsipx.h>
00030
00031 #pragma push(warning)
00032 #pragma warning(disable:4201)
00033
00034 #include <atalkwsh.h>
00035
00036 #pragma pop(warning)
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 void
00047 PrintProtocolInfo(
00048 WSAPROTOCOL_INFOW *wsapi
00049 )
00050 {
00051 WCHAR szGuidString[MAX_PATH],
00052 wszProviderPath[MAX_PATH];
00053 INT dwProviderPathLen=MAX_PATH-1;
00054 int rc, error, i;
00055
00056 rc = WSCGetProviderPath(
00057 &wsapi->ProviderId,
00058 wszProviderPath,
00059 &dwProviderPathLen,
00060 &error
00061 );
00062 if ( 0 != rc )
00063 {
00064 fprintf(stderr, "WSCGetProviderPath failed: %d\n", error);
00065 lstrcpyW(wszProviderPath, L"(error)");
00066 }
00067
00068
00069
00070
00071
00072 printf("\nProtocol: %S\n", wsapi->szProtocol);
00073 printf("\n Path: %S\n", wszProviderPath);
00074 printf(" Address Family: ");
00075 switch ( wsapi->iAddressFamily )
00076 {
00077 case AF_INET:
00078 case AF_INET6:
00079 printf("%s\n", (wsapi->iAddressFamily == AF_INET ? "AF_INET" : "AF_INET6"));
00080 printf(" Protocol: ");
00081 switch (wsapi->iProtocol)
00082 {
00083 case IPPROTO_IP:
00084 printf("IPROTO_IP\n");
00085 break;
00086 case IPPROTO_ICMP:
00087 printf("IPROTO_ICMP\n");
00088 break;
00089 case IPPROTO_IGMP:
00090 printf("IPROTO_IGMP\n");
00091 break;
00092 case IPPROTO_GGP:
00093 printf("IPROTO_GGP\n");
00094 break;
00095 case IPPROTO_TCP:
00096 printf("IPROTO_TCP\n");
00097 break;
00098 case IPPROTO_PUP:
00099 printf("IPROTO_PUP\n");
00100 break;
00101 case IPPROTO_UDP:
00102 printf("IPROTO_UDP\n");
00103 break;
00104 case IPPROTO_IDP:
00105 printf("IPROTO_IDP\n");
00106 break;
00107 case IPPROTO_ND:
00108 printf("IPROTO_ND\n");
00109 break;
00110 case IPPROTO_RM:
00111 printf("IPPROTO_RM\n");
00112 break;
00113 case IPPROTO_RAW:
00114 printf("IPROTO_RAW\n");
00115 break;
00116 }
00117 break;
00118
00119 case AF_UNSPEC:
00120 printf("AF_UNSPEC\n");
00121 printf(" Protocol: UNKNOWN: %d", wsapi->iProtocol);
00122 break;
00123
00124 case AF_UNIX:
00125 printf("AF_UNIX\n");
00126 printf(" Protocol: UNKNOWN: %d", wsapi->iProtocol);
00127 break;
00128
00129 case AF_IMPLINK:
00130 printf("AF_IMPLINK\n");
00131 printf(" Protocol: UNKNOWN: %d", wsapi->iProtocol);
00132 break;
00133
00134 case AF_PUP:
00135 printf("AF_PUP\n");
00136 printf(" Protocol: UNKNOWN: %d", wsapi->iProtocol);
00137 break;
00138
00139 case AF_CHAOS:
00140 printf("AF_CHAOS\n");
00141 printf(" Protocol: UNKNOWN: %d", wsapi->iProtocol);
00142 break;
00143
00144 case AF_NS:
00145 printf("AF_NS or AF_IPX\n");
00146 printf(" Protocol: ");
00147
00148 switch ( wsapi->iProtocol )
00149 {
00150 case NSPROTO_IPX:
00151 printf("NSPROTO_IPX\n");
00152 break;
00153 case NSPROTO_SPX:
00154 printf("NSPROTO_SPX\n");
00155 break;
00156 case NSPROTO_SPXII:
00157 printf("NSPROTO_SPXII\n");
00158 break;
00159 }
00160 break;
00161
00162 case AF_ISO:
00163 printf("AF_ISO or AF_OSI\n");
00164 printf(" Protocol: UNKNOWN: %d", wsapi->iProtocol);
00165 break;
00166
00167 case AF_ECMA:
00168 printf("AF_ECMA\n");
00169 printf(" Protocol: UNKNOWN: %d", wsapi->iProtocol);
00170 break;
00171
00172 case AF_DATAKIT:
00173 printf("AF_DATAKIT\n");
00174 printf(" Protocol: UNKNOWN: %d", wsapi->iProtocol);
00175 break;
00176
00177 case AF_CCITT:
00178 printf("AF_CCITT\n");
00179 printf(" Protocol: UNKNOWN: %d", wsapi->iProtocol);
00180 break;
00181
00182 case AF_SNA:
00183 printf("AF_SNA\n");
00184 printf(" Protocol: UNKNOWN: %d", wsapi->iProtocol);
00185 break;
00186
00187 case AF_DECnet:
00188 printf("AF_DECnet\n");
00189 printf(" Protocol: UNKNOWN: %d", wsapi->iProtocol);
00190 break;
00191
00192 case AF_DLI:
00193 printf("AF_DLI\n");
00194 printf(" Protocol: UNKNOWN: %d", wsapi->iProtocol);
00195 break;
00196
00197 case AF_LAT:
00198 printf("AF_LAT\n");
00199 printf(" Protocol: UNKNOWN: %d", wsapi->iProtocol);
00200 break;
00201
00202 case AF_HYLINK:
00203 printf("AF_HYLINK\n");
00204 printf(" Protocol: UNKNOWN: %d", wsapi->iProtocol);
00205 break;
00206
00207 case AF_APPLETALK:
00208 printf("AF_APPLETALK\n");
00209 printf(" Protocol: ");
00210
00211 switch ( wsapi->iProtocol )
00212 {
00213 case DDPPROTO_RTMP:
00214 printf("DDPPROTO_RTMP\n");
00215 break;
00216 case DDPPROTO_NBP:
00217 printf("DDPPROTO_NBP\n");
00218 break;
00219 case DDPPROTO_ATP:
00220 printf("DDPROTO_ATP\n");
00221 break;
00222 case DDPPROTO_AEP:
00223 printf("DDPPROTO_AEP\n");
00224 break;
00225 case DDPPROTO_RTMPRQ:
00226 printf("DDPPROTO_RTMPRQ\n");
00227 break;
00228 case DDPPROTO_ZIP:
00229 printf("DDPPROTO_ZIP\n");
00230 break;
00231 case DDPPROTO_ADSP:
00232 printf("DDPPROTO_ADSP\n");
00233 break;
00234 case ATPROTO_ADSP:
00235 printf("ATPROTO_ADSP\n");
00236 break;
00237 case ATPROTO_ATP:
00238 printf("ATPROTO_ATP\n");
00239 break;
00240 case ATPROTO_ASP:
00241 printf("ATPROTO_ASP\n");
00242 break;
00243 case ATPROTO_PAP:
00244 printf("ATPROTO_PAP\n");
00245 break;
00246 }
00247 break;
00248
00249 case AF_NETBIOS:
00250 printf("AF_NETBIOS\n");
00251 printf(" Protocol: ");
00252 printf("NetBIOS LANA %d\n", ((wsapi->iProtocol == 0x80000000) ? 0: abs(wsapi->iProtocol)));
00253 break;
00254
00255 case AF_VOICEVIEW:
00256 printf("AF_VOICEVIEW\n");
00257 printf(" Protocol: UNKNOWN: %d", wsapi->iProtocol);
00258 break;
00259
00260 case AF_FIREFOX:
00261 printf("AF_FIREFOX\n");
00262 printf(" Protocol: UNKNOWN: %d", wsapi->iProtocol);
00263 break;
00264
00265 case AF_UNKNOWN1:
00266 printf("AF_UNKNOWN1\n");
00267 printf(" Protocol: UNKNOWN: %d", wsapi->iProtocol);
00268 break;
00269
00270 case AF_BAN:
00271 printf("AF_BAN\n");
00272 printf(" Protocol: UNKNOWN: %d", wsapi->iProtocol);
00273 break;
00274
00275 case AF_ATM:
00276 printf("AF_ATM\n");
00277 printf(" Protocol: ");
00278
00279 switch ( wsapi->iProtocol )
00280 {
00281 case ATMPROTO_AALUSER:
00282 printf("ATMPROTO_AALUSER\n");
00283 break;
00284 case ATMPROTO_AAL1:
00285 printf("ATMPROTO_AAL1\n");
00286 break;
00287 case ATMPROTO_AAL2:
00288 printf("ATMPROTO_AAL2\n");
00289 break;
00290 case ATMPROTO_AAL34:
00291 printf("ATMPROTO_AAL34\n");
00292 break;
00293 case ATMPROTO_AAL5:
00294 printf("ATMPROTO_AAL5\n");
00295 break;
00296 }
00297 break;
00298
00299 case AF_CLUSTER:
00300 printf("AF_CLUSTER\n");
00301 printf(" Protocol: UNKNOWN: %d", wsapi->iProtocol);
00302 break;
00303 case AF_12844:
00304 printf("AF_12844\n");
00305 printf(" Protocol: UNKNOWN: %d", wsapi->iProtocol);
00306 break;
00307 case AF_IRDA:
00308 printf("AF_IRDA\n");
00309 printf(" Protocol: ");
00310
00311 switch (wsapi->iProtocol)
00312 {
00313 case IRDA_PROTO_SOCK_STREAM:
00314 printf("IRDA_PROTO_SOCK_STREAM\n");
00315 break;
00316 }
00317 break;
00318
00319 default:
00320 printf("Unknown: %d\n", wsapi->iAddressFamily);
00321 }
00322
00323
00324
00325
00326
00327 printf(" Socket Type: ");
00328 switch (wsapi->iSocketType)
00329 {
00330 case SOCK_STREAM:
00331 printf("SOCK_STREAM\n");
00332 break;
00333 case SOCK_DGRAM:
00334 printf("SOCK_DGRAM\n");
00335 break;
00336 case SOCK_RAW:
00337 printf("SOCK_RAW\n");
00338 break;
00339 case SOCK_RDM:
00340 printf("SOCK_RDM\n");
00341 break;
00342 case SOCK_SEQPACKET:
00343 printf("SOCK_SEQPACKET\n");
00344 break;
00345 }
00346
00347
00348
00349
00350
00351 printf(" Connectionless: ");
00352 if (wsapi->dwServiceFlags1 & XP1_CONNECTIONLESS)
00353 printf("YES\n");
00354 else
00355 printf("NO\n");
00356 printf(" Guaranteed Delivery: ");
00357 if (wsapi->dwServiceFlags1 & XP1_GUARANTEED_DELIVERY)
00358 printf("YES\n");
00359 else
00360 printf("NO\n");
00361 printf(" Guaranteed Order: ");
00362 if (wsapi->dwServiceFlags1 & XP1_GUARANTEED_ORDER)
00363 printf("YES\n");
00364 else
00365 printf("NO\n");
00366 printf(" Message Oriented: ");
00367 if (wsapi->dwServiceFlags1 & XP1_MESSAGE_ORIENTED)
00368 printf("YES\n");
00369 else
00370 printf("NO\n");
00371 printf(" Pseudo Stream: ");
00372 if (wsapi->dwServiceFlags1 & XP1_PSEUDO_STREAM)
00373 printf("YES\n");
00374 else
00375 printf("NO\n");
00376 printf(" Graceful Close: ");
00377 if (wsapi->dwServiceFlags1 & XP1_GRACEFUL_CLOSE)
00378 printf("YES\n");
00379 else
00380 printf("NO\n");
00381 printf(" Expedited Data: ");
00382 if (wsapi->dwServiceFlags1 & XP1_EXPEDITED_DATA)
00383 printf("YES\n");
00384 else
00385 printf("NO\n");
00386 printf(" Connect Data: ");
00387 if (wsapi->dwServiceFlags1 & XP1_CONNECT_DATA)
00388 printf("YES\n");
00389 else
00390 printf("NO\n");
00391 printf(" Disconnect Data: ");
00392 if (wsapi->dwServiceFlags1 & XP1_DISCONNECT_DATA)
00393 printf("YES\n");
00394 else
00395 printf("NO\n");
00396 printf(" Supports Broadcast: ");
00397 if (wsapi->dwServiceFlags1 & XP1_SUPPORT_BROADCAST)
00398 printf("YES\n");
00399 else
00400 printf("NO\n");
00401 printf(" Supports Multipoint: ");
00402 if (wsapi->dwServiceFlags1 & XP1_SUPPORT_MULTIPOINT)
00403 printf("YES\n");
00404 else
00405 printf("NO\n");
00406 printf(" Multipoint Control Plane: ");
00407 if (wsapi->dwServiceFlags1 & XP1_MULTIPOINT_CONTROL_PLANE)
00408 printf("ROOTED\n");
00409 else
00410 printf("NON-ROOTED\n");
00411 printf(" Multipoint Data Plane: ");
00412 if (wsapi->dwServiceFlags1 & XP1_MULTIPOINT_DATA_PLANE)
00413 printf("ROOTED\n");
00414 else
00415 printf("NON-ROOTED\n");
00416 printf(" QoS Supported: ");
00417 if (wsapi->dwServiceFlags1 & XP1_QOS_SUPPORTED)
00418 printf("YES\n");
00419 else
00420 printf("NO\n");
00421 printf(" Unidirectional Sends: ");
00422 if (wsapi->dwServiceFlags1 & XP1_UNI_SEND)
00423 printf("YES\n");
00424 else
00425 printf("NO\n");
00426 printf(" Unidirection Receives: ");
00427 if (wsapi->dwServiceFlags1 & XP1_UNI_RECV)
00428 printf("YES\n");
00429 else
00430 printf("NO\n");
00431 printf(" IFS Handles: ");
00432 if (wsapi->dwServiceFlags1 & XP1_IFS_HANDLES)
00433 printf("YES\n");
00434 else
00435 printf("NO\n");
00436 printf(" Partial Messages: ");
00437 if (wsapi->dwServiceFlags1 & XP1_PARTIAL_MESSAGE)
00438 printf("YES\n");
00439 else
00440 printf("NO\n");
00441 printf(" Provider Flags: ");
00442 if (wsapi->dwProviderFlags & PFL_MULTIPLE_PROTO_ENTRIES)
00443 {
00444 printf("PFL_MULTIPLE_PROTO_ENTRIES ");
00445 }
00446 if (wsapi->dwProviderFlags & PFL_RECOMMENDED_PROTO_ENTRY)
00447 {
00448 printf("PFL_RECOMMENDED_PROT_ENTRY ");
00449 }
00450 if (wsapi->dwProviderFlags & PFL_HIDDEN)
00451 {
00452 printf("PFL_HIDDEN ");
00453 }
00454 if (wsapi->dwProviderFlags & PFL_MATCHES_PROTOCOL_ZERO)
00455 {
00456 printf("PFL_MATCHES_PROTOCOL_ZERO ");
00457 }
00458 if (wsapi->dwProviderFlags == 0)
00459 {
00460 printf("NONE");
00461 }
00462 printf("\n");
00463
00464
00465
00466
00467
00468 StringFromGUID2( wsapi->ProviderId, szGuidString, MAX_PATH-1 );
00469
00470 printf(" Provider Id: %S\n", szGuidString);
00471 printf(" Catalog Entry Id: %ld\n", wsapi->dwCatalogEntryId);
00472 printf(" Number of Chain Entries: %d {",
00473 wsapi->ProtocolChain.ChainLen);
00474
00475 for(i=0; i < wsapi->ProtocolChain.ChainLen ;i++)
00476 printf("%ld ", wsapi->ProtocolChain.ChainEntries[i]);
00477
00478 printf("}\n");
00479
00480
00481
00482
00483
00484 printf(" Version: %d\n", wsapi->iVersion);
00485 printf("Max Socket Address Length: %d\n", wsapi->iMaxSockAddr);
00486 printf("Min Socket Address Length: %d\n", wsapi->iMinSockAddr);
00487 printf(" Protocol Max Offset: %d\n", wsapi->iProtocolMaxOffset);
00488
00489 printf(" Network Byte Order: ");
00490 if (wsapi->iNetworkByteOrder == 0)
00491 printf("BIG-ENDIAN\n");
00492 else
00493 printf("LITLE-ENDIAN\n");
00494
00495 printf(" Security Scheme: ");
00496 if (wsapi->iSecurityScheme == SECURITY_PROTOCOL_NONE)
00497 printf("NONE\n");
00498 else
00499 printf("%d\n", wsapi->iSecurityScheme);
00500
00501 printf(" Message Size: ");
00502 if (wsapi->dwMessageSize == 0)
00503 printf("N/A (Stream Oriented)\n");
00504 else if (wsapi->dwMessageSize == 1)
00505 printf("Depended on underlying MTU\n");
00506 else if (wsapi->dwMessageSize == 0xFFFFFFFF)
00507 printf("No limit\n");
00508 else
00509 printf("%ld\n", wsapi->dwMessageSize);
00510
00511 printf(" Provider Reserved: %d\n", wsapi->dwProviderReserved);
00512 }