1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
#include "idl_types.h"
import "server_id.idl";
import "security.idl";
import "file_id.idl";
import "smb2_lease_struct.idl";
import "misc.idl";
[
pointer_default(unique)
]
interface open_files
{
typedef [enum16bit] enum {
SHARE_MODE_ENTRY_OP_TYPE_NONE = 0,
SHARE_MODE_ENTRY_OP_TYPE_EXCLUSIVE = 1,
SHARE_MODE_ENTRY_OP_TYPE_BATCH_WITHOUT_EXCLUSIVE = 2,
SHARE_MODE_ENTRY_OP_TYPE_BATCH = 3,
SHARE_MODE_ENTRY_OP_TYPE_LEVEL_II = 4,
SHARE_MODE_ENTRY_OP_TYPE_LEASE = 0x100
} share_mode_entry_op_type;
typedef [public] struct {
server_id pid;
hyper op_mid;
share_mode_entry_op_type op_type;
GUID client_guid;
smb2_lease_key lease_key;
uint32 access_mask;
uint32 share_access;
uint32 private_options;
timeval time;
udlong share_file_id;
uint32 uid;
uint16 flags;
uint32 name_hash;
/*
* In-memory flag indicating a non-existing pid. We don't want
* to store this share_mode_entry on disk.
*/
[skip] boolean8 stale;
} share_mode_entry;
typedef [public] struct {
uint32 name_hash;
security_token *delete_nt_token;
security_unix_token *delete_token;
} delete_token;
typedef [public,bitmap16bit] bitmap {
SHARE_MODE_SHARE_DELETE = 0x100,
SHARE_MODE_SHARE_WRITE = 0x080,
SHARE_MODE_SHARE_READ = 0x040,
SHARE_MODE_ACCESS_DELETE = 0x020,
SHARE_MODE_ACCESS_WRITE = 0x010,
SHARE_MODE_ACCESS_READ = 0x008,
SHARE_MODE_LEASE_HANDLE = 0x004,
SHARE_MODE_LEASE_WRITE = 0x002,
SHARE_MODE_LEASE_READ = 0x001
} share_mode_flags;
typedef [public] struct {
hyper unique_content_epoch;
share_mode_flags flags;
[string,charset(UTF8)] char *servicepath;
[string,charset(UTF8)] char *base_name;
[string,charset(UTF8)] char *stream_name;
uint32 num_delete_tokens;
[size_is(num_delete_tokens)] delete_token delete_tokens[];
NTTIME old_write_time;
NTTIME changed_write_time;
[skip] boolean8 not_stored;
[skip] boolean8 modified;
[ignore] file_id id; /* In memory key used to lookup cache. */
} share_mode_data;
/* these are 0x30 (48) characters */
const string VFS_DEFAULT_DURABLE_COOKIE_MAGIC =
"VFS_DEFAULT_DURABLE_COOKIE_MAGIC ";
const uint32 VFS_DEFAULT_DURABLE_COOKIE_VERSION = 0;
/* this corresponds to struct stat_ex (SMB_STRUCT_STAT) */
typedef struct {
hyper st_ex_dev;
hyper st_ex_ino;
hyper st_ex_mode;
hyper st_ex_nlink;
hyper st_ex_uid;
hyper st_ex_gid;
hyper st_ex_rdev;
hyper st_ex_size;
timespec st_ex_atime;
timespec st_ex_mtime;
timespec st_ex_ctime;
timespec st_ex_btime;
hyper st_ex_blksize;
hyper st_ex_blocks;
uint32 st_ex_flags;
uint32 st_ex_iflags;
} vfs_default_durable_stat;
typedef [public] struct {
[value(VFS_DEFAULT_DURABLE_COOKIE_MAGIC),charset(DOS)] uint8 magic[0x30];
[value(VFS_DEFAULT_DURABLE_COOKIE_VERSION)] uint32 version;
boolean8 allow_reconnect;
file_id id;
[string,charset(UTF8)] char *servicepath;
[string,charset(UTF8)] char *base_name;
hyper initial_allocation_size;
hyper position_information;
boolean8 update_write_time_triggered;
boolean8 update_write_time_on_close;
boolean8 write_time_forced;
NTTIME close_write_time;
vfs_default_durable_stat stat_info;
} vfs_default_durable_cookie;
typedef [public] struct {
file_id id;
udlong share_file_id;
uint8 break_to;
} oplock_break_message;
typedef [public] struct {
file_id id;
udlong share_file_id;
[string,charset(UTF8)] char *servicepath;
[string,charset(UTF8)] char *base_name;
[string,charset(UTF8)] char *stream_name;
} file_rename_message;
}
|