190 lines
4.9 KiB
C
190 lines
4.9 KiB
C
/*++
|
|
|
|
Copyright (c) 1995-1999 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
|
|
Abstract:
|
|
Router interface with IPX stack (to be replaced by WinSock 2.0)
|
|
|
|
|
|
Author:
|
|
|
|
Vadim Eydelman
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
#ifndef _IPX_ADAPTER_
|
|
#pragma option push -b -a8 -pc -A- /*P_O_Push*/
|
|
#define _IPX_ADAPTER_
|
|
|
|
#if _MSC_VER > 1000
|
|
#pragma once
|
|
#endif
|
|
|
|
typedef struct _ADDRESS_RESERVED {
|
|
UCHAR Reserved[28];
|
|
} ADDRESS_RESERVED, *PADDRESS_RESERVED;
|
|
|
|
/*++
|
|
|
|
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 with direct access to NIC
|
|
|
|
Arguments:
|
|
Socket - IPX socket number to use (network byte order)
|
|
|
|
Return Value:
|
|
Handle to communication port that provides NIC oriented 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.
|
|
|
|
Arguments:
|
|
Handle - Handle to socket port to use
|
|
IpxPacket - buffer for ipx packet (complete with header)
|
|
IpxPacketLength - length of the buffer
|
|
pReserved - buffer to exchange NIC information with IPX stack
|
|
(current implementation requires that memory allocated
|
|
for this buffer is immediately followed by the
|
|
IpxPacket buffer)
|
|
lpOverlapped - structure to be used for async IO, fields are set
|
|
as follows:
|
|
Internal - Reserved, must be 0
|
|
InternalHigh - Reserved, must be 0
|
|
Offset - Reserved, must be 0
|
|
OffsetHigh - Reserved, must be 0
|
|
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 receive has
|
|
successfully completed (do not need to wait on event,
|
|
however it will be signalled anyway), otherwise,
|
|
receive operation has started and completion routine will
|
|
be called when done (possibly it has been called even
|
|
before this routine returned)
|
|
ERROR_IO_PENDING - only returned if lpOverlapped->hEvent!=NULL and
|
|
receive 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/event won't be
|
|
signalled)
|
|
--*/
|
|
DWORD WINAPI
|
|
IpxRecvPacket (
|
|
IN HANDLE Handle,
|
|
OUT PUCHAR IpxPacket,
|
|
IN ULONG IpxPacketLength,
|
|
OUT PADDRESS_RESERVED lpReserved,
|
|
IN LPOVERLAPPED lpOverlapped,
|
|
IN LPOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine
|
|
);
|
|
|
|
/* Use this to retrieve NIC index once IO completes */
|
|
#define GetNicIdx(pReserved) ((ULONG)*((USHORT *)(pReserved+2)))
|
|
|
|
|
|
/*++
|
|
|
|
I p x S e n d P a c k e t
|
|
|
|
Routine Description:
|
|
|
|
Enqueue request to send IPX packet.
|
|
|
|
Arguments:
|
|
|
|
Handle - Handle to socket port to use
|
|
AdapterIdx - NIC index on which to send
|
|
IpxPacket - IPX packet complete with header
|
|
IpxPacketLength - length of the packet
|
|
pReserved - buffer to exchange NIC info with IPX stack
|
|
lpOverlapped - structure to be used for async IO, fields are set
|
|
as follows:
|
|
Internal - Reserved, must be 0
|
|
InternalHigh - Reserved, must be 0
|
|
Offset - Reserved, must be 0
|
|
OffsetHigh - Reserved, must be 0
|
|
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,
|
|
however it will be signalled anyway), otherwise,
|
|
send operation has started and completion routine will
|
|
be called when done (possibly it has been called even
|
|
before this routine returned)
|
|
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/event won't be
|
|
signalled)
|
|
|
|
--*/
|
|
DWORD WINAPI
|
|
IpxSendPacket (
|
|
IN HANDLE Handle,
|
|
IN ULONG AdapterIdx,
|
|
IN PUCHAR IpxPacket,
|
|
IN ULONG IpxPacketLength,
|
|
IN PADDRESS_RESERVED lpReserved,
|
|
IN LPOVERLAPPED lpOverlapped,
|
|
IN LPOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine
|
|
);
|
|
|
|
#pragma option pop /*P_O_Pop*/
|
|
#endif // _IPX_ADAPTER_
|