windows-nt/Source/XPSP1/NT/base/cluster/clusdisk/clusdskp.h

1131 lines
20 KiB
C
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
/*++
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 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
// #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 of last reservation.
//
LARGE_INTEGER LastReserve;
//
// 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;
//
// Hold I/O IRPs
//
LIST_ENTRY HoldIO;
//
// 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 DriveLayout;
ULONG DriveLayoutSize;
ERESOURCE DriveLayoutLock;
} 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 {
PDEVICE_OBJECT DeviceObject;
KEVENT CompletionEvent;
NTSTATUS FinalStatus;
PVOID Context;
} WORK_CONTEXT, *PWORK_CONTEXT;
//
// Flags for ClusDiskpReplaceHandleArray
//
enum {
DO_DISMOUNT = 0x00000001,
RELEASE_REMOVE_LOCK = 0x00000002,
};
typedef struct _REPLACE_CONTEXT {
PCLUS_DEVICE_EXTENSION DeviceExtension;
PHANDLE NewValue; // OPTIONAL
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;
} DEVICE_CHANGE_CONTEXT, *PDEVICE_CHANGE_CONTEXT;
//
// External Function declartions
//
VOID
ClusDiskReserveDriveLetters(
IN ULONG Signature,
IN BOOLEAN DeleteLetter
);
NTSTATUS
GetDriveLetterFromMountMgr(
IN LPWSTR PartitionString,
OUT PUCHAR DriveLetter
);
VOID
ClusDiskReleaseDriveLetters(
VOID
);
NTSTATUS
ClusDiskDismount(
IN ULONG Signature
);
//
// 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
);
BOOLEAN
MatchScsiBus(
PSCSI_ADDRESS ScsiAddress
);
NTSTATUS
GetScsiAddress(
PDEVICE_OBJECT DeviceObject,
PSCSI_ADDRESS ScsiAddress
);
VOID
ClusDiskAddScsiBusList(
IN PCLUS_DEVICE_EXTENSION DeviceExtension
);
VOID
ClusDiskWriteDiskInfo(
IN ULONG Signature,
IN ULONG DiskNumber,
IN LPWSTR KeyName
);
PDRIVE_LAYOUT_INFORMATION
ClusDiskGetPartitionInfo(
PCLUS_DEVICE_EXTENSION DeviceExtension
);
NTSTATUS
ClusDiskTryAttachDevice(
ULONG Signature,
ULONG NextDisk,
PDRIVER_OBJECT DriverObject
);
NTSTATUS
ClusDiskAttachDevice(
ULONG Signature,
ULONG NextDisk,
PDRIVER_OBJECT DriverObject,
BOOLEAN Reset,
BOOLEAN *StopProcessing
);
NTSTATUS
ClusDiskDetachDevice(
ULONG Signature,
PDRIVER_OBJECT DriverObject
);
VOID
ClusDiskAssignLetters(
VOID
);
VOID
ClusDiskAssignLetter(
IN UCHAR DriveLetter,
IN LPWSTR AssignDevice
);
NTSTATUS
DismountDevice(
IN HANDLE FileHandle
);
NTSTATUS
ClusDiskGetDiskGeometry(
PDEVICE_OBJECT DeviceObject
);
NTSTATUS
GetDiskGeometry(
PDEVICE_OBJECT DeviceObject
);
PDRIVE_LAYOUT_INFORMATION
DoGetPartitionInfo(
PDEVICE_OBJECT DeviceObject
);
PDRIVE_LAYOUT_INFORMATION
GetPartitionInfo(
PDEVICE_OBJECT DeviceObject,
NTSTATUS *Status
);
PDEVICE_OBJECT
GetDeviceObject(
IN LPWSTR lpwstrDirectory,
IN LPWSTR lpwstrObject,
IN LPWSTR lpwstrType
);
NTSTATUS
GetDriveLetterFromObjectDir(
IN LPWSTR Name,
OUT PUCHAR Letter
);
VOID
ResetScsiDevice(
PDEVICE_OBJECT DeviceObject,
PSCSI_ADDRESS ScsiAddress
);
NTSTATUS
ReserveScsiDevice(
IN PCLUS_DEVICE_EXTENSION DeviceExtension
);
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
);
NTSTATUS
ClusDiskOfflineFtSet(
IN PCLUS_DEVICE_EXTENSION DeviceExtension
);
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
CluSetFtMemberComplete(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context
);
NTSTATUS
DismountPartition(
IN PDEVICE_OBJECT TargetDevice,
IN ULONG DiskNumber,
IN ULONG PartNumber
);
NTSTATUS
DismountPartitionDevice(
IN UCHAR DriveLetter
);
VOID
DeleteSpecificDriveLetter(
IN UCHAR Letter
);
#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 * PartitionInfo OPTIONAL,
OUT PSCSI_ADDRESS ScsiAddress OPTIONAL,
IN BOOLEAN Reset
);
//[GN]
NTSTATUS
ArbitrationInitialize(
VOID
);
VOID
ArbitrationDone(
VOID
);
VOID
ArbitrationTick(
VOID
);
VOID
ArbitrationReserve(
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 KeyNameSize
);
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 *DriveLayout,
BOOLEAN UpdateCachedLayout
);
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
);
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
);
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
ProcessDelayedWorkSynchronous(
PDEVICE_OBJECT DeviceObject,
PVOID WorkerRoutine,
PVOID Context
);
VOID
EnableHaltProcessingWorker(
PDEVICE_OBJECT DeviceObject,
PWORK_CONTEXT WorkContext
);
VOID
DisableHaltProcessingWorker(
PDEVICE_OBJECT DeviceObject,
PWORK_CONTEXT WorkContext
);
BOOLEAN
IsDiskMbr(
IN PDEVICE_OBJECT DeviceObject
);
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
CleanupDeviceList(
PDEVICE_OBJECT DeviceObject
);
VOID
CleanupDeviceListWorker(
PDEVICE_OBJECT DeviceObject,
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 AcquireRemoveLock(RemoveLock, Tag) IoAcquireRemoveLock(RemoveLock, Tag)
#define ReleaseRemoveLock(RemoveLock, Tag) IoReleaseRemoveLock(RemoveLock, Tag)
#define ReleaseRemoveLockAndWait(RemoveLock, Tag) IoReleaseRemoveLockAndWait(RemoveLock, 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) \
)