Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

253 lines
7.4 KiB

/*++
Copyright(c) 1999-2002 Microsoft Corporation
Module Name:
brdgtdi.h
Abstract:
Ethernet MAC level bridge.
Gpo registration for address notifications.
Author:
Salahuddin J. Khan (sjkhan)
Environment:
Kernel mode
Revision History:
March 2002 - Original version
--*/
// ===========================================================================
//
// DEFINES
//
// ===========================================================================
#define MAX_GUID_LEN 39
#define MAX_IP4_STRING_LEN 17
#define BRDG_ON_SAME_NETWORK TRUE
#define BRDG_ON_DIFFERENT_NETWORK FALSE
#define BRDG_STATUS_EMPTY_LIST ((NTSTATUS)(0x0000000F))
// ===========================================================================
//
// TYPES
//
// ===========================================================================
typedef struct _BRDG_GPO_NETWORKS BRDG_GPO_NETWORKS, *PBRDG_GPO_NETWORKS;
typedef struct _BRDG_GPO_NETWORKS
{
LIST_ENTRY ListEntry;
PUNICODE_STRING Identifier;
PUNICODE_STRING NetworkName;
} BRDG_GPO_NETWORKS, *PBRDG_GPO_NETWORKS;
typedef struct _BRDG_GPO_THREAD_PARAMS
{
PLIST_ENTRY NotifyList;
PNDIS_RW_LOCK NotifyListLock;
PKEVENT NotifyEvent;
PKEVENT KillEvent;
} BRDG_GPO_THREAD_PARAMS, *PBRDG_GPO_THREAD_PARAMS;
typedef struct _BRDG_GPO_GLOBALS
{
UNICODE_STRING GroupPolicyNetworkName;
BOOLEAN RegisteredForGroupPolicyChanges;
BOOLEAN RegisteredForGroupPolicyHistoryChanges;
BOOLEAN RegisteredForNetworkConnectionsGroupPolicyChanges;
BOOLEAN PolicyBridge;
BOOLEAN WaitingOnSoftwareHive;
BOOLEAN ProcessingNotifications;
PNDIS_RW_LOCK NetworkListLock;
BRIDGE_TIMER RegistrationTimer;
PLIST_ENTRY ListHeadNetworks;
PLIST_ENTRY ListHeadNotify;
PNDIS_RW_LOCK NotifyListLock;
HANDLE NotificationsThread;
BRDG_GPO_THREAD_PARAMS QueueInfo;
} BRDG_GPO_GLOBALS, *PBRDG_GPO_GLOBALS;
// The joys of a multi-pass compiler allow us to not have
// to forward declare this. If you need a single pass compile
// you'll have to add a forward to the struct below.
typedef VOID (*PBRDG_GPO_REG_CALLBACK)(PBRDG_GPO_NOTIFY_KEY);
typedef NTSTATUS (*PBRDG_GPO_REGISTER)();
typedef struct _BRDG_GPO_NOTIFY_KEY
{
LIST_ENTRY ListEntry;
HANDLE RegKey;
ULONG Buffer;
ULONG BufferSize;
IO_STATUS_BLOCK IoStatus;
UNICODE_STRING RegValue;
UNICODE_STRING RegKeyName;
UNICODE_STRING Identifier;
WORK_QUEUE_ITEM RegChangeWorkItem;
PVOID WorkItemContext;
BOOLEAN Recurring;
PBRDG_GPO_REG_CALLBACK FunctionCallback;
BOOLEAN WatchTree;
ULONG CompletionFilter;
BOOLEAN Modified;
PBOOLEAN SuccessfulRegistration;
WAIT_REFCOUNT RefCount;
LONG PendingNotification;
PBRDG_GPO_REGISTER FunctionRegister;
} BRDG_GPO_NOTIFY_KEY, *PBRDG_GPO_NOTIFY_KEY;
typedef struct _BRDG_GPO_QUEUED_NOTIFY
{
LIST_ENTRY ListEntry;
PBRDG_GPO_NOTIFY_KEY Notify;
} BRDG_GPO_QUEUED_NOTIFY, *PBRDG_GPO_QUEUED_NOTIFY;
// ===========================================================================
//
// PROTOTYPES
//
// ===========================================================================
NTSTATUS
BrdgGpoDriverInit();
VOID
BrdgGpoCleanup();
NTSTATUS
BrdgGpoNewAddressNotification(
IN PWSTR DeviceId
);
NTSTATUS
BrdgGpoNotifyRegKeyChange(
IN PBRDG_GPO_NOTIFY_KEY Notify,
IN PIO_APC_ROUTINE ApcRoutine,
IN PVOID ApcContext,
IN ULONG CompletionFilter,
IN BOOLEAN WatchTree);
NTSTATUS
BrdgGpoInitializeNetworkList();
VOID
BrdgGpoUninitializeNetworkList();
VOID
BrdgGpoAcquireNetworkListLock(
IN PNDIS_RW_LOCK NetworkListLock,
IN BOOLEAN fWrite,
IN OUT PLOCK_STATE LockState);
VOID
BrdgGpoReleaseNetworkListLock(
IN PNDIS_RW_LOCK NetworkListLock,
IN OUT PLOCK_STATE LockState);
NTSTATUS
BrdgGpoAllocateAndInitializeNetwork(
IN OUT PBRDG_GPO_NETWORKS* Network,
IN PWCHAR Identifier,
IN PWCHAR NetworkName);
NTSTATUS
BrdgGpoInsertNetwork(
IN PLIST_ENTRY NetworkList,
IN PLIST_ENTRY Network,
IN PNDIS_RW_LOCK NetworkListLock);
VOID
BrdgGpoFreeNetworkAndData(
IN PBRDG_GPO_NETWORKS Network);
NTSTATUS
BrdgGpoDeleteNetwork(
IN PLIST_ENTRY NetworkList,
IN PUNICODE_STRING NetworkIdentifier,
IN PNDIS_RW_LOCK NetworkListLock);
NTSTATUS
BrdgGpoFindNetwork(
IN PLIST_ENTRY NetworkList,
IN PUNICODE_STRING NetworkIdentifier,
IN PNDIS_RW_LOCK NetworkListLock,
OUT PBRDG_GPO_NETWORKS* Network);
NTSTATUS
BrdgGpoMatchNetworkName(
IN PLIST_ENTRY NetworkList,
IN PUNICODE_STRING NetworkName,
IN PNDIS_RW_LOCK NetworkListLock);
NTSTATUS
BrdgGpoUpdateNetworkName(
IN PLIST_ENTRY NetworkList,
IN PUNICODE_STRING Identifier,
IN PWCHAR NetworkName,
IN PNDIS_RW_LOCK NetworkListLock);
NTSTATUS
BrdgGpoEmptyNetworkList(
IN OUT PLIST_ENTRY NetworkList,
IN PNDIS_RW_LOCK NetworkListLock);
NTSTATUS BrdgGpoGetCurrentNetwork(
IN PUNICODE_STRING RegKeyName,
OUT PWCHAR* NetworkName);
//
// Notify filter values
//
#define REG_NOTIFY_CHANGE_NAME (0x00000001L) // Create or delete (child)
#define REG_NOTIFY_CHANGE_ATTRIBUTES (0x00000002L)
#define REG_NOTIFY_CHANGE_LAST_SET (0x00000004L) // time stamp
#define REG_NOTIFY_CHANGE_SECURITY (0x00000008L)
#define REG_LEGAL_CHANGE_FILTER \
(REG_NOTIFY_CHANGE_NAME |\
REG_NOTIFY_CHANGE_ATTRIBUTES |\
REG_NOTIFY_CHANGE_LAST_SET |\
REG_NOTIFY_CHANGE_SECURITY)
typedef enum _REG_ACTION {
KeyAdded,
KeyRemoved,
KeyModified
} REG_ACTION;
typedef struct _REG_NOTIFY_INFORMATION {
ULONG NextEntryOffset;
REG_ACTION Action;
ULONG KeyLength;
WCHAR Key[1]; // Variable size
} REG_NOTIFY_INFORMATION, *PREG_NOTIFY_INFORMATION;
NTSTATUS
ZwNotifyChangeKey(
IN HANDLE KeyHandle,
IN HANDLE Event,
IN PIO_APC_ROUTINE ApcRoutine,
IN PVOID ApcContext,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN ULONG CompletionFilter,
IN BOOLEAN WatchTree,
OUT PVOID Buffer,
IN ULONG BufferSize,
IN BOOLEAN Asynchronous
);