Windows NT 4.0 source code leak
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.
 
 
 
 
 
 

1027 lines
34 KiB

/*++
Copyright (c) 1990 Microsoft Corporation
Module Name:
rdrdata.c
Abstract:
Redirector Data Variables
This module contains all of the definitions of the redirector data
structures.
Author:
Larry Osterman (LarryO) 30-May-1990
Revision History:
30-May-1990 LarryO
Created
--*/
#include "precomp.h"
#pragma hdrstop
//
// Name of redirector's device object.
//
WCHAR RdrName[] = DD_NFS_DEVICE_NAME_U;
//
// RdrNameString - Pointer to redirector name.
//
UNICODE_STRING RdrNameString = {0};
//
// Global Fcb databases package mutex
//
//
// Whenever any routines traverse either the connection or the FCB database
// they claim this mutex.
//
//
KMUTEX RdrDatabaseMutex = {0};
//
// The redirector name and other initialization parameters are protected
// by the RdrDataResource. All reads of the initialization variables
// should acquire the name resource before they continue.
//
//
ERESOURCE RdrDataResource = {0};
//
// Current redirector time.
//
ULONG
RdrCurrentTime = {0};
KSPIN_LOCK
RdrTimeInterLock = {0};
KSPIN_LOCK
RdrMpxTableEntryCallbackSpinLock = {0};
KSPIN_LOCK
RdrMpxTableSpinLock = {0};
KSPIN_LOCK
RdrServerConnectionValidSpinLock = {0};
KSPIN_LOCK
RdrConnectionFlagsSpinLock = {0};
//
// Spin lock protecting the reference count fields in the transport.
//
KSPIN_LOCK
RdrTransportReferenceSpinLock = {0};
KSPIN_LOCK
RdrGlobalSleSpinLock = {0};
KSPIN_LOCK
RdrStatisticsSpinLock = {0};
KMUTEX
RdrSecurityMutex = {0};
ULONG
_setjmpexused = 0;
LARGE_INTEGER
RdrZero = { 0, 0};
ULONG
RdrRequestTimeout = 0;
#if RDRDBG
LONG RdrDebugTraceLevel = /* DPRT_ERROR | DPRT_DISPATCH */
/*DPRT_FSDDISP | DPRT_FSPDISP | DPRT_CREATE | DPRT_READWRITE |*/
/*DPRT_CLOSE | DPRT_FILEINFO | DPRT_VOLINFO | DPRT_DIRECTORY |*/
/*DPRT_FILELOCK | DPRT_CACHE | DPRT_EA | */
/*DPRT_ACLQUERY | DPRT_CLEANUP | DPRT_CONNECT | DPRT_FSCTL |*/
/*DPRT_TDI | DPRT_SMBBUF | DPRT_SMB | DPRT_SECURITY | */
/*DPRT_SCAVTHRD | DPRT_QUOTA | DPRT_FCB | DPRT_OPLOCK | */
/*DPRT_SMBTRACE | DPRT_INIT |*/0;
ULONG RdrSMBTraceValue = 3;
ULONG RdrMaxDump = 128;
#endif
#ifdef PAGED_DBG
ULONG ThisCodeCantBePaged = 0;
#endif
//
// Static structures protected by RdrStatisticsSpinLock.
//
REDIR_STATISTICS
RdrStatistics = {0};
//
// A pointer to the redirectors device object
//
PFS_DEVICE_OBJECT RdrDeviceObject = {0};
//
// list of server entries that need to be scavenged.
//
LIST_ENTRY
RdrServerScavengerListHead = {0};
//
// Redir static data protected by RdrDataResource.
//
REDIRDATA
RdrData = {0};
//
// Paged redirector data
//
#ifdef ALLOC_DATA_PRAGMA
#pragma data_seg("PAGE")
#endif
FAST_IO_DISPATCH RdrFastIoDispatch = {0};
//
//
// A pointer to the redirector's driver object
//
//
PDRIVER_OBJECT RdrDriverObject = {0};
PEPROCESS RdrFspProcess = {0};
UNICODE_STRING
RdrPrimaryDomain = {0};
UNICODE_STRING
RdrOperatingSystem = {0};
UNICODE_STRING
RdrLanmanType = {0};
BOOLEAN
RdrUseWriteBehind = TRUE;
BOOLEAN
RdrUseAsyncWriteBehind = TRUE;
//
// Root of redirectors connection database - First serverlist
//
LIST_ENTRY
RdrServerHead = {0};
//
// Global FCB database head.
//
LIST_ENTRY
RdrFcbHead = {0};
//
// Strings containing the manifest constants "PIPE", "MAILSLOT",
// "IPC$", and "$DATA".
//
UNICODE_STRING
RdrPipeText = {0};
UNICODE_STRING
RdrIpcText = {0};
UNICODE_STRING
RdrMailslotText = {0};
UNICODE_STRING
RdrDataText = {0};
//
// These parameters may become configurable in the future.
// If RdrUpperSearchBufferSize gets too big then Search Count in the Smb
// may wrap around.
//
ULONG RdrLowerSearchThreshold = 16384;
USHORT RdrLowerSearchBufferSize = 16384;
USHORT RdrUpperSearchBufferSize = 32768;
//
// Wait for 5 minutes to timeout a connect.
//
ULONG
RdrTdiConnectTimeoutSeconds = 45;
//
// Wait for 60 seconds to timeout a connect.
//
ULONG
RdrTdiDisconnectTimeoutSeconds = 60;
ULONG
RdrStackSize = 3;
//
// Some OS/2 servers may not correctly handle more than two user sessions,
// so we provide a registry parameter that can be used to force the redir
// to disallow extra logon sessions. The limit defaults to infinite,
// because we haven't actually seen any problems (yet).
//
ULONG
RdrOs2SessionLimit = 0;
//
// Handle for LSA authentication process
//
HANDLE
RdrLsaHandle = {0};
ULONG
RdrAuthenticationPackage = {0};
ULONG
RdrRawTimeLimit = RAW_IO_MAX_TIME;
BOOLEAN
RdrTurboMode = FALSE;
DBGSTATIC
ULONG
RdrNumDormantConnections = {0}; // Number of dormant connections.
#ifndef _IDWBUILD
ILLEGAL_SERVERNAMES_LIST
RdrIllegalServerNames[] = {
{ L"KERNEL", L"RAZZLE2" },
{ L"POPCORN", L"RAZZLE1" },
{ L"RASTAMAN", L"NTWIN" },
{ L"ORVILLE", L"RAZZLE" },
{ L"KERNEL", L"RAZZLE3" },
{ L"SAVIK", L"WIN40" },
{ L"SAVIK", L"CAIRO" }
};
ULONG
RdrNumberOfIllegalServerNames = sizeof(RdrIllegalServerNames) / sizeof(RdrIllegalServerNames[0]);
#endif
DBGSTATIC
ULONG
RdrConnectionSerialNumber = {0};
DBGSTATIC
LONG
RdrConnectionTickCount = 45/(2*SCAVENGER_TIMER_GRANULARITY);
//
//
// Data variables used in the connection package
//
//
DBGSTATIC
LIST_ENTRY
RdrConnectHead = {0};
LARGE_INTEGER
RdrMaxTimezoneBias = {0};
UNICODE_STRING
RdrAccessCheckTypeName = {0};
UNICODE_STRING
RdrAccessCheckObjectName = {0};
PACL
RdrAdminAcl = {0};
PSECURITY_DESCRIPTOR
RdrAdminSecurityDescriptor = {0};
//
//
// The RdrAdminAccessMapping is a generic mapping that simply provides
// a mapping of all the generic accesses to a standard access mask.
//
//
GENERIC_MAPPING
RdrAdminGenericMapping = {
STANDARD_RIGHTS_READ, // GenericRead
STANDARD_RIGHTS_WRITE, // GenericWrite
STANDARD_RIGHTS_EXECUTE, // GenericExecute
STANDARD_RIGHTS_ALL // GenericAll
};
DBGSTATIC
LIST_ENTRY
RdrGlobalSecurityList = {0};
//
// Head of list of transport providers bound into the NT redirector
//
LIST_ENTRY
RdrTransportHead = {0};
ULONG
RdrTransportIndex = {0};
#if !defined(DISABLE_POPUP_ON_PRIMARY_TRANSPORT_FAILURE)
PWSTR
RdrServersWithAllTransports = NULL;
#endif
//
// Different SMB protocols use different wildcard strings to mean return
// every file/directory. WILD8DOT3 is for servers < LANMAN2.0
//
#define WILD8DOT3 L"????????.???"
#define WILD20FILES L"*"
UNICODE_STRING
RdrAll8dot3Files = {sizeof(WILD8DOT3)-1,sizeof(WILD8DOT3),WILD8DOT3};
UNICODE_STRING
RdrAll20Files = {sizeof(WILD20FILES)-1,sizeof(WILD20FILES),WILD20FILES};
//
// ++++ Start of configurable parameters ++++
//
//
// SEARCH_INVALIDATE_INTERVAL is the maximum time that a SearchBuffer
// will be retained by the redirector.
// Note the SEARCH_INVALIDATE_INTERVAL is positive because it is used when
// calculating the difference between to current times. Usually NT delta
// times are negative values.
//
DBGSTATIC
LARGE_INTEGER SEARCH_INVALIDATE_INTERVAL = {0};
//
// The defines below define bit positions for each of the IRP major
// functions defined in NT (CREATE, which is function 0 will never go
// through this routine).
//
#if IRP_MJ_MAXIMUM_FUNCTION > 0x20
#pragma error ("You can't have more than 32 IRP functions")
#endif
#define CREATE_NAMED_PIPE (1<<IRP_MJ_CREATE_NAMED_PIPE)
#define CLOSE (1<<IRP_MJ_CLOSE)
#define READ (1<<IRP_MJ_READ)
#define WRITE (1<<IRP_MJ_WRITE)
#define QUERY_INFORMATION (1<<IRP_MJ_QUERY_INFORMATION)
#define SET_INFORMATION (1<<IRP_MJ_SET_INFORMATION)
#define QUERY_EA (1<<IRP_MJ_QUERY_EA)
#define SET_EA (1<<IRP_MJ_SET_EA)
#define FLUSH_BUFFERS (1<<IRP_MJ_FLUSH_BUFFERS)
#define QUERY_VOLUME_INFORMATION (1<<IRP_MJ_QUERY_VOLUME_INFORMATION)
#define SET_VOLUME_INFORMATION (1<<IRP_MJ_SET_VOLUME_INFORMATION)
#define DIRECTORY_CONTROL (1<<IRP_MJ_DIRECTORY_CONTROL)
#define FILE_SYSTEM_CONTROL (1<<IRP_MJ_FILE_SYSTEM_CONTROL)
#define DEVICE_CONTROL (1<<IRP_MJ_DEVICE_CONTROL)
#define INTERNAL_DEVICE_CONTROL (1<<IRP_MJ_INTERNAL_DEVICE_CONTROL)
#define CONFIGURATION_CONTROL (1<<IRP_MJ_CONFIGURATION_CONTROL)
#define LOCK_CONTROL (1<<IRP_MJ_LOCK_CONTROL)
#define CLEANUP (1<<IRP_MJ_CLEANUP)
#define SET_SECURITY (1<<IRP_MJ_SET_SECURITY)
#define QUERY_SECURITY (1<<IRP_MJ_QUERY_SECURITY)
//
// ALL_FILES defines the set of operations that are valid on all files.
//
#define ALL_FILES CLOSE | CLEANUP | FILE_SYSTEM_CONTROL
//
// The following array defines which IRP operations are valid for each
// type of redirector file.
//
// The Unknown file type has NO legal operations as it can never be
// returned to the caller.
//
DBGSTATIC
ULONG RdrLegalIrpFunctions[MaxFcbType] = {
0, // UNKNOWN type
ALL_FILES, // Redirector file.
ALL_FILES, // Net root
ALL_FILES, // ServerRoot
ALL_FILES | DIRECTORY_CONTROL | QUERY_INFORMATION |
QUERY_VOLUME_INFORMATION, // TreeConnect
ALL_FILES | READ | WRITE | QUERY_INFORMATION | SET_INFORMATION | QUERY_EA |
SET_EA | FLUSH_BUFFERS | LOCK_CONTROL | DEVICE_CONTROL |
QUERY_VOLUME_INFORMATION | SET_SECURITY |
DIRECTORY_CONTROL | QUERY_SECURITY, // DiskFile
ALL_FILES | WRITE | FLUSH_BUFFERS | QUERY_VOLUME_INFORMATION, // Printerfile
ALL_FILES | SET_INFORMATION | QUERY_INFORMATION | QUERY_EA | SET_EA |
DIRECTORY_CONTROL | QUERY_VOLUME_INFORMATION |
SET_SECURITY | QUERY_SECURITY, // Directory
ALL_FILES | READ | WRITE | QUERY_VOLUME_INFORMATION | SET_INFORMATION |
QUERY_INFORMATION | FLUSH_BUFFERS | SET_SECURITY |
QUERY_SECURITY, // NamedPipe
ALL_FILES | READ | WRITE | QUERY_VOLUME_INFORMATION | FLUSH_BUFFERS |
SET_SECURITY | QUERY_SECURITY, // Com
ALL_FILES | WRITE | QUERY_VOLUME_INFORMATION, // Mailslot
ALL_FILES | QUERY_INFORMATION | SET_INFORMATION | QUERY_VOLUME_INFORMATION // FileOrDirectory
};
HANDLE
RdrMupHandle = {0};
//
// Name of the IPC resource as applied to pipes.
//
WCHAR RdrPipeName[] = L"PIPE";
//
// Name of IPC resource (pipes are opened on this connection name).
//
WCHAR RdrIpcName[] = L"IPC$";
//
// Name that indicates that a file is a mailslot.
//
WCHAR RdrMailslotName[] = L"MAILSLOT";
//
// Name of the "DATA" alternate data stream.
//
WCHAR RdrDataName[] = L"$DATA";
#ifdef RDR_PNP_POWER
//
// Binding list of transports
//
LPWSTR RdrTransportBindingList;
//
// Handle used for TDI PNP notifications
//
HANDLE RdrTdiNotificationHandle = NULL;
#endif
PWSTR
RdrBatchExtensionArray[] = {
L".BAT",
L".CMD"
};
ULONG
RdrNumberOfBatchExtensions = sizeof(RdrBatchExtensionArray) / sizeof(RdrBatchExtensionArray[0]);
#ifdef ALLOC_DATA_PRAGMA
#pragma data_seg()
#endif
//
// Init time redirector data
//
#ifdef ALLOC_DATA_PRAGMA
#pragma data_seg("INIT")
#endif
REDIR_CONFIG_INFO
RdrConfigEntries[] = {
{ RDR_CONFIG_USE_WRITEBHND, &RdrUseWriteBehind, REG_BOOLEAN, REG_BOOLEAN_SIZE },
{ RDR_CONFIG_USE_ASYNC_WRITEBHND, &RdrUseAsyncWriteBehind, REG_BOOLEAN, REG_BOOLEAN_SIZE },
{ RDR_CONFIG_LOWER_SEARCH_THRESHOLD, &RdrLowerSearchThreshold, REG_DWORD, sizeof(DWORD) },
{ RDR_CONFIG_LOWER_SEARCH_BUFFSIZE, &RdrLowerSearchBufferSize, REG_DWORD, sizeof(DWORD) },
{ RDR_CONFIG_UPPER_SEARCH_BUFFSIZE, &RdrUpperSearchBufferSize, REG_DWORD, sizeof(DWORD) },
{ RDR_CONFIG_STACK_SIZE, &RdrStackSize, REG_DWORD, sizeof(DWORD) },
{ RDR_CONFIG_CONNECT_TIMEOUT, &RdrTdiConnectTimeoutSeconds, REG_DWORD, sizeof(DWORD) },
{ RDR_CONFIG_RAW_TIME_LIMIT, &RdrRawTimeLimit, REG_DWORD, sizeof(DWORD) },
{ RDR_CONFIG_OS2_SESSION_LIMIT, &RdrOs2SessionLimit, REG_DWORD, sizeof(DWORD) },
#if RDRDBG
{ L"RdrDebugTraceLevel", &RdrDebugTraceLevel, REG_DWORD, sizeof(DWORD) },
#endif
{ RDR_CONFIG_TURBO_MODE, &RdrTurboMode, REG_BOOLEAN, REG_BOOLEAN_SIZE },
{ NULL, NULL, REG_NONE, 0}
};
#ifdef ALLOC_DATA_PRAGMA
#pragma data_seg()
#endif
#ifdef ALLOC_DATA_PRAGMA
#pragma data_seg("PAGE2VC")
#endif
USHORT MaximumCommands = 0;
STATUS_MAP
RdrSmbErrorMap[] = {
{ SMB_ERR_BAD_PASSWORD, STATUS_WRONG_PASSWORD },
{ SMB_ERR_ACCESS, STATUS_NETWORK_ACCESS_DENIED },
{ SMB_ERR_BAD_TID, STATUS_NETWORK_NAME_DELETED },
{ SMB_ERR_BAD_NET_NAME, STATUS_BAD_NETWORK_NAME }, // Invalid network name
{ SMB_ERR_BAD_DEVICE, STATUS_BAD_DEVICE_TYPE }, // Invalid device request
{ SMB_ERR_QUEUE_FULL, STATUS_PRINT_QUEUE_FULL }, // Print queue full
{ SMB_ERR_QUEUE_TOO_BIG, STATUS_NO_SPOOL_SPACE }, // No space on print dev
{ SMB_ERR_BAD_PRINT_FID, STATUS_PRINT_CANCELLED }, // Invalid printfile FID
{ SMB_ERR_SERVER_PAUSED, STATUS_SHARING_PAUSED }, // Server is paused
{ SMB_ERR_MESSAGE_OFF, STATUS_REQUEST_NOT_ACCEPTED }, // Server not receiving msgs
{ SMB_ERR_BAD_TYPE, STATUS_BAD_DEVICE_TYPE }, // Reserved
{ SMB_ERR_BAD_SMB_COMMAND, STATUS_NOT_IMPLEMENTED }, // SMB command not recognized
{ SMB_ERR_BAD_PERMITS, STATUS_NETWORK_ACCESS_DENIED }, // Access permissions invalid
{ SMB_ERR_NO_ROOM, STATUS_DISK_FULL }, // No room for buffer message
{ SMB_ERR_NO_RESOURCE, STATUS_REQUEST_NOT_ACCEPTED }, // No resources available for request
{ SMB_ERR_TOO_MANY_UIDS, STATUS_TOO_MANY_SESSIONS }, // Too many UIDs active in session
{ SMB_ERR_BAD_UID, STATUS_USER_SESSION_DELETED }, // UID not known as a valid UID
{ SMB_ERR_USE_MPX, STATUS_SMB_USE_MPX }, // Can't support Raw; use MPX
{ SMB_ERR_USE_STANDARD, STATUS_SMB_USE_STANDARD }, // Can't support Raw, use standard r/w
{ SMB_ERR_INVALID_NAME, STATUS_OBJECT_NAME_INVALID },
{ SMB_ERR_INVALID_NAME_RANGE, STATUS_OBJECT_NAME_INVALID },
{ SMB_ERR_NO_SUPPORT,STATUS_NOT_SUPPORTED }, // Function not supported
{ NERR_PasswordExpired, STATUS_PASSWORD_EXPIRED },
{ NERR_AccountExpired, STATUS_ACCOUNT_DISABLED },
{ NERR_InvalidLogonHours, STATUS_INVALID_LOGON_HOURS },
{ NERR_InvalidWorkstation, STATUS_INVALID_WORKSTATION },
{ NERR_DuplicateShare, STATUS_LOGON_FAILURE }
// { SMB_ERR_QUEUE_EOF, STATUS_UNEXPECTED_NETWORK_ERROR },// EOF on print queue dump
// { SMB_ERR_SERVER_ERROR, STATUS_UNEXPECTED_NETWORK_ERROR}, // Internal server error
// { SMB_ERR_FILE_SPECS, STATUS_UNEXPECTED_NETWORK_ERROR }, // FID and pathname were incompatible
// { SMB_ERR_BAD_ATTRIBUTE_MODE, STATUS_UNEXPECTED_NETWORK_ERROR }, // Invalid attribute mode specified
// { SMB_ERR_NO_SUPPORT_INTERNAL,STATUS_UNEXPECTED_NETWORK_ERROR }, // Internal code for NO_SUPPORT--
// // allows codes to be stored in a byte
// { SMB_ERR_ERROR, STATUS_UNEXPECTED_NETWORK_ERROR },
// { SMB_ERR_CONTINUE_MPX, STATUS_UNEXPECTED_NETWORK_ERROR }, // Reserved
// { SMB_ERR_TOO_MANY_NAMES, STATUS_UNEXPECTED_NETWORK_ERROR }, // Too many remote user names
// { SMB_ERR_TIMEOUT, STATUS_UNEXPECTED_NETWORK_ERROR }, // Operation was timed out
// { SMB_ERR_RESERVED2, STATUS_UNEXPECTED_NETWORK_ERROR },
// { SMB_ERR_RESERVED3, STATUS_UNEXPECTED_NETWORK_ERROR },
// { SMB_ERR_RESERVED4, STATUS_UNEXPECTED_NETWORK_ERROR },
// { SMB_ERR_RESERVED5, STATUS_UNEXPECTED_NETWORK_ERROR },
};
ULONG
RdrSmbErrorMapLength = sizeof(RdrSmbErrorMap) / sizeof(RdrSmbErrorMap[0]);
STATUS_MAP
RdrOs2ErrorMap[] = {
{ ERROR_INVALID_FUNCTION, STATUS_NOT_IMPLEMENTED },
{ ERROR_FILE_NOT_FOUND, STATUS_NO_SUCH_FILE },
{ ERROR_PATH_NOT_FOUND, STATUS_OBJECT_PATH_NOT_FOUND },
{ ERROR_TOO_MANY_OPEN_FILES,STATUS_TOO_MANY_OPENED_FILES },
{ ERROR_ACCESS_DENIED, STATUS_ACCESS_DENIED },
{ ERROR_INVALID_HANDLE, STATUS_INVALID_HANDLE },
{ ERROR_NOT_ENOUGH_MEMORY, STATUS_INSUFFICIENT_RESOURCES },
{ ERROR_INVALID_ACCESS, STATUS_ACCESS_DENIED },
{ ERROR_INVALID_DATA, STATUS_DATA_ERROR },
{ ERROR_CURRENT_DIRECTORY, STATUS_DIRECTORY_NOT_EMPTY },
{ ERROR_NOT_SAME_DEVICE, STATUS_NOT_SAME_DEVICE },
{ ERROR_NO_MORE_FILES, STATUS_NO_MORE_FILES },
{ ERROR_WRITE_PROTECT, STATUS_MEDIA_WRITE_PROTECTED},
{ ERROR_NOT_READY, STATUS_DEVICE_NOT_READY },
{ ERROR_CRC, STATUS_CRC_ERROR },
{ ERROR_BAD_LENGTH, STATUS_DATA_ERROR },
{ ERROR_NOT_DOS_DISK, STATUS_DISK_CORRUPT_ERROR }, //***
{ ERROR_SECTOR_NOT_FOUND, STATUS_NONEXISTENT_SECTOR },
{ ERROR_OUT_OF_PAPER, STATUS_DEVICE_PAPER_EMPTY},
{ ERROR_SHARING_VIOLATION, STATUS_SHARING_VIOLATION },
{ ERROR_LOCK_VIOLATION, STATUS_FILE_LOCK_CONFLICT },
{ ERROR_WRONG_DISK, STATUS_WRONG_VOLUME },
{ ERROR_NOT_SUPPORTED, STATUS_NOT_SUPPORTED },
{ ERROR_REM_NOT_LIST, STATUS_REMOTE_NOT_LISTENING },
{ ERROR_DUP_NAME, STATUS_DUPLICATE_NAME },
{ ERROR_BAD_NETPATH, STATUS_BAD_NETWORK_PATH },
{ ERROR_NETWORK_BUSY, STATUS_NETWORK_BUSY },
{ ERROR_DEV_NOT_EXIST, STATUS_DEVICE_DOES_NOT_EXIST },
{ ERROR_TOO_MANY_CMDS, STATUS_TOO_MANY_COMMANDS },
{ ERROR_ADAP_HDW_ERR, STATUS_ADAPTER_HARDWARE_ERROR },
{ ERROR_BAD_NET_RESP, STATUS_INVALID_NETWORK_RESPONSE },
{ ERROR_UNEXP_NET_ERR, STATUS_UNEXPECTED_NETWORK_ERROR },
{ ERROR_BAD_REM_ADAP, STATUS_BAD_REMOTE_ADAPTER },
{ ERROR_PRINTQ_FULL, STATUS_PRINT_QUEUE_FULL },
{ ERROR_NO_SPOOL_SPACE, STATUS_NO_SPOOL_SPACE },
{ ERROR_PRINT_CANCELLED, STATUS_PRINT_CANCELLED },
{ ERROR_NETNAME_DELETED, STATUS_NETWORK_NAME_DELETED },
{ ERROR_NETWORK_ACCESS_DENIED, STATUS_NETWORK_ACCESS_DENIED },
{ ERROR_BAD_DEV_TYPE, STATUS_BAD_DEVICE_TYPE },
{ ERROR_BAD_NET_NAME, STATUS_BAD_NETWORK_NAME },
{ ERROR_TOO_MANY_NAMES, STATUS_TOO_MANY_NAMES },
{ ERROR_TOO_MANY_SESS, STATUS_TOO_MANY_SESSIONS },
{ ERROR_SHARING_PAUSED, STATUS_SHARING_PAUSED },
{ ERROR_REQ_NOT_ACCEP, STATUS_REQUEST_NOT_ACCEPTED },
{ ERROR_REDIR_PAUSED, STATUS_REDIRECTOR_PAUSED },
{ ERROR_FILE_EXISTS, STATUS_OBJECT_NAME_COLLISION },
{ ERROR_INVALID_PASSWORD, STATUS_WRONG_PASSWORD },
{ ERROR_INVALID_PARAMETER, STATUS_INVALID_PARAMETER },
{ ERROR_NET_WRITE_FAULT, STATUS_NET_WRITE_FAULT },
{ ERROR_BROKEN_PIPE, STATUS_PIPE_BROKEN },
{ ERROR_OPEN_FAILED, STATUS_OPEN_FAILED },
{ ERROR_BUFFER_OVERFLOW, STATUS_BUFFER_OVERFLOW },
{ ERROR_DISK_FULL, STATUS_DISK_FULL },
{ ERROR_SEM_TIMEOUT, STATUS_IO_TIMEOUT },
{ ERROR_INSUFFICIENT_BUFFER,STATUS_BUFFER_TOO_SMALL },
{ ERROR_INVALID_NAME, STATUS_OBJECT_NAME_INVALID },
{ ERROR_INVALID_LEVEL, STATUS_INVALID_LEVEL },
{ ERROR_BAD_PATHNAME, STATUS_OBJECT_PATH_INVALID }, //*
{ ERROR_BAD_PIPE, STATUS_INVALID_PARAMETER },
{ ERROR_PIPE_BUSY, STATUS_PIPE_NOT_AVAILABLE },
{ ERROR_NO_DATA, STATUS_PIPE_EMPTY },
{ ERROR_PIPE_NOT_CONNECTED, STATUS_PIPE_DISCONNECTED },
{ ERROR_MORE_DATA, STATUS_BUFFER_OVERFLOW },
{ ERROR_VC_DISCONNECTED, STATUS_VIRTUAL_CIRCUIT_CLOSED },
{ ERROR_INVALID_EA_NAME, STATUS_INVALID_EA_NAME },
{ ERROR_EA_LIST_INCONSISTENT,STATUS_EA_LIST_INCONSISTENT },
// { ERROR_EA_LIST_TOO_LONG, STATUS_EA_LIST_TO_LONG },
{ ERROR_EAS_DIDNT_FIT, STATUS_EA_TOO_LARGE },
{ ERROR_EA_FILE_CORRUPT, STATUS_EA_CORRUPT_ERROR },
{ ERROR_EA_TABLE_FULL, STATUS_EA_CORRUPT_ERROR },
{ ERROR_INVALID_EA_HANDLE, STATUS_EA_CORRUPT_ERROR }
// { ERROR_BAD_UNIT, STATUS_UNSUCCESSFUL}, // ***
// { ERROR_BAD_COMMAND, STATUS_UNSUCCESSFUL}, // ***
// { ERROR_SEEK, STATUS_UNSUCCESSFUL },// ***
// { ERROR_WRITE_FAULT, STATUS_UNSUCCESSFUL}, // ***
// { ERROR_READ_FAULT, STATUS_UNSUCCESSFUL}, // ***
// { ERROR_GEN_FAILURE, STATUS_UNSUCCESSFUL }, // ***
};
ULONG
RdrOs2ErrorMapLength = sizeof(RdrOs2ErrorMap) / sizeof(RdrOs2ErrorMap[0]);
SMB_VALIDATE_TABLE
RdrSMBValidateTable[] = {
/* 0x00 MkDir */ (CHAR)FIELD_OFFSET(RESP_CREATE_DIRECTORY, Buffer[0]), -1, 0, -1,
/* 0x01 RmDir */ (CHAR)FIELD_OFFSET(RESP_DELETE_DIRECTORY, Buffer[0]), -1, 0, -1,
/* 0x02 Open */ (CHAR)FIELD_OFFSET(RESP_OPEN, Buffer[0]), -1, 7, -1,
/* 0x03 Create */ (CHAR)FIELD_OFFSET(RESP_CREATE, Buffer[0]), -1, 1, -1,
/* 0x04 Close */ (CHAR)FIELD_OFFSET(RESP_CLOSE, Buffer[0]), -1, 0, -1,
/* 0x05 Flush */ (CHAR)FIELD_OFFSET(RESP_FLUSH, Buffer[0]), -1, 0, -1,
/* 0x06 Delete */ (CHAR)FIELD_OFFSET(RESP_DELETE, Buffer[0]), -1, 0, -1,
/* 0x07 Rename */ (CHAR)FIELD_OFFSET(RESP_RENAME, Buffer[0]), -1, 0, -1,
/* 0x08 QInfo */ (CHAR)FIELD_OFFSET(RESP_QUERY_INFORMATION, Buffer[0]), (CHAR)FIELD_OFFSET(RESP_QUERY_INFORMATION, Reserved[1]), 10, 5,
/* 0x09 SetInfo */ (CHAR)FIELD_OFFSET(RESP_SET_INFORMATION, Buffer[0]), -1, 0, -1,
/* 0x0A Read */ (CHAR)FIELD_OFFSET(RESP_READ, Buffer[0]), -1, 5, -1,
/* 0x0B Write */ (CHAR)FIELD_OFFSET(RESP_WRITE, Buffer[0]), -1, 1, -1,
/* 0x0C Lock */ (CHAR)FIELD_OFFSET(RESP_LOCK_BYTE_RANGE, Buffer[0]), -1, 0, -1,
/* 0x0D Unlock */ (CHAR)FIELD_OFFSET(RESP_UNLOCK_BYTE_RANGE, Buffer[0]), -1, 0, -1,
/* 0x0E MkTemp */ (CHAR)FIELD_OFFSET(RESP_CREATE_TEMPORARY, Buffer[0]), -1, 1, -1,
/* 0x0F MkNew */ (CHAR)FIELD_OFFSET(RESP_CREATE, Buffer[0]), -1, 1, -1,
/* 0x10 ChDir */ (CHAR)FIELD_OFFSET(RESP_CHECK_DIRECTORY, Buffer[0]), -1, 0, -1,
/* 0x11 Exit */ -1, -1, -1, -1,
/* 0x12 Seek */ (CHAR)FIELD_OFFSET(RESP_SEEK, Buffer[0]), -1, 2, -1,
/* 0x13 Lock&Read */ (CHAR)FIELD_OFFSET(RESP_READ, Buffer[0]), -1, 5, -1,
/* 0x14 Write&Unlok */ (CHAR)FIELD_OFFSET(RESP_WRITE, Buffer[0]), -1, 5, -1,
/* 0x15 */ -1, -1, -1, -1,
/* 0x16 */ -1, -1, -1, -1,
/* 0x17 */ -1, -1, -1, -1,
/* 0x18 */ -1, -1, -1, -1,
/* 0x19 */ -1, -1, -1, -1,
/* 0x1A ReadRaw */ -1, -1, -1, -1,
/* 0x1B ReadMpx */ -1, -1, -1, -1,
/* 0x1C ReadMpx2 */ -1, -1, -1, -1,
/* 0x1D WriteRaw */ (CHAR)FIELD_OFFSET(RESP_WRITE_RAW_INTERIM, Buffer[0]), -1, 1, -1,
/* 0x1E WriteMpx */ -1, -1, -1, -1,
/* 0x1F WriteMpx2 */ -1, -1, -1, -1,
/* 0x20 WriteC */ (CHAR)FIELD_OFFSET(RESP_WRITE_COMPLETE, Buffer[0]), -1, 1, -1,
/* 0x21 QInfoSrv */ -1, -1, -1, -1,
/* 0x22 SetInfo2 */ (CHAR)FIELD_OFFSET(RESP_SET_INFORMATION2, Buffer[0]), -1, 0, -1,
/* 0x23 QInfo2 */ (CHAR)FIELD_OFFSET(RESP_QUERY_INFORMATION2, Buffer[0]), -1, 11, -1,
/* 0x24 Locking&X */ (CHAR)FIELD_OFFSET(RESP_LOCKING_ANDX, Buffer[0]), -1, 2,8,
/* 0x25 Transact */ (CHAR)FIELD_OFFSET(RESP_TRANSACTION, Buffer[0]), -1, 10, -1,
/* 0x26 TransactSec */ (CHAR)FIELD_OFFSET(RESP_TRANSACTION_INTERIM, Buffer[0]), -1, 0, -1,
/* 0x27 Ioctl */ (CHAR)FIELD_OFFSET(RESP_IOCTL, Buffer[0]), -1, 8, -1,
/* 0x28 IoctlSecond */ -1, -1, -1, -1,
/* 0x29 Copy */ -1, -1, -1, -1,
/* 0x2A Move */ -1, -1, -1, -1,
/* 0x2B Echo */ (CHAR)FIELD_OFFSET(RESP_ECHO, Buffer[0]), -1, 1, -1,
/* 0x2C Write&Close */ -1, -1, -1, -1,
/* 0x2D Open&X */ (CHAR)FIELD_OFFSET(RESP_OPEN_ANDX, Buffer[0]), -1, 15, -1,
/* 0x2E Read&X */ (CHAR)FIELD_OFFSET(RESP_READ_ANDX, Buffer[0]), -1, 12, -1,
/* 0x2F Write&X */ (CHAR)FIELD_OFFSET(RESP_WRITE_ANDX, Buffer[0]), -1, 6, -1,
/* 0x30 */ -1, -1, -1, -1,
/* 0x31 Close&TDis */ -1, -1, -1, -1,
/* 0x32 Transact2 */ (CHAR)FIELD_OFFSET(RESP_TRANSACTION, Buffer[0]), -1, 10, -1,
/* 0x33 Transact2Sec*/ (CHAR)FIELD_OFFSET(RESP_TRANSACTION_INTERIM, Buffer[0]), -1, 0, -1,
/* 0x34 FindClose2 */ (CHAR)FIELD_OFFSET(RESP_FIND_CLOSE2, Buffer[0]), -1, 0, -1,
/* 0x35 FindNotifyCl*/ (CHAR)FIELD_OFFSET(RESP_FIND_NOTIFY_CLOSE, Buffer[0]), -1, 0, -1,
/* 0x36 */ -1, -1, -1, -1,
/* 0x37 */ -1, -1, -1, -1,
/* 0x38 */ -1, -1, -1, -1,
/* 0x39 */ -1, -1, -1, -1,
/* 0x3A */ -1, -1, -1, -1,
/* 0x3B */ -1, -1, -1, -1,
/* 0x3C */ -1, -1, -1, -1,
/* 0x3D */ -1, -1, -1, -1,
/* 0x3E */ -1, -1, -1, -1,
/* 0x3F */ -1, -1, -1, -1,
/* 0x40 */ -1, -1, -1, -1,
/* 0x41 */ -1, -1, -1, -1,
/* 0x42 */ -1, -1, -1, -1,
/* 0x43 */ -1, -1, -1, -1,
/* 0x44 */ -1, -1, -1, -1,
/* 0x45 */ -1, -1, -1, -1,
/* 0x46 */ -1, -1, -1, -1,
/* 0x47 */ -1, -1, -1, -1,
/* 0x48 */ -1, -1, -1, -1,
/* 0x49 */ -1, -1, -1, -1,
/* 0x4A */ -1, -1, -1, -1,
/* 0x4B */ -1, -1, -1, -1,
/* 0x4C */ -1, -1, -1, -1,
/* 0x4D */ -1, -1, -1, -1,
/* 0x4E */ -1, -1, -1, -1,
/* 0x4F */ -1, -1, -1, -1,
/* 0x50 */ -1, -1, -1, -1,
/* 0x51 */ -1, -1, -1, -1,
/* 0x52 */ -1, -1, -1, -1,
/* 0x53 */ -1, -1, -1, -1,
/* 0x54 */ -1, -1, -1, -1,
/* 0x55 */ -1, -1, -1, -1,
/* 0x56 */ -1, -1, -1, -1,
/* 0x57 */ -1, -1, -1, -1,
/* 0x58 */ -1, -1, -1, -1,
/* 0x59 */ -1, -1, -1, -1,
/* 0x5A */ -1, -1, -1, -1,
/* 0x5B */ -1, -1, -1, -1,
/* 0x5C */ -1, -1, -1, -1,
/* 0x5D */ -1, -1, -1, -1,
/* 0x5E */ -1, -1, -1, -1,
/* 0x5F */ -1, -1, -1, -1,
/* 0x60 */ -1, -1, -1, -1,
/* 0x61 */ -1, -1, -1, -1,
/* 0x62 */ -1, -1, -1, -1,
/* 0x63 */ -1, -1, -1, -1,
/* 0x64 */ -1, -1, -1, -1,
/* 0x65 */ -1, -1, -1, -1,
/* 0x66 */ -1, -1, -1, -1,
/* 0x67 */ -1, -1, -1, -1,
/* 0x68 */ -1, -1, -1, -1,
/* 0x69 */ -1, -1, -1, -1,
/* 0x6A */ -1, -1, -1, -1,
/* 0x6B */ -1, -1, -1, -1,
/* 0x6C */ -1, -1, -1, -1,
/* 0x6D */ -1, -1, -1, -1,
/* 0x6E */ -1, -1, -1, -1,
/* 0x6F */ -1, -1, -1, -1,
/* 0x70 TreeConnect */ (CHAR)FIELD_OFFSET(RESP_TREE_CONNECT, Buffer[0]), -1, 2, -1,
/* 0x71 TreeDisConn */ (CHAR)FIELD_OFFSET(RESP_TREE_DISCONNECT, Buffer[0]), -1, 0, -1,
/* 0x72 Negotiate */ (CHAR)FIELD_OFFSET(RESP_NEGOTIATE, DialectIndex)+2, -1, -1, -1,
/* 0x73 SessSetup&X */ (CHAR)FIELD_OFFSET(RESP_SESSION_SETUP_ANDX, Buffer[0]), -1, 3, -1,
/* 0x74 Logoff&X */ (CHAR)FIELD_OFFSET(RESP_LOGOFF_ANDX, Buffer[0]), -1, 2, -1,
/* 0x75 TConnect&X */ (CHAR)FIELD_OFFSET(RESP_TREE_CONNECT_ANDX, Buffer[0]), -1, 2, 3,
/* 0x76 */ -1, -1, -1, -1,
/* 0x77 */ -1, -1, -1, -1,
/* 0x78 */ -1, -1, -1, -1,
/* 0x79 */ -1, -1, -1, -1,
/* 0x7A */ -1, -1, -1, -1,
/* 0x7B */ -1, -1, -1, -1,
/* 0x7C */ -1, -1, -1, -1,
/* 0x7D */ -1, -1, -1, -1,
/* 0x7E */ -1, -1, -1, -1,
/* 0x7F */ -1, -1, -1, -1,
/* 0x80 QInfoDisk */ (CHAR)FIELD_OFFSET(RESP_QUERY_INFORMATION_DISK, Buffer[0]), -1, 5, -1,
/* 0x81 Search */ (CHAR)FIELD_OFFSET(RESP_SEARCH, Buffer[0]), -1, 1, -1,
/* 0x82 Find */ (CHAR)FIELD_OFFSET(RESP_SEARCH, Buffer[0]), -1, 1, -1,
/* 0x83 FindUnique */ (CHAR)FIELD_OFFSET(RESP_SEARCH, Buffer[0]), -1, 1, -1,
/* 0x84 FindClose */ (CHAR)FIELD_OFFSET(RESP_SEARCH, Buffer[0]), -1, 1, -1,
/* 0x85 */ -1, -1, -1, -1,
/* 0x86 */ -1, -1, -1, -1,
/* 0x87 */ -1, -1, -1, -1,
/* 0x88 */ -1, -1, -1, -1,
/* 0x89 */ -1, -1, -1, -1,
/* 0x8A */ -1, -1, -1, -1,
/* 0x8B */ -1, -1, -1, -1,
/* 0x8C */ -1, -1, -1, -1,
/* 0x8D */ -1, -1, -1, -1,
/* 0x8E */ -1, -1, -1, -1,
/* 0x8F */ -1, -1, -1, -1,
/* 0x90 */ -1, -1, -1, -1,
/* 0x91 */ -1, -1, -1, -1,
/* 0x92 */ -1, -1, -1, -1,
/* 0x93 */ -1, -1, -1, -1,
/* 0x94 */ -1, -1, -1, -1,
/* 0x95 */ -1, -1, -1, -1,
/* 0x96 */ -1, -1, -1, -1,
/* 0x97 */ -1, -1, -1, -1,
/* 0x98 */ -1, -1, -1, -1,
/* 0x99 */ -1, -1, -1, -1,
/* 0x9A */ -1, -1, -1, -1,
/* 0x9B */ -1, -1, -1, -1,
/* 0x9C */ -1, -1, -1, -1,
/* 0x9D */ -1, -1, -1, -1,
/* 0x9E */ -1, -1, -1, -1,
/* 0x9F */ -1, -1, -1, -1,
/* 0xA0 NT Transact */ (CHAR)FIELD_OFFSET(RESP_NT_TRANSACTION, Buffer[0]), -1, -1, -1,
/* 0xA1 NT Trans2 */ (CHAR)FIELD_OFFSET(RESP_NT_TRANSACTION_INTERIM, Buffer[0]), -1, 0, -1,
/* 0xA2 NT Create */ (CHAR)FIELD_OFFSET(RESP_NT_CREATE_ANDX, Buffer[0]), -1, 26, -1,
/* 0xA3 */ -1, -1, -1, -1,
/* 0xA4 NT Cancel */ -1, -1, -1, -1,
/* 0xA5 NT Rename */ (CHAR)FIELD_OFFSET(RESP_RENAME, Buffer[0]), -1, 0, -1,
/* 0xA6 */ -1, -1, -1, -1,
/* 0xA7 */ -1, -1, -1, -1,
/* 0xA8 */ -1, -1, -1, -1,
/* 0xA9 */ -1, -1, -1, -1,
/* 0xAA */ -1, -1, -1, -1,
/* 0xAB */ -1, -1, -1, -1,
/* 0xAC */ -1, -1, -1, -1,
/* 0xAD */ -1, -1, -1, -1,
/* 0xAE */ -1, -1, -1, -1,
/* 0xAF */ -1, -1, -1, -1,
/* 0xB0 */ -1, -1, -1, -1,
/* 0xB1 */ -1, -1, -1, -1,
/* 0xB2 */ -1, -1, -1, -1,
/* 0xB3 */ -1, -1, -1, -1,
/* 0xB4 */ -1, -1, -1, -1,
/* 0xB5 */ -1, -1, -1, -1,
/* 0xB6 */ -1, -1, -1, -1,
/* 0xB7 */ -1, -1, -1, -1,
/* 0xB8 */ -1, -1, -1, -1,
/* 0xB9 */ -1, -1, -1, -1,
/* 0xBA */ -1, -1, -1, -1,
/* 0xBB */ -1, -1, -1, -1,
/* 0xBC */ -1, -1, -1, -1,
/* 0xBD */ -1, -1, -1, -1,
/* 0xBE */ -1, -1, -1, -1,
/* 0xBF */ -1, -1, -1, -1,
/* 0xC0 SpoolOpen */ (CHAR)FIELD_OFFSET(RESP_OPEN_PRINT_FILE, Buffer[0]), -1, 1, 0,
/* 0xC1 WriteSpool */ (CHAR)FIELD_OFFSET(RESP_WRITE_PRINT_FILE, Buffer[0]), -1, 0, 0,
/* 0xC2 CloseSpool */ (CHAR)FIELD_OFFSET(RESP_CLOSE_PRINT_FILE, Buffer[0]), -1, 0, 0,
/* 0xC3 GetPrintQue */ (CHAR)FIELD_OFFSET(RESP_GET_PRINT_QUEUE, Buffer[0]), -1, 2, 0,
/* 0xC4 */ -1, -1, -1, -1,
/* 0xC5 */ -1, -1, -1, -1,
/* 0xC6 */ -1, -1, -1, -1,
/* 0xC7 */ -1, -1, -1, -1,
/* 0xC8 */ -1, -1, -1, -1,
/* 0xC9 */ -1, -1, -1, -1,
/* 0xCA */ -1, -1, -1, -1,
/* 0xCB */ -1, -1, -1, -1,
/* 0xCC */ -1, -1, -1, -1,
/* 0xCD */ -1, -1, -1, -1,
/* 0xCE */ -1, -1, -1, -1,
/* 0xCF */ -1, -1, -1, -1,
/* 0xD0 SendMessage */ -1, -1, -1, -1,
/* 0xD1 SendBcaseMsg*/ -1, -1, -1, -1,
/* 0xD2 FwrdMessage */ -1, -1, -1, -1,
/* 0xD3 CanclFwd */ -1, -1, -1, -1,
/* 0xD4 GetMachName */ -1, -1, -1, -1,
/* 0xD5 SendSMBM */ -1, -1, -1, -1,
/* 0xD6 SendEMBM */ -1, -1, -1, -1,
/* 0xD7 SeendTxtMBM */ -1, -1, -1, -1,
/* 0xD8 */ -1, -1, -1, -1,
/* 0xD9 */ -1, -1, -1, -1,
/* 0xDA */ -1, -1, -1, -1,
/* 0xDB */ -1, -1, -1, -1,
/* 0xDC */ -1, -1, -1, -1,
/* 0xDD */ -1, -1, -1, -1,
/* 0xDE */ -1, -1, -1, -1,
/* 0xDF */ -1, -1, -1, -1,
/* 0xE0 */ -1, -1, -1, -1,
/* 0xE1 */ -1, -1, -1, -1,
/* 0xE2 */ -1, -1, -1, -1,
/* 0xE3 */ -1, -1, -1, -1,
/* 0xE4 */ -1, -1, -1, -1,
/* 0xE5 */ -1, -1, -1, -1,
/* 0xE6 */ -1, -1, -1, -1,
/* 0xE7 */ -1, -1, -1, -1,
/* 0xE8 */ -1, -1, -1, -1,
/* 0xE9 */ -1, -1, -1, -1,
/* 0xEA */ -1, -1, -1, -1,
/* 0xEB */ -1, -1, -1, -1,
/* 0xEC */ -1, -1, -1, -1,
/* 0xED */ -1, -1, -1, -1,
/* 0xEE */ -1, -1, -1, -1,
/* 0xEF */ -1, -1, -1, -1,
/* 0xF0 */ -1, -1, -1, -1,
/* 0xF1 */ -1, -1, -1, -1,
/* 0xF2 */ -1, -1, -1, -1,
/* 0xF3 */ -1, -1, -1, -1,
/* 0xF4 */ -1, -1, -1, -1,
/* 0xF5 */ -1, -1, -1, -1,
/* 0xF6 */ -1, -1, -1, -1,
/* 0xF7 */ -1, -1, -1, -1,
/* 0xF8 */ -1, -1, -1, -1,
/* 0xF9 */ -1, -1, -1, -1,
/* 0xFA */ -1, -1, -1, -1,
/* 0xFB */ -1, -1, -1, -1,
/* 0xFC */ -1, -1, -1, -1,
/* 0xFD */ -1, -1, -1, -1,
/* 0xFE */ -1, -1, -1, -1,
/* 0xFF */ -1, -1, -1, -1
};
//#if sizeof(RdrSMBValidateTable) - 0x100*sizeof(SMB_VALIDATE_TABLE)
//#pragma error("RdrSMBValidateTable has an incorrect length")
//#endif
//
// Structures used for protocol exchange
//
DBGSTATIC
DIALECT_CAPABILITIES_MAP
RdrNegotiateDialect[] = {
{ PCNET1, DF_CORE },
{ XENIXCORE, DF_CORE | DF_MIXEDCASEPW | DF_MIXEDCASE },
{ MSNET103, DF_CORE | DF_OLDRAWIO | DF_LOCKREAD | DF_EXTENDNEGOT },
{ LANMAN10, DF_CORE | DF_NEWRAWIO | DF_LOCKREAD | DF_EXTENDNEGOT |
DF_LANMAN10 },
{ WFW10, DF_CORE | DF_NEWRAWIO | DF_LOCKREAD | DF_EXTENDNEGOT |
DF_LANMAN10 | DF_WFW},
{ LANMAN12, DF_CORE | DF_NEWRAWIO | DF_LOCKREAD | DF_EXTENDNEGOT |
DF_LANMAN10 | DF_LANMAN20 |
DF_MIXEDCASE | DF_LONGNAME | DF_SUPPORTEA },
{ LANMAN21, DF_CORE | DF_NEWRAWIO | DF_LOCKREAD | DF_EXTENDNEGOT |
DF_LANMAN10 | DF_LANMAN20 |
DF_MIXEDCASE | DF_LONGNAME | DF_SUPPORTEA |
DF_LANMAN21},
{ NTLANMAN, DF_CORE | DF_NEWRAWIO | DF_NTNEGOTIATE |
DF_MIXEDCASEPW | DF_LANMAN10 | DF_LANMAN20 |
DF_LANMAN21 | DF_MIXEDCASE | DF_LONGNAME |
DF_SUPPORTEA | DF_TIME_IS_UTC }
#ifdef _CAIRO_
,
{ CAIROX, DF_CORE | DF_NEWRAWIO | DF_LOCKREAD | DF_NTNEGOTIATE |
DF_MIXEDCASEPW | DF_LANMAN10 | DF_LANMAN20 |
DF_LANMAN21 | DF_MIXEDCASE | DF_LONGNAME |
DF_SUPPORTEA | DF_TIME_IS_UTC | DF_KERBEROS }
#endif // _CAIRO_
};
ULONG
RdrNumDialects = (sizeof(RdrNegotiateDialect) / sizeof(RdrNegotiateDialect[0]));
DBGSTATIC
PUCHAR RdrConnectTypeList[] = {
SHARE_TYPE_NAME_WILD,
SHARE_TYPE_NAME_DISK,
SHARE_TYPE_NAME_PRINT,
SHARE_TYPE_NAME_COMM,
SHARE_TYPE_NAME_PIPE
};
ULONG
RdrNumConnectTypes = (sizeof(RdrConnectTypeList) / sizeof(RdrConnectTypeList[0]));
DBGSTATIC
PUCHAR *
RdrConnectTypes = &RdrConnectTypeList[1];
//
// Whenever we update state on the server we increment the value
// of this variable. This lets us handle a cache of items such
// as successful 'checkpath' operations
//
LONG RdrServerStateUpdated = 0;
#ifdef ALLOC_DATA_PRAGMA
#pragma data_seg()
#endif