253 lines
7.4 KiB
C
253 lines
7.4 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1998, Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
socket.h
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This module contains declarations for socket-management.
|
||
|
The routines declared here operate asynchronously on sockets
|
||
|
associated with an I/O completion port. They are also integrated
|
||
|
with the component-reference object, which may optionally be used
|
||
|
by callers to control the number of outstanding entries into a component's
|
||
|
address-space. (See 'COMPREF.H'.)
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Abolade Gbadegesin (aboladeg) 2-Mar-1998
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
Abolade Gbadegesin (aboladeg) 23-May-1999
|
||
|
|
||
|
Added support for stream sockets.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
|
||
|
#ifndef _NATHLP_SOCKET_H_
|
||
|
#define _NATHLP_SOCKET_H_
|
||
|
|
||
|
#define INET_NTOA(x) inet_ntoa(*(struct in_addr*)&(x))
|
||
|
|
||
|
//
|
||
|
// BOOLEAN
|
||
|
// NhIsFatalSocketError(
|
||
|
// ULONG Error
|
||
|
// );
|
||
|
//
|
||
|
// Determines whether a request may be reissued on a socket,
|
||
|
// given the error-code from the previous issuance of the request.
|
||
|
// This macro is arranged to branch on the most common error-codes first.
|
||
|
//
|
||
|
|
||
|
#define \
|
||
|
NhIsFatalSocketError( \
|
||
|
_Error \
|
||
|
) \
|
||
|
((_Error) != ERROR_OPERATION_ABORTED && \
|
||
|
((_Error) == WSAEDISCON || \
|
||
|
(_Error) == WSAECONNRESET || \
|
||
|
(_Error) == WSAETIMEDOUT || \
|
||
|
(_Error) == WSAENETDOWN || \
|
||
|
(_Error) == WSAENOTSOCK || \
|
||
|
(_Error) == WSAESHUTDOWN || \
|
||
|
(_Error) == WSAECONNABORTED))
|
||
|
|
||
|
|
||
|
typedef class _CNhSock : public virtual GENERIC_NODE
|
||
|
{
|
||
|
|
||
|
public:
|
||
|
|
||
|
|
||
|
_CNhSock();
|
||
|
|
||
|
_CNhSock(SOCKET iSocket);
|
||
|
|
||
|
~_CNhSock();
|
||
|
|
||
|
void ComponentCleanUpRoutine(void);
|
||
|
|
||
|
virtual void StopSync(void);
|
||
|
|
||
|
virtual PCHAR GetObjectName() { return ObjectNamep;}
|
||
|
|
||
|
SOCKET GetSock() { return Socket;};
|
||
|
|
||
|
VOID SetSock(SOCKET inSock) { Socket = inSock;};
|
||
|
|
||
|
ULONG
|
||
|
NhAcceptStreamSocket(
|
||
|
PCOMPONENT_SYNC Component,
|
||
|
class _CNhSock * AcceptedSocketp OPTIONAL,
|
||
|
PNH_BUFFER Bufferp OPTIONAL,
|
||
|
PNH_COMPLETION_ROUTINE AcceptCompletionRoutine,
|
||
|
PVOID Context,
|
||
|
PVOID Context2
|
||
|
);
|
||
|
|
||
|
ULONG
|
||
|
NhConnectStreamSocket(
|
||
|
PCOMPONENT_SYNC Component,
|
||
|
ULONG Address,
|
||
|
USHORT Port,
|
||
|
PNH_BUFFER Bufferp OPTIONAL,
|
||
|
PNH_COMPLETION_ROUTINE ConnectCompletionRoutine,
|
||
|
PNH_COMPLETION_ROUTINE CloseNotificationRoutine OPTIONAL,
|
||
|
PVOID Context,
|
||
|
PVOID Context2
|
||
|
);
|
||
|
|
||
|
ULONG
|
||
|
NhCreateDatagramSocket(
|
||
|
ULONG Address,
|
||
|
USHORT Port,
|
||
|
OUT SOCKET* Socketp
|
||
|
);
|
||
|
|
||
|
ULONG
|
||
|
NhCreateStreamSocket(
|
||
|
ULONG Address OPTIONAL, // may be INADDR_NONE
|
||
|
USHORT Port OPTIONAL,
|
||
|
OUT SOCKET* Socketp
|
||
|
);
|
||
|
|
||
|
#define NhDeleteDatagramSocket(s) NhDeleteSocket(s)
|
||
|
#define NhDeleteStreamSocket(s) NhDeleteSocket(s)
|
||
|
|
||
|
VOID
|
||
|
NhDeleteSocket(
|
||
|
SOCKET Socket
|
||
|
);
|
||
|
|
||
|
VOID NhDeleteSocket() \
|
||
|
{if (this->Socket != INVALID_SOCKET) {closesocket(this->Socket);};}
|
||
|
|
||
|
ULONG
|
||
|
NhNotifyOnCloseStreamSocket(
|
||
|
PCOMPONENT_SYNC Component,
|
||
|
PNH_BUFFER Bufferp OPTIONAL,
|
||
|
PNH_COMPLETION_ROUTINE CloseNotificationRoutine,
|
||
|
PVOID Context,
|
||
|
PVOID Context2
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
NhQueryAcceptEndpoints(
|
||
|
PUCHAR AcceptBuffer,
|
||
|
PULONG LocalAddress OPTIONAL,
|
||
|
PUSHORT LocalPort OPTIONAL,
|
||
|
PULONG RemoteAddress OPTIONAL,
|
||
|
PUSHORT RemotePort OPTIONAL
|
||
|
);
|
||
|
|
||
|
ULONG
|
||
|
NhQueryAddressSocket();
|
||
|
|
||
|
ULONG
|
||
|
NhQueryLocalEndpointSocket(
|
||
|
PULONG Address OPTIONAL,
|
||
|
PUSHORT Port OPTIONAL
|
||
|
);
|
||
|
|
||
|
USHORT
|
||
|
NhQueryPortSocket();
|
||
|
|
||
|
ULONG
|
||
|
NhQueryRemoteEndpointSocket(
|
||
|
PULONG Address OPTIONAL,
|
||
|
PUSHORT Port OPTIONAL
|
||
|
);
|
||
|
|
||
|
ULONG
|
||
|
NhReadDatagramSocket(
|
||
|
PCOMPONENT_SYNC Component,
|
||
|
PNH_BUFFER Bufferp OPTIONAL,
|
||
|
PNH_COMPLETION_ROUTINE CompletionRoutine,
|
||
|
PVOID Context,
|
||
|
PVOID Context2
|
||
|
);
|
||
|
|
||
|
ULONG
|
||
|
NhReadStreamSocket(
|
||
|
PCOMPONENT_SYNC Component,
|
||
|
PNH_BUFFER Bufferp OPTIONAL,
|
||
|
ULONG Length,
|
||
|
ULONG Offset,
|
||
|
PNH_COMPLETION_ROUTINE CompletionRoutine,
|
||
|
PVOID Context,
|
||
|
PVOID Context2
|
||
|
);
|
||
|
|
||
|
ULONG
|
||
|
NhWriteDatagramSocket(
|
||
|
PCOMPONENT_SYNC Component,
|
||
|
ULONG Address,
|
||
|
USHORT Port,
|
||
|
PNH_BUFFER Bufferp,
|
||
|
ULONG Length,
|
||
|
PNH_COMPLETION_ROUTINE CompletionRoutine,
|
||
|
PVOID Context,
|
||
|
PVOID Context2
|
||
|
);
|
||
|
|
||
|
ULONG
|
||
|
NhWriteStreamSocket(
|
||
|
PCOMPONENT_SYNC Component,
|
||
|
PNH_BUFFER Bufferp,
|
||
|
ULONG Length,
|
||
|
ULONG Offset,
|
||
|
PNH_COMPLETION_ROUTINE CompletionRoutine,
|
||
|
PVOID Context,
|
||
|
PVOID Context2
|
||
|
);
|
||
|
|
||
|
|
||
|
static VOID NTAPI
|
||
|
NhpConnectOrCloseCallbackRoutine(
|
||
|
PVOID Context,
|
||
|
BOOLEAN WaitCompleted
|
||
|
);
|
||
|
|
||
|
static VOID NTAPI
|
||
|
NhpCloseNotificationCallbackRoutine(
|
||
|
PVOID Context,
|
||
|
BOOLEAN WaitCompleted
|
||
|
);
|
||
|
|
||
|
|
||
|
static VOID WINAPI
|
||
|
NhpIoCompletionRoutine(
|
||
|
ULONG ErrorCode,
|
||
|
ULONG BytesTransferred,
|
||
|
LPOVERLAPPED Overlapped
|
||
|
);
|
||
|
|
||
|
static VOID APIENTRY
|
||
|
NhpIoWorkerRoutine(
|
||
|
PVOID Context
|
||
|
);
|
||
|
|
||
|
protected:
|
||
|
SOCKET Socket;
|
||
|
|
||
|
static const PCHAR ObjectNamep;
|
||
|
|
||
|
// For Shared Sockets we should have ShareCounter
|
||
|
|
||
|
} CNhSock, *PCNhSock;
|
||
|
|
||
|
|
||
|
//
|
||
|
// Utility functions
|
||
|
//
|
||
|
ULONG InterfaceForDestination(ULONG DestIp);
|
||
|
|
||
|
|
||
|
|
||
|
#endif // _NATHLP_SOCKET_H_
|