468 lines
12 KiB
C
468 lines
12 KiB
C
|
#ifndef _IPX_ADAPTER_
|
||
|
#define _IPX_ADAPTER_
|
||
|
|
||
|
#include <ntddndis.h>
|
||
|
#include "tdi.h"
|
||
|
#include "isnkrnl.h"
|
||
|
#include "ipxrtdef.h"
|
||
|
|
||
|
// Adapter state changes
|
||
|
#define ADAPTER_CREATED 1
|
||
|
#define ADAPTER_DELETED 2
|
||
|
#define ADAPTER_UP 3
|
||
|
#define ADAPTER_DOWN 4
|
||
|
|
||
|
|
||
|
//*** Adapter Info ***
|
||
|
|
||
|
// this information is communicated whenever an adapter gets
|
||
|
// created or gets connected
|
||
|
|
||
|
typedef struct _ADAPTER_INFO {
|
||
|
ULONG InterfaceIndex; // relevant only for demand dial WAN interfaces
|
||
|
UCHAR Network[4];
|
||
|
UCHAR LocalNode[6];
|
||
|
UCHAR RemoteNode[6];
|
||
|
ULONG LinkSpeed;
|
||
|
ULONG PacketType;
|
||
|
ULONG MaxPacketSize;
|
||
|
NDIS_MEDIUM NdisMedium;
|
||
|
ULONG ConnectionId;
|
||
|
WCHAR pszAdpName[MAX_ADAPTER_NAME_LEN];
|
||
|
} ADAPTER_INFO, *PADAPTER_INFO;
|
||
|
|
||
|
typedef struct _ADAPTERS_GLOBAL_PARAMETERS {
|
||
|
ULONG AdaptersCount;
|
||
|
} ADAPTERS_GLOBAL_PARAMETERS, *PADAPTERS_GLOBAL_PARAMETERS;
|
||
|
|
||
|
typedef struct _IPXWAN_INFO {
|
||
|
UCHAR Network[4];
|
||
|
UCHAR LocalNode[6];
|
||
|
UCHAR RemoteNode[6];
|
||
|
} IPXWAN_INFO, *PIPXWAN_INFO;
|
||
|
|
||
|
typedef struct _ADDRESS_RESERVED {
|
||
|
UCHAR Reserved[FIELD_OFFSET(IPX_DATAGRAM_OPTIONS2, Data)];
|
||
|
} ADDRESS_RESERVED, *PADDRESS_RESERVED;
|
||
|
|
||
|
#define GetNicId(pReserved) ((PIPX_DATAGRAM_OPTIONS2)pReserved)->DgrmOptions.LocalTarget.NicId
|
||
|
|
||
|
/*++
|
||
|
|
||
|
I p x C r e a t e A d a p t e r C o n f i g u r a t i o n P o r t
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Register client that wants to be updated of any changes in
|
||
|
adapter state
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
NotificationEvent - event to be signaled when adapter state changes
|
||
|
AdptGlobalParameters - parameters that common to all adapters
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
Handle to configuration port thru which changes in adapter state
|
||
|
are reported. Returns INVALID_HANDLE_VALUE if port could not be created
|
||
|
|
||
|
--*/
|
||
|
HANDLE WINAPI
|
||
|
IpxCreateAdapterConfigurationPort (
|
||
|
IN HANDLE NotificationEvent,
|
||
|
OUT PADAPTERS_GLOBAL_PARAMETERS AdptGlobalParameters
|
||
|
);
|
||
|
|
||
|
/*++
|
||
|
|
||
|
I p x W a n C r e a t e A d a p t e r C o n f i g u r a t i o n P o r t
|
||
|
|
||
|
Routine Description:
|
||
|
Same as above, but creates port that only reports ADAPTER_UP
|
||
|
events on WAN adapters that require IPXWAN negotiation.
|
||
|
IpxGetQueuedAdapterConfigurationStatus on this port should be
|
||
|
followed by IpxWanSetAdapterConfiguration obtained during the
|
||
|
negotiation process, and ADAPTER_UP event will then be reported
|
||
|
to other clients (including forwarder dirver)
|
||
|
*/
|
||
|
HANDLE WINAPI
|
||
|
IpxWanCreateAdapterConfigurationPort (
|
||
|
IN HANDLE NotificationEvent,
|
||
|
OUT PADAPTERS_GLOBAL_PARAMETERS AdptGlobalParameters
|
||
|
);
|
||
|
|
||
|
|
||
|
/*++
|
||
|
|
||
|
I p x D e l e t e A d a p t e r C o n f i g u r a t i o n P o r t
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Unregister client
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
Handle - configuration port handle
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
NO_ERROR
|
||
|
ERROR_INVALID_PARAMETER
|
||
|
ERROR_GEN_FAILURE
|
||
|
|
||
|
--*/
|
||
|
|
||
|
DWORD WINAPI
|
||
|
IpxDeleteAdapterConfigurationPort (
|
||
|
IN HANDLE Handle
|
||
|
);
|
||
|
|
||
|
/*++
|
||
|
|
||
|
G e t Q u e u e d A d a p t e r C o n f i g u r a t i o n S t a t u s
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Get info from the list of adapter info chages queued to the
|
||
|
configuration info port
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
Handle - configuration port handle
|
||
|
AdapterIndex - number of adapter being reported
|
||
|
AdapterConfigurationStatus - new adapter status
|
||
|
AdapterParameters - adapter parameters
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
NO_ERROR - new information is reported
|
||
|
ERROR_NO_MORE_ITEMS - there is nothing to report
|
||
|
Windows error code - operation failed
|
||
|
--*/
|
||
|
DWORD WINAPI
|
||
|
IpxGetQueuedAdapterConfigurationStatus(
|
||
|
IN HANDLE Handle,
|
||
|
OUT PULONG AdapterIndex,
|
||
|
OUT PULONG AdapterConfigurationStatus,
|
||
|
OUT PADAPTER_INFO AdapterInfo
|
||
|
);
|
||
|
|
||
|
|
||
|
/*++
|
||
|
|
||
|
I p x W a n S e t A d a p t e r C o n f i g u r a t i o n
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Sets adapter configuration to be reported to both user and
|
||
|
kernel mode clients (through the ADAPTER_UP/LINE_UP events)
|
||
|
Arguments:
|
||
|
|
||
|
AdapterIndex - number of adapter being set
|
||
|
IpxWanInfo - IPXWAN negotiated parameters
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
NO_ERROR - adapter info set successfully
|
||
|
Windows error code - operation failed
|
||
|
--*/
|
||
|
DWORD
|
||
|
IpxWanSetAdapterConfiguration (
|
||
|
IN ULONG AdapterIndex,
|
||
|
IN PIPXWAN_INFO IpxWanInfo
|
||
|
);
|
||
|
|
||
|
/*++
|
||
|
|
||
|
I p x W a n Q u e r y I n a c t i v i t y T i m e r
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Returns value of inactivity timer associated with WAN line
|
||
|
Arguments:
|
||
|
ConnectionId - connection id that identifies WAN line (used only
|
||
|
if *AdapterIndex==INVALID_NICID
|
||
|
AdapterIndex - adapter index that identifies WAN line (preferred
|
||
|
over connection id), if *AdapterIndex==INVALID_NICID
|
||
|
the value of connection id is used to identify the
|
||
|
WAN line and value of AdapterIndex is returned.
|
||
|
InactivityCounter - value of inactivity counter.
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
NO_ERROR - inactivity timer reading is returned
|
||
|
Windows error code - operation failed
|
||
|
--*/
|
||
|
DWORD
|
||
|
IpxWanQueryInactivityTimer (
|
||
|
IN ULONG ConnectionId,
|
||
|
IN OUT PULONG AdapterIndex,
|
||
|
OUT PULONG InactivityCounter
|
||
|
);
|
||
|
|
||
|
/*++
|
||
|
|
||
|
G e t A d a p t e r N a m e W
|
||
|
|
||
|
|
||
|
Routine Description:
|
||
|
Returns UNICODE name of the adapter associated with given index
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
AdapterIndex - index of adapter
|
||
|
AdapterNameSize - size of adapter name (in bytes), including terminal wchar NULL
|
||
|
AdapterNameBuffer - buffer to receive adapter name
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
NO_ERROR - adapter name is in the buffer
|
||
|
ERROR_INVALID_PARAMETER - adapter with given index does not exist
|
||
|
ERROR_INSUFFICIENT_BUFFER - buffer in to small. Updates AdapterNameSize to
|
||
|
the correct value.
|
||
|
Other windows error code - operation failed
|
||
|
|
||
|
--*/
|
||
|
DWORD WINAPI
|
||
|
GetAdapterNameW(
|
||
|
IN ULONG AdapterIndex,
|
||
|
IN OUT PULONG AdapterNameSize,
|
||
|
OUT LPWSTR AdapterNameBuffer);
|
||
|
|
||
|
|
||
|
/*++
|
||
|
|
||
|
C r e a t e S o c k e t P o r t
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Creates port to communicate over IPX socket
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
Socket - IPX socket number to use (network byte order)
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
Handle to communication port that provides async interface
|
||
|
to IPX stack. Returns INVALID_HANDLE_VALUE if port can not be opened
|
||
|
|
||
|
--*/
|
||
|
HANDLE WINAPI
|
||
|
CreateSocketPort(
|
||
|
IN USHORT Socket
|
||
|
);
|
||
|
|
||
|
/*++
|
||
|
|
||
|
D e l e t e S o c k e t P o r t
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Cancel all the outstandng requests and dispose of all the resources
|
||
|
allocated for communication port
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
Handle - Handle to communication port to be disposed of
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
NO_ERROR - success
|
||
|
Windows error code - operation failed
|
||
|
|
||
|
|
||
|
--*/
|
||
|
DWORD WINAPI
|
||
|
DeleteSocketPort(
|
||
|
IN HANDLE Handle
|
||
|
);
|
||
|
|
||
|
/*++
|
||
|
|
||
|
I p x R e c v P a c k e t
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Enqueue request to receive IPX packet and return immediately. Event will
|
||
|
be signalled or comletion routine will be called when done
|
||
|
|
||
|
Arguments:
|
||
|
Handle - Handle to adapter & socket to use
|
||
|
AdapterIdx - adapter on which to packet was received (set upon completion)
|
||
|
IpxPacket - buffer for ipx packet (complete with header)
|
||
|
IpxPacketLength - length of the buffer
|
||
|
pReserved - buffer to get info from IPX stack
|
||
|
lpOverlapped - structure to be used for async IO:
|
||
|
Internal - Reserved
|
||
|
InternalHigh - Reserved
|
||
|
Offset - not used
|
||
|
OffsetHigh - not used
|
||
|
hEvent - event to be signalled when IO completes or NULL
|
||
|
if CompletionRoutine is to be called
|
||
|
CompletionRoutine - to be called when IO operation is completes
|
||
|
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
NO_ERROR - if lpOverlapped->hEvent!=NULL, then send has successfully completed
|
||
|
(do not need to wait on event), otherwise, send operation has
|
||
|
started and completion routine will be called when done
|
||
|
ERROR_IO_PENDING - only returned if lpOverlapped->hEvent!=NULL and send could not
|
||
|
be completed immediately, event will be signalled when
|
||
|
operation is done: call GetOverlapedResult to retrieve result of
|
||
|
the operation
|
||
|
other (windows error code) - operation could not be started (completion routine
|
||
|
won't be called)
|
||
|
|
||
|
--*/
|
||
|
DWORD WINAPI
|
||
|
IpxRecvPacket(
|
||
|
IN HANDLE Handle,
|
||
|
OUT PUCHAR IpxPacket,
|
||
|
IN ULONG IpxPacketLength,
|
||
|
IN PADDRESS_RESERVED lpReserved,
|
||
|
LPOVERLAPPED lpOverlapped,
|
||
|
LPOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine
|
||
|
);
|
||
|
|
||
|
/*++
|
||
|
|
||
|
I p x S e n d P a c k e t
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Enqueue request to receive IPX packet and return immediately. Event will
|
||
|
be signalled or comletion routine will be called when done
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
Handle - Handle to adapter & socket to use
|
||
|
AdapterIdx - adapter on which to send
|
||
|
IpxPacket - ipx packet complete with header
|
||
|
IpxPacketLength - length of the packet
|
||
|
pReserved - buffer to supply info to IPX stack
|
||
|
lpOverlapped - structure to be used for async IO:
|
||
|
Internal - reserved
|
||
|
InternalHigh - reserved
|
||
|
Offset - not used
|
||
|
OffsetHigh - not used
|
||
|
hEvent - event to be signalled when IO completes or NULL
|
||
|
if CompletionRoutine is to be called
|
||
|
CompletionRoutine - to be called when IO operation is completes
|
||
|
Return Value:
|
||
|
NO_ERROR - if lpOverlapped->hEvent!=NULL, then recv has successfully completed
|
||
|
(do not need to wait on event), otherwise, recv operation has
|
||
|
started and completion routine will be called when done
|
||
|
ERROR_IO_PENDING - only returned if lpOverlapped->hEvent!=NULL and recv could not
|
||
|
be completed immediately, event will be signalled when
|
||
|
operation is done: call GetOverlapedResult to retrieve result of
|
||
|
the operation
|
||
|
other (windows error code) - operation could not be started (completion routine
|
||
|
won't be called)
|
||
|
|
||
|
|
||
|
--*/
|
||
|
DWORD WINAPI
|
||
|
IpxSendPacket (
|
||
|
IN HANDLE Handle,
|
||
|
IN ULONG AdapterIdx,
|
||
|
IN PUCHAR IpxPacket,
|
||
|
IN ULONG IpxPacketLength,
|
||
|
IN PADDRESS_RESERVED lpReserved,
|
||
|
LPOVERLAPPED lpOverlapped,
|
||
|
LPOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine
|
||
|
);
|
||
|
|
||
|
/*++
|
||
|
|
||
|
I p x G e t O v e r l a p p e d R e s u l t
|
||
|
Routine Description:
|
||
|
GetOverlappedResult wrapper: gives adptif.dll a chance to adjust
|
||
|
returned parameters (currently number of bytes transferred).
|
||
|
|
||
|
Arguments:
|
||
|
Same as in GetOverlappedResult (see SDK doc)
|
||
|
Return Value:
|
||
|
Same as in GetOverlappedResult (see SDK doc)
|
||
|
--*/
|
||
|
BOOL
|
||
|
IpxGetOverlappedResult (
|
||
|
HANDLE Handle,
|
||
|
LPOVERLAPPED lpOverlapped,
|
||
|
LPDWORD lpNumberOfBytesTransferred,
|
||
|
BOOL bWait
|
||
|
);
|
||
|
|
||
|
/*++
|
||
|
|
||
|
I p x G e t Q u e u e d C o m p l e t i o n S t a t u s
|
||
|
|
||
|
Routine Description:
|
||
|
GetQueuedCompletionStatus wrapper: gives adptif.dll a chance to adjust
|
||
|
returned parameters (currently number of bytes transferred)
|
||
|
|
||
|
Arguments:
|
||
|
Same as in GetQueuedCompletionStatus (see SDK doc)
|
||
|
Return Value:
|
||
|
Same as in GetQueuedCompletionStatus (see SDK doc)
|
||
|
--*/
|
||
|
BOOL
|
||
|
IpxGetQueuedCompletionStatus(
|
||
|
HANDLE CompletionPort,
|
||
|
LPDWORD lpNumberOfBytesTransferred,
|
||
|
PULONG_PTR lpCompletionKey,
|
||
|
LPOVERLAPPED *lpOverlapped,
|
||
|
DWORD dwMilliseconds
|
||
|
);
|
||
|
|
||
|
/*++
|
||
|
|
||
|
I p x A d j u s t I o C o m p l e t i o n P a r a m s
|
||
|
|
||
|
Routine Description:
|
||
|
Adjust io completion parameters for io performed
|
||
|
by IpxSendPacket or IpxReceivePacket and completed
|
||
|
through the mechanisms other than routines provided
|
||
|
above
|
||
|
|
||
|
Arguments:
|
||
|
lpOverlapped - overlapped structure passed to
|
||
|
Ipx(Send/Recv)Packet routines
|
||
|
lpNumberOfBytesTransferred - adjusted number of bytes
|
||
|
transferred in io
|
||
|
error - win32 error code
|
||
|
|
||
|
Return Value:
|
||
|
None
|
||
|
--*/
|
||
|
VOID
|
||
|
IpxAdjustIoCompletionParams (
|
||
|
IN OUT LPOVERLAPPED lpOverlapped,
|
||
|
OUT LPDWORD lpNumberOfBytesTransferred,
|
||
|
OUT LPDWORD error
|
||
|
);
|
||
|
/*++
|
||
|
|
||
|
I p x P o s t Q u e u e d C o m p l e t i o n S t a t u s
|
||
|
|
||
|
Routine Description:
|
||
|
PostQueuedCompletionStatus wrapper: gives adptif.dll a chance to
|
||
|
setup lpOverlapped so it can be correctly processed by
|
||
|
the IpxGetQueueCompletionStatus and IpxGetOverlappedResult
|
||
|
|
||
|
Arguments:
|
||
|
Same as in PostQueuedCompletionStatus (see SDK doc)
|
||
|
Return Value:
|
||
|
Same as in PostQueuedCompletionStatus (see SDK doc)
|
||
|
--*/
|
||
|
BOOL
|
||
|
IpxPostQueuedCompletionStatus(
|
||
|
HANDLE CompletionPort,
|
||
|
DWORD dwNumberOfBytesTransferred,
|
||
|
DWORD dwCompletionKey,
|
||
|
LPOVERLAPPED lpOverlapped
|
||
|
);
|
||
|
|
||
|
#endif // _IPX_ADAPTER_
|