/*++

Copyright (c) 1997  Microsoft Corporation

Module Name:

    volmgr.h

Abstract:

    This file defines the services supplied by the volume managers.

Author:

    norbertk

Revision History:

--*/

#ifndef _VOLMGR_
#define _VOLMGR_

#include <volmgrx.h>

#define IOCTL_INTERNAL_VOLMGR_PARTITION_ARRIVED             CTL_CODE(VOLMGRCONTROLTYPE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_INTERNAL_VOLMGR_PARTITION_REMOVED             CTL_CODE(VOLMGRCONTROLTYPE, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_INTERNAL_VOLMGR_WHOLE_DISK_REMOVED            CTL_CODE(VOLMGRCONTROLTYPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_INTERNAL_VOLMGR_REFERENCE_DEPENDANT_VOLUMES   CTL_CODE(VOLMGRCONTROLTYPE, 3, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_INTERNAL_VOLMGR_LEGACY_PARTITION_ARRIVED      CTL_CODE(VOLMGRCONTROLTYPE, 4, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_INTERNAL_VOLMGR_LEGACY_PARTITION_REMOVED      CTL_CODE(VOLMGRCONTROLTYPE, 5, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_INTERNAL_VOLMGR_QUERY_CHANGE_PARTITION        CTL_CODE(VOLMGRCONTROLTYPE, 6, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_INTERNAL_VOLMGR_CANCEL_CHANGE_PARTITION       CTL_CODE(VOLMGRCONTROLTYPE, 7, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_INTERNAL_VOLMGR_PARTITION_CHANGED             CTL_CODE(VOLMGRCONTROLTYPE, 8, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_INTERNAL_VOLMGR_PMWMICOUNTERLIB_CONTEXT       CTL_CODE(VOLMGRCONTROLTYPE, 9, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_INTERNAL_VOLMGR_SET_POWER_STATE               CTL_CODE(VOLMGRCONTROLTYPE, 10, METHOD_BUFFERED, FILE_ANY_ACCESS)

//
// Input structure for IOCTL_INTERNAL_VOLMGR_PARTITION_ARRIVED,
// IOCTL_INTERNAL_VOLMGR_PARTITION_REMOVED,
// IOCTL_INTERNAL_VOLMGR_REFERENCE_DEPENDANT_VOLUMES,
// IOCTL_INTERNAL_VOLMGR_QUERY_CHANGE_PARTITION,
// IOCTL_INTERNAL_VOLMGR_CANCEL_CHANGE_PARTITION, and
// IOCTL_INTERNAL_VOLMGR_PARTITION_CHANGED.
//

typedef struct _VOLMGR_PARTITION_INFORMATION {
    PDEVICE_OBJECT  PartitionDeviceObject;
    PDEVICE_OBJECT  WholeDiskPdo;
} VOLMGR_PARTITION_INFORMATION, *PVOLMGR_PARTITION_INFORMATION;

//
// Input structure for IOCTL_INTERNAL_VOLMGR_WHOLE_DISK_REMOVED.
//

typedef struct _VOLMGR_WHOLE_DISK_INFORMATION {
    PDEVICE_OBJECT  WholeDiskPdo;
} VOLMGR_WHOLE_DISK_INFORMATION, *PVOLMGR_WHOLE_DISK_INFORMATION;

//
// Output structure for IOCTL_INTERNAL_VOLMGR_REFERENCE_DEPENDANT_VOLUMES.
//

typedef struct _VOLMGR_DEPENDANT_VOLUMES_INFORMATION {
    PDEVICE_RELATIONS   DependantVolumeReferences;
} VOLMGR_DEPENDANT_VOLUMES_INFORMATION, *PVOLMGR_DEPENDANT_VOLUMES_INFORMATION;

//
// Input structure for IOCTL_INTERNAL_VOLMGR_LEGACY_PARTITION_ARRIVED and
// IOCTL_INTERNAL_VOLMGR_LEGACY_PARTITION_REMOVED.
//

typedef struct _VOLMGR_LEGACY_PARTITION_INFORMATION {
    PDEVICE_OBJECT  LegacyWholeDiskDeviceObject;
    ULONG           DiskNumber;
    ULONG           PartitionNumber;
} VOLMGR_LEGACY_PARTITION_INFORMATION, *PVOLMGR_LEGACY_PARTITION_INFORMATION;

//
// Input structure for IOCTL_INTERNAL_VOLMGR_PMWMICOUNTERLIB_CONTEXT
//

typedef
NTSTATUS
(*PPMWMICOUNTERENABLE) (
    IN OUT PVOID* CounterContext
    );

typedef
BOOLEAN
(*PPMWMICOUNTERDISABLE) (
    IN PVOID* CounterContext,
    IN BOOLEAN ForceDisable,
    IN BOOLEAN DeallocateOnZero
    );

typedef
VOID
(*PPMWMICOUNTERIOSTART) (
    IN PVOID CounterContext,
    OUT PLARGE_INTEGER TimeStamp
    );

typedef
VOID
(*PPMWMICOUNTERIOCOMPLETE) (
    IN PVOID CounterContext,
    IN PIRP Irp,
    IN PLARGE_INTEGER TimeStamp
    );

typedef
VOID
(*PPMWMICOUNTERQUERY) (
    IN PVOID CounterContext,
    IN OUT PDISK_PERFORMANCE CounterBuffer,
    IN PWCHAR StorageManagerName,
    IN ULONG StorageDeviceNumber
    );

typedef struct _PMWMICOUNTERLIB_CONTEXT {
    PPMWMICOUNTERENABLE     PmWmiCounterEnable;
    PPMWMICOUNTERDISABLE    PmWmiCounterDisable;
    PPMWMICOUNTERIOSTART    PmWmiCounterIoStart;
    PPMWMICOUNTERIOCOMPLETE PmWmiCounterIoComplete;
    PPMWMICOUNTERQUERY      PmWmiCounterQuery;
} PMWMICOUNTERLIB_CONTEXT, *PPMWMICOUNTERLIB_CONTEXT;

//
// Input structure for IOCTL_INTERNAL_VOLMGR_SET_POWER_STATE
//

typedef struct _VOLMGR_POWER_STATE {
    PDEVICE_OBJECT      PartitionDeviceObject;
    PDEVICE_OBJECT      WholeDiskPdo;
    DEVICE_POWER_STATE  PowerState;
} VOLMGR_POWER_STATE, *PVOLMGR_POWER_STATE;

#endif
