Leaked source code of windows server 2003
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.
 
 
 
 
 
 

512 lines
11 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:
dprocess.h
Abstract:
This header defines the "DPROCESS" class. The DPROCESS class defines state
variables and operations for DPROCESS objects within the WinSock 2 DLL. A
DPROCESS object represents all of the information known about a process
using the Windows Sockets API.
Author:
Paul Drews ([email protected]) 7-July-1995
Notes:
$Revision: 1.16 $
$Modtime: 08 Mar 1996 04:58:14 $
Revision History:
most-recent-revision-date email-name
description
25-July [email protected]
Moved protocol catalog related items into DCATALOG. Added data
member to contain a pointer to the protocol catalog. Removed
provider list moved provider references to into the protocol
catalog.
14-July-1995 [email protected]
Moved member function documentation to implementation file
dprocess.cpp. Changed critical section data members to be
pointers to CRITICAL_SECTION. Added inline implementations for
the list lock/unlock member functions.
07-09-1995 [email protected]
Completed first complete version with clean compile and released for
subsequent implementation.
7-July-1995 [email protected]
Original version
--*/
#ifndef _DPROCESS_
#define _DPROCESS_
#include "winsock2.h"
#include <windows.h>
#include "ws2help.h"
#include "classfwd.h"
class DPROCESS
{
public:
// Static (global-scope) member functions
static PDPROCESS
GetCurrentDProcess(
VOID
);
static INT
DProcessClassInitialize(
VOID
);
// Normal member functions
DPROCESS();
INT Initialize();
~DPROCESS();
BOOL
DSocketDetach (
IN LPWSHANDLE_CONTEXT Context
);
PDCATALOG
GetProtocolCatalog();
PNSCATALOG
GetNamespaceCatalog();
INT
GetAsyncHelperDeviceID(
OUT LPHANDLE HelperHandle
);
INT
GetHandleHelperDeviceID(
OUT LPHANDLE HelperHandle
);
INT
GetNotificationHelperDeviceID(
OUT LPHANDLE HelperHandle
);
VOID
IncrementRefCount();
DWORD
DecrementRefCount();
BYTE
GetMajorVersion();
BYTE
GetMinorVersion();
WORD
GetVersion();
VOID
SetVersion( WORD Version );
#ifndef WS2_DEBUGGER_EXTENSION
//
// Give debugger extension access to all fields
//
private:
#endif
VOID LockDThreadList();
VOID UnLockDThreadList();
VOID UpdateNamespaceCatalog ();
INT
OpenAsyncHelperDevice(
OUT LPHANDLE HelperHandle
);
INT
OpenHandleHelperDevice(
OUT LPHANDLE HelperHandle
);
INT
OpenNotificationHelperDevice(
OUT LPHANDLE HelperHandle
);
static PDPROCESS sm_current_dprocess;
// A class-scope reference to the single current DPROCESS object for this
// process.
LONG m_reference_count;
// The number of times this object has been refereced by
// WSAStarup/WSACleanup. WSAStartup increases the count and WSACleanup
// decreases the count. Declarations for lists of associated objects:
WORD m_version;
// The WinSock version number for this process.
BOOLEAN m_lock_initialized;
// For proper cleanup of critical section if initialization fails
PDCATALOG m_protocol_catalog;
// Reference to the protocol catalog for the process
HANDLE m_proto_catalog_change_event;
// Event that keeps track of protocol catalog changes
PNSCATALOG m_namespace_catalog;
// Reference to the name space catalog for the process
HANDLE m_ns_catalog_change_event;
// Event that keeps track of name space catalog changes
// Declarations for Helper objects created on demand:
HANDLE m_ApcHelper;
// Reference to the Asynchronous callback helper device. An asynchronous
// callback helper device is only opened on demand.
HANDLE m_HandleHelper;
// Reference to the handle helper device. A handler
// helper device is only opened on demand.
HANDLE m_NotificationHelper;
// Reference to the notification handle helper device. A notification
// helper device is only opened on demand.
#if 0
// Thread list not used due to race conditions.
// Lock is still used.
LIST_ENTRY m_thread_list;
#endif
CRITICAL_SECTION m_thread_list_lock;
}; // class DPROCESS
inline
PDPROCESS
DPROCESS::GetCurrentDProcess(
)
/*++
Routine Description:
Retrieves a reference to the current DPROCESS object. Note that this is a
"static" function with global scope instead of object-instance scope.
Arguments:
None
Return Value:
Returns pointer to current DPROCESS object or NULL if process has not been
initialized yet
--*/
{
return sm_current_dprocess;
} //GetCurrentDProcess
inline VOID
DPROCESS::IncrementRefCount(
VOID
)
/*++
Routine Description:
This function increases the reference count on this object.
Arguments:
Return Value:
NONE
--*/
{
InterlockedIncrement(&m_reference_count);
}
inline DWORD
DPROCESS::DecrementRefCount(
VOID
)
/*++
Routine Description:
This function decreases the reference count on this object.
Arguments:
Return Value:
Returns the new value of the reference count
--*/
{
return(InterlockedDecrement(&m_reference_count));
}
inline
BYTE
DPROCESS::GetMajorVersion()
/*++
Routine Description:
This function returns the major WinSock version number negotiated
at WSAStartup() time.
Arguments:
None.
Return Value:
Returns the major WinSock version number.
--*/
{
assert(m_version != 0);
return LOBYTE(m_version);
} // GetMajorVersion
inline
BYTE
DPROCESS::GetMinorVersion()
/*++
Routine Description:
This function returns the minor WinSock version number negotiated
at WSAStartup() time.
Arguments:
None.
Return Value:
Returns the minor WinSock version number.
--*/
{
assert(m_version != 0);
return HIBYTE(m_version);
} // GetMinorVersion
inline
WORD
DPROCESS::GetVersion()
/*++
Routine Description:
This function returns the WinSock version number negotiated
at WSAStartup() time.
Arguments:
None.
Return Value:
Returns the WinSock version number.
--*/
{
assert(m_version != 0);
return m_version;
} // GetVersion
inline VOID
DPROCESS::LockDThreadList()
/*++
Routine Description:
This function acquires mutually exclusive access to the list of DTHREAD
objects attached to the DPROCESS object. The companion procedures
LockDThreadList and UnLockDThreadList are used internally to bracket
operations that add and remove items from the DTHREAD list.
NOTE:
Use a Critical Section object for best performance. Create the Critical
Section object at DPROCESS object initialization time and destroy it at
DPROCESS object destruction time.
Arguments:
None
Return Value:
None
--*/
{
EnterCriticalSection(&m_thread_list_lock);
}
inline VOID
DPROCESS::UnLockDThreadList()
/*++
Routine Description:
This function releases mutually exclusive access to the list of DTHREAD
objects attached to the DPROCESS object. The companion procedures
LockDThreadList and UnLockDThreadList are used internally to bracket
operations that add and remove items from the DTHREAD list.
NOTE:
Use a Critical Section object for best performance. Create the Critical
Section object at DPROCESS object initialization time and destroy it at
DPROCESS object destruction time.
Arguments:
None
Return Value:
None
--*/
{
LeaveCriticalSection(&m_thread_list_lock);
}
inline INT
DPROCESS::GetAsyncHelperDeviceID(
OUT LPHANDLE HelperHandle
)
/*++
Routine Description:
Retrieves the opened Async Helper device ID required for processing
callbacks in the overlapped I/O model. The operation opens the Async
Helper device if necessary.
Arguments:
HelperHandle - Returns the requested Async Helper device ID.
Return Value:
The function returns ERROR_SUCESS if successful, otherwise it
returns an appropriate WinSock error code.
--*/
{
if (m_ApcHelper) {
*HelperHandle = m_ApcHelper;
return ERROR_SUCCESS;
} //if
else {
return OpenAsyncHelperDevice (HelperHandle);
}
}
inline INT
DPROCESS::GetHandleHelperDeviceID(
OUT LPHANDLE HelperHandle
)
/*++
Routine Description:
Retrieves the opened Handle Helper device ID required for allocation
of socket handles for non-IFS providers. The operation opens the Handle
Helper device if necessary.
Arguments:
HelperHandle - Returns the requested Handle Helper device ID.
Return Value:
The function returns ERROR_SUCESS if successful, otherwise it
returns an appropriate WinSock error code.
--*/
{
if (m_HandleHelper) {
*HelperHandle = m_HandleHelper;
return ERROR_SUCCESS;
} //if
else {
return OpenHandleHelperDevice (HelperHandle);
}
}
inline INT
DPROCESS::GetNotificationHelperDeviceID(
OUT LPHANDLE HelperHandle
)
/*++
Routine Description:
Retrieves the opened Async Helper device ID required for processing
callbacks in the overlapped I/O model. The operation opens the Async
Helper device if necessary.
Arguments:
HelperHandle - Returns the requested Async Helper device ID.
Return Value:
The function returns ERROR_SUCESS if successful, otherwise it
returns an appropriate WinSock error code.
--*/
{
if (m_NotificationHelper) {
*HelperHandle = m_NotificationHelper;
return ERROR_SUCCESS;
} //if
else {
return OpenNotificationHelperDevice (HelperHandle);
}
}
#endif // _DPROCESS_