/*++ Copyright (c) 2000 Microsoft Corporation Module Name: AlgIF.h Abstract: This module contains declarations for the ALG transparent proxy's interface management. Author: Qiang Wang (qiangw) 10-Apr-2000 Revision History: Savas Guven (savasg) 22-Aug-2001 Added RRAS Support --*/ #pragma once // // Structure: ALG_BINDING // // This structure holds information used for I/O on a logical network. // Each interface's 'BindingArray' contains an entry for each binding-entry // supplied during 'BindInterface'. // typedef struct _ALG_BINDING { ULONG Address; ULONG Mask; SOCKET ListeningSocket; HANDLE ListeningRedirectHandle[2]; } ALG_BINDING, *PALG_BINDING; // // Structure: ALG_INTERFACE // // This structure holds operational information for an interface. // // Each interface is inserted into the list of ALG transparent proxy // interfaces, sorted by 'Index'. // // Synchronization on an interface makes use of an interface-list lock // ('AlgInterfaceLock'), a per-interface reference count, and a per-interface // critical-section: // // Acquiring a reference to an interface guarantees the interface's existence; // acquiring the interface's lock guarantees the interface's consistency. // // To acquire a reference, first acquire the interface-list lock; // to traverse the interface-list, first acquire the interface-list lock. // // An interface's lock can only be acquired if // (a) a reference to the interface has been acquired, or // (b) the interface-list lock is currently held. // Note that holding the list lock alone does not guarantee consistency. // // Fields marked read-only can be read so long as the interface is referenced. // typedef struct _ALG_INTERFACE { LIST_ENTRY Link; CRITICAL_SECTION Lock; ULONG ReferenceCount; ULONG Index; // read-only ULONG AdapterIndex; // read-only ULONG Characteristics; //read-only after activation NET_INTERFACE_TYPE Type; // read-only IP_ALG_INTERFACE_INFO Info; IP_NAT_PORT_MAPPING PortMapping; ULONG Flags; ULONG BindingCount; PALG_BINDING BindingArray; LIST_ENTRY ConnectionList; LIST_ENTRY EndpointList; } ALG_INTERFACE, *PALG_INTERFACE; // // Flags // #define ALG_INTERFACE_FLAG_DELETED 0x80000000 #define ALG_INTERFACE_DELETED(i) \ ((i)->Flags & ALG_INTERFACE_FLAG_DELETED) #define ALG_INTERFACE_FLAG_BOUND 0x40000000 #define ALG_INTERFACE_BOUND(i) \ ((i)->Flags & ALG_INTERFACE_FLAG_BOUND) #define ALG_INTERFACE_FLAG_ENABLED 0x20000000 #define ALG_INTERFACE_ENABLED(i) \ ((i)->Flags & ALG_INTERFACE_FLAG_ENABLED) #define ALG_INTERFACE_FLAG_CONFIGURED 0x10000000 #define ALG_INTERFACE_CONFIGURED(i) \ ((i)->Flags & ALG_INTERFACE_FLAG_CONFIGURED) #define ALG_INTERFACE_FLAG_MAPPED 0x01000000 #define ALG_INTERFACE_MAPPED(i) \ ((i)->Flags & ALG_INTERFACE_FLAG_MAPPED) #define ALG_INTERFACE_ACTIVE(i) \ (((i)->Flags & (ALG_INTERFACE_FLAG_BOUND|ALG_INTERFACE_FLAG_ENABLED)) \ == (ALG_INTERFACE_FLAG_BOUND|ALG_INTERFACE_FLAG_ENABLED)) #define ALG_INTERFACE_ADMIN_DISABLED(i) \ ((i)->Flags & IP_ALG_INTERFACE_FLAG_DISABLED) // // Synchronization // #define ALG_REFERENCE_INTERFACE(i) \ REFERENCE_OBJECT(i, ALG_INTERFACE_DELETED) #define ALG_DEREFERENCE_INTERFACE(i) \ DEREFERENCE_OBJECT(i, AlgCleanupInterface) #define COMINIT_BEGIN \ bool bComInitialized = true; \ hr = CoInitializeEx(NULL, COINIT_MULTITHREADED | COINIT_DISABLE_OLE1DDE ); \ if ( FAILED(hr) ) \ { \ bComInitialized = FALSE; \ if (RPC_E_CHANGED_MODE == hr) \ hr = S_OK; \ } \ #define COMINIT_END if (TRUE == bComInitialized) { CoUninitialize(); } #define IID_PPV_ARG(Type, Expr) \ __uuidof(Type), reinterpret_cast(static_cast((Expr))) #define WIN32_FROM_HRESULT(hr) (0x0000FFFF & (hr)) // // GLOBAL DATA DECLARATIONS // extern LIST_ENTRY AlgInterfaceList; extern CRITICAL_SECTION AlgInterfaceLock; extern ULONG AlgFirewallIfCount; // // FUNCTION DECLARATIONS // ULONG AlgActivateInterface( PALG_INTERFACE Interfacep ); VOID AlgDeactivateInterface( PALG_INTERFACE Interfacep ); ULONG AlgBindInterface( ULONG Index, PIP_ADAPTER_BINDING_INFO BindingInfo ); VOID AlgCleanupInterface( PALG_INTERFACE Interfacep ); ULONG AlgConfigureInterface( ULONG Index, PIP_ALG_INTERFACE_INFO InterfaceInfo ); ULONG AlgCreateInterface( ULONG Index, NET_INTERFACE_TYPE Type, PIP_ALG_INTERFACE_INFO InterfaceInfo, PALG_INTERFACE* InterfaceCreated ); ULONG AlgDeleteInterface( ULONG Index ); ULONG AlgDisableInterface( ULONG Index ); ULONG AlgEnableInterface( ULONG Index ); ULONG AlgInitializeInterfaceManagement( VOID ); PALG_INTERFACE AlgLookupInterface( ULONG Index, OUT PLIST_ENTRY* InsertionPoint OPTIONAL ); ULONG AlgQueryInterface( ULONG Index, PVOID InterfaceInfo, PULONG InterfaceInfoSize ); VOID AlgShutdownInterfaceManagement( VOID ); ULONG AlgUnbindInterface( ULONG Index ); VOID AlgSignalNatInterface( ULONG Index, BOOLEAN Boundary );