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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
|
/*++ BUILD Version: 0009 // Increment this if a change has global effects
Copyright (c) 1987-1993 Microsoft Corporation
Module Name:
ntddnfs.h
Abstract:
This is the include file that defines all constants and types for
accessing the redirector file system device.
Author:
Steve Wood (stevewo) 27-May-1990
Revision History:
Larry Osterman (larryo)
Rita Wong (ritaw) 19-Feb-1991
John Rogers (JohnRo) 08-Mar-1991
--*/
#ifndef _NTDDNFS_
#define _NTDDNFS_
#include <windef.h>
#include <lmcons.h>
#include <lmwksta.h>
#include <ntmsv1_0.h>
//
// Device Name - this string is the name of the device. It is the name
// that should be passed to NtOpenFile when accessing the device.
//
// Note: For devices that support multiple units, it should be suffixed
// with the Ascii representation of the unit number.
//
//
// Device Name - this string is the name of the device. It is the name
// that should be passed to NtOpenFile when accessing the device.
//
// Note: For devices that support multiple units, it should be suffixed
// with the Ascii representation of the unit number.
//
#define DD_NFS2_DEVICE_NAME "\\Device\\FsWrap"
#define DD_NFS2_DEVICE_NAME_U L"\\Device\\FsWrap"
#define DD_NFS_DEVICE_NAME "\\Device\\LanmanRedirector"
#define DD_NFS_DEVICE_NAME_U L"\\Device\\LanmanRedirector"
//
// The file system name as returned by
// NtQueryInformationVolume(FileFsAttributeInformation)
//
#define DD_NFS_FILESYS_NAME "LMRDR"
#define DD_NFS_FILESYS_NAME_U L"LMRDR"
//
// EA Names for creating a tree connection
//
#define EA_NAME_CONNECT "NoConnect"
#define EA_NAME_DOMAIN "Domain"
#define EA_NAME_USERNAME "UserName"
#define EA_NAME_PASSWORD "Password"
#define EA_NAME_TYPE "Type"
#define EA_NAME_TRANSPORT "Transport"
#define EA_NAME_PRINCIPAL "Principal"
#define EA_NAME_MRXCONTEXT "MinirdrContext"
#define EA_NAME_DOMAIN_U L"Domain"
#define EA_NAME_USERNAME_U L"UserName"
#define EA_NAME_PASSWORD_U L"Password"
#define EA_NAME_TYPE_U L"Type"
#define EA_NAME_TRANSPORT_U L"Transport"
#define EA_NAME_PRINCIPAL_U L"Principal"
#define EA_NAME_MRXCONTEXT_U L"MinirdrContext"
#define TRANSACTION_REQUEST 0x00000003
//
// Redirector specific configuration options (separate from workstation
// service configuration options)
//
#define RDR_CONFIG_PARAMETERS L"Parameters"
#define RDR_CONFIG_USE_WRITEBHND L"UseWriteBehind"
#define RDR_CONFIG_USE_ASYNC_WRITEBHND L"UseAsyncWriteBehind"
#define RDR_CONFIG_LOWER_SEARCH_THRESHOLD L"LowerSearchThreshold"
#define RDR_CONFIG_LOWER_SEARCH_BUFFSIZE L"LowerSearchBufferSize"
#define RDR_CONFIG_UPPER_SEARCH_BUFFSIZE L"UpperSearchBufferSize"
#define RDR_CONFIG_STACK_SIZE L"StackSize"
#define RDR_CONFIG_CONNECT_TIMEOUT L"ConnectMaxTimeout"
#define RDR_CONFIG_RAW_TIME_LIMIT L"RawIoTimeLimit"
#define RDR_CONFIG_OS2_SESSION_LIMIT L"Os2SessionLimit"
#define RDR_CONFIG_TURBO_MODE L"TurboMode"
#define RDR_CONFIG_CURRENT_WINDOWS_VERSION L"\\REGISTRY\\Machine\\Software\\Microsoft\\Windows Nt\\CurrentVersion"
#define RDR_CONFIG_OPERATING_SYSTEM L"CurrentBuildNumber"
#define RDR_CONFIG_OPERATING_SYSTEM_VERSION L"CurrentVersion"
#define RDR_CONFIG_OPERATING_SYSTEM_NAME L"Windows NT "
//
// NtDeviceIoControlFile/NtFsControlFile IoControlCode values for this device.
//
// Warning: Remember that the low two bits of the code specify how the
// buffers are passed to the driver!
//
//
// Method = 00 - Buffer both input and output buffers for the request
// Method = 01 - Buffer input, map output buffer to an MDL as an IN buff
// Method = 10 - Buffer input, map output buffer to an MDL as an OUT buff
// Method = 11 - Do not buffer either the input or output
//
#define IOCTL_RDR_BASE FILE_DEVICE_NETWORK_FILE_SYSTEM
#define _RDR_CONTROL_CODE(request, method, access) \
CTL_CODE(IOCTL_RDR_BASE, request, method, access)
#define FSCTL_LMR_START _RDR_CONTROL_CODE(100, METHOD_IN_DIRECT, FILE_ANY_ACCESS)
#define FSCTL_LMR_STOP _RDR_CONTROL_CODE(101, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_LMR_SET_CONFIG_INFO _RDR_CONTROL_CODE(102, METHOD_IN_DIRECT, FILE_ANY_ACCESS)
#define FSCTL_LMR_GET_CONFIG_INFO _RDR_CONTROL_CODE(103, METHOD_OUT_DIRECT, FILE_ANY_ACCESS)
#define FSCTL_LMR_GET_CONNECTION_INFO _RDR_CONTROL_CODE(104, METHOD_NEITHER, FILE_ANY_ACCESS)
#define FSCTL_LMR_ENUMERATE_CONNECTIONS _RDR_CONTROL_CODE(105, METHOD_NEITHER, FILE_ANY_ACCESS)
#define FSCTL_LMR_GET_VERSIONS _RDR_CONTROL_CODE(106, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_LMR_DELETE_CONNECTION _RDR_CONTROL_CODE(107, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_LMR_BIND_TO_TRANSPORT _RDR_CONTROL_CODE(108, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_LMR_UNBIND_FROM_TRANSPORT _RDR_CONTROL_CODE(109, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_LMR_ENUMERATE_TRANSPORTS _RDR_CONTROL_CODE(110, METHOD_NEITHER, FILE_ANY_ACCESS)
#define FSCTL_LMR_GET_HINT_SIZE _RDR_CONTROL_CODE(113, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_LMR_TRANSACT _RDR_CONTROL_CODE(114, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_LMR_ENUMERATE_PRINT_INFO _RDR_CONTROL_CODE(115, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_LMR_GET_STATISTICS _RDR_CONTROL_CODE(116, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_LMR_START_SMBTRACE _RDR_CONTROL_CODE(117, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_LMR_END_SMBTRACE _RDR_CONTROL_CODE(118, METHOD_BUFFERED, FILE_ANY_ACCESS)
//
// the following fsctl controlcodes are reserved for the fswrap device and minirdrs
//
#define FSCTL_FSWRAP_RESERVED_LOW _RDR_CONTROL_CODE(200, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_FSWRAP_RESERVED_HIGH _RDR_CONTROL_CODE(219, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_MINIRDR_RESERVED_LOW _RDR_CONTROL_CODE(220, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_MINIRDR_RESERVED_HIGH _RDR_CONTROL_CODE(239, METHOD_BUFFERED, FILE_ANY_ACCESS)
//
// Identifies the data structure type for Buffer 2 of each FSCtl
//
typedef enum {
ConfigInformation, // FSCTL_LMR_START,
// FSCTL_LMR_SET_CONFIG_INFO,
// FSCTL_LMR_GET_CONFIG_INFO
// (structure found in wksta.h)
GetConnectionInfo, // FSCTL_LMR_ENUMERATE_CONNECTIONS,
// FSCTL_LMR_GET_CONNECTION_INFO
EnumerateTransports // FSCTL_LMR_ENUMERATE_TRANSPORTS
// (structure found in wksta.h)
} FSCTL_LMR_STRUCTURES;
//
// LAN Man Redirector Request Packet used by the Workstation service
// to pass parameters to the Redirector through Buffer 1 of
// NtFsControlFile.
//
// Additional input or output of each FSCtl is found in Buffer 2.
//
#define REQUEST_PACKET_VERSION 0x00000006L // Structure version.
typedef struct _LMR_REQUEST_PACKET {
FSCTL_LMR_STRUCTURES Type; // Type of structure in Buffer 2
ULONG Version; // Version of structure in Buffer 2
ULONG Level; // Level of information of force level
LUID LogonId; // User logon session identifier
union {
struct {
ULONG RedirectorNameLength; // Length of computer name.
ULONG DomainNameLength; // Length of primary domain name.
WCHAR RedirectorName[1]; // Computer name (NOT null terminated)
// WCHAR DomainName[1]; // Domain name - After computer name.
} Start; // IN
struct {
ULONG EntriesRead; // Number of entries returned
ULONG TotalEntries; // Total entries available
ULONG TotalBytesNeeded; // Total bytes needed to read all entries
ULONG ResumeHandle; // Resume handle.
} Get; // OUT
struct {
ULONG WkstaParameter; // Specifies the entire structure or a
// field to set on input; if any
// field is invalid, specifies the
// one at fault on output.
} Set; // IN OUT
struct {
ULONG RedirectorVersion; // Version of the Redirector
ULONG RedirectorPlatform; // Redirector platform base number
ULONG MajorVersion; // LAN Man major version number
ULONG MinorVersion; // LAN Man minor version number
} GetVersion; // OUT
struct {
ULONG WkstaParameter; // Specifies the parameter at fault
// if a parameter is invalid OUT
ULONG QualityOfService; // Quality of service indicator IN
ULONG TransportNameLength; // not including terminator IN
WCHAR TransportName[1]; // Name of transport provider IN
} Bind;
struct {
ULONG TransportNameLength; // not including terminator
WCHAR TransportName[1]; // Name of transport provider
} Unbind; // IN
struct {
ULONG ConnectionsHint; // Number of bytes needed for buffer
// to enumerate tree connections
ULONG TransportsHint; // Number of bytes needed for buffer
// to enumerate transports
} GetHintSize; // OUT
struct {
ULONG Index; // Entry in the queue to return, 0 on
// first call, value of RestartIndex on
// subsequent calls.
} GetPrintQueue; // IN
} Parameters;
} LMR_REQUEST_PACKET, *PLMR_REQUEST_PACKET;
//
// Mask bits for use with Parameters.GetConnectionInfo.Capabilities:
//
#define CAPABILITY_CASE_SENSITIVE_PASSWDS 0x00000001L
#define CAPABILITY_REMOTE_ADMIN_PROTOCOL 0x00000002L
#define CAPABILITY_RPC 0x00000004L
#define CAPABILITY_SAM_PROTOCOL 0x00000008L
#define CAPABILITY_UNICODE 0x00000010L
//
// Output buffer structure of FSCTL_LMR_ENUMERATE_CONNECTIONS used
// to implement NetUseEnum. The returned data is actually an array
// of this structure.
//
typedef struct _LMR_CONNECTION_INFO_0 {
UNICODE_STRING UNCName; // Name of UNC connection
ULONG ResumeKey; // Resume key for this entry.
} LMR_CONNECTION_INFO_0, *PLMR_CONNECTION_INFO_0;
typedef struct _LMR_CONNECTION_INFO_1 {
UNICODE_STRING UNCName; // Name of UNC connection
ULONG ResumeKey; // Resume key for this entry.
DEVICE_TYPE SharedResourceType; // Type of shared resource
ULONG ConnectionStatus; // Status of the connection
ULONG NumberFilesOpen; // Number of opened files
} LMR_CONNECTION_INFO_1, *PLMR_CONNECTION_INFO_1;
typedef struct _LMR_CONNECTION_INFO_2 {
UNICODE_STRING UNCName; // Name of UNC connection
ULONG ResumeKey; // Resume key for this entry.
DEVICE_TYPE SharedResourceType; // Type of shared resource
ULONG ConnectionStatus; // Status of the connection
ULONG NumberFilesOpen; // Number of opened files
UNICODE_STRING UserName; // User who created connection.
UNICODE_STRING DomainName; // Domain of user who created connection.
ULONG Capabilities; // Bit mask of remote abilities.
UCHAR UserSessionKey[MSV1_0_USER_SESSION_KEY_LENGTH]; // User session key
UCHAR LanmanSessionKey[MSV1_0_LANMAN_SESSION_KEY_LENGTH]; // Lanman session key
} LMR_CONNECTION_INFO_2, *PLMR_CONNECTION_INFO_2;
typedef struct _LMR_CONNECTION_INFO_3 {
UNICODE_STRING UNCName; // Name of UNC connection
ULONG ResumeKey; // Resume key for this entry.
DEVICE_TYPE SharedResourceType; // Type of shared resource
ULONG ConnectionStatus; // Status of the connection
ULONG NumberFilesOpen; // Number of opened files
UNICODE_STRING UserName; // User who created connection.
UNICODE_STRING DomainName; // Domain of user who created connection.
ULONG Capabilities; // Bit mask of remote abilities.
UCHAR UserSessionKey[MSV1_0_USER_SESSION_KEY_LENGTH]; // User session key
UCHAR LanmanSessionKey[MSV1_0_LANMAN_SESSION_KEY_LENGTH]; // Lanman session key
UNICODE_STRING TransportName; // Transport connection is active on
ULONG Throughput; // Throughput of connection.
ULONG Delay; // Small packet overhead.
LARGE_INTEGER TimeZoneBias; // Time zone delta in 100ns units.
BOOL IsSpecialIpcConnection; // True IFF there is a special IPC connection active.
BOOL Reliable; // True iff the connection is reliable
BOOL ReadAhead; // True iff readahead is active on connection.
BOOL Core;
BOOL MsNet103;
BOOL Lanman10;
BOOL WindowsForWorkgroups;
BOOL Lanman20;
BOOL Lanman21;
BOOL WindowsNt;
BOOL MixedCasePasswords;
BOOL MixedCaseFiles;
BOOL LongNames;
BOOL ExtendedNegotiateResponse;
BOOL LockAndRead;
BOOL NtSecurity;
BOOL SupportsEa;
BOOL NtNegotiateResponse;
BOOL CancelSupport;
BOOL UnicodeStrings;
BOOL LargeFiles;
BOOL NtSmbs;
BOOL RpcRemoteAdmin;
BOOL NtStatusCodes;
BOOL LevelIIOplock;
BOOL UtcTime;
BOOL UserSecurity;
BOOL EncryptsPasswords;
} LMR_CONNECTION_INFO_3, *PLMR_CONNECTION_INFO_3;
#define TRANSACTION_VERSION 0x00000002L // Structure version.
typedef struct _LMR_TRANSACTION {
ULONG Type; // Type of structure
ULONG Size; // Size of fixed portion of structure
ULONG Version; // Structure version.
ULONG NameLength; // Number of bytes in name (in path
// format, e.g., \server\pipe\netapi\4)
ULONG NameOffset; // Offset of name in buffer.
BOOLEAN ResponseExpected; // Should remote system respond?
ULONG Timeout; // Timeout time in milliseconds.
ULONG SetupWords; // Number of trans setup words (may be
// 0). (setup words are input/output.)
ULONG SetupOffset; // Offset of setup (may be 0 for none).
ULONG MaxSetup; // Size of setup word array (may be 0).
ULONG ParmLength; // Input param area length (may be 0).
PVOID ParmPtr; // Input parameter area (may be NULL).
ULONG MaxRetParmLength; // Output param. area length (may be 0).
ULONG DataLength; // Input data area length (may be 0).
PVOID DataPtr; // Input data area (may be NULL).
ULONG MaxRetDataLength; // Output data area length (may be 0).
PVOID RetDataPtr; // Output data area (may be NULL).
} LMR_TRANSACTION, *PLMR_TRANSACTION;
//
// Output buffer structure of FSCTL_LMR_ENUMERATE_PRINT_INFO used
// to implement DosPrintQEnum to down level servers. Caller must supply
// a buffer at least sizeof( LMR_GET_PRINT_QUEUE ) + UNLEN
//
typedef struct _LMR_GET_PRINT_QUEUE {
ANSI_STRING OriginatorName; // Name of user that did print
LARGE_INTEGER CreateTime; // When file was created
ULONG EntryStatus; // Held/Printing etc.
ULONG FileNumber; // Spool file number from create
// print request.
ULONG FileSize;
ULONG RestartIndex; // Index of the next entry in queue
// note this is not last index+1
// either a value of 0 or an error
// indicates end-of-queue
} LMR_GET_PRINT_QUEUE, *PLMR_GET_PRINT_QUEUE;
//
// NB: The following structure is STAT_WORKSTATION_0 in sdk\inc\lmstats.h. If
// you change the structure, change it in both places
//
typedef struct _REDIR_STATISTICS {
LARGE_INTEGER StatisticsStartTime;
LARGE_INTEGER BytesReceived;
LARGE_INTEGER SmbsReceived;
LARGE_INTEGER PagingReadBytesRequested;
LARGE_INTEGER NonPagingReadBytesRequested;
LARGE_INTEGER CacheReadBytesRequested;
LARGE_INTEGER NetworkReadBytesRequested;
LARGE_INTEGER BytesTransmitted;
LARGE_INTEGER SmbsTransmitted;
LARGE_INTEGER PagingWriteBytesRequested;
LARGE_INTEGER NonPagingWriteBytesRequested;
LARGE_INTEGER CacheWriteBytesRequested;
LARGE_INTEGER NetworkWriteBytesRequested;
ULONG InitiallyFailedOperations;
ULONG FailedCompletionOperations;
ULONG ReadOperations;
ULONG RandomReadOperations;
ULONG ReadSmbs;
ULONG LargeReadSmbs;
ULONG SmallReadSmbs;
ULONG WriteOperations;
ULONG RandomWriteOperations;
ULONG WriteSmbs;
ULONG LargeWriteSmbs;
ULONG SmallWriteSmbs;
ULONG RawReadsDenied;
ULONG RawWritesDenied;
ULONG NetworkErrors;
// Connection/Session counts
ULONG Sessions;
ULONG FailedSessions;
ULONG Reconnects;
ULONG CoreConnects;
ULONG Lanman20Connects;
ULONG Lanman21Connects;
ULONG LanmanNtConnects;
ULONG ServerDisconnects;
ULONG HungSessions;
ULONG UseCount;
ULONG FailedUseCount;
//
// Queue Lengths (updates protected by RdrMpxTableSpinLock NOT
// RdrStatisticsSpinlock)
//
ULONG CurrentCommands;
} REDIR_STATISTICS, *PREDIR_STATISTICS;
#endif // ifndef _NTDDNFS_
|