windows-nt/Source/XPSP1/NT/net/rras/ip/inc/ddipinip.h
2020-09-26 16:20:57 +08:00

220 lines
6.6 KiB
C

/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
private\inc\ddipinip.h
Abstract:
Public IOCTLS and related structures for the IP in IP encapsulation
driver
See documentation for more details
Author:
Amritansh Raghav
Revision History:
AmritanR Created
Notes:
--*/
#ifndef __DDIPINIP_H__
#define __DDIPINIP_H__
#ifndef ANY_SIZE
#define ANY_SIZE 1
#endif
#define IPINIP_SERVICE_NAME "IPINIP"
//////////////////////////////////////////////////////////////////////////////
// //
// Device Name - this string is the name of the device. It is the name //
// that should be passed to NtCreateFile when accessing the device. //
// //
//////////////////////////////////////////////////////////////////////////////
#define DD_IPINIP_DEVICE_NAME L"\\Device\\IPINIP"
//////////////////////////////////////////////////////////////////////////////
// //
// Win32 Name - This is the (Unicode and NonUnicode) name exposed by Win32 //
// subsystem for the device. It is the name that should be passed to //
// CreateFile(Ex) when opening the device. //
// //
//////////////////////////////////////////////////////////////////////////////
#define IPINIP_NAME L"\\\\.\\IPINIP"
#define IPINIP_NAME_NUC "\\\\.\\IPINIP"
//////////////////////////////////////////////////////////////////////////////
// //
// IOCTL code definitions and related structures //
// All the IOCTLs are synchronous //
// All need administrator privilege //
// //
//////////////////////////////////////////////////////////////////////////////
#define FSCTL_IPINIP_BASE FILE_DEVICE_NETWORK
#define _IPINIP_CTL_CODE(function, method, access) \
CTL_CODE(FSCTL_IPINIP_BASE, function, method, access)
#define MIN_IPINIP_CODE 0
#define CREATE_TUNNEL_CODE (MIN_IPINIP_CODE)
#define DELETE_TUNNEL_CODE (CREATE_TUNNEL_CODE + 1)
#define SET_TUNNEL_INFO_CODE (DELETE_TUNNEL_CODE + 1)
#define GET_TUNNEL_TABLE_CODE (SET_TUNNEL_INFO_CODE + 1)
#define IPINIP_NOTIFICATION_CODE (GET_TUNNEL_TABLE_CODE + 1)
#define MAX_IPINIP_CODE (IPINIP_NOTIFICATION_CODE)
//////////////////////////////////////////////////////////////////////////////
// //
// The IOCTL used to create a tunnel //
// //
//////////////////////////////////////////////////////////////////////////////
#define IOCTL_IPINIP_CREATE_TUNNEL \
_IPINIP_CTL_CODE(CREATE_TUNNEL_CODE,METHOD_BUFFERED,FILE_WRITE_ACCESS)
typedef struct _IPINIP_CREATE_TUNNEL
{
//
// The index of the created tunnel
//
OUT DWORD dwIfIndex;
//
// Name of the interface (must be a guid)
//
IN GUID Guid;
}IPINIP_CREATE_TUNNEL, *PIPINIP_CREATE_TUNNEL;
//////////////////////////////////////////////////////////////////////////////
// //
// The IOCTL used to delete a tunnel //
// //
//////////////////////////////////////////////////////////////////////////////
#define IOCTL_IPINIP_DELETE_TUNNEL \
_IPINIP_CTL_CODE(DELETE_TUNNEL_CODE,METHOD_BUFFERED,FILE_WRITE_ACCESS)
typedef struct _IPINIP_DELETE_TUNNEL
{
//
// The index of the tunnel to remove
//
IN DWORD dwIfIndex;
}IPINIP_DELETE_TUNNEL, *PIPINIP_DELETE_TUNNEL;
//////////////////////////////////////////////////////////////////////////////
// //
// The IOCTL used to set up a tunnel //
// //
//////////////////////////////////////////////////////////////////////////////
#define IOCTL_IPINIP_SET_TUNNEL_INFO \
_IPINIP_CTL_CODE(SET_TUNNEL_INFO_CODE,METHOD_BUFFERED,FILE_WRITE_ACCESS)
typedef struct _IPINIP_SET_TUNNEL_INFO
{
//
// Index as returned by the create call
//
IN DWORD dwIfIndex;
//
// The state the tunnel goes to after the set
//
OUT DWORD dwOperationalState;
//
// Configuration
//
IN DWORD dwRemoteAddress;
IN DWORD dwLocalAddress;
IN BYTE byTtl;
}IPINIP_SET_TUNNEL_INFO, *PIPINIP_SET_TUNNEL_INFO;
#define IOCTL_IPINIP_GET_TUNNEL_TABLE \
_IPINIP_CTL_CODE(GET_TUNNEL_TABLE_CODE,METHOD_BUFFERED,FILE_WRITE_ACCESS)
typedef struct _TUNNEL_INFO
{
OUT DWORD dwIfIndex;
OUT DWORD dwRemoteAddress;
OUT DWORD dwLocalAddress;
OUT DWORD fMapped;
OUT BYTE byTtl;
}TUNNEL_INFO, *PTUNNEL_INFO;
typedef struct _IPINIP_TUNNEL_TABLE
{
OUT ULONG ulNumTunnels;
OUT TUNNEL_INFO rgTable[ANY_SIZE];
}IPINIP_TUNNEL_TABLE, *PIPINIP_TUNNEL_TABLE;
#define SIZEOF_BASIC_TUNNEL_TABLE \
(ULONG)(FIELD_OFFSET(IPINIP_TUNNEL_TABLE, rgTable[0]))
#define SIZEOF_TUNNEL_TABLE(X) \
SIZEOF_BASIC_TUNNEL_TABLE + ((X) * sizeof(TUNNEL_INFO))
//////////////////////////////////////////////////////////////////////////////
// //
// The asynchronous IOCTL used to receive state change notifications //
// //
//////////////////////////////////////////////////////////////////////////////
#define IOCTL_IPINIP_NOTIFICATION \
_IPINIP_CTL_CODE(IPINIP_NOTIFICATION_CODE,METHOD_BUFFERED,FILE_WRITE_ACCESS)
typedef enum _IPINIP_EVENT
{
IE_INTERFACE_UP = 0,
IE_INTERFACE_DOWN = 1,
}IPINIP_EVENT, *PIPINIP_EVENT;
typedef enum _IPINIP_SUB_EVENT
{
ISE_ICMP_TTL_TOO_LOW = 0,
ISE_DEST_UNREACHABLE = 1,
}IPINIP_SUB_EVENT, *PIPINIP_SUB_EVENT;
typedef struct _IPINIP_NOTIFICATION
{
IPINIP_EVENT ieEvent;
IPINIP_SUB_EVENT iseSubEvent;
DWORD dwIfIndex;
}IPINIP_NOTIFICATION, *PIPINIP_NOTIFICATION;
#endif // __DDIPINIP_H__