Leaked source code of windows server 2003
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.
 
 
 
 
 
 

1243 lines
25 KiB

/*++
Copyright (c) 1996-1997 Microsoft Corporation
Module Name:
clusdskp.h
Abstract:
Private header file for the cluster disk driver.
Authors:
Rod Gamache 30-Mar-1997
Environment:
kernel mode only
Notes:
Revision History:
--*/
#define _NTDDK_ // [HACKHACK] to make ProbeForRead work. Better to include ntddk instead of ntos //
#include "ntos.h"
#include "zwapi.h"
#include "stdarg.h"
#include "stdio.h"
#include "ntddscsi.h"
#include "ntdddisk.h"
#include "clusdef.h"
#if 1 // turn on tagging all the time
#ifdef ExAllocatePool
#undef ExAllocatePool
#endif
#define ExAllocatePool(a,b) ExAllocatePoolWithTag(a,b,'kdSC')
#endif
//
// Global definitions
//
#define CLUSDISK_ROOT_DEVICE L"\\Device\\ClusDisk0"
#define CLUSDISK_SIGNATURE_DISK_NAME L"DiskName"
#define CLUSDISK_SIGNATURE_FIELD L"\\12345678"
#define CLUSDISK_PARAMETERS_KEYNAME L"\\Parameters"
#define CLUSDISK_SIGNATURE_KEYNAME L"\\Signatures"
#define CLUSDISK_AVAILABLE_DISKS_KEYNAME L"\\AvailableDisks"
#define CLUSDISK_SINGLE_BUS_KEYNAME L"SingleBus"
#define CLUSSVC_VALUENAME_MANAGEDISKSONSYSTEMBUSES L"ManageDisksOnSystemBuses"
#define ID_CLEANUP ' nlC'
#define ID_CLEANUP_DEV_OBJ 'OnlC'
#define ID_CLUSTER_RESET_IOCTL 'tsRI'
#define ID_RESET ' tsR'
#define ID_CLUSTER_ARB_RESET 'tsRA'
#define ID_RESET_BUSSES 'BtsR'
#define ID_GET_PARTITION 'traP'
#define ID_GET_GEOMETRY 'moeG'
#define UNINITIALIZED_DISK_NUMBER (ULONG)-1
#define MAX_BUSSES 20 // Maximum number of shared busses
#define MAX_BUFFER_SIZE 256 // Maximum buffer size
#define MAX_RETRIES 2
//
// KeEnterCriticalRegion is required if resource
// acquisition is done at a PASSIVE level in the context
// of non-kernel thread.
//
// KeEnterCriticalRegion() == KeGetCurrentThread()->KernelApcDisable -= 1;
//
// guarantees that the thread in which we execute cannot get
// suspeneded in APC while we own the global resource.
//
#define ACQUIRE_EXCLUSIVE( _lock ) \
do { KeEnterCriticalRegion();ExAcquireResourceExclusiveLite(_lock, TRUE); } while(0)
#define ACQUIRE_SHARED( _lock ) \
do { KeEnterCriticalRegion();ExAcquireResourceSharedLite(_lock, TRUE); } while(0)
#define RELEASE_EXCLUSIVE( _lock ) \
do { ExReleaseResourceLite( _lock );KeLeaveCriticalRegion(); } while(0)
#define RELEASE_SHARED( _lock ) \
do { ExReleaseResourceLite( _lock );KeLeaveCriticalRegion(); } while(0)
// #define RESERVE_TIMER 3 // [GN] moved to cluster\inc\diskarbp.h
#if DBG
#define ClusDiskPrint(x) ClusDiskDebugPrint x
#define WCSLEN_ASSERT( _buf ) ( wcslen( _buf ) < (sizeof( _buf ) / sizeof( WCHAR )))
#else
#define ClusDiskPrint(x)
#define WCSLEN_ASSERT( _buf )
#endif // DBG
//
// Error log messages
//
#define CLUSDISK_BAD_DEVICE L"Skipping device. Possible filter driver installed!"
//
// Macros
#define IsAlpha( c ) \
( ((c) >= 'a' && (c) <= 'z') || ((c) >='A' && (c) <= 'Z') )
//
// Device Extension
//
typedef struct _CLUS_DEVICE_EXTENSION {
//
// Back pointer to this extension's device object
//
PDEVICE_OBJECT DeviceObject;
//
// device object to which clusdisk's device obj is attached
//
PDEVICE_OBJECT TargetDeviceObject;
//
// back ptr to clusdisk Partition0 Device Object
//
PDEVICE_OBJECT PhysicalDevice;
//
// The SCSI_ADDRESS for this device
//
SCSI_ADDRESS ScsiAddress;
//
// Disk signature
//
ULONG Signature;
//
// Disk number for reference on verifying attach
//
ULONG DiskNumber;
//
// Disk State. This is only maintained in the physical or partition
// zero extension.
//
ULONG DiskState;
//
// Reservation timer - valid on the physical (partition0) extension
//
ULONG ReserveTimer;
//
// Time last reserve started. Not protected by a lock as only one
// routine ever updates this value.
//
LARGE_INTEGER LastReserveStart;
//
// Event flag for use with reservation IRP.
// Use is controlled by the TimerBusy flag.
//
KEVENT Event;
//
// The bus type. E.G. Scsi, SSA, etc.
//
ULONG BusType;
//
// Last reserve failure.
//
NTSTATUS ReserveFailure;
//
// Waiting IOCTL's looking for Reserve Failure notification.
//
LIST_ENTRY WaitingIoctls;
//
// Work queue item context.
//
WORK_QUEUE_ITEM WorkItem;
//
// Reservation time IRP
//
BOOLEAN PerformReserves;
//
// Work queue item busy.
//
BOOLEAN TimerBusy;
//
// Attached state. True if this device object is supposed to be
// attached. False if not sure.
//
BOOLEAN AttachValid;
//
// Device is detached.
//
BOOLEAN Detached;
//
// Flag to indicate offline/terminate is in process.
//
BOOLEAN OfflinePending;
//
// The driver object for use on repartitioning. RNGFIX -???
//
PDRIVER_OBJECT DriverObject;
//
// The partition number for the last extension created
// only maintained in the physical or partition zero extension.
//
ULONG LastPartitionNumber;
//
// context value for when we deregister from disk device
// notifications
//
PVOID DiskNotificationEntry;
//
// context value for when we deregister from mounted device
// notifications
//
PVOID VolumeNotificationEntry;
// [GN]
// Physical Sector Size of the device
// If SectorSize == 0 then
// persistent writing is disabled
ULONG SectorSize;
//
// Physical Sector which is used
// for persistent reservations.
ULONG ArbitrationSector;
//
// For tracing purposes:
// Approximate time of the last write to
// the disk. (Approximate, because we
// update this field without holding any locks)
//
LARGE_INTEGER LastWriteTime;
//
// P0 object stores an array of handles to all volumes on
// this disk to be dismounted when offline happens
// First entry in this array is a number of handles in the array
//
PHANDLE VolumeHandles;
//
// Lock to prevent removal while I/O in progress.
//
IO_REMOVE_LOCK RemoveLock;
//
// Keep track of paging files, crash dump files, and hibernation files.
//
KEVENT PagingPathCountEvent;
ULONG PagingPathCount;
ULONG HibernationPathCount;
ULONG DumpPathCount;
//
// Cache partition info when possible.
//
PDRIVE_LAYOUT_INFORMATION_EX DriveLayout;
ULONG DriveLayoutSize;
ERESOURCE DriveLayoutLock;
//
// Number of arbitration writes and reserves in progress.
//
LONG ArbWriteCount;
LONG ReserveCount;
//
// Time when the last reserve successfully completed.
// Protected by ReserveInfoLock as this value could be updated
// by multiple threads.
//
LARGE_INTEGER LastReserveEnd;
//
// Lock to control access to LastReserveEnd
//
ERESOURCE ReserveInfoLock;
} CLUS_DEVICE_EXTENSION, *PCLUS_DEVICE_EXTENSION;
#define DEVICE_EXTENSION_SIZE sizeof(CLUS_DEVICE_EXTENSION)
//
// Device list entry
//
typedef struct _DEVICE_LIST_ENTRY {
struct _DEVICE_LIST_ENTRY *Next;
ULONG Signature;
PDEVICE_OBJECT DeviceObject;
BOOLEAN Attached;
BOOLEAN LettersAssigned;
BOOLEAN FreePool;
} DEVICE_LIST_ENTRY, *PDEVICE_LIST_ENTRY;
typedef struct _SCSI_BUS_ENTRY {
struct _SCSI_BUS_ENTRY *Next;
UCHAR Port;
UCHAR Path;
USHORT Reserved;
} SCSI_BUS_ENTRY, *PSCSI_BUS_ENTRY;
typedef enum _ClusterBusType {
RootBus,
ScsiBus,
UnknownBus
} ClusterBusType;
typedef struct _WORK_CONTEXT {
LIST_ENTRY ListEntry;
PDEVICE_OBJECT DeviceObject;
KEVENT CompletionEvent;
NTSTATUS FinalStatus;
PVOID Context;
PIO_WORKITEM WorkItem;
} WORK_CONTEXT, *PWORK_CONTEXT;
//
// Flags for ClusDiskpReplaceHandleArray
//
enum {
DO_DISMOUNT = 0x00000001,
RELEASE_REMOVE_LOCK = 0x00000002,
CLEANUP_STORAGE = 0x00000004,
SET_PART0_EVENT = 0x00000008,
};
typedef struct _REPLACE_CONTEXT {
PCLUS_DEVICE_EXTENSION DeviceExtension;
PHANDLE NewValue; // OPTIONAL
PHANDLE OldValue;
PKEVENT Part0Event;
ULONG Flags;
} REPLACE_CONTEXT, *PREPLACE_CONTEXT;
typedef struct _HALTPROC_CONTEXT {
PCLUS_DEVICE_EXTENSION DeviceExtension;
PHANDLE FileHandle;
} HALTPROC_CONTEXT, *PHALTPROC_CONTEXT;
typedef struct _VOL_STATE_INFO {
PIO_WORKITEM WorkItem;
ULONG NewDiskState;
} VOL_STATE_INFO, *PVOL_STATE_INFO;
typedef struct _DEVICE_CHANGE_CONTEXT {
PIO_WORKITEM WorkItem;
PCLUS_DEVICE_EXTENSION DeviceExtension;
UNICODE_STRING SymbolicLinkName;
ULONG Signature;
ULONG DeviceNumber;
ULONG PartitionNumber;
SCSI_ADDRESS ScsiAddress;
} DEVICE_CHANGE_CONTEXT, *PDEVICE_CHANGE_CONTEXT;
//
// Structure for offline to preserve snapshots.
//
typedef struct _OFFLINE_ENTRY {
ULONG DiskNumber;
ULONG PartitionNumber;
BOOLEAN OfflineSent;
struct _OFFLINE_ENTRY * Next;
} OFFLINE_ENTRY, *POFFLINE_ENTRY;
//
// Structure to offline disk in sync thread instead of using
// worker thread (async).
//
typedef struct _OFFLINE_DISK_ENTRY {
PCLUS_DEVICE_EXTENSION DeviceExtension;
struct _OFFLINE_DISK_ENTRY * Next;
} OFFLINE_DISK_ENTRY, *POFFLINE_DISK_ENTRY;
//
// Info for synchronous reserves and arbitration
//
typedef NTSTATUS ( * ArbFunction)( IN PCLUS_DEVICE_EXTENSION DeviceExtenion,
IN PVOID Context );
typedef enum _ArbIoType {
ArbIoWrite,
ArbIoReserve,
ArbIoInvalid
} ArbIoType;
typedef struct _ARB_RESERVE_COMPLETION {
LARGE_INTEGER IoStartTime;
LARGE_INTEGER IoEndTime;
ULONG RetriesLeft;
ArbIoType Type;
PVOID LockTag;
PDEVICE_OBJECT DeviceObject;
PCLUS_DEVICE_EXTENSION DeviceExtension;
PIO_WORKITEM WorkItem;
NTSTATUS FinalStatus;
ArbFunction RetryRoutine; // Optional routine called if I/O fails & RetriesLeft > 0
ArbFunction FailureRoutine; // Optional routine called if I/O fails & RetriesLeft == 0
ArbFunction PostCompletionRoutine; // Optional routine called if I/O succeeds
} ARB_RESERVE_COMPLETION, *PARB_RESERVE_COMPLETION;
//
// Function declarations
//
NTSTATUS
DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
);
VOID
ClusDiskScsiInitialize(
IN PDRIVER_OBJECT DriverObject,
IN PVOID NextDisk,
IN ULONG Count
);
VOID
ClusDiskUnload(
IN PDRIVER_OBJECT DriverObject
);
NTSTATUS
ClusDiskCreate(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
ClusDiskClose(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
ClusDiskCleanup(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
ClusDiskRead(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
ClusDiskWrite(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
ClusDiskIoCompletion(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context
);
NTSTATUS
ClusDiskDeviceControl(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
ClusDiskRootDeviceControl(
PDEVICE_OBJECT DeviceObject,
PIRP Irp
);
NTSTATUS
ClusDiskShutdownFlush(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
ClusDiskNewDiskCompletion(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context
);
NTSTATUS
ClusDiskSetLayoutCompletion(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context
);
NTSTATUS
ClusDiskDismountDevice(
IN ULONG DiskNumber,
IN BOOLEAN ForceDismount
);
BOOLEAN
ClusDiskAttached(
IN PDEVICE_OBJECT DeviceObject,
IN ULONG DiskNumber
);
BOOLEAN
ClusDiskVerifyAttach(
IN PDEVICE_OBJECT DeviceObject
);
BOOLEAN
AddAttachedDevice(
IN ULONG Signature,
IN PDEVICE_OBJECT DeviceObject
);
BOOLEAN
MatchDevice(
IN ULONG Signature,
OUT PDEVICE_OBJECT *DeviceObject
);
NTSTATUS
GetScsiAddress(
PDEVICE_OBJECT DeviceObject,
PSCSI_ADDRESS ScsiAddress
);
VOID
ClusDiskWriteDiskInfo(
IN ULONG Signature,
IN ULONG DiskNumber,
IN LPWSTR KeyName
);
PDRIVE_LAYOUT_INFORMATION_EX
ClusDiskGetPartitionInfo(
PCLUS_DEVICE_EXTENSION DeviceExtension
);
NTSTATUS
ClusDiskTryAttachDevice(
ULONG Signature,
ULONG NextDisk,
PDRIVER_OBJECT DriverObject,
BOOLEAN InstallMode
);
NTSTATUS
ClusDiskAttachDevice(
ULONG Signature,
ULONG NextDisk,
PDRIVER_OBJECT DriverObject,
BOOLEAN Reset,
BOOLEAN *StopProcessing,
BOOLEAN InstallMode
);
NTSTATUS
ClusDiskDetachDevice(
ULONG Signature,
PDRIVER_OBJECT DriverObject
);
NTSTATUS
DismountDevice(
IN HANDLE FileHandle
);
NTSTATUS
ClusDiskGetDiskGeometry(
PDEVICE_OBJECT DeviceObject
);
NTSTATUS
GetDiskGeometry(
PDEVICE_OBJECT DeviceObject,
PMEDIA_TYPE MediaType
);
PDRIVE_LAYOUT_INFORMATION_EX
GetPartitionInfo(
PDEVICE_OBJECT DeviceObject,
NTSTATUS *Status
);
NTSTATUS
ResetScsiDevice(
IN HANDLE ScsiportHandle,
IN PSCSI_ADDRESS ScsiAddress
);
NTSTATUS
ReserveScsiDevice(
IN PCLUS_DEVICE_EXTENSION DeviceExtension,
IN PVOID Context
);
VOID
ReleaseScsiDevice(
IN PCLUS_DEVICE_EXTENSION DeviceExtension
);
BOOLEAN
AttachedDevice(
IN ULONG Signature,
OUT PDEVICE_OBJECT *DeviceObject
);
NTSTATUS
EnableHaltProcessing(
IN KIRQL *Irql
);
NTSTATUS
DisableHaltProcessing(
IN KIRQL *Irql
);
VOID
ClusDiskEventCallback(
IN CLUSNET_EVENT_TYPE EventType,
IN CL_NODE_ID NodeId,
IN CL_NETWORK_ID NetworkId
);
VOID
ClusDiskLogError(
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT DeviceObject OPTIONAL,
IN ULONG SequenceNumber,
IN UCHAR MajorFunctionCode,
IN UCHAR RetryCount,
IN ULONG UniqueErrorValue,
IN NTSTATUS FinalStatus,
IN NTSTATUS SpecificIOStatus,
IN ULONG LengthOfText,
IN PWCHAR Text
);
NTSTATUS
DismountPartition(
IN PDEVICE_OBJECT TargetDevice,
IN ULONG DiskNumber,
IN ULONG PartNumber
);
#if DBG
VOID
ClusDiskDebugPrint(
IN ULONG Level,
IN PCHAR DebugMessage,
...
);
#endif
VOID
GetSymbolicLink(
IN PWCHAR Root,
IN OUT PWCHAR Path
);
NTSTATUS
ClusDiskGetTargetDevice(
IN ULONG DiskNumber,
IN ULONG PartitionNumber,
OUT PDEVICE_OBJECT * DeviceObject OPTIONAL,
IN OUT PUNICODE_STRING UnicodeString,
OUT PDRIVE_LAYOUT_INFORMATION_EX * PartitionInfo OPTIONAL,
OUT PSCSI_ADDRESS ScsiAddress OPTIONAL,
IN BOOLEAN Reset
);
//[GN]
NTSTATUS
ArbitrationInitialize(
VOID
);
VOID
ArbitrationDone(
VOID
);
VOID
ArbitrationTick(
VOID
);
VOID
ArbitrationWrite(
IN PCLUS_DEVICE_EXTENSION DeviceExtension
);
NTSTATUS
VerifyArbitrationArgumentsIfAny(
IN PULONG InputData,
IN LONG InputSize
);
VOID
ProcessArbitrationArgumentsIfAny(
IN PCLUS_DEVICE_EXTENSION DeviceExtension,
IN PULONG InputData,
IN LONG InputSize
);
NTSTATUS
ProcessArbitrationEscape(
IN PCLUS_DEVICE_EXTENSION DeviceExtension,
IN PULONG InputData,
IN LONG InputSize,
IN OUT PULONG OutputSize
);
NTSTATUS
SimpleDeviceIoControl(
IN PDEVICE_OBJECT DeviceObject,
IN ULONG Ioctl,
IN PVOID InBuffer,
IN ULONG InBufferSize,
IN PVOID OutBuffer,
IN ULONG OutBufferSize);
NTSTATUS
ClusDiskInitRegistryString(
OUT PUNICODE_STRING UnicodeString,
IN LPWSTR KeyName,
IN ULONG KeyNameChars
);
NTSTATUS
ClusDiskAddSignature(
IN PUNICODE_STRING UnicodeString,
IN ULONG Signature,
IN BOOLEAN Volatile
);
NTSTATUS
ClusDiskDeleteSignature(
IN PUNICODE_STRING UnicodeString,
IN ULONG Signature
);
ULONG
ClusDiskIsSignatureDisk(
IN ULONG Signature
);
NTSTATUS
ClusDiskMarkIrpPending(
PIRP Irp,
PDRIVER_CANCEL CancelRoutine
);
VOID
ClusDiskCompletePendingRequest(
IN PIRP Irp,
IN NTSTATUS Status,
PCLUS_DEVICE_EXTENSION DeviceExtension
);
VOID
ClusDiskIrpCancel(
PDEVICE_OBJECT DeviceObject,
PIRP Irp
);
MEDIA_TYPE
GetMediaType(
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
GetScsiPortNumber(
IN ULONG DiskSignature,
IN PUCHAR DiskPortNumber
);
NTSTATUS
IsDiskClusterCapable(
IN UCHAR PortNumber,
OUT PBOOLEAN IsCapable
);
NTSTATUS
GetBootTimeSystemRoot(
IN OUT PWCHAR Path
);
NTSTATUS
GetRunTimeSystemRoot(
IN OUT PWCHAR Path
);
NTSTATUS
GetSystemRootPort(
VOID
);
VOID
ResetScsiBusses(
VOID
);
NTSTATUS
GetDriveLayout(
IN PDEVICE_OBJECT DeviceObject,
OUT PDRIVE_LAYOUT_INFORMATION_EX *DriveLayout,
BOOLEAN UpdateCachedLayout,
BOOLEAN FlushStorageDrivers
);
NTSTATUS
ClusDiskInitialize(
IN PDRIVER_OBJECT DriverObject
);
NTSTATUS
DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
);
NTSTATUS
LockVolumes(
IN PCLUS_DEVICE_EXTENSION DeviceExtension
);
NTSTATUS
ClusDiskHaltProcessingWorker(
IN PVOID Context
);
VOID
SendOfflineDirect(
IN PCLUS_DEVICE_EXTENSION DeviceExtension
);
NTSTATUS
ClusDiskRescanWorker(
IN PVOID Context
);
VOID
ClusDiskTickHandler(
IN PDEVICE_OBJECT DeviceObject,
IN PVOID Context
);
NTSTATUS
RegistryQueryValue(
PVOID hKey,
LPWSTR pValueName,
PULONG pulType,
PVOID pData,
PULONG pulDataSize
);
NTSTATUS
ClusDiskCreateHandle(
OUT PHANDLE pHandle,
IN ULONG DiskNumber,
IN ULONG PartitionNumber,
IN ACCESS_MASK DesiredAccess
);
VOID
ClusDiskCompletePendedIrps(
IN PCLUS_DEVICE_EXTENSION DeviceExtension,
IN PFILE_OBJECT FileObject OPTIONAL,
IN ULONG Offline
);
NTSTATUS
ClusDiskOfflineEntireDisk(
IN PDEVICE_OBJECT Part0DeviceObject
);
NTSTATUS
ClusDiskDismountVolumes(
IN PDEVICE_OBJECT Part0DeviceObject,
IN BOOLEAN RelRemLock
);
NTSTATUS
ClusDiskForwardIrpSynchronous(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
VOID
ClusDiskReservationWorker(
IN PCLUS_DEVICE_EXTENSION DeviceExtension
);
VOID
ClusDiskpReplaceHandleArray(
PDEVICE_OBJECT DeviceObject,
PWORK_CONTEXT WorkContext
);
VOID
ClusDiskpOpenFileHandles(
PDEVICE_OBJECT Part0DeviceObject,
PWORK_CONTEXT WorkContext
);
NTSTATUS
EjectVolumes(
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
ReclaimVolumes(
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
ProcessDelayedWorkAsynchronous(
PDEVICE_OBJECT DeviceObject,
PVOID WorkerRoutine,
PVOID Context
);
NTSTATUS
ProcessDelayedWorkSynchronous(
PDEVICE_OBJECT DeviceObject,
PVOID WorkerRoutine,
PVOID Context
);
VOID
EnableHaltProcessingWorker(
PDEVICE_OBJECT DeviceObject,
PWORK_CONTEXT WorkContext
);
VOID
DisableHaltProcessingWorker(
PDEVICE_OBJECT DeviceObject,
PWORK_CONTEXT WorkContext
);
NTSTATUS
GetRegistryValue(
PUNICODE_STRING KeyName,
PWSTR ValueName,
PULONG ReturnValue
);
NTSTATUS
SetVolumeState(
PCLUS_DEVICE_EXTENSION PhysicalDisk,
ULONG NewDiskState
);
VOID
SetVolumeStateWorker(
PDEVICE_OBJECT DeviceObject,
PVOID Context
);
NTSTATUS
AttachSignatureList(
PDEVICE_OBJECT DeviceObject,
PULONG InBuffer,
ULONG InBufferLen
);
NTSTATUS
DetachSignatureList(
PDEVICE_OBJECT DeviceObject,
PULONG InBuffer,
ULONG InBufferLen
);
NTSTATUS
IsVolumeMounted(
IN ULONG DiskNumber,
IN ULONG PartNumber,
OUT BOOLEAN *IsMounted
);
NTSTATUS
SendFtdiskIoctlSync(
PDEVICE_OBJECT TargetObject,
IN ULONG DiskNumber,
IN ULONG PartNumber,
ULONG Ioctl
);
NTSTATUS
ClusDiskDeviceChangeNotification(
IN PDEVICE_INTERFACE_CHANGE_NOTIFICATION DeviceChangeNotification,
IN PCLUS_DEVICE_EXTENSION DeviceExtension
);
NTSTATUS
ClusDiskDeviceChangeNotificationWorker(
IN PDEVICE_OBJECT DeviceObject,
IN PVOID Context
);
NTSTATUS
ClusDiskVolumeChangeNotification(
IN PDEVICE_INTERFACE_CHANGE_NOTIFICATION DeviceChangeNotification,
IN PCLUS_DEVICE_EXTENSION DeviceExtension
);
NTSTATUS
ClusDiskVolumeChangeNotificationWorker(
IN PDEVICE_OBJECT DeviceObject,
IN PVOID Context
);
NTSTATUS
ProcessDeviceArrival(
IN PDEVICE_INTERFACE_CHANGE_NOTIFICATION DeviceChangeNotification,
IN PCLUS_DEVICE_EXTENSION DeviceExtension,
IN BOOLEAN VolumeArrival
);
NTSTATUS
CleanupDeviceList(
PDEVICE_OBJECT DeviceObject
);
VOID
CleanupDeviceListWorker(
PDEVICE_OBJECT DeviceObject,
PVOID Context
);
NTSTATUS
CreateVolumeObject(
PCLUS_DEVICE_EXTENSION ZeroExtension,
ULONG DiskNumber,
ULONG PartitionNumber,
PDEVICE_OBJECT TargetDev
);
NTSTATUS
WaitForAttachCompletion(
PCLUS_DEVICE_EXTENSION DeviceExtension,
BOOLEAN WaitForInit,
BOOLEAN CheckPhysDev
);
NTSTATUS
GetReserveInfo(
PVOID InOutBuffer,
ULONG InSize,
ULONG* OutSize
);
NTSTATUS
SetDiskState(
PVOID InBuffer,
ULONG InBufferLength,
ULONG OutBufferLength,
ULONG *BytesReturned
);
NTSTATUS
ArbReserveCompletion(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context
);
RequeueArbReserveIo(
IN PDEVICE_OBJECT DeviceObject,
IN PVOID Context
);
NTSTATUS
CheckReserveTiming(
IN PCLUS_DEVICE_EXTENSION DeviceExtension,
IN PVOID Context
);
NTSTATUS
HandleReserveFailure(
IN PCLUS_DEVICE_EXTENSION DeviceExtension,
IN PVOID Context
);
#if DBG
//
// RemoveLock tracing functions.
//
NTSTATUS
AcquireRemoveLock(
IN PIO_REMOVE_LOCK RemoveLock,
IN OPTIONAL PVOID Tag
);
VOID
ReleaseRemoveLock(
IN PIO_REMOVE_LOCK RemoveLock,
IN PVOID Tag
);
VOID
ReleaseRemoveLockAndWait(
IN PIO_REMOVE_LOCK RemoveLock,
IN PVOID Tag
);
//
// Debug print helper routines
//
PCHAR
PnPMinorFunctionString (
UCHAR MinorFunction
);
PCHAR
BoolToString(
BOOLEAN Value
);
PCHAR
DiskStateToString(
ULONG DiskState
);
#else
#define ReleaseRemoveLock(RemoveLock, Tag) IoReleaseRemoveLock(RemoveLock, Tag)
NTSTATUS
AcquireRemoveLock(
IN PIO_REMOVE_LOCK RemoveLock,
IN OPTIONAL PVOID Tag
);
VOID
ReleaseRemoveLockAndWait(
IN PIO_REMOVE_LOCK RemoveLock,
IN PVOID Tag
);
#endif
#define WPP_CONTROL_GUIDS \
WPP_DEFINE_CONTROL_GUID(ClusdiskLH,(b25a9257,9a39,43df,9f35,b0976e28e843), \
WPP_DEFINE_BIT(DEFAULT) \
WPP_DEFINE_BIT(CREATE) \
WPP_DEFINE_BIT(CLOSE) \
WPP_DEFINE_BIT(CLEANUP) \
WPP_DEFINE_BIT(UNPEND) \
WPP_DEFINE_BIT(LEGACY) \
) \
WPP_DEFINE_CONTROL_GUID(ClusdiskHB,(7f827e76,1a10,11d3,ba86,00c04f8eed00), \
WPP_DEFINE_BIT(RESERVE) \
WPP_DEFINE_BIT(READ) \
WPP_DEFINE_BIT(WRITE) \
WPP_DEFINE_BIT(TICK) \
)