274 lines
5.3 KiB
C
274 lines
5.3 KiB
C
//+----------------------------------------------------------------------------
|
||
//
|
||
// Copyright (C) 1992, Microsoft Corporation.
|
||
//
|
||
// File: dfsstruc.h
|
||
//
|
||
// Contents:
|
||
// This module defines the data structures that make up the major internal
|
||
// part of the DFS file system.
|
||
//
|
||
// Functions:
|
||
//
|
||
//-----------------------------------------------------------------------------
|
||
|
||
|
||
#ifndef _DFSSTRUC_
|
||
#define _DFSSTRUC_
|
||
|
||
typedef enum {
|
||
DFS_STATE_UNINITIALIZED = 0,
|
||
DFS_STATE_INITIALIZED = 1,
|
||
DFS_STATE_STARTED = 2,
|
||
DFS_STATE_STOPPING = 3,
|
||
DFS_STATE_STOPPED = 4
|
||
} DFS_OPERATIONAL_STATE;
|
||
|
||
typedef enum {
|
||
DFS_UNKNOWN = 0,
|
||
DFS_CLIENT = 1,
|
||
DFS_SERVER = 2,
|
||
DFS_ROOT_SERVER = 3,
|
||
} DFS_MACHINE_STATE;
|
||
|
||
typedef enum {
|
||
LV_UNINITIALIZED = 0,
|
||
LV_INITSCHEDULED,
|
||
LV_INITINPROGRESS,
|
||
LV_INITIALIZED,
|
||
LV_VALIDATED
|
||
} DFS_LV_STATE;
|
||
|
||
//
|
||
// The DFS_DATA record is the top record in the DFS file system in-memory
|
||
// data structure. This structure must be allocated from non-paged pool.
|
||
//
|
||
|
||
typedef struct _DFS_DATA {
|
||
|
||
//
|
||
// The type and size of this record (must be DFS_NTC_DATA_HEADER)
|
||
//
|
||
|
||
NODE_TYPE_CODE NodeTypeCode;
|
||
NODE_BYTE_SIZE NodeByteSize;
|
||
|
||
//
|
||
// A queue of all attached volume device objects
|
||
//
|
||
|
||
LIST_ENTRY AVdoQueue;
|
||
|
||
//
|
||
// A queue of all attached file system device objects
|
||
//
|
||
|
||
LIST_ENTRY AFsoQueue;
|
||
|
||
//
|
||
// A pointer to the Driver object we were initialized with
|
||
//
|
||
|
||
PDRIVER_OBJECT DriverObject;
|
||
|
||
//
|
||
// A pointer to the \Dfs device object
|
||
//
|
||
|
||
PDEVICE_OBJECT FileSysDeviceObject;
|
||
|
||
//
|
||
// A pointer to an array of provider records
|
||
//
|
||
|
||
struct _PROVIDER_DEF *pProvider;
|
||
int cProvider, maxProvider;
|
||
|
||
//
|
||
// A resource variable to control access to the global data record
|
||
//
|
||
|
||
ERESOURCE Resource;
|
||
|
||
//
|
||
// A pointer to our EPROCESS struct, which is a required input to the
|
||
// Cache Management subsystem. This field is simply set each time an
|
||
// FSP thread is started, since it is easiest to do while running in the
|
||
// Fsp.
|
||
//
|
||
|
||
PEPROCESS OurProcess;
|
||
|
||
//
|
||
// Principal Name of this machine.
|
||
//
|
||
|
||
UNICODE_STRING PrincipalName;
|
||
|
||
//
|
||
// The NetBIOS name of this machine. Needed for public Dfs APIs.
|
||
//
|
||
|
||
UNICODE_STRING NetBIOSName;
|
||
|
||
//
|
||
// The operational state of the machine - Started, Stopped, etc.
|
||
//
|
||
|
||
DFS_OPERATIONAL_STATE OperationalState;
|
||
|
||
//
|
||
// The state of the machine - DC, Server, Client etc.
|
||
//
|
||
|
||
DFS_MACHINE_STATE MachineState;
|
||
|
||
//
|
||
// Is this a DC?
|
||
//
|
||
|
||
BOOLEAN IsDC;
|
||
|
||
//
|
||
// The state of the local volumes - initialize or validated
|
||
|
||
DFS_LV_STATE LvState;
|
||
|
||
//
|
||
// The system wide Partition Knowledge Table (PKT)
|
||
//
|
||
|
||
DFS_PKT Pkt;
|
||
|
||
//
|
||
// A hash table for associating DFS_FCBs with file objects
|
||
//
|
||
|
||
struct _FCB_HASH_TABLE *FcbHashTable;
|
||
|
||
//
|
||
// A hash table for associating Sites with machines
|
||
//
|
||
|
||
struct _SITE_HASH_TABLE *SiteHashTable;
|
||
|
||
//
|
||
// Another hash table for associating IP addresses with sites
|
||
//
|
||
|
||
struct _IP_HASH_TABLE *IpHashTable;
|
||
|
||
//
|
||
// Hash table for special names
|
||
//
|
||
|
||
struct _SPECIAL_HASH_TABLE *SpcHashTable;
|
||
|
||
//
|
||
// Hash table for FtDfs's
|
||
//
|
||
|
||
struct _SPECIAL_HASH_TABLE *FtDfsHashTable;
|
||
|
||
//
|
||
// Lpc Port info
|
||
//
|
||
|
||
struct _DFS_LPC_INFO DfsLpcInfo;
|
||
|
||
} DFS_DATA, *PDFS_DATA;
|
||
|
||
|
||
|
||
|
||
#define MAX_PROVIDERS 5 // number of pre-allocated provider records
|
||
|
||
//
|
||
// A PROVIDER_DEF is a provider definition record, which maps a provider
|
||
// ID in a referral record to an installed provider.
|
||
//
|
||
|
||
typedef struct _PROVIDER_DEF {
|
||
|
||
//
|
||
// The type and size of this record (must be DFS_NTC_PROVIDER)
|
||
//
|
||
|
||
NODE_TYPE_CODE NodeTypeCode;
|
||
NODE_BYTE_SIZE NodeByteSize;
|
||
|
||
//
|
||
// Provider ID and Capabilities, same as in the DS_REFERRAL structure.
|
||
//
|
||
|
||
USHORT eProviderId;
|
||
USHORT fProvCapability;
|
||
|
||
//
|
||
// The following field gives the name of the device for the provider.
|
||
//
|
||
|
||
UNICODE_STRING DeviceName;
|
||
|
||
//
|
||
// Referenced pointers to the associated file and device objects
|
||
//
|
||
|
||
PDEVICE_OBJECT DeviceObject;
|
||
PFILE_OBJECT FileObject;
|
||
|
||
} PROVIDER_DEF, *PPROVIDER_DEF;
|
||
|
||
//
|
||
// For every open file on a volume object to which we are attached, we
|
||
// maintain an FCB.
|
||
//
|
||
|
||
typedef struct _DFS_FCB {
|
||
|
||
//
|
||
// Type and size of this record (must be DFS_NTC_FCB)
|
||
//
|
||
|
||
NODE_TYPE_CODE NodeTypeCode;
|
||
NODE_BYTE_SIZE NodeByteSize;
|
||
|
||
//
|
||
// A list entry for the hash table chain.
|
||
//
|
||
|
||
LIST_ENTRY HashChain;
|
||
|
||
//
|
||
// The following field is the fully qualified file name for this DFS_FCB/DCB
|
||
// starting from the logical root.
|
||
//
|
||
|
||
UNICODE_STRING FullFileName;
|
||
|
||
//
|
||
// The following fields give the file on which this DFS_FCB
|
||
// have been opened.
|
||
//
|
||
|
||
PFILE_OBJECT FileObject;
|
||
|
||
} DFS_FCB, *PDFS_FCB;
|
||
|
||
//
|
||
// We need to order our referrals by site; we normalize the referral list of names and
|
||
// types into the following structure.
|
||
//
|
||
|
||
typedef struct _DFS_REFERRAL_LIST {
|
||
|
||
UNICODE_STRING pName; // ex: JHARPERDC1
|
||
|
||
UNICODE_STRING pAddress; // ex: \\JHARPERDC1\MYFTDFS
|
||
|
||
ULONG Type;
|
||
|
||
} DFS_REFERRAL_LIST, *PDFS_REFERRAL_LIST;
|
||
|
||
#endif // _DFSSTRUC_
|