windows-nt/Source/XPSP1/NT/base/fs/srv/persist.h

185 lines
5.2 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++ BUILD Version: 0003 // Increment this if a change has global effects
Copyright (c) 1989 Microsoft Corporation
Module Name:
persist.h
Abstract:
This module defines the header for data blocks maintained by the
SMB server in it's persistent handle state file that is associated with
persistent-handle enabled shares.
Author:
Andy Herron (andyhe) 3-Nov-1999
Revision History:
--*/
#ifndef _SRVPERSIST_
#define _SRVPERSIST_
typedef enum _PERSISTENT_OPERATION {
PersistentFreeSpace,
PersistentConnection,
PersistentSession,
PersistentUserName,
PersistentFileOpen,
PersistentByteLock
} PERSISTENT_OPERATION, *PPERSISTENT_OPERATION;
typedef enum _PERSISTENT_STATE {
PersistentStateFreed,
PersistentStateActive,
PersistentStateInError,
PersistentStateClosed
} PERSISTENT_STATE, *PPERSISTENT_STATE;
//
// Types of blocks that are saved in the persistent state file are as follows:
//
// Share block - single one at offset 0 in the file
// Connection - one per connection that has persistent handles
// Session - one per session that has persistent handles
// PersistentFile - one per file that is opened persistently
// ByteRangeLock - one per byte range lock that is held on persistent file
//
typedef struct _PERSISTENT_FILE_HEADER {
ULONG ConsistencyCheck;
ULONG FileSize;
ULONG HeaderSize;
ULONG RecordSize;
ULONG NumberOfRecords;
LARGE_INTEGER ServerStartTime;
LARGE_INTEGER CreateTime;
LARGE_INTEGER TimeClosed;
BOOLEAN ClosedCleanly;
} PERSISTENT_FILE_HEADER, *PPERSISTENT_FILE_HEADER;
//
// The following structures map out the specific types of persistent records
// we have in the state file. We lay them out this way rather than just
// as sub-structures within the PERSISTENT_RECORD structure so that we can
// accurately guage how big the largest substructure is for the SID records.
//
typedef struct _PERSISTENT_CONNECTION {
ULONG ClientId; // shared with client
PCONNECTION Connection; // actual pointer back to our connection
BOOLEAN DirectHostIpx;
union {
ULONG ClientIPAddress;
TDI_ADDRESS_IPX IpxAddress;
};
CHAR OemClientMachineName[COMPUTER_NAME_LENGTH+1];
};
typedef struct _PERSISTENT_SESSION {
ULONG ClientId;
PSESSION Session;
ULONG SessionNumber; // sent to client during session setup
LARGE_INTEGER CreateTime; // ditto
USHORT Uid; // ditto
LARGE_INTEGER LogOffTime; // for forced logoff
LARGE_INTEGER KickOffTime; // for forced logoff
ULONG UserNameRecord; // offset to record for this user's name
};
typedef struct _PERSISTENT_OPEN {
ULONG ClientId;
ULONG SessionNumber;
PRFCB Rfcb;
ULONG PersistentFileId;
LARGE_INTEGER FileReferenceNumber; // instead of file name
LARGE_INTEGER UsnValue; // ensure correct file
BOOLEAN CompatibilityOpen; // from MFCB
ULONG OpenFileAttributes; // from MFCB
ULONG FileMode; // from LFCB
ULONG JobId; // from LFCB
CLONG FcbOpenCount; // from RFCB
USHORT Fid; // from RFCB
USHORT Pid; // from RFCB
USHORT Tid; // tree ID for this open
ACCESS_MASK GrantedAccess; // from RFCB
ULONG ShareAccess; // from RFCB
OPLOCK_STATE OplockState; // from RFCB
};
typedef struct _PERSISTENT_BYTELOCK {
ULONG ClientId;
PBYTELOCK ByteLock;
ULONG PersistentFileId;
LARGE_INTEGER LockOffset;
LARGE_INTEGER LockLength;
BOOLEAN Exclusive;
};
#define LARGEST_PERSISTENT_RECORD _PERSISTENT_OPEN
#define PERSISTENT_USER_NAME_BUFFER_LENGTH ( sizeof( struct LARGEST_PERSISTENT_RECORD ) - (3 * sizeof(ULONG)) )
typedef struct _PERSISTENT_USER_NAME {
//
// we store the user's name and domain name in a series of records,
// though typically it should fit in one.
//
ULONG RecordLength; // number of valid bytes in Buffer
ULONG ContinuationRecord; // offset within file to next part of SID, 0 if at end
UCHAR Buffer[ PERSISTENT_USER_NAME_BUFFER_LENGTH ];
};
//
// These are the records we log to the state file. They're all the same
// length to make processing more efficient.
//
typedef struct _PERSISTENT_RECORD {
ULONG PersistConsistencyCheck; // must be first dword
ULONG PersistIndex;
PERSISTENT_STATE PersistState;
PERSISTENT_OPERATION PersistOperation;
union {
struct _PERSISTENT_CONNECTION Connection;
struct _PERSISTENT_SESSION Session;
struct _PERSISTENT_OPEN FileOpen;
struct _PERSISTENT_BYTELOCK ByteLock;
struct _PERSISTENT_USER_NAME UserName;
};
} PERSISTENT_RECORD, *PPERSISTENT_RECORD;
#endif // #ifndef _SRVPERSIST