You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
531 lines
10 KiB
531 lines
10 KiB
/*++
|
|
|
|
|
|
Intel Corporation Proprietary Information
|
|
Copyright (c) 1995 Intel Corporation
|
|
|
|
This listing is supplied under the terms of a license agreement with
|
|
Intel Corporation and may not be used, copied, nor disclosed except in
|
|
accordance with the terms of that agreeement.
|
|
|
|
|
|
Module Name:
|
|
|
|
dsocket.h
|
|
|
|
Abstract:
|
|
|
|
This header defines the "DSOCKET" class. The DSOCKET class defines state
|
|
variables and operations for DSOCKET objects within the WinSock 2 DLL. A
|
|
DSOCKET object represents all of the information that the WinSock 2 DLL
|
|
knows about a socket created using the Windows Sockets API.
|
|
|
|
Author:
|
|
|
|
Paul Drews ([email protected]) 30-June-1995
|
|
|
|
Notes:
|
|
|
|
$Revision: 1.12 $
|
|
|
|
$Modtime: 08 Mar 1996 00:07:38 $
|
|
|
|
Revision History:
|
|
|
|
most-recent-revision-date email-name
|
|
description
|
|
|
|
07-14-1995 [email protected]
|
|
Moved member function descriptions to the implementation file
|
|
dsocket.cpp
|
|
|
|
07-09-1995 [email protected]
|
|
Completed first complete version with clean compile and released for
|
|
subsequent implementation.
|
|
|
|
07-08-95 [email protected]
|
|
Original version
|
|
|
|
--*/
|
|
|
|
#ifndef _DSOCKET_
|
|
#define _DSOCKET_
|
|
|
|
#include "winsock2.h"
|
|
#include <windows.h>
|
|
#include "classfwd.h"
|
|
#include "ws2help.h"
|
|
|
|
class DSOCKET: private WSHANDLE_CONTEXT
|
|
{
|
|
public:
|
|
|
|
static
|
|
INT
|
|
DSocketClassInitialize();
|
|
|
|
static
|
|
INT
|
|
DSocketClassCleanup();
|
|
|
|
static
|
|
INT
|
|
AddSpecialApiReference(
|
|
IN SOCKET SocketHandle
|
|
);
|
|
|
|
static
|
|
PDSOCKET
|
|
GetCountedDSocketFromSocket(
|
|
IN SOCKET SocketHandle
|
|
);
|
|
|
|
static
|
|
PDSOCKET
|
|
GetCountedDSocketFromSocketNoExport(
|
|
IN SOCKET SocketHandle
|
|
);
|
|
|
|
DSOCKET();
|
|
|
|
INT
|
|
Initialize(
|
|
IN PPROTO_CATALOG_ITEM CatalogEntry
|
|
);
|
|
|
|
~DSOCKET();
|
|
|
|
SOCKET
|
|
GetSocketHandle();
|
|
|
|
PDPROVIDER
|
|
GetDProvider();
|
|
|
|
DWORD_PTR
|
|
GetContext();
|
|
|
|
VOID
|
|
SetContext(
|
|
IN DWORD_PTR Context
|
|
);
|
|
|
|
PPROTO_CATALOG_ITEM
|
|
GetCatalogItem();
|
|
|
|
INT
|
|
AssociateSocketHandle(
|
|
IN SOCKET SocketHandle,
|
|
IN BOOLEAN ProviderSocket
|
|
);
|
|
|
|
INT
|
|
DisassociateSocketHandle( );
|
|
|
|
VOID
|
|
AddDSocketReference(
|
|
);
|
|
|
|
VOID
|
|
DropDSocketReference(
|
|
);
|
|
|
|
VOID
|
|
DestroyDSocket(
|
|
);
|
|
|
|
BOOL
|
|
IsProviderSocket(
|
|
);
|
|
|
|
BOOL
|
|
IsApiSocket (
|
|
);
|
|
|
|
BOOL
|
|
IsOverlappedSocket (
|
|
);
|
|
|
|
#ifndef WS2_DEBUGGER_EXTENSION
|
|
//
|
|
// Give debugger extension access to all fields
|
|
//
|
|
private:
|
|
#endif
|
|
|
|
static
|
|
PDSOCKET
|
|
FindIFSSocket (
|
|
IN SOCKET SocketHandle
|
|
);
|
|
|
|
friend class DPROCESS;
|
|
|
|
static LPCONTEXT_TABLE sm_context_table;
|
|
// Context tables
|
|
|
|
//#define m_reference_count RefCount
|
|
//#define m_socket_handle Handle
|
|
DWORD_PTR m_handle_context;
|
|
// The uninterpreted socket handle context value that was set by
|
|
// SetContext at the time of WPUCreateSocketHandle.
|
|
|
|
PDPROVIDER m_provider;
|
|
// Reference to the DPROVIDER object representing the service provider
|
|
// that controls this socket.
|
|
|
|
PPROTO_CATALOG_ITEM m_catalog_item;
|
|
// The protocol catalog item used to create this socket
|
|
|
|
BOOLEAN m_pvd_socket;
|
|
// TRUE if this socket comes from the provider and not created by
|
|
// helper DLL on provider request (WPUCreateSocketHandle).
|
|
|
|
BOOLEAN m_api_socket;
|
|
// TRUE if socket was returned via socket/WSASocketA/WSASocketW call,
|
|
// or imported from IFS provider in other API calls
|
|
// FALSE for sockets that are used only at SPI level (created on
|
|
// request from layered provider and never exposed to the
|
|
// application)
|
|
|
|
BOOLEAN m_overlapped_socket;
|
|
// To support the hack of creations of non-overlapped handles
|
|
// during Accept and JoinLeaf by handle helper.
|
|
|
|
#if defined(DEBUG_TRACING) || defined(WS2_DEBUGGER_EXTENSION)
|
|
#define SOCKET_STACK_BACKTRACE_DEPTH 2
|
|
public:
|
|
PVOID m_CreatorBackTrace[SOCKET_STACK_BACKTRACE_DEPTH];
|
|
// Socket creator information
|
|
#endif
|
|
|
|
|
|
}; // class DSOCKET
|
|
|
|
|
|
|
|
inline SOCKET
|
|
DSOCKET::GetSocketHandle()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Retrieves the external socket-handle value corresponding to this internal
|
|
DSOCKET object.
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
The corresponding external socket-handle value.
|
|
--*/
|
|
{
|
|
return((SOCKET)Handle);
|
|
}
|
|
|
|
|
|
|
|
|
|
inline PDPROVIDER
|
|
DSOCKET::GetDProvider()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Retrieves a reference to the DPROVIDER object associated with this DSOCKET
|
|
object.
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
The reference to the DPROVIDER object associated with this DSOCKET object.
|
|
--*/
|
|
{
|
|
return(m_provider);
|
|
}
|
|
|
|
|
|
inline DWORD_PTR
|
|
DSOCKET::GetContext()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This function retrieves the socket handle context value set with the
|
|
SetContext operation. This function is typically called at the time of
|
|
WPUQuerySocketHandleContext. The return value is unspecified if SetContext
|
|
has not been called.
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
Returns the context value that was set by SetContext. This value is
|
|
uninterpreted by the WinSock 2 DLL.
|
|
--*/
|
|
{
|
|
return(m_handle_context);
|
|
}
|
|
|
|
|
|
|
|
|
|
inline VOID
|
|
DSOCKET::SetContext(
|
|
IN DWORD_PTR Context
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This function sets the socket handle context value. This function is
|
|
typically called at the time of WPUCreateSocketHandle.
|
|
|
|
Arguments:
|
|
|
|
lpContext - Supplies the uninterpreted socket handle context value to be
|
|
associated with this socket.
|
|
|
|
Return Value:
|
|
|
|
None
|
|
--*/
|
|
{
|
|
m_handle_context = Context;
|
|
}
|
|
|
|
|
|
|
|
inline PPROTO_CATALOG_ITEM
|
|
DSOCKET::GetCatalogItem()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Retreives the pointer to the catalog item associated with this socket.
|
|
|
|
Arguments:
|
|
|
|
Return Value:
|
|
|
|
The pointer to the catalog item associated with this socket.
|
|
--*/
|
|
{
|
|
return(m_catalog_item);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
inline
|
|
BOOL
|
|
DSOCKET::IsProviderSocket(
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
|
|
This function returns a boolean indicating whether the object is
|
|
for the socket created by the provider (presumably IFS).
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
TRUE - The object is for the socket created by the provider.
|
|
|
|
FALSE - The object is for the socket created by helper DLL.
|
|
--*/
|
|
{
|
|
return m_pvd_socket;
|
|
|
|
} // IsProviderSocket
|
|
|
|
|
|
|
|
inline
|
|
BOOL
|
|
DSOCKET::IsApiSocket(
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
|
|
This function returns a boolean indicating whether the object represents
|
|
socket used by API client.
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
TRUE - The socket is used by API client .
|
|
|
|
FALSE - The object is used by SPI client.
|
|
--*/
|
|
{
|
|
return m_api_socket;
|
|
|
|
} // IsApiSocket
|
|
|
|
|
|
inline
|
|
BOOL
|
|
DSOCKET::IsOverlappedSocket(
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
|
|
This function returns a boolean indicating whether the object represents
|
|
overlapped socket.
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
TRUE - The socket is overlapped.
|
|
|
|
FALSE - The object is non-overlapped.
|
|
--*/
|
|
{
|
|
return m_overlapped_socket;
|
|
|
|
} // IsOverlappedSocket
|
|
|
|
|
|
|
|
|
|
|
|
inline VOID
|
|
DSOCKET::AddDSocketReference(
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
|
|
Adds a reference to the DSOCKET.
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
None
|
|
--*/
|
|
{
|
|
|
|
WahReferenceHandleContext(this);
|
|
|
|
} // AddDSocketReference
|
|
|
|
|
|
inline VOID
|
|
DSOCKET::DropDSocketReference(
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
|
|
Drops the DSOCKET reference and destroys the object
|
|
if reference count is 0.
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
None
|
|
--*/
|
|
{
|
|
|
|
if (WahDereferenceHandleContext(this)==0)
|
|
DestroyDSocket ();
|
|
} // DropDSocketReference
|
|
|
|
inline
|
|
PDSOCKET
|
|
DSOCKET::GetCountedDSocketFromSocket(
|
|
IN SOCKET SocketHandle
|
|
)
|
|
/*++
|
|
Routine Description
|
|
|
|
This procedure takes a client socket handle and maps it to a DSOCKET object
|
|
reference. The reference is counted.
|
|
|
|
If socket object corresponding to the handle cannot be found in the table
|
|
this function queires all IFS providers to see if one of the recognizes
|
|
the handle.
|
|
|
|
Whenever this procedure successfuly returns a counted reference, it is the
|
|
responsibility of the caller to eventually call DropDSocketReference.
|
|
|
|
Note that this procedure assumes that the caller has already checked to
|
|
make sure that WinSock is initialized.
|
|
|
|
Arguments:
|
|
|
|
SocketHandle - Supplies the client-level socket handle to be mapped.
|
|
|
|
|
|
Return Value:
|
|
DSOCKET object or NULL in case the object cannot be found
|
|
--*/
|
|
{
|
|
PDSOCKET Socket;
|
|
Socket = static_cast<PDSOCKET>(WahReferenceContextByHandle (
|
|
sm_context_table,
|
|
(HANDLE)SocketHandle));
|
|
if (Socket!=NULL)
|
|
return Socket;
|
|
else
|
|
return FindIFSSocket (SocketHandle);
|
|
}
|
|
|
|
inline
|
|
PDSOCKET
|
|
DSOCKET::GetCountedDSocketFromSocketNoExport(
|
|
IN SOCKET SocketHandle
|
|
)
|
|
/*++
|
|
Routine Description
|
|
|
|
This procedure takes a client socket handle and maps it to a DSOCKET object
|
|
reference. The reference is counted.
|
|
|
|
No attempt is made to find IFS provider for the socket if it cannot be found
|
|
in the table. This function is intented for calls from non-IFS providers
|
|
such as in context of WPUQuerySocketHandleContext.
|
|
|
|
Whenever this procedure successfuly returns a counted reference, it is the
|
|
responsibility of the caller to eventually call DropDSocketReference.
|
|
|
|
Note that this procedure assumes that the caller has already checked to
|
|
make sure that WinSock is initialized.
|
|
|
|
Arguments:
|
|
|
|
SocketHandle - Supplies the client-level socket handle to be mapped.
|
|
|
|
|
|
Return Value:
|
|
DSOCKET object or NULL in case the object cannot be found
|
|
--*/
|
|
{
|
|
return static_cast<PDSOCKET>(WahReferenceContextByHandle (
|
|
sm_context_table,
|
|
(HANDLE)SocketHandle));
|
|
}
|
|
|
|
#endif // _DSOCKET_
|