mirror of https://github.com/lianthony/NT4.0
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.
488 lines
8.5 KiB
488 lines
8.5 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 "llist.h"
|
|
#include "classfwd.h"
|
|
#include "ws2help.h"
|
|
|
|
|
|
|
|
class DSOCKET
|
|
{
|
|
public:
|
|
|
|
static
|
|
INT
|
|
DSocketClassInitialize();
|
|
|
|
static
|
|
INT
|
|
DSocketClassCleanup();
|
|
|
|
static
|
|
INT
|
|
AddSpecialNonIfsReference(
|
|
IN SOCKET SocketHandle
|
|
);
|
|
|
|
static
|
|
INT
|
|
GetCountedDSocketFromSocket(
|
|
IN SOCKET SocketHandle,
|
|
OUT PDSOCKET * DSocket
|
|
);
|
|
|
|
static
|
|
INT
|
|
GetUncountedDSocketFromSocket(
|
|
IN SOCKET SocketHandle,
|
|
OUT PDSOCKET * DSocket
|
|
);
|
|
|
|
static
|
|
VOID
|
|
AcquireHandleTableLock();
|
|
|
|
static
|
|
VOID
|
|
ReleaseHandleTableLock();
|
|
|
|
DSOCKET();
|
|
|
|
INT
|
|
Initialize(
|
|
IN PDPROCESS Process,
|
|
IN PDPROVIDER Provider
|
|
);
|
|
|
|
~DSOCKET();
|
|
|
|
SOCKET
|
|
GetSocketHandle();
|
|
|
|
PDPROVIDER
|
|
GetDProvider();
|
|
|
|
PDPROCESS
|
|
GetDProcess();
|
|
|
|
DWORD
|
|
GetContext();
|
|
|
|
VOID
|
|
SetContext(
|
|
IN DWORD Context
|
|
);
|
|
VOID
|
|
SetCatalogItem(
|
|
IN PPROTO_CATALOG_ITEM CatalogItem
|
|
);
|
|
|
|
PPROTO_CATALOG_ITEM
|
|
GetCatalogItem();
|
|
|
|
INT
|
|
AssociateSocketHandle(
|
|
IN SOCKET SocketHandle
|
|
);
|
|
|
|
INT
|
|
AssociateNewSocketHandle(
|
|
OUT SOCKET * SocketHandle
|
|
);
|
|
|
|
VOID
|
|
DisassociateSocketHandle(
|
|
IN BOOL DestroyHandle
|
|
);
|
|
|
|
VOID
|
|
AddDSocketReference(
|
|
);
|
|
|
|
VOID
|
|
DropDSocketReference(
|
|
);
|
|
|
|
BOOL
|
|
IsClosing(
|
|
);
|
|
|
|
BOOL
|
|
IsIfsSocket(
|
|
);
|
|
|
|
VOID
|
|
MarkSocketClosing(
|
|
);
|
|
|
|
DWORD
|
|
ClearContextTableEntry(
|
|
);
|
|
|
|
DWORD
|
|
RestoreContextTableEntry(
|
|
);
|
|
|
|
LIST_ENTRY m_dprocess_linkage;
|
|
// Provides the linkage space for a list of DSOCKET objects maintained by
|
|
// the DPROCESS object associated with this DSOCKET object. Note that
|
|
// this member variable must be public so that the linked-list macros can
|
|
// maniplate the list linkage from within the DPROCESS object's methods.
|
|
|
|
// Note that no LIST_ENTRY is required to correspond to the DPROVIDER
|
|
// object associated with this DSOCKET object since the DPROVIDER object
|
|
// does not maintain a list of sockets it controls.
|
|
|
|
|
|
private:
|
|
|
|
PDPROVIDER m_provider;
|
|
// Reference to the DPROVIDER object representing the service provider
|
|
// that controls this socket.
|
|
|
|
PDPROCESS m_process;
|
|
// Reference to the DPROCESS object with which this socket is associated.
|
|
|
|
DWORD m_handle_context;
|
|
// The uninterpreted socket handle context value that was set by
|
|
// SetContext at the time of WPUCreateSocketHandle.
|
|
|
|
SOCKET m_socket_handle;
|
|
// The external socket handle value corresponding to this internal
|
|
// DSOCKET object.
|
|
|
|
PPROTO_CATALOG_ITEM m_catalog_item;
|
|
// The protocol catalog item used to create this socket
|
|
|
|
BOOL m_close_in_progress;
|
|
// Normally FALSE. Set to TRUE during closesocket to prevent new
|
|
// operations from starting.
|
|
|
|
BOOL m_ifs_socket;
|
|
// TRUE if this socket comes from an IFS provider.
|
|
|
|
LONG m_reference_count;
|
|
// A count of how many references to this DSOCKET are outstanding. This
|
|
// count is bumped up when a function maps a socket handle to a DSOCKET
|
|
// reference. It is bumped back down when a function drops a DSOCKET
|
|
// reference.
|
|
|
|
static
|
|
LPCONTEXT_TABLE sm_handle_table;
|
|
// The association table (managed by ws2help) that maps socket handles to
|
|
// socket object references. Note that this is a global-scope class
|
|
// variable, not a per-instance member variable.
|
|
|
|
static
|
|
CRITICAL_SECTION sm_handle_table_synchro;
|
|
// A critical-section object used to make association-table operations
|
|
// atomic with DSOCKET object reference counts.
|
|
|
|
}; // 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(m_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 PDPROCESS
|
|
DSOCKET::GetDProcess()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Retrieves a reference to the DPROCESS object associated with this DSOCKET
|
|
object.
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
The reference to the DPROCESS object associated with this DSOCKET object.
|
|
--*/
|
|
{
|
|
return(m_process);
|
|
}
|
|
|
|
|
|
|
|
|
|
inline DWORD
|
|
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 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::IsClosing(
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
|
|
This function returns a boolean indicating whether the object has a
|
|
closesocket operation in progress.
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
TRUE - The object has a closesocket operation in progress
|
|
|
|
FALSE - The object does not have a closesocket operation in progress
|
|
--*/
|
|
{
|
|
return(m_close_in_progress);
|
|
} // IsClosing
|
|
|
|
|
|
|
|
|
|
inline
|
|
BOOL
|
|
DSOCKET::IsIfsSocket(
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
|
|
This function returns a boolean indicating whether the object is
|
|
supported by an IFS provider.
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
TRUE - The object is supported by an IFS provider.
|
|
|
|
FALSE - The object is not supported by an IFS provider.
|
|
--*/
|
|
{
|
|
return m_ifs_socket;
|
|
|
|
} // IsIfsSocket
|
|
|
|
|
|
|
|
|
|
inline VOID
|
|
DSOCKET::MarkSocketClosing(
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
|
|
This procedure marks the DSOCKET object to indicate that a close operation
|
|
is in progress. This prevents other threads from starting other operations
|
|
involving that socket handle.
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
None
|
|
--*/
|
|
{
|
|
m_close_in_progress = TRUE;
|
|
} // MarkSocketClosing
|
|
|
|
|
|
|
|
|
|
inline VOID
|
|
DSOCKET::AddDSocketReference(
|
|
)
|
|
/*++
|
|
Routine Description:
|
|
|
|
Adds a reference to the DSOCKET.
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
None
|
|
--*/
|
|
{
|
|
InterlockedIncrement( &m_reference_count );
|
|
|
|
} // AddDSocketReference
|
|
|
|
|
|
|
|
#endif // _DSOCKET_
|
|
|