mirror of https://github.com/lianthony/NT4.0
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.
147 lines
5.6 KiB
147 lines
5.6 KiB
/*++
|
|
|
|
Copyright (c) 1990 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
dir.h
|
|
|
|
Abstract:
|
|
|
|
This module describes the structure of the redirector specific directory
|
|
structures.
|
|
|
|
|
|
Author:
|
|
|
|
Colin Watson (ColinW) 12-Jul-1990
|
|
|
|
Revision History:
|
|
|
|
31-Aug-1990 ColinW
|
|
|
|
Created
|
|
|
|
--*/
|
|
#ifndef _RDRDIR_
|
|
#define _RDRDIR_
|
|
|
|
typedef PFILE_NAMES_INFORMATION *PPFILE_NAMES_INFORMATION;
|
|
typedef PFILE_DIRECTORY_INFORMATION *PPFILE_DIRECTORY_INFORMATION;
|
|
typedef PFILE_FULL_DIR_INFORMATION *PPFILE_FULL_DIR_INFORMATION;
|
|
typedef PFILE_BOTH_DIR_INFORMATION *PPFILE_BOTH_DIR_INFORMATION;
|
|
typedef PFILE_OLE_DIR_INFORMATION *PPFILE_OLE_DIR_INFORMATION;
|
|
|
|
//
|
|
// All T2Find requests to the remote server request the 32 bit resume key
|
|
// so SMB_RFIND_BUFFER2 is used instead of SMB_FIND_BUFFER2.
|
|
//
|
|
|
|
typedef struct _SMB_RFIND_BUFFER2 {
|
|
_ULONG( ResumeKey );
|
|
SMB_FIND_BUFFER2 Find;
|
|
} SMB_RFIND_BUFFER2;
|
|
typedef SMB_RFIND_BUFFER2 SMB_UNALIGNED *PSMB_RFIND_BUFFER2;
|
|
|
|
//
|
|
// The NtQueryDirectory response contains one of the following three structures. We use this union
|
|
// to reduce the amount of casting needed
|
|
//
|
|
typedef union _SMB_RFIND_BUFFER_NT {
|
|
FILE_NAMES_INFORMATION Names;
|
|
FILE_DIRECTORY_INFORMATION Dir;
|
|
FILE_FULL_DIR_INFORMATION FullDir;
|
|
FILE_BOTH_DIR_INFORMATION BothDir;
|
|
FILE_OLE_DIR_INFORMATION OleDir;
|
|
} SMB_RFIND_BUFFER_NT;
|
|
typedef SMB_RFIND_BUFFER_NT SMB_UNALIGNED *PSMB_RFIND_BUFFER_NT;
|
|
|
|
// It is convenient for much of the directory code not to worry if the
|
|
// directory entry pointed to is a directory entry to a down level client.
|
|
// The following structure
|
|
typedef union _DIRPTR {
|
|
PUCHAR PU; // Used when type is either
|
|
PSMB_DIRECTORY_INFORMATION DI; // For Below Lan Man 2.0 servers
|
|
PSMB_RFIND_BUFFER2 FB2; // Lan Man 2.0 server
|
|
PSMB_RFIND_BUFFER_NT NtFind; // NT Server
|
|
} DIRPTR;
|
|
typedef DIRPTR SMB_UNALIGNED *PDIRPTR;
|
|
|
|
//
|
|
// Each SCB is allocated in non-paged pool because they are accessed
|
|
// at DPC level when page breaks are not acceptable.
|
|
// FileNameTemplate and SmbFileName are in paged pool and are never
|
|
// accessed at DPC level or above.
|
|
//
|
|
|
|
typedef struct _SCB {
|
|
ULONG Signature; // SCB structure signature
|
|
PSERVERLISTENTRY Sle; // ServerList for search.
|
|
// PTRANSPORT_CONNECTION TransportConnection; // Transport connection.
|
|
SMB_RESUME_KEY LastResumeKey; // Last resume key in SearchBuffer returned
|
|
// to the application or discarded
|
|
ULONG ResumeKey; // Last resume key given to the
|
|
// application with a Transact2 connection
|
|
USHORT Sid; // Search handle - Transact2 only
|
|
UNICODE_STRING ResumeName; // Transact2 only
|
|
PVOID SearchBuffer; // Points at the start of the SMB or
|
|
// pool buffer.
|
|
USHORT SearchBuffLength; // Length in bytes allocated/charged
|
|
USHORT MaxCount; // Value for Search/Find SMB
|
|
USHORT MaxBuffLength; // Based on servers max-xmit-size
|
|
USHORT ReturnLength; // Amount of data returned by server
|
|
|
|
DIRPTR FirstDirEntry; // First in SearchBuffer
|
|
|
|
|
|
DIRPTR DirEntry; // Next unused field in SearchBuffer
|
|
USHORT OriginalEntryCount; // # of entries in SearchBuffer
|
|
USHORT EntryCount; // # of unprocessed entries
|
|
|
|
ULONG Flags; // SCB_*
|
|
ULONG SearchType; // ST_*
|
|
FILE_INFORMATION_CLASS FileInformationClass;// Names or Directory Info.
|
|
LARGE_INTEGER SearchBufferLoaded; // Time when search buffer
|
|
// contents were requested.
|
|
UNICODE_STRING FileNameTemplate; // FileName wildcard template for sifting
|
|
// the correct names.
|
|
UNICODE_STRING SmbFileName; // FileName sent to server. Because of
|
|
// differing wildcard semantics this may
|
|
// be different from FileNameTemplate
|
|
PKEVENT SynchronizationEvent; // Prevents simultaneous use
|
|
// of this scb
|
|
} SCB, *PSCB;
|
|
|
|
//
|
|
// Assignement within Scb->Flags
|
|
//
|
|
|
|
#define SCB_INITIAL_CALL 0x00000001 // FileName is a mask in this request
|
|
#define SCB_DIRECTORY_END_FLAG 0x00000002 // Last directory entry already returned
|
|
#define SCB_RETURNED_SOME 0x00000008 // Returned at least one dir entry
|
|
// since restartscan was true
|
|
#define SCB_COPIED_THIS_CALL 0x00000010 // Returned at least one dir entry
|
|
// on this call
|
|
#define SCB_SERVER_NEEDS_CLOSE 0x00000020 // Server has a search handle open
|
|
|
|
//
|
|
// Assignment within Scb->SearchType.
|
|
// Only ST_UNIQUE can be set at the same time as any other bit.
|
|
//
|
|
|
|
#define ST_UNIQUE 0x00000001 // FileNameTemplate has no wildcards
|
|
#define ST_SEARCH 0x00000002 // Core search protocol
|
|
#define ST_FIND 0x00000004 // SMB 2.0 Find
|
|
#define ST_T2FIND 0x00000008 // SMB 3.0 Transact 2 Find
|
|
#define ST_NTFIND 0x00000010 // SMB 4.0 NT Transact 2 Find
|
|
#define ST_UNICODE 0x00000020 // Strings in SMB are unicode.
|
|
|
|
//
|
|
// DirectoryControlSpinLock is used to protect the LARGE_INTEGER fields in the SCB's
|
|
// from being modified while they are being accessed. It can also be used
|
|
// for other short term exclusions if the need arises.
|
|
//
|
|
|
|
extern KSPIN_LOCK DirectoryControlSpinLock;
|
|
|
|
#endif
|