NT4/private/ntos/rdr/rdrprocs.h
2020-09-30 17:12:29 +02:00

2158 lines
37 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
Copyright (c) 1990 Microsoft Corporation
Module Name:
rdrprocs.h
Abstract:
This module defines all of the global routine headers for the NT
redirector
Author:
Larry Osterman (LarryO) 31-May-1990
Revision History:
31-May-1990 LarryO
Created
--*/
#ifndef _RDRPROCS_
#define _RDRPROCS_
//
// Define those routines used in the FSD.
//
NTSTATUS
RdrFsdInitialize(
IN PDRIVER_OBJECT DriverObject
);
NTSTATUS
RdrFsdClose (
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFsdCreate (
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFsdQueryEa(
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFsdSetEa(
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFsdRead (
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFsdWrite (
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFsdDirectoryControl (
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFsdFsControlFile (
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFsdDeviceIoControlFile (
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFsdQueryInformationFile (
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFsdSetInformationFile (
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFsdQueryVolumeInformationFile (
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFsdClose (
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFsdCleanup (
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFsdLockOperation (
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFsdFlushBuffersFile (
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFsdSetSecurity (
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFsdQuerySecurity (
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFspRead (
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFspWrite (
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFspDirectoryControl (
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFspQueryEa(
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFspSetEa(
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFspQueryInformationFile (
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFspSetInformationFile (
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFspQueryVolumeInformationFile (
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFspFsControlFile (
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFspDeviceIoControlFile (
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFspLockOperation (
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFspFlushBuffersFile (
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFspSetSecurity (
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFspQuerySecurity (
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
//
// Common routines between the FSP and FSD.
//
NTSTATUS
RdrFscRead (
IN BOOLEAN Wait,
IN BOOLEAN InFsd,
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFscWrite (
IN BOOLEAN Wait,
IN BOOLEAN InFsd,
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFscDirectoryControl (
IN BOOLEAN Wait,
IN BOOLEAN InFsd,
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFscQueryEa(
IN BOOLEAN Wait,
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFscSetEa(
IN BOOLEAN Wait,
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFscQueryInformationFile (
IN BOOLEAN Wait,
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFscSetInformationFile (
IN BOOLEAN Wait,
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFscQueryVolumeInformationFile (
IN BOOLEAN Wait,
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFscFsControlFile (
IN BOOLEAN InFsd,
IN BOOLEAN Wait,
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFscDeviceIoControlFile (
IN BOOLEAN InFsd,
IN BOOLEAN Wait,
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFscLockOperation (
IN BOOLEAN Wait,
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFscFlushBuffersFile (
IN BOOLEAN Wait,
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFscSetSecurity (
IN BOOLEAN Wait,
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
RdrFscQuerySecurity (
IN BOOLEAN Wait,
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
//
// In CONNECT.C
//
NTSTATUS
RdrCreateConnection (
IN PIRP Irp OPTIONAL,
IN PUNICODE_STRING ServerName,
IN PUNICODE_STRING ShareName,
IN PTRANSPORT Transport OPTIONAL,
IN PULONG Disposition,
OUT PCONNECTLISTENTRY *Connection,
IN ULONG Type
);
BOOLEAN
RdrDereferenceConnection (
IN PIRP Irp OPTIONAL,
IN PCONNECTLISTENTRY Connection,
IN PSECURITY_ENTRY Se,
IN BOOLEAN ForcablyDeleteConnection
);
NTSTATUS
RdrReferenceConnection (
IN PCONNECTLISTENTRY Connection
);
NTSTATUS
RdrReconnectConnection (
IN PIRP Irp OPTIONAL,
IN PCONNECTLISTENTRY Connection,
IN PSECURITY_ENTRY Se OPTIONAL
);
VOID
RdrScanForDormantConnections(
IN ULONG NumberOfConnectionsToFree,
IN PTRANSPORT Transport OPTIONAL
);
NTSTATUS
RdrDeleteConnection (
IN PIRP Irp OPTIONAL,
IN PCONNECTLISTENTRY Connection,
IN PUNICODE_STRING DeviceName OPTIONAL,
IN PSECURITY_ENTRY Se,
IN ULONG Level
);
VOID
RdrHandleLogonSessionTermination(
IN PLUID LogonId
);
NTSTATUS
RdrDisconnectConnection (
IN PIRP Irp OPTIONAL,
IN PCONNECTLISTENTRY Connection,
IN BOOLEAN DeletingConnection,
IN PSECURITY_ENTRY Se OPTIONAL
);
VOID
RdrInvalidateServerConnections(
IN PSERVERLISTENTRY Server
);
VOID
RdrReferenceServer (
IN PSERVERLISTENTRY Sle
);
VOID
RdrDereferenceServer (
IN PIRP Irp OPTIONAL,
IN PSERVERLISTENTRY ServerList
);
VOID
RdrScavengeServerEntries();
NTSTATUS
RdrForeachServer(
IN PRDR_ENUM_SERVER_CALLBACK Callback,
IN PVOID CallbackContext
);
VOID
RdrGetConnectionReferences(
IN PCONNECTLISTENTRY Connection,
IN PUNICODE_STRING DeviceName OPTIONAL,
IN PSECURITY_ENTRY Se OPTIONAL,
OUT PULONG NumberOfTreeConnections,
OUT PULONG NumberOfOpenDirectories,
OUT PULONG NumberOfOpenFiles
);
VOID
RdrReferenceConnectionForFile(
IN PICB Icb
);
VOID
RdrDereferenceConnectionForFile(
IN PICB Icb
);
VOID
RdrResetConnectlistFlag(
IN PCONNECTLISTENTRY Connection,
IN ULONG Flag
);
VOID
RdrSetConnectlistFlag(
IN PCONNECTLISTENTRY Connection,
IN ULONG Flag
);
VOID
RdrEvaluateTimeouts (
VOID
);
VOID
RdrpInitializeConnectPackage (
VOID
);
#define RdrpUninitializeConnectPackage( ) { \
ASSERT( IsListEmpty(&RdrServerHead) ); \
ASSERT( IsListEmpty(&RdrConnectHead) ); \
}
//
// In CREATE.C
//
NTSTATUS
RdrCreateFile (
IN PIRP Irp,
IN PICB Icb,
IN ULONG OpenOptions,
IN USHORT ShareAccess,
IN ULONG FileAttributes,
IN ULONG DesiredAccess,
IN ULONG Disposition,
IN PIO_SECURITY_CONTEXT SecurityContext,
IN BOOLEAN FcbCreated
);
NTSTATUS
RdrDetermineFileConnection (
IN PIRP Irp OPTIONAL,
IN PUNICODE_STRING FileName,
IN PIO_SECURITY_CONTEXT SecurityContext,
OUT PUNICODE_STRING PathName,
OUT PCONNECTLISTENTRY *Connection,
OUT PSECURITY_ENTRY *Se,
IN PFILE_FULL_EA_INFORMATION EaBuffer,
IN ULONG EaLength,
IN BOOLEAN CreateTreeConnection,
// OUT PBOOLEAN OpeningServerRoot,
OUT PBOOLEAN OpeningMailslotFile,
IN OUT PULONG ConnectDisposition,
OUT PULONG ConnectionType,
OUT PBOOLEAN UserCredentialsSpecified OPTIONAL,
OUT PBOOLEAN NoConnectRequested
);
//
// In DIR.C
//
//++
//
// VOID
// RdrInitializeDir (
// VOID
// )
//
// Routine Description:
//
// This routine initializes the redirector Directory Control structures.
//
// Arguments:
//
// None.
//
// Return Value:
//
// None.
//
//--
#define RdrInitializeDir( ) { \
KeInitializeSpinLock(&DirectoryControlSpinLock); \
SEARCH_INVALIDATE_INTERVAL.QuadPart = Int32x32To64(5*60*1000, 10000); \
}
//++
//
// VOID
// RdrpUninitializeDir (
// VOID
// )
//
// Routine Description:
//
// This routine undoes the operations performed by RdrInitializeDir
//
// Arguments:
//
// None.
//
// Return Value:
//
// None.
//
//--
//
#define RdrpUninitializeDir( )
NTSTATUS
RdrFindClose (
IN PIRP Irp OPTIONAL,
IN PICB Icb,
IN PSCB Scb
);
//
//
// In EA.C
//
ULONG
NtFullEaSizeToOs2 (
IN PFILE_FULL_EA_INFORMATION NtFullEa
);
VOID
NtFullListToOs2 (
IN PFILE_FULL_EA_INFORMATION NtEaList,
IN PFEALIST FeaList
);
//
//
// In ERROR.C
//
NTSTATUS
RdrMapSmbError (
IN PSMB_HEADER Smb,
IN PSERVERLISTENTRY Sle OPTIONAL
);
#define RdrMapNetworkError( _TransportError ) (_TransportError)
//
//
// In ERRORLOG.C
//
VOID
RdrWriteErrorLogEntry(
IN OPTIONAL PSERVERLISTENTRY Sle,
IN NTSTATUS IoErrorCode,
IN ULONG UniqueErrorCode,
IN NTSTATUS NtStatusCode,
IN VOID UNALIGNED *ExtraInformationBuffer,
IN USHORT ExtraInformationLength
);
//
//
// In FCB.C
//
//
PICB
RdrAllocateIcb (
IN PFILE_OBJECT FileObject
);
VOID
RdrFreeIcb (
IN PICB Icb
);
PFCB
RdrAllocateFcb (
IN PICB Icb OPTIONAL,
IN PFILE_OBJECT FileObject OPTIONAL,
IN PUNICODE_STRING BaseFileName OPTIONAL,
IN PUNICODE_STRING FileName,
IN USHORT ShareAccess,
IN ACCESS_MASK DesiredAccess,
IN BOOLEAN OpenTargetDirectory,
IN BOOLEAN DfsFile,
IN PCONNECTLISTENTRY Connection,
OUT PBOOLEAN FcbWasCreated,
OUT PBOOLEAN BaseFcbWasCreated OPTIONAL
);
VOID
RdrUnlinkAndFreeIcb (
IN PIRP Irp OPTIONAL,
IN PICB Icb,
IN PFILE_OBJECT FileObject
);
VOID
RdrReferenceFcb (
IN PNONPAGED_FCB Fcb
);
BOOLEAN
RdrDereferenceFcb (
IN PIRP Irp OPTIONAL,
IN PNONPAGED_FCB Fcb,
IN BOOLEAN FcbLocked,
IN ERESOURCE_THREAD DereferencingThread OPTIONAL,
IN PSECURITY_ENTRY Se OPTIONAL
);
VOID
RdrForeachFcb (
IN FCB_LOCK_TYPE LockType,
IN PFCB_ENUMERATION_ROUTINE EnumerationRoutine,
IN PVOID Context
);
VOID
RdrForeachFcbOnConnection(
IN PCONNECTLISTENTRY Connection,
IN FCB_LOCK_TYPE LockType,
IN PFCB_ENUMERATION_ROUTINE EnumerationRoutine,
IN PVOID Context
);
NTSTATUS
RdrIsOperationValid (
IN PICB Icb,
IN ULONG NtOperation,
IN PFILE_OBJECT FileObject
);
BOOLEAN
RdrFastIoCheckIfPossible(
IN PFILE_OBJECT FileObject,
IN PLARGE_INTEGER FileOffset,
IN ULONG Length,
IN BOOLEAN Wait,
IN ULONG LockKey,
IN BOOLEAN CheckForReadOperation,
OUT PIO_STATUS_BLOCK IoStatus,
IN PDEVICE_OBJECT DeviceObject
);
VOID
RdrInvalidateConnectionFiles(
IN PIRP Irp OPTIONAL,
IN PCONNECTLISTENTRY Connection,
IN PUNICODE_STRING DeviceName OPTIONAL,
IN PSECURITY_ENTRY Se OPTIONAL,
IN BOOLEAN CloseFile
);
VOID
RdrInvalidateFileId(
IN PNONPAGED_FCB Fcb,
IN USHORT FileId
);
VOID
RdrCountConnectionFiles(
IN PCONNECTLISTENTRY Connection,
OUT PULONG ConnectionCount,
OUT PULONG OpenFileCount,
OUT PULONG DirectoryCount
);
VOID
RdrCountFcbFiles(
IN PFCB Fcb,
OUT PULONG ConnectionCount,
OUT PULONG OpenFileCount,
OUT PULONG DirectoryCount
);
BOOLEAN
RdrAcquireFcbLock(
IN PFCB Fcb,
IN FCB_LOCK_TYPE LockType,
IN BOOLEAN WaitForLock
);
#if 0
VOID
RdrReleaseFcbLock (
IN PFCB Fcb
);
VOID
RdrReleaseFcbLockForThread (
IN PFCB Fcb,
IN ERESOURCE_THREAD Thread
);
#endif
PFCB
RdrFindOplockedFcb(
IN USHORT FileId,
IN PSERVERLISTENTRY Server
);
NTSTATUS
RdrCheckShareAccess(
IN ACCESS_MASK DesiredAccess,
IN USHORT ShareAccess,
IN PFILE_OBJECT FileObject,
IN PSHARE_ACCESS IoShareAccess
);
VOID
RdrRemoveShareAccess(
IN PFILE_OBJECT FileObject,
IN PSHARE_ACCESS IoShareAccess
);
VOID
RdrRealAcquireSize(
IN PFCB Fcb
);
VOID
RdrRealReleaseSize(
IN PFCB Fcb
);
VOID
RdrpInitializeFcb (
VOID
);
VOID
RdrpUninitializeFcb (
VOID
);
//
//
// In LOCK.C
//
NTSTATUS
RdrUnlockAll (
IN PFS_DEVICE_OBJECT DeviceObject,
IN PFILE_OBJECT FileObject
);
NTSTATUS
RdrUnlockFileLocks(
IN PFCB Fcb,
IN PUNICODE_STRING DeviceName OPTIONAL
);
PLCB
RdrFindLcb (
IN PLOCKHEAD LockHead,
IN LARGE_INTEGER ByteOffset,
IN ULONG Length,
IN ULONG Key
);
PLCB
RdrAllocateLcb (
IN PLOCKHEAD LockHead,
IN LARGE_INTEGER ByteOffset,
IN ULONG Length,
IN ULONG Key
);
VOID
RdrFreeLcb (
PLOCKHEAD LockHead,
PLCB Lcb
);
VOID
RdrRemoveLock (
IN PLOCKHEAD LockHead,
IN PLCB Lcb
);
VOID
RdrInsertLock (
IN PLOCKHEAD LockHead,
IN PLCB Lcb
);
#define RdrInitializeLockHead( _LockHead ) { \
dprintf(DPRT_FILELOCK, ("RdrInitializeLockHead %lx\n", (_LockHead))); \
InitializeListHead(&(_LockHead)->LockList); \
(_LockHead)->Signature = STRUCTURE_SIGNATURE_LOCKHEAD; \
(_LockHead)->QuotaAvailable = RdrData.LockAndReadQuota; \
}
VOID
RdrUninitializeLockHead (
IN PLOCKHEAD LockHead
);
VOID
RdrTruncateLockHeadForFcb (
IN PFCB Fcb
);
VOID
RdrTruncateLockHeadForIcb (
IN PICB Icb
);
NTSTATUS
RdrLockOperationCompletion (
IN PVOID Context,
IN PIRP Irp
);
VOID
RdrUnlockOperation (
IN PVOID Context,
IN PFILE_LOCK_INFO FileLockInfo
);
VOID
RdrStartAndXBehindOperation(
IN PAND_X_BEHIND AndXBehind
);
VOID
RdrEndAndXBehindOperation(
IN PAND_X_BEHIND AndXBehind
);
VOID
RdrWaitForAndXBehindOperation(
IN PAND_X_BEHIND AndXBehind
);
VOID
RdrInitializeAndXBehind(
IN PAND_X_BEHIND AndXBehind
);
#define RdrpInitializeLockHead( ) KeInitializeSpinLock(&RdrLockHeadSpinLock)
#define RdrpUninitializeLockHead( )
//
// In NETTRANS.C
//
NTSTATUS
RdrNetTranceive(
IN ULONG Flags,
IN PIRP Irp OPTIONAL,
IN PCONNECTLISTENTRY CLE,
IN PMDL SendMDL,
OUT PMDL ReceiveMDL,
IN PSECURITY_ENTRY Se
);
NTSTATUS
RdrNetTranceiveWithCallback (
IN ULONG Flags,
IN PIRP Irp OPTIONAL,
IN PCONNECTLISTENTRY Connection,
IN PMDL SendMDL,
IN PVOID ContextInformation,
IN PNETTRANCEIVE_CALLBACK IoCallback,
IN PSECURITY_ENTRY Se,
IN OUT PMPX_ENTRY *pMTE OPTIONAL
);
NTSTATUS
RdrNetTranceiveNoWait (
IN ULONG Flags,
IN PIRP Irp OPTIONAL,
IN PCONNECTLISTENTRY Connection,
IN PMDL SendMDL,
IN PVOID ContextInformation OPTIONAL,
IN PNETTRANCEIVE_CALLBACK IoCallback,
IN PSECURITY_ENTRY Se,
IN OUT PMPX_ENTRY *pMTE OPTIONAL
);
NTSTATUS
RdrRawTranceive (
IN ULONG Flags,
IN PIRP Irp OPTIONAL,
IN PCONNECTLISTENTRY Connection,
IN PSECURITY_ENTRY Se,
IN PMDL SendMDL,
OUT PMDL ReceiveMDL,
OUT PULONG BytesReceived
);
NTSTATUS
RdrStartTranceive (
IN PIRP Irp OPTIONAL,
IN PCONNECTLISTENTRY Cle,
IN PSECURITY_ENTRY Se,
IN BOOLEAN AllowReconnection,
IN BOOLEAN Reconnecting,
IN ULONG LongtermOperation,
IN BOOLEAN CannotBeCanceled,
OUT PMPX_ENTRY *pMte,
IN ULONG TransferSize
);
NTSTATUS
RdrWaitTranceive (
IN PMPX_ENTRY MpxEntry
);
VOID
RdrEndTranceive (
IN PMPX_ENTRY MTE
);
VOID
RdrCancelTranceive(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
VOID
RdrAbandonOutstandingRequests(
IN PFILE_OBJECT FileObject
);
VOID
RdrSetCallbackTranceive(
PMPX_ENTRY MpxEntry,
ULONG StartTime,
PNETTRANCEIVE_CALLBACK Callback
);
NTSTATUS
RdrCallbackTranceive(
IN PMPX_ENTRY MpxTableEntry,
IN PSMB_HEADER Smb,
IN OUT PULONG SmbLength,
IN PVOID Context,
IN PSERVERLISTENTRY Sle,
IN BOOLEAN Error,
IN NTSTATUS ErrorStatus,
OUT PIRP *Irp,
IN ULONG ReceiveFlags
);
NTSTATUS
RdrSendSMB(
IN ULONG Flags,
PCONNECTLISTENTRY Connection,
PSECURITY_ENTRY Se,
PMPX_ENTRY MpxTable,
PMDL SendSMB
);
NTSTATUS
RdrStartReceiveForMpxEntry (
IN PMPX_ENTRY MpxTableEntry,
IN PIRP ReceiveIrp
);
NTSTATUS
RdrCompleteReceiveForMpxEntry (
IN PMPX_ENTRY MpxTableEntry,
IN PIRP ReceiveIrp
);
NTSTATUS
RdrStartReceiveForMpxEntry (
IN PMPX_ENTRY MpxTableEntry,
IN PIRP ReceiveIrp
);
NTSTATUS
RdrCompleteReceiveForMpxEntry (
IN PMPX_ENTRY MpxTableEntry,
IN PIRP ReceiveIrp
);
NTSTATUS
RdrTdiReceiveHandler (
IN PVOID ReceiveEventContext,
IN PVOID ConnectionContext,
IN USHORT ReceiveFlags,
IN ULONG BytesIndicated,
IN ULONG BytesAvailable,
OUT PULONG BytesTaken,
IN PVOID Tsdu,
OUT PIRP *IoRequestPacket
);
NTSTATUS
RdrTdiDisconnectHandler (
IN PVOID EventContext,
IN PVOID ConnectionContext,
IN ULONG DisconnectDataLength,
IN PVOID DisconnectData,
IN ULONG DisconnectInformationLength,
IN PVOID DisconnectInformation,
IN ULONG DisconnectFlags
);
VOID
RdrQueueServerDisconnection(
PSERVERLISTENTRY Server,
NTSTATUS Status
);
VOID
RdrCancelOutstandingRequests(
IN PVOID Ctx
);
BOOLEAN
RdrCheckSmb(
IN PSERVERLISTENTRY Server,
IN PVOID Buffer,
IN ULONG BufferLength
);
NTSTATUS
RdrUpdateSmbExchangeForConnection(
IN PSERVERLISTENTRY Server,
IN ULONG NumberOfEntries,
IN ULONG MaximumCommands
);
VOID
RdrUninitializeSmbExchangeForConnection(
IN PSERVERLISTENTRY Server
);
NTSTATUS
RdrpInitializeSmbExchange (
VOID
);
#define RdrpUninitializeSmbExchange( )
VOID
RdrPingLongtermOperations(
VOID
);
VOID
RdrMarkIrpAsNonCanceled(
IN PIRP Irp
);
VOID
RdrCheckForSessionOrShareDeletion(
NTSTATUS Status,
USHORT Uid,
BOOLEAN Reconnecting,
PCONNECTLISTENTRY Connection,
PTRANCEIVE_HEADER Header,
PIRP Irp OPTIONAL
);
//
// In NPIPE.C
//
#define RdrInitializeNp( )
#define RdrpUninitializeNp( )
NTSTATUS
RdrNpPeek (
IN BOOLEAN Wait,
IN BOOLEAN InFsd,
IN PIRP Irp,
IN PICB Icb,
IN PVOID OutputBuffer,
IN OUT PULONG OutputBufferLength
);
NTSTATUS
RdrNpTransceive (
IN BOOLEAN Wait,
IN BOOLEAN InFsd,
IN PIRP Irp,
IN PICB Icb,
IN PVOID InputBuffer,
IN ULONG InputBufferLength,
OUT PVOID OutputBuffer,
IN OUT PULONG OutputBufferLength
);
NTSTATUS
RdrNpWait (
IN BOOLEAN Wait,
IN BOOLEAN InFsd,
IN PIRP Irp,
IN PICB Icb,
IN PVOID InputBuffer,
IN ULONG InputBufferLength
);
BOOLEAN
RdrQueryNpInfo(
PICB Icb,
PVOID UsersBuffer,
PULONG BufferSize,
PNTSTATUS FinalStatus
);
BOOLEAN
RdrQueryNpLocalInfo(
PIRP Irp,
PICB Icb,
PVOID UsersBuffer,
PULONG BufferSize,
PNTSTATUS FinalStatus,
BOOLEAN Wait
);
BOOLEAN
RdrQueryNpRemoteInfo(
PICB Icb,
PVOID UsersBuffer,
PULONG BufferSize,
PNTSTATUS FinalStatus
);
BOOLEAN
RdrSetNpInfo(
PIRP Irp,
PICB Icb,
PVOID UsersBuffer,
ULONG BufferSize,
PNTSTATUS FinalStatus,
BOOLEAN Wait
);
BOOLEAN
RdrSetNpRemoteInfo(
PICB Icb,
PVOID UsersBuffer,
ULONG BufferSize,
PNTSTATUS FinalStatus
);
NTSTATUS
RdrNpFlushBuffers (
IN BOOLEAN Wait,
PIRP Irp,
PICB Icb
);
NTSTATUS
RdrNpCachedRead (
IN BOOLEAN Wait,
IN BOOLEAN InFsd,
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp,
OUT PBOOLEAN Processed,
OUT PULONG TotalDataRead
);
NTSTATUS
RdrNpCachedWrite (
IN BOOLEAN Wait,
IN BOOLEAN InFsd,
IN PFS_DEVICE_OBJECT DeviceObject,
IN PIRP Irp,
OUT PBOOLEAN Processed
);
NTSTATUS
RdrNpWriteFlush (
IN PIRP Irp,
IN PICB Icb,
IN BOOLEAN Forever
);
BOOLEAN
RdrNpCancelTimer (
IN PICB Icb
);
VOID
RdrNpTimerDispatch(
IN PKDPC Dpc,
IN PVOID Contxt,
IN PVOID SystemArgument1,
IN PVOID SystemArgument2
);
VOID
RdrNpTimedOut(
PVOID Context
);
DBGSTATIC
BOOLEAN
RdrNpAcquireExclusive (
IN BOOLEAN Wait,
IN PKSEMAPHORE SynchronizationEvent
);
#define RdrNpRelease( _Semaphore ) { \
dprintf(DPRT_NP, ("RdrNpRelease: %lx\n", (_Semaphore))); \
KeReleaseSemaphore( (_Semaphore), 0, 1, FALSE ); \
}
//
// In OPLOCK.C
//
STANDARD_CALLBACK_HEADER(
RdrBreakOplockCallback
);
VOID
RdrQueueOplockBreak(
IN USHORT FileId,
IN PSERVERLISTENTRY Server,
IN UCHAR NewOplockLevel
);
VOID
RdrCheckOplockInRaw(
IN PMDL Mdl,
IN PSERVERLISTENTRY Sle,
IN OUT PULONG ByteCount
);
NTSTATUS
RdrFlushFileLocks(
IN PFCB Fcb
);
//
// In PRINT.C
//
typedef
NTSTATUS
(*PWRITE_COMPLETION_ROUTINE) (
IN NTSTATUS Status, // Status of operation from transport|server
IN PVOID Context // Context for write completion.
);
NTSTATUS
RdrCreatePrintFile (
IN PICB Icb,
IN PIRP Irp
);
NTSTATUS
RdrWritePrintFile(
IN PIRP Irp OPTIONAL,
IN PFILE_OBJECT FileObject,
IN PMDL DataMdl,
IN PCHAR TransferStart,
IN ULONG Length,
IN BOOLEAN WaitForCompletion,
IN PWRITE_COMPLETION_ROUTINE CompletionRoutine,
IN PVOID CompletionContext,
OUT PBOOLEAN AllDataWritten,
OUT PULONG AmountActuallyWritten
);
NTSTATUS
RdrEnumPrintFile (
IN PICB Icb,
IN PIRP Irp,
IN ULONG Index,
OUT PLMR_GET_PRINT_QUEUE UserBuffer
);
NTSTATUS
RdrGetPrintJobId (
IN PICB Icb,
IN PIRP Irp,
OUT PQUERY_PRINT_JOB_INFO Buffer
);
//
// In RITEBHND.C
//
VOID
RdrInitializeWriteBufferHead(
IN PWRITE_BUFFER_HEAD WriteHeader,
IN PFILE_OBJECT FileObject
);
VOID
RdrUninitializeWriteBufferHead(
IN PWRITE_BUFFER_HEAD WriteHeader
);
PWRITE_BUFFER
RdrFindOrAllocateWriteBuffer(
IN PWRITE_BUFFER_HEAD WriteHeader,
IN LARGE_INTEGER ByteOffset,
IN ULONG Length,
IN LARGE_INTEGER FileValidDataLength
);
VOID
RdrDereferenceWriteBuffer(
IN PWRITE_BUFFER WriteBuffer,
IN BOOLEAN WaitForCompletion
);
NTSTATUS
RdrFlushWriteBuffer(
IN PIRP Irp OPTIONAL,
IN PWRITE_BUFFER Buffer,
IN BOOLEAN WaitForCompletion
);
NTSTATUS
RdrFlushWriteBufferForFile(
IN PIRP Irp OPTIONAL,
IN PICB Icb,
IN BOOLEAN WaitForCompletion
);
VOID
RdrTruncateWriteBufferForFcb(
IN PFCB Fcb
);
VOID
RdrTruncateWriteBufferForIcb(
IN PICB Icb
);
#define RdrWaitForWriteBehindOperation( _Icb ) \
RdrWaitForAndXBehindOperation(&(_Icb)->u.f.WriteBufferHead.AndXBehind)
//
// In READWRIT.C
//
NTSTATUS
RdrCoreWrite (
IN PIRP Irp,
IN PFILE_OBJECT FileObject,
IN PMDL DataMdl,
IN PCHAR TransferStart,
IN ULONG Length,
IN LARGE_INTEGER WriteOffset,
IN BOOLEAN WaitForCompletion,
IN PWRITE_COMPLETION_ROUTINE CompletionRoutine,
IN PVOID CompletionContext,
OUT PBOOLEAN AllDataWritten,
OUT PULONG AmountActuallyWritten
);
NTSTATUS
RdrWriteRange (
IN PIRP Irp OPTIONAL,
IN PFILE_OBJECT FileObject,
IN PMDL DataMdl,
IN PCHAR TransferStart,
IN ULONG Length,
IN LARGE_INTEGER WriteOffset,
IN BOOLEAN WaitForCompletion,
IN PWRITE_COMPLETION_ROUTINE CompletionRoutine,
IN PVOID CompletionContext,
OUT PBOOLEAN AllDataWritten,
OUT PULONG AmountActuallyWritten
);
VOID
RdrSetAllocationSizeToFileSize(
IN PFCB Fcb,
IN LARGE_INTEGER FileSize
);
LARGE_INTEGER
RdrSetFileSize(
IN PFCB Fcb,
IN LARGE_INTEGER FileSize
);
//
// In MAILSLOT.C
//
NTSTATUS
RdrMailslotWrite (
IN BOOLEAN Wait,
IN BOOLEAN InFsd,
IN PICB Icb,
IN PIRP Irp,
OUT PBOOLEAN PostToFsp
);
//
// In SECURITY.C
//
#ifdef _CAIRO_
NTSTATUS
RdrGetKerberosBlob(
IN PSECURITY_ENTRY Se,
OUT PUCHAR *Response,
OUT ULONG *Length,
IN PUNICODE_STRING Principal,
IN PUCHAR RemoteBlob,
IN ULONG RemoteBlobLength,
IN BOOLEAN Allocate
);
BOOL
RdrCleanSecurityContexts(
IN PSECURITY_ENTRY Se
);
#endif // _CAIRO_
NTSTATUS
RdrCreateSecurityEntry(
IN PCONNECTLISTENTRY Cle,
IN PUNICODE_STRING UserName OPTIONAL,
IN PUNICODE_STRING Password OPTIONAL,
IN PUNICODE_STRING Domain OPTIONAL,
IN PLUID LogonId OPTIONAL,
OUT PSECURITY_ENTRY *Se
);
BOOLEAN
RdrIsSecurityEntryEqual(
IN PSECURITY_ENTRY Se,
IN PUNICODE_STRING UserName OPTIONAL,
IN PUNICODE_STRING Domain OPTIONAL,
IN PUNICODE_STRING Password OPTIONAL
);
PSECURITY_ENTRY
RdrFindSecurityEntry (
IN PCONNECTLISTENTRY Cle OPTIONAL,
IN PSERVERLISTENTRY Server OPTIONAL,
IN PLUID LogonId OPTIONAL,
IN PUNICODE_STRING Password OPTIONAL
);
PSECURITY_ENTRY
RdrFindActiveSecurityEntry (
IN PSERVERLISTENTRY Server OPTIONAL,
IN PLUID LogonId OPTIONAL
);
PSECURITY_ENTRY
RdrFindDefaultSecurityEntry(
IN PCONNECTLISTENTRY Connection,
IN PLUID LogonId
);
NTSTATUS
RdrSetDefaultSecurityEntry(
IN PCONNECTLISTENTRY Connection,
IN PSECURITY_ENTRY Se
);
VOID
RdrUnsetDefaultSecurityEntry(
IN PSECURITY_ENTRY Se
);
VOID
RdrSetPotentialSecurityEntry(
IN PSERVERLISTENTRY Connection,
IN PSECURITY_ENTRY Se
);
VOID
RdrRemovePotentialSecurityEntry(
IN PSECURITY_ENTRY Se
);
USHORT
RdrGetNumberSessions (
IN PSERVERLISTENTRY Server OPTIONAL
);
VOID
RdrInsertSecurityEntryList (
IN PSERVERLISTENTRY Server,
IN PSECURITY_ENTRY Se
);
NTSTATUS
RdrGetUserName(
IN PLUID LogonId,
OUT PUNICODE_STRING UserName
);
NTSTATUS
RdrGetDomain (
IN PLUID LogonId,
OUT PUNICODE_STRING Domain
);
VOID
RdrGetUnicodeDomainName(
IN OUT PUNICODE_STRING String,
IN PSECURITY_ENTRY Se
);
NTSTATUS
RdrGetChallengeResponse (
IN PUCHAR Challenge,
IN PSECURITY_ENTRY Se,
OUT PSTRING CaseSensitiveChallengeResponse OPTIONAL,
OUT PSTRING CaseInsensitiveChallengeResponse OPTIONAL,
OUT PUNICODE_STRING UserName OPTIONAL,
OUT PUNICODE_STRING LogonDomainName OPTIONAL,
IN BOOLEAN DisableDefaultPassword
);
NTSTATUS
RdrCopyUserName(
IN PSZ *Pointer,
IN PSECURITY_ENTRY Se
);
NTSTATUS
RdrCopyUnicodeUserName(
IN PWSTR *Pointer,
IN PSECURITY_ENTRY Se
);
BOOLEAN
RdrAdminAccessCheck(
IN PIRP Irp,
IN PIO_SECURITY_CONTEXT SecurityContext OPTIONAL
);
NTSTATUS
RdrGetUsersLogonId (
IN PIO_SECURITY_CONTEXT SecurityContext,
OUT PLUID LogonId
);
VOID
RdrDereferenceSecurityEntry (
IN PNONPAGED_SECURITY_ENTRY Se
);
VOID
RdrReferenceSecurityEntry (
IN PNONPAGED_SECURITY_ENTRY Se
);
VOID
RdrDereferenceSecurityEntryForFile (
IN PSECURITY_ENTRY Se
);
VOID
RdrReferenceSecurityEntryForFile (
IN PSECURITY_ENTRY Se
);
VOID
RdrInvalidateServerSecurityEntries(
IN PIRP Irp OPTIONAL,
IN PCONNECTLISTENTRY Cle,
IN BOOLEAN LogOffUser
);
VOID
RdrInvalidateConnectionActiveSecurityEntries(
IN PIRP Irp,
IN PSERVERLISTENTRY Server,
IN PCONNECTLISTENTRY Cle,
IN BOOLEAN LogOffUser,
IN USHORT UserId OPTIONAL
);
VOID
RdrInvalidateConnectionPotentialSecurityEntries(
IN PSERVERLISTENTRY Server
);
NTSTATUS
RdrpInitializeSecurity (
VOID
);
NTSTATUS
RdrpUninitializeSecurity (
VOID
);
#define RdrUnloadSecurity( ) ASSERT (IsListEmpty(&RdrGlobalSecurityList))
NTSTATUS
RdrLogoffDefaultSecurityEntry(
IN PIRP Irp,
IN PCONNECTLISTENTRY Connection,
IN PSERVERLISTENTRY Server,
IN PLUID LogonId
);
NTSTATUS
RdrLogoffAllDefaultSecurityEntry(
IN PIRP Irp,
IN PCONNECTLISTENTRY Connection,
IN PSERVERLISTENTRY Server
);
NTSTATUS
RdrUserLogoff (
IN PIRP Irp OPTIONAL,
IN PCONNECTLISTENTRY Connection,
IN PSECURITY_ENTRY Se
);
//
// String definitions, in STRING.C
//
NTSTATUS
RdrpDuplicateStringWithString (
OUT PSTRING DestinationString,
IN PSTRING SourceString,
IN POOL_TYPE PoolType,
IN BOOLEAN ChargeQuota
);
NTSTATUS
RdrpDuplicateUnicodeStringWithString (
OUT PUNICODE_STRING DestinationString,
IN PUNICODE_STRING SourceString,
IN POOL_TYPE PoolType,
IN BOOLEAN ChargeQuota
);
//
// TDI Interface routines - In TDI.C
//
NTSTATUS
RdrpTdiAllocateTransport (
PUNICODE_STRING TransportName,
ULONG QualityOfService
);
NTSTATUS
RdrRemoveConnectionsTransport(
IN PIRP Irp,
IN PTRANSPORT Transport,
IN ULONG ForceLevel
);
NTSTATUS
RdrUnbindFromAllTransports(
IN PIRP Irp
);
NTSTATUS
RdrDereferenceTransportByName (
IN PUNICODE_STRING TransportName
);
#define RdrReferenceTransport( _Transport ) { \
InterlockedIncrement(&(_Transport)->ReferenceCount); \
dprintf(DPRT_TRANSPORT, ("Reference transport %lx (%wZ), now at %lx\n", \
(_Transport), &(_Transport)->PagedTransport->TransportName, \
(_Transport)->ReferenceCount)); \
}
NTSTATUS
RdrDereferenceTransport (
IN PNONPAGED_TRANSPORT Transport
);
PTRANSPORT
RdrFindTransport (
PUNICODE_STRING TransportName
);
NTSTATUS
RdrEnumerateTransports(
IN BOOLEAN Wait,
IN PLMR_REQUEST_PACKET InputBuffer,
IN OUT PULONG InputBufferLength,
OUT PVOID OutputBuffer,
IN ULONG OutputBufferLength,
IN ULONG OutputBufferDisplacement
);
NTSTATUS
RdrReferenceTransportConnection(
// IN PTRANSPORT_CONNECTION Connection
IN PSERVERLISTENTRY Connection
);
NTSTATUS
RdrDereferenceTransportConnectionForThread(
// IN PTRANSPORT_CONNECTION Connection,
IN PSERVERLISTENTRY Server,
IN ERESOURCE_THREAD Thread
);
VOID
RdrSetConnectionFlag(
// IN PTRANSPORT_CONNECTION Connection,
IN PSERVERLISTENTRY Server,
IN ULONG Flag
);
VOID
RdrResetConnectionFlag(
// IN PTRANSPORT_CONNECTION Connection,
IN PSERVERLISTENTRY Server,
IN ULONG Flag
);
//NTSTATUS
//RdrAllocateAndSetTransportConnection(
// IN OUT PTRANSPORT_CONNECTION *OutConnection,
// IN PSERVERLISTENTRY Sle,
// OUT PBOOLEAN ConnectionAllocated
// );
NTSTATUS
RdrInitializeTransportConnection(
// IN PTRANSPORT_CONNECTION *TransportConnection,
IN PSERVERLISTENTRY Server
);
//VOID
//RdrDeleteTransportConnection (
// IN PTRANSPORT_CONNECTION Connection
// );
BOOLEAN
RdrNoTransportBindings (
VOID
);
NTSTATUS
RdrTdiConnectToServer (
IN PIRP Irp OPTIONAL,
IN PUNICODE_STRING ServerName,
// OUT PTRANSPORT_CONNECTION Connection
OUT PSERVERLISTENTRY Server
);
NTSTATUS
RdrTdiConnectOnTransport(
IN PIRP Irp,
IN PTRANSPORT Transport,
IN PUNICODE_STRING ServerName,
// OUT PTRANSPORT_CONNECTION Connection
OUT PSERVERLISTENTRY Server
);
NTSTATUS
RdrTdiDisconnect (
IN PIRP Irp OPTIONAL,
// IN PTRANSPORT_CONNECTION Connection
IN PSERVERLISTENTRY Server
);
NTSTATUS
RdrBuildNetbiosAddress (
OUT PTRANSPORT_ADDRESS TransportAddress,
IN ULONG TransportAddressLength,
IN PUNICODE_STRING Name
);
NTSTATUS
RdrBuildTransportAddress (
OUT PTRANSPORT_ADDRESS TransportAddress,
IN ULONG TransportAddressLength,
IN PUNICODE_STRING Name
);
NTSTATUS
RdrTdiSendDatagramOnAllTransports (
IN PUNICODE_STRING Destination,
IN CHAR SignatureByte,
IN PMDL DatagramToSend
);
NTSTATUS
RdrQueryConnectionInformation(
// IN PTRANSPORT_CONNECTION ConnectionObject
IN PSERVERLISTENTRY Server
);
NTSTATUS
RdrQueryServerAddresses(
IN PSERVERLISTENTRY Server,
OUT PUNICODE_STRING NBName,
OUT PTDI_ADDRESS_IP IPAddress
);
NTSTATUS
RdrSendMagicBullet (
IN PTRANSPORT Transport OPTIONAL
);
VOID
RdrpInitializeTdi (
VOID
);
#define RdrpUninitializeTdi( ) { \
ExDeleteResource( &RdrTransportResource ); \
ASSERT( IsListEmpty(&RdrTransportHead) ); \
}
//
// In TRANS2.C
//
NTSTATUS
RdrTransact(
IN PIRP Irp,
IN PCONNECTLISTENTRY PagedConnection,
IN PSECURITY_ENTRY Se,
IN OUT PVOID Setup,
IN CLONG InSetupCount,
IN OUT PCLONG OutSetupCount,
IN PUNICODE_STRING Name OPTIONAL,
IN OUT VOID UNALIGNED *Parameters,
IN CLONG InParameterCount,
IN OUT PCLONG OutParameterCount,
IN VOID UNALIGNED *InData OPTIONAL,
IN CLONG InDataCount,
OUT VOID UNALIGNED *OutData OPTIONAL,
IN OUT PCLONG OutDataCount,
IN PUSHORT Fid OPTIONAL,
IN ULONG TimeoutInMilliseconds,
IN USHORT Flags,
IN USHORT NtTransactionFunction,
IN PTRANSACTION_COMPLETION_ROUTINE CompletionRoutine OPTIONAL,
IN PVOID CallbackContext OPTIONAL
);
//
// Cache support routines, in CACHE.C
//
BOOLEAN
RdrAcquireFcbForLazyWrite (
IN PVOID Context,
IN BOOLEAN Wait
);
VOID
RdrReleaseFcbFromLazyWrite (
IN PVOID Context
);
BOOLEAN
RdrAcquireFcbForReadAhead (
IN PVOID Context,
IN BOOLEAN Wait
);
VOID
RdrReleaseFcbFromReadAhead (
IN PVOID Context
);
NTSTATUS
RdrFlushCacheFile(
IN PFCB Fcb
);
NTSTATUS
RdrPurgeCacheFile(
IN PFCB Fcb
);
BOOLEAN
RdrUninitializeCacheMap(
IN PFILE_OBJECT FileObject,
IN PLARGE_INTEGER TruncateSize
);
VOID
RdrPurgeDormantCachedFiles(
VOID
);
VOID
RdrSetDormantCachedFile(
IN PFCB Fcb
);
VOID
RdrPurgeDormantFilesOnConnection(
IN PCONNECTLISTENTRY Connection
);
VOID
RdrDereferenceDormantCachedFile(
IN PFCB Fcb
);
VOID
RdrReferenceDormantCachedFile(
IN PFCB Fcb
);
//
// In UTILS.C
//
//
// The following two procedures are used by the Fsd/Fsp exception handlers to
// process an exception. The first macro is the exception filter used in the
// Fsd/Fsp to decide if an exception should be handled at this level.
// The second macro decides if the exception is to be finished off by
// completing the IRP, and cleaning up the Irp Context, or if we should
// bugcheck. Exception values such as STATUS_FILE_INVALID (raised by
// RdrIsOperationValid) cause us to complete the Irp and cleanup, while
// exceptions such as access violation cause us to bugcheck.
//
// The basic structure for fsd/fsp exception handling is as follows:
//
// RdrFsdXxx(...)
// {
// try {
// NTSTATUS Status;
// ...
//
// } except(RdrExceptionFilter(GetExceptionInformation(), &Status)) {
//
// Status = RdrProcessException( Irp, Status);
// }
//
// Return Status;
// }
//
LONG
RdrExceptionFilter (
IN PEXCEPTION_POINTERS ExceptionPointer,
OUT PNTSTATUS TrueStatus
);
NTSTATUS
RdrProcessException (
IN PIRP Irp,
IN NTSTATUS ExceptionCode
);
VOID
RdrSmbScrounge (
PSMB_HEADER Smb,
PSERVERLISTENTRY Sle,
IN BOOLEAN DfsFile,
IN BOOLEAN KnowsEas,
IN BOOLEAN KnowsLongNames
);
NTSTATUS
RdrCopyNetworkPath(
IN OUT PVOID *Destination,
IN PUNICODE_STRING PathName,
IN PSERVERLISTENTRY Server,
IN CHAR CoreProtocol,
IN USHORT SkipCount
);
NTSTATUS
RdrCanonicalizeAndCopyShare (
OUT PVOID *SmbContents,
IN PUNICODE_STRING ServerName,
IN PUNICODE_STRING ShareName,
IN PSERVERLISTENTRY Server
);
VOID
RdrCopyUnicodeStringToUnicode (
OUT PVOID *Destination,
IN PUNICODE_STRING Source,
IN BOOLEAN AdjustPointer
);
NTSTATUS
RdrCopyUnicodeStringToAscii (
OUT PUCHAR *Destination,
IN PUNICODE_STRING Source,
IN BOOLEAN AdjustPointer,
IN USHORT MaxLength
);
LARGE_INTEGER
RdrConvertSmbTimeToTime(
IN SMB_TIME Time,
IN SMB_DATE Date,
IN PSERVERLISTENTRY Sle
);
BOOLEAN
RdrConvertTimeToSmbTime (
IN PLARGE_INTEGER InputTime,
IN PSERVERLISTENTRY Sle,
OUT PSMB_TIME Time,
OUT PSMB_DATE Date
);
BOOLEAN
RdrTimeToSecondsSince1970(
IN PLARGE_INTEGER CurrentTime,
IN PSERVERLISTENTRY Sle,
OUT PULONG SecondsSince1970
);
VOID
RdrSecondsSince1970ToTime(
IN ULONG SecondsSince1970,
IN PSERVERLISTENTRY Sle,
OUT PLARGE_INTEGER CurrentTime
);
BOOLEAN
RdrIsFileBatch(
IN PUNICODE_STRING FileName
);
BOOLEAN
RdrFastQueryBasicInfo (
IN PFILE_OBJECT FileObject,
IN BOOLEAN Wait,
IN OUT PFILE_BASIC_INFORMATION Buffer,
OUT PIO_STATUS_BLOCK IoStatus,
IN PDEVICE_OBJECT DeviceObject
);
BOOLEAN
RdrFastQueryStdInfo (
IN PFILE_OBJECT FileObject,
IN BOOLEAN Wait,
IN OUT PFILE_STANDARD_INFORMATION Buffer,
OUT PIO_STATUS_BLOCK IoStatus,
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
RdrQueryNtFileInformation(
IN PIRP Irp,
IN PICB Icb,
IN USHORT FileInformationClass,
IN OUT PVOID Buffer,
IN OUT PULONG BufferSize
);
NTSTATUS
RdrQueryNtPathInformation(
IN PIRP Irp,
IN PICB Icb,
IN USHORT FileInformationClass,
IN OUT PVOID Buffer,
IN OUT PULONG BufferSize
);
ULONG
RdrNumberOfComponents(
IN PUNICODE_STRING String
);
#ifdef RDR_PNP_POWER
NTSTATUS
RdrRegisterForPnpNotifications(
);
NTSTATUS
RdrDeRegisterForPnpNotifications(
);
#endif
#endif