Skip to content

Latest commit

 

History

History
157 lines (134 loc) · 4.83 KB

sample_223.md

File metadata and controls

157 lines (134 loc) · 4.83 KB

Home

Winsock: retrieving information about available transport protocols

Code:

*| typedef struct _WSAPROTOCOLCHAIN {
*|   int   ChainLen;
*|   DWORD ChainEntries[MAX_PROTOCOL_CHAIN];
*| } WSAPROTOCOLCHAIN, *LPWSAPROTOCOLCHAIN; total bytes = 32

*| typedef struct _WSAPROTOCOL_INFO {
*|   DWORD            dwServiceFlags1;             0:4
*|   DWORD            dwServiceFlags2;             4:4
*|   DWORD            dwServiceFlags3;             8:4
*|   DWORD            dwServiceFlags4;            12:4
*|   DWORD            dwProviderFlags;            16:4
*|   GUID             ProviderId;                 20:16
*|   DWORD            dwCatalogEntryId;           36:4
*|   WSAPROTOCOLCHAIN ProtocolChain;              40:32
*|   int              iVersion;                   72:4
*|   int              iAddressFamily;             76:4
*|   int              iMaxSockAddr;               80:4
*|   int              iMinSockAddr;               84:4
*|   int              iSocketType;                88:4
*|   int              iProtocol;                  92:4
*|   int              iProtocolMaxOffset;         96:4
*|   int              iNetworkByteOrder;         100:4
*|   int              iSecurityScheme;           104:4
*|   DWORD            dwMessageSize;             108:4
*|   DWORD            dwProviderReserved;        112:4
*|   TCHAR            szProt[WSAPROTOCOL_LEN+1]; 116:256
*| } WSAPROTOCOL_INFO, *LPWSAPROTOCOL_INFO; total bytes = 372

#DEFINE WSAPROTOCOL_INFO_SIZE  372
#DEFINE WSAPROTOCOL_LEN        255
#DEFINE MAX_PROTOCOL_CHAIN       7

DO declare

LOCAL lcBuffer, lnBufsize, lcProtInfo, lnProtIndex, lnProtCount

IF InitWinsock()
	lnBufsize = 16384  && large enough to care not
	lcBuffer = Repli(Chr(0), lnBufsize)
	lnProtCount = WSAEnumProtocols (0, @lcBuffer, @lnBufsize)

	* resulting cursor
	CREATE CURSOR cs (;
		flags1   N(16),;
		flags2   N(16),;
		flags3   N(16),;
		flags4   N(16),;
		guid     C(40),;
		entryid  N(16),;
		chain    C(32),;
		version  N(16),;
		addrfam  N(16),;
		maxsock  N(16),;
		minsock  N(16),;
		socktype N(16),;
		protocol N(16),;
		maxoffs  N(16),;
		btorder  N(16),;
		secur    N(16),;
		msgsize  N(16),;
		reserved N(16),;
		protname C(250);
	)
	
	* scan the buffer filled by the WSAEnumProtocols function
	FOR lnProtIndex=0 TO lnProtCount-1
		* extract protocol info substring from the buffer
		lcProtInfo = SUBSTR(lcBuffer, lnProtIndex*WSAPROTOCOL_INFO_SIZE+1,;
			WSAPROTOCOL_INFO_SIZE)

		= DisplayProtInfo (lcProtInfo)
	ENDFOR

	= WSACleanup()
	GO TOP
	BROWSE NORMAL NOWAIT
ENDIF
* End of Main

PROCEDURE DisplayProtInfo(lcProtInfo)
	LOCAL lcProt

	lcProt = SUBSTR(lcProtInfo, 117)  && protocol name offset
	lcProt = SUBSTR(lcProt, 1,AT(Chr(0),lcProt)-1)
	
	* append the protocol info to the resulting cursor
	INSERT INTO cs VALUES (;
		buf2dword(SUBSTR(lcProtInfo,   1,4)),;
		buf2dword(SUBSTR(lcProtInfo,   5,4)),;
		buf2dword(SUBSTR(lcProtInfo,   9,4)),;
		buf2dword(SUBSTR(lcProtInfo,  13,4)),;
		GUIDToString(SUBSTR(lcProtInfo, 21,16)),;
		buf2dword(SUBSTR(lcProtInfo,  37,4)),;
		SUBSTR(lcProtInfo, 41,32),;
		buf2dword(SUBSTR(lcProtInfo,  73,4)),;
		buf2dword(SUBSTR(lcProtInfo,  77,4)),;
		buf2dword(SUBSTR(lcProtInfo,  81,4)),;
		buf2dword(SUBSTR(lcProtInfo,  85,4)),;
		buf2dword(SUBSTR(lcProtInfo,  89,4)),;
		buf2dword(SUBSTR(lcProtInfo,  93,4)),;
		buf2dword(SUBSTR(lcProtInfo,  97,4)),;
		buf2dword(SUBSTR(lcProtInfo, 101,4)),;
		buf2dword(SUBSTR(lcProtInfo, 105,4)),;
		buf2dword(SUBSTR(lcProtInfo, 109,4)),;
		buf2dword(SUBSTR(lcProtInfo, 113,4)),;
		m.lcProt;
		)
RETURN

FUNCTION InitWinsock()
* Initializing the Winsock service for the application
#DEFINE WSADATA_SIZE 398
#DEFINE WS_VERSION 0x0202
	LOCAL lcWSADATA, lnInitResult
	lcWSADATA = Repli(Chr(0), WSADATA_SIZE)
	lnInitResult = WSAStartup (WS_VERSION, @lcWSADATA)
RETURN (lnInitResult = 0)

FUNCTION buf2dword (lcBuffer)
RETURN Asc(SUBSTR(lcBuffer, 1,1)) + ;
	Asc(SUBSTR(lcBuffer, 2,1)) * 256 +;
	Asc(SUBSTR(lcBuffer, 3,1)) * 65536 +;
	Asc(SUBSTR(lcBuffer, 4,1)) * 16777216

FUNCTION GUIDToString(cGUID as String) as String
	LOCAL cBuffer, nBufsize
	nBufsize=128
	cBuffer = REPLICATE(CHR(0), nBufsize*2)
	= StringFromGUID2(cGUID, @cBuffer, nBufsize)
	cBuffer = SUBSTR(cBuffer, 1, AT(CHR(0)+CHR(0), cBuffer))
RETURN STRCONV(cBuffer,6)

PROCEDURE declare
	DECLARE INTEGER WSAStartup IN ws2_32 INTEGER wVerRq, STRING @lpWSAData

	DECLARE INTEGER WSACleanup IN ws2_32

	DECLARE INTEGER WSAEnumProtocols IN ws2_32;
		INTEGER lpiProtocols, STRING @lpProtBuf, INTEGER @lpdwBufLen

	DECLARE INTEGER StringFromGUID2 IN ole32;
		STRING rguid, STRING @lpsz, INTEGER cchMax  

Listed functions:

StringFromGUID2
WSACleanup
WSAEnumProtocols
WSAStartup