⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 extension.cpp

📁 快速掌握windows网络编程
💻 CPP
字号:
// Module Name: extension.cpp
//
// Description:
//
//    This sample illustrates how to develop a layered service provider that is
//    capable of counting all bytes transmitted through a TCP/IP socket.
//
//    This file contains all of the Winsock extension functions that can
//    be monitored by a service provider.
//    
//
// Compile:
//
//    This project is managed through the LSP.DSW project file.
//
// Execute:
//
//    This project produces a DLL named lsp.dll. This dll should be copied to the
//    %SystemRoot%\System32 directory. Once the file is in place you should execute
//    the application instlsp.exe to insert this provider in the Winsock 2 catalog
//    of service providers.
//

#include "provider.h"

BOOL PASCAL FAR ExtTransmitFile (
    IN SOCKET hSocket,
    IN HANDLE hFile,
    IN DWORD nNumberOfBytesToWrite,
    IN DWORD nNumberOfBytesPerSend,
    IN LPOVERLAPPED lpOverlapped,
    IN LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers,
    IN DWORD dwReserved)
{
	SOCK_INFO *SocketContext;
	LPWSAOVERLAPPED ProviderOverlapped;
	LPFN_TRANSMITFILE lpProviderTransmitFile;
	GUID TransmitFileGuid = WSAID_TRANSMITFILE;
	DWORD BytesReturned;
	int Errno;

	if (MainUpCallTable.lpWPUQuerySocketHandleContext(hSocket,
		(LPDWORD) &SocketContext,
		&Errno) == SOCKET_ERROR)
		return FALSE;

	if (NextProcTable.lpWSPIoctl(SocketContext->ProviderSocket,
		SIO_GET_EXTENSION_FUNCTION_POINTER,
		&TransmitFileGuid, sizeof(GUID), (LPVOID) &lpProviderTransmitFile, sizeof(LPFN_TRANSMITFILE), 
		&BytesReturned, NULL, NULL, NULL, &Errno) == SOCKET_ERROR)
	{
		return FALSE;
	}

	// Check for overlapped I/O
	
	if (lpOverlapped)
	{
		ProviderOverlapped = GetOverlappedStructure(hSocket, SocketContext->ProviderSocket, lpOverlapped, NULL,
			NULL, NULL);

		return lpProviderTransmitFile(
			SocketContext->ProviderSocket,
			hFile,
			nNumberOfBytesToWrite,
			nNumberOfBytesPerSend,
			ProviderOverlapped,
			lpTransmitBuffers,
			dwReserved);
	}
	else
	{
		return lpProviderTransmitFile(
			SocketContext->ProviderSocket,
			hFile,
			nNumberOfBytesToWrite,
			nNumberOfBytesPerSend,
			NULL,
			lpTransmitBuffers,
			dwReserved);
	}

	return FALSE;
}


BOOL PASCAL FAR ExtAcceptEx(
	IN SOCKET sListenSocket,
	IN SOCKET sAcceptSocket,
	IN PVOID lpOutputBuffer,
	IN DWORD dwReceiveDataLength,
	IN DWORD dwLocalAddressLength,
	IN DWORD dwRemoteAddressLength,
	OUT LPDWORD lpdwBytesReceived,
	IN LPOVERLAPPED lpOverlapped)
{
	SOCK_INFO *ListenSocketContext;
	SOCK_INFO *AcceptSocketContext;
	LPWSAOVERLAPPED ProviderOverlapped;
	LPFN_ACCEPTEX lpProviderAcceptEx;
	GUID AcceptExGuid = WSAID_ACCEPTEX;
	DWORD BytesReturned;
	int Errno;


	if (MainUpCallTable.lpWPUQuerySocketHandleContext(sListenSocket,
		(LPDWORD) &ListenSocketContext,
		&Errno) == SOCKET_ERROR)
		return FALSE;

	if (MainUpCallTable.lpWPUQuerySocketHandleContext(sAcceptSocket,
		(LPDWORD) &AcceptSocketContext,
		&Errno) == SOCKET_ERROR)
		return FALSE;

	if (NextProcTable.lpWSPIoctl(ListenSocketContext->ProviderSocket,
		SIO_GET_EXTENSION_FUNCTION_POINTER,
		&AcceptExGuid, sizeof(GUID), (LPVOID) &lpProviderAcceptEx, sizeof(LPFN_ACCEPTEX), 
		&BytesReturned, NULL, NULL, NULL, &Errno) == SOCKET_ERROR)
	{
		return FALSE;
	}

	// Check for overlapped I/O
	
	if (lpOverlapped)
	{
		ProviderOverlapped = GetOverlappedStructure(sListenSocket, ListenSocketContext->ProviderSocket, lpOverlapped, NULL,
			NULL, NULL);

		return lpProviderAcceptEx(
			ListenSocketContext->ProviderSocket,
			AcceptSocketContext->ProviderSocket,
			lpOutputBuffer,
			dwReceiveDataLength,
			dwLocalAddressLength,
			dwRemoteAddressLength,
			lpdwBytesReceived,
			ProviderOverlapped);
	}
	else
	{
		return lpProviderAcceptEx(
			ListenSocketContext->ProviderSocket,
			AcceptSocketContext->ProviderSocket,
			lpOutputBuffer,
			dwReceiveDataLength,
			dwLocalAddressLength,
			dwRemoteAddressLength,
			lpdwBytesReceived,
			NULL);
	}

	return FALSE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -