#define _UNICODE
#define UNICODE
#include <stdio.h>
#include <ws2spi.h>
#include <tchar.h>
BOOL getprovider();
void freeprovider();
void start();
void usage();
LPWSAPROTOCOL_INFOW protoinfo;
DWORD protoinfosize;
int totalprotocols;
int main(int argc,char *argv[])
{
int i,k;
int index=-1;
int errorcode,pathlength;
TCHAR *path;
BOOL totalshow=TRUE;
WSADATA wsa;
if(WSAStartup(MAKEWORD(2,2),&wsa))
{
_tprintf(_T("WSAStartup Error: %d\n"),WSAGetLastError());
return -1;
}
pathlength=MAX_PATH;
path=(TCHAR *)GlobalAlloc(GPTR,pathlength*sizeof(TCHAR));
system("cls.exe");
start();
if(argc==1)
{
totalshow=TRUE;
}
else if(argc==2)
{
totalshow=FALSE;
index=atoi(argv[1]);
}
else
{
usage();
return -1;
}
getprovider();
if(!totalshow && (index<1 || index>totalprotocols))
{
_tprintf(_T("You can get the special information between 1 and %d\n"),totalprotocols);
return -1;
}
_tprintf(_T("Service Provider Interface:\n\n"));
for(i=0;i<totalprotocols;i++)
{
if(totalshow)
{
_tprintf(_T("%.3d> "),i+1);
_tprintf(_T("%s\n"),protoinfo[i].szProtocol);
}
else if(!totalshow && (i+1==index))
{
if(WSCGetProviderPath(&protoinfo[i].ProviderId,path,&pathlength,&errorcode)==SOCKET_ERROR)
{
_tprintf(_T("WSCGetProviderPath Error: %d\n"),errorcode);
break;
}
_tprintf(_T("LibraryPath\t\t\t"));
_tprintf(_T("%s"),path);
_tprintf(_T("\n"));
_tprintf(_T("dwServiceFlags1\t\t\t0x%08X: %d\n"),protoinfo[i].dwServiceFlags1,protoinfo[i].dwServiceFlags1);
_tprintf(_T("dwServiceFlags2\t\t\t0x%08X: %d\n"),protoinfo[i].dwServiceFlags2,protoinfo[i].dwServiceFlags2);
_tprintf(_T("dwServiceFlags3\t\t\t0x%08X: %d\n"),protoinfo[i].dwServiceFlags3,protoinfo[i].dwServiceFlags3);
_tprintf(_T("dwServiceFlags4\t\t\t0x%08X: %d\n"),protoinfo[i].dwServiceFlags4,protoinfo[i].dwServiceFlags4);
_tprintf(_T("dwProviderFlags\t\t\t0x%08X: %d\n"),protoinfo[i].dwProviderFlags,protoinfo[i].dwProviderFlags);
_tprintf(_T("ProviderId\t\t\t"));
_tprintf(_T("%08X-"),protoinfo[i].ProviderId.Data1);
_tprintf(_T("%04X-"),protoinfo[i].ProviderId.Data2);
_tprintf(_T("%04X-"),protoinfo[i].ProviderId.Data3);
_tprintf(_T("%02X%02X-"),protoinfo[i].ProviderId.Data4[0],protoinfo[i].ProviderId.Data4[1]);
_tprintf(_T("%02X%02X"),protoinfo[i].ProviderId.Data4[2],protoinfo[i].ProviderId.Data4[3]);
_tprintf(_T("%02X%02X"),protoinfo[i].ProviderId.Data4[4],protoinfo[i].ProviderId.Data4[5]);
_tprintf(_T("%02X%02X\n"),protoinfo[i].ProviderId.Data4[6],protoinfo[i].ProviderId.Data4[7]);
_tprintf(_T("dwCatalogEntryId\t\t0x%08X: %d\n"),protoinfo[i].dwCatalogEntryId,protoinfo[i].dwCatalogEntryId);
_tprintf(_T("ProtocolChain.ChainLen\t\t%d\n"),protoinfo[i].ProtocolChain.ChainLen);
_tprintf(_T("ProtocolChain.ChainEntries\t"));
for(k=0;k<MAX_PROTOCOL_CHAIN;k++)
{
if(k==MAX_PROTOCOL_CHAIN-1)
_tprintf(_T("0x%08X\n"),protoinfo[i].ProtocolChain.ChainEntries[i]);
else
_tprintf(_T("0x%08X->"),protoinfo[i].ProtocolChain.ChainEntries[i]);
}
_tprintf(_T("iVersion\t\t\t0x%08X: %d\n"),protoinfo[i].iVersion,protoinfo[i].iVersion);
_tprintf(_T("iAddressFamily\t\t\t0x%08X: %d\n"),protoinfo[i].iAddressFamily,protoinfo[i].iAddressFamily);
_tprintf(_T("iMaxSockAddr\t\t\t0x%08X: %d\n"),protoinfo[i].iMaxSockAddr,protoinfo[i].iMaxSockAddr);
_tprintf(_T("iMinSockAddr\t\t\t0x%08X: %d\n"),protoinfo[i].iMinSockAddr,protoinfo[i].iMinSockAddr);
_tprintf(_T("iSocketType\t\t\t0x%08X: %d\n"),protoinfo[i].iSocketType,protoinfo[i].iSocketType);
_tprintf(_T("iProtocol\t\t\t0x%08X: %d\n"),protoinfo[i].iProtocol,protoinfo[i].iProtocol);
_tprintf(_T("iProtocolMaxOffset\t\t0x%08X: %d\n"),protoinfo[i].iProtocolMaxOffset,protoinfo[i].iProtocolMaxOffset);
_tprintf(_T("iNetworkByteOffset\t\t0x%08X: %d\n"),protoinfo[i].iNetworkByteOrder,protoinfo[i].iNetworkByteOrder);
_tprintf(_T("iSecurityScheme\t\t\t0x%08X: %d\n"),protoinfo[i].iSecurityScheme,protoinfo[i].iSecurityScheme);
_tprintf(_T("dwMessageSize\t\t\t0x%08X: %d\n"),protoinfo[i].dwMessageSize,protoinfo[i].dwMessageSize);
_tprintf(_T("dwProviderReserved\t\t0x%08X: %d\n"),protoinfo[i].dwProviderReserved,protoinfo[i].dwProviderReserved);
_tprintf(_T("szProtocol\t\t\t%s\n"),protoinfo[i].szProtocol);
break;
}
}
freeprovider();
WSACleanup();
return 0;
}
BOOL getprovider()
{
int errorcode;
protoinfo=NULL;
protoinfosize=0;
totalprotocols=0;
if(WSCEnumProtocols(NULL,protoinfo,&protoinfosize,&errorcode)==SOCKET_ERROR)
{
if(errorcode!=WSAENOBUFS)
{
_tprintf(_T("First WSCEnumProtocols Error: %d\n"),errorcode);
return FALSE;
}
}
if((protoinfo=(LPWSAPROTOCOL_INFOW)GlobalAlloc(GPTR,protoinfosize))==NULL)
{
_tprintf(_T("GlobalAlloc Error: %d\n"),GetLastError());
return FALSE;
}
if((totalprotocols=WSCEnumProtocols(NULL,protoinfo,&protoinfosize,&errorcode))==SOCKET_ERROR)
{
_tprintf(_T("Second WSCEnumProtocols Error: %d\n"),errorcode);
return FALSE;
}
return TRUE;
}
void freeprovider()
{
GlobalFree(protoinfo);
}
void start()
{
_tprintf(_T("T-Sporder for SPI, by TOo2y\n"));
_tprintf(_T("E-mail: [email protected]\n"));
_tprintf(_T("Homepage: www.safechina.net\n"));
_tprintf(_T("Date: 10-29-2002\n\n"));
return ;
}
void usage()
{
_tprintf(_T("Usage: T-Sporder [index]\n"));
return ;
}