6 Appendix A: Full IDL

 import "ms-dtyp.idl";
  
  
 // typedefs
  
  
  
 typedef GUID * REFIID;
  
 typedef GUID * LPGUID;
  
 typedef GUID * LPNTMS_GUID;
  
 typedef GUID NTMS_GUID;
  
 typedef byte * PSECURITY_DESCRIPTOR_NTMS;
  
 typedef ULONG_PTR NTMS_HANDLE;
  
 // enumerations
  
  
 enum NtmsObjectsTypes { 
     NTMS_UNKNOWN                    = 0,
     NTMS_OBJECT                     = 1,
     NTMS_CHANGER                    = 2,
     NTMS_CHANGER_TYPE               = 3,
     NTMS_COMPUTER                   = 4,
     NTMS_DRIVE                      = 5,
     NTMS_DRIVE_TYPE                 = 6,
     NTMS_IEDOOR                     = 7,
     NTMS_IEPORT                     = 8,
     NTMS_LIBRARY                    = 9,
     NTMS_LIBREQUEST                 = 10,
     NTMS_LOGICAL_MEDIA              = 11,
     NTMS_MEDIA_POOL                 = 12,
     NTMS_MEDIA_TYPE                 = 13,
     NTMS_PARTITION                  = 14,
     NTMS_PHYSICAL_MEDIA             = 15,
     NTMS_STORAGESLOT                = 16,
     NTMS_OPREQUEST                  = 17,
     NTMS_UI_DESTINATION             = 18
 };
  
 enum NtmsOpreqCommand {
     NTMS_OPREQ_UNKNOWN              = 0,
     NTMS_OPREQ_NEWMEDIA             = 1,
     NTMS_OPREQ_CLEANER              = 2,
     NTMS_OPREQ_DEVICESERVICE        = 3,
     NTMS_OPREQ_MOVEMEDIA            = 4,
     NTMS_OPREQ_MESSAGE              = 5
 };
  
 enum NtmsNotificationOperations {
     NTMS_OBJ_UPDATE                 = 1,
     NTMS_OBJ_INSERT                 = 2,
     NTMS_OBJ_DELETE                 = 3,
     NTMS_EVENT_SIGNAL               = 4,
     NTMS_EVENT_COMPLETE             = 5
 };
  
 enum NtmsDismountOptions {
     NTMS_DISMOUNT_DEFERRED          = 0x0001,
     NTMS_DISMOUNT_IMMEDIATE         = 0x0002
 };
  
 enum NtmsLmState {
     NTMS_LM_QUEUED                  = 0,
     NTMS_LM_INPROCESS               = 1,
     NTMS_LM_PASSED                  = 2,
     NTMS_LM_FAILED                  = 3,
     NTMS_LM_INVALID                 = 4,
     NTMS_LM_WAITING                 = 5,
     NTMS_LM_CANCELLED               = 7,
     NTMS_LM_STOPPED                 = 8
 };
  
  
 enum NtmsEjectOperation {
     NTMS_EJECT_START                = 0,
     NTMS_EJECT_STOP                 = 1,
     NTMS_EJECT_QUEUE                = 2,
     NTMS_EJECT_FORCE                = 3,
     NTMS_EJECT_IMMEDIATE            = 4,
     NTMS_EJECT_ASK_USER             = 5
 };
  
 enum NtmsInjectOperation {
     NTMS_INJECT_START               = 0,
     NTMS_INJECT_STOP                = 1,
     NTMS_INJECT_RETRACT             = 2,
     NTMS_INJECT_STARTMANY           = 3
 };
  
 enum NtmsInventoryMethod {
     NTMS_INVENTORY_NONE             = 0,
     NTMS_INVENTORY_FAST             = 1,
     NTMS_INVENTORY_OMID             = 2,
     NTMS_INVENTORY_DEFAULT          = 3,
     NTMS_INVENTORY_SLOT             = 4,
     NTMS_INVENTORY_STOP             = 5,
     NTMS_INVENTORY_MAX              = 6
 };
  
 enum NtmsAllocateOptions {
     NTMS_ALLOCATE_NEW                  = 0x0001,
     NTMS_ALLOCATE_NEXT                 = 0x0002,
     NTMS_ALLOCATE_ERROR_IF_UNAVAILABLE = 0x0004
 };
  
 enum NtmsCreateOptions {
     NTMS_OPEN_EXISTING              = 0x0001,
     NTMS_CREATE_NEW                 = 0x0002,
     NTMS_OPEN_ALWAYS                = 0x0003
 };
  
 enum NtmsMountOptions {
     NTMS_MOUNT_READ                 = 0x0001,
     NTMS_MOUNT_WRITE                = 0x0002,
     NTMS_MOUNT_ERROR_NOT_AVAILABLE  = 0x0004,
     NTMS_MOUNT_ERROR_OFFLINE        = 0x0008,
     NTMS_MOUNT_SPECIFIC_DRIVE       = 0x0010,
     NTMS_MOUNT_NOWAIT               = 0x0020
 };
  
 enum NtmsMountPriority {
     NTMS_PRIORITY_DEFAULT           = 0,
     NTMS_PRIORITY_HIGHEST           = 15,
     NTMS_PRIORITY_HIGH              = 7,
     NTMS_PRIORITY_NORMAL            = 0,
     NTMS_PRIORITY_LOW               = -7,
     NTMS_PRIORITY_LOWEST            = -15
 };
  
 enum NtmsBarCodeState {
     NTMS_BARCODESTATE_OK            = 1,
     NTMS_BARCODESTATE_UNREADABLE    = 2
 };
  
 enum NtmsDriveState {
     NTMS_DRIVESTATE_DISMOUNTED      = 0,
     NTMS_DRIVESTATE_MOUNTED         = 1,
     NTMS_DRIVESTATE_LOADED          = 2,
     NTMS_DRIVESTATE_UNLOADED        = 5,
     NTMS_DRIVESTATE_BEING_CLEANED   = 6,
     NTMS_DRIVESTATE_DISMOUNTABLE    = 7
 };
  
 enum NtmsLmOperation {
     NTMS_LM_REMOVE                  = 0,
     NTMS_LM_DISABLECHANGER          = 1,
     NTMS_LM_DISABLELIBRARY          = 1,
     NTMS_LM_ENABLECHANGER           = 2,
     NTMS_LM_ENABLELIBRARY           = 2,
     NTMS_LM_DISABLEDRIVE            = 3,
     NTMS_LM_ENABLEDRIVE             = 4,
     NTMS_LM_DISABLEMEDIA            = 5,
     NTMS_LM_ENABLEMEDIA             = 6,
     NTMS_LM_UPDATEOMID              = 7,
     NTMS_LM_INVENTORY               = 8,
     NTMS_LM_DOORACCESS              = 9,
     NTMS_LM_EJECT                   = 10,
     NTMS_LM_EJECTCLEANER            = 11,
     NTMS_LM_INJECT                  = 12,
     NTMS_LM_INJECTCLEANER           = 13,
     NTMS_LM_PROCESSOMID             = 14,
     NTMS_LM_CLEANDRIVE              = 15,
     NTMS_LM_DISMOUNT                = 16,
     NTMS_LM_MOUNT                   = 17,
     NTMS_LM_WRITESCRATCH            = 18,
     NTMS_LM_CLASSIFY                = 19,
     NTMS_LM_RESERVECLEANER          = 20,
     NTMS_LM_RELEASECLEANER          = 21,
 };
  
 enum NtmsMediaState {
     NTMS_MEDIASTATE_IDLE            = 0,
     NTMS_MEDIASTATE_INUSE           = 1,
     NTMS_MEDIASTATE_MOUNTED         = 2,
     NTMS_MEDIASTATE_LOADED          = 3,
     NTMS_MEDIASTATE_UNLOADED        = 4,
     NTMS_MEDIASTATE_OPERROR         = 5,
     NTMS_MEDIASTATE_OPREQ           = 6
 };
  
 enum NtmsOperationalState {
     NTMS_READY                      = 0,
     NTMS_INITIALIZING               = 10,
     NTMS_NEEDS_SERVICE              = 20,
     NTMS_NOT_PRESENT                = 21
 };
  
 enum NtmsOpreqState {
     NTMS_OPSTATE_UNKNOWN            = 0,
     NTMS_OPSTATE_SUBMITTED          = 1,
     NTMS_OPSTATE_ACTIVE             = 2,
     NTMS_OPSTATE_INPROGRESS         = 3,
     NTMS_OPSTATE_REFUSED            = 4,
     NTMS_OPSTATE_COMPLETE           = 5
 };
  
 enum NtmsPartitionState {
     NTMS_PARTSTATE_UNKNOWN          = 0,
     NTMS_PARTSTATE_UNPREPARED       = 1,
     NTMS_PARTSTATE_INCOMPATIBLE     = 2,
     NTMS_PARTSTATE_DECOMMISSIONED   = 3,
     NTMS_PARTSTATE_AVAILABLE        = 4,
     NTMS_PARTSTATE_ALLOCATED        = 5,
     NTMS_PARTSTATE_COMPLETE         = 6,
     NTMS_PARTSTATE_FOREIGN          = 7,
     NTMS_PARTSTATE_IMPORT           = 8,
     NTMS_PARTSTATE_RESERVED         = 9
 };
  
 enum NtmsUIOperations {
     NTMS_UIDEST_ADD                 = 1,
     NTMS_UIDEST_DELETE              = 2,
     NTMS_UIDEST_DELETEALL           = 3
 };
  
 enum NtmsUITypes {
     NTMS_UITYPE_INVALID             = 0,
     NTMS_UITYPE_INFO                = 1,
     NTMS_UITYPE_REQ                 = 2,
     NTMS_UITYPE_ERR                 = 3,
     NTMS_UITYPE_MAX                 = 4
 };
  
 enum NtmsAccessMask {
     NTMS_USE_ACCESS                 = 1,
     NTMS_MODIFY_ACCESS              = 2,
     NTMS_CONTROL_ACCESS             = 3
 };
  
 // Generic Mappings :
 #define NTMS_GENERIC_READ       NTMS_USE_ACCESS
 #define NTMS_GENERIC_WRITE     (NTMS_USE_ACCESS | NTMS_MODIFY_ACCESS)
 #define NTMS_GENERIC_EXECUTE   (NTMS_USE_ACCESS | NTMS_MODIFY_ACCESS | NTMS_CONTROL_ACCESS)
 #define NTMS_GENERIC_ALL       (NTMS_USE_ACCESS | NTMS_MODIFY_ACCESS | NTMS_CONTROL_ACCESS)
  
  
 // Structures
  
  
 typedef struct _NTMS_LIBRARYINFORMATION {
     DWORD              LibraryType;
     NTMS_GUID          CleanerSlot;
     NTMS_GUID          CleanerSlotDefault;
     BOOL               LibrarySupportsDriveCleaning;
     BOOL               BarCodeReaderInstalled;
     DWORD              InventoryMethod;
     DWORD              dwCleanerUsesRemaining;
     DWORD              FirstDriveNumber;
     DWORD              dwNumberOfDrives;
     DWORD              FirstSlotNumber;
     DWORD              dwNumberOfSlots;
     DWORD              FirstDoorNumber;
     DWORD              dwNumberOfDoors;
     DWORD              FirstPortNumber;
     DWORD              dwNumberOfPorts;
     DWORD              FirstChangerNumber;
     DWORD              dwNumberOfChangers;
     DWORD              dwNumberOfMedia;
     DWORD              dwNumberOfMediaTypes;
     DWORD              dwNumberOfLibRequests;
     GUID               Reserved;
     BOOL               AutoRecovery;
     DWORD              dwFlags;
 } NTMS_LIBRARYINFORMATION;
  
 typedef struct _SECURITY_ATTRIBUTES_NTMS {
     DWORD              nLength;
         [size_is(nDescriptorLength)] 
         byte *         lpSecurityDescriptor;
     BOOL               bInheritHandle;
     DWORD              nDescriptorLength;
 } SECURITY_ATTRIBUTES_NTMS, *LPSECURITY_ATTRIBUTES_NTMS;
  
 typedef struct _NTMS_ALLOCATION_INFORMATION {
     DWORD              dwSize;                   
     byte *             lpReserved;
     NTMS_GUID          AllocatedFrom;         
 } NTMS_ALLOCATION_INFORMATION, *LPNTMS_ALLOCATION_INFORMATION;
  
  
 typedef struct _NTMS_ASYNC_IO {
     NTMS_GUID   OperationId;                // reserved - do not use
     NTMS_GUID   EventId;                    // GUID which will be used by server to notify the client using OnNotify method
     DWORD       dwOperationType;            // reserved - do not use
     DWORD       dwResult;                   // reserved - do not use
     DWORD       dwAsyncState;               // reserved - do not use
 #ifdef __midl
     NTMS_HANDLE hEvent;                     // reserved - do not use
 #else
     PVOID      hEvent;                     // reserved - do not use
 #endif                                      
     BOOL        bOnStateChange;             // indicate to signal on every status change or not; false will signal only completion
 } NTMS_ASYNC_IO, *LPNTMS_ASYNC_IO;
  
 typedef struct _NTMS_MOUNT_INFORMATION {
     DWORD              dwSize;        
 #ifdef __midl
     [ptr]  LPNTMS_ASYNC_IO lpReserved;
 #else
     LPVOID lpReserved;
 #endif
 } NTMS_MOUNT_INFORMATION, *LPNTMS_MOUNT_INFORMATION;
  
 typedef struct _NTMS_CHANGERINFORMATIONA {
     DWORD              Number;
     NTMS_GUID          ChangerType;
     char               szSerialNumber[32];
     char               szRevision[32];
     char               szDeviceName[64];
     unsigned short     ScsiPort;
     unsigned short     ScsiBus;
     unsigned short     ScsiTarget;
     unsigned short     ScsiLun;
     NTMS_GUID          Library;
 } NTMS_CHANGERINFORMATIONA;
  
 typedef struct _NTMS_CHANGERINFORMATIONW {
     DWORD              Number;
     NTMS_GUID          ChangerType;
     [string] wchar_t   szSerialNumber[32];
     [string] wchar_t   szRevision[32];
     [string] wchar_t   szDeviceName[64];
     unsigned short     ScsiPort;
     unsigned short     ScsiBus;
     unsigned short     ScsiTarget;
     unsigned short     ScsiLun;
     NTMS_GUID          Library;
 } NTMS_CHANGERINFORMATIONW;
  
 typedef struct _NTMS_CHANGERTYPEINFORMATIONA {
     char               szVendor[128];
     char               szProduct[128];
     DWORD              DeviceType;
 } NTMS_CHANGERTYPEINFORMATIONA;
  
 typedef struct _NTMS_CHANGERTYPEINFORMATIONW {
     [string] wchar_t   szVendor[128];
     [string] wchar_t   szProduct[128];
     DWORD              DeviceType;
 } NTMS_CHANGERTYPEINFORMATIONW;
  
 typedef struct _NTMS_DRIVEINFORMATIONA {
     DWORD              Number;
     DWORD              State;
     NTMS_GUID          DriveType;
     char               szDeviceName[64];
     char               szSerialNumber[32];
     char               szRevision[32];
     unsigned short     ScsiPort;
     unsigned short     ScsiBus;
     unsigned short     ScsiTarget;
     unsigned short     ScsiLun;
     DWORD              dwMountCount;
     SYSTEMTIME         LastCleanedTs;
     NTMS_GUID          SavedPartitionId;
     NTMS_GUID          Library;
     GUID               Reserved;
     DWORD              dwDeferDismountDelay;
 } NTMS_DRIVEINFORMATIONA;
  
 typedef struct _NTMS_DRIVEINFORMATIONW {
     DWORD              Number;
     DWORD              State;
     NTMS_GUID          DriveType;
     [string] wchar_t   szDeviceName[64];
     [string] wchar_t   szSerialNumber[32];
     [string] wchar_t   szRevision[32];
     unsigned short     ScsiPort;
     unsigned short     ScsiBus;
     unsigned short     ScsiTarget;
     unsigned short     ScsiLun;
     DWORD              dwMountCount;
     SYSTEMTIME         LastCleanedTs;
     NTMS_GUID          SavedPartitionId;
     NTMS_GUID          Library;
     GUID               Reserved;
     DWORD              dwDeferDismountDelay;
 } NTMS_DRIVEINFORMATIONW;
  
 typedef struct _NTMS_DRIVETYPEINFORMATIONA {
     char               szVendor[128];
     char               szProduct[128];
     DWORD              NumberOfHeads;
     DWORD              DeviceType;
 } NTMS_DRIVETYPEINFORMATIONA;
  
 typedef struct _NTMS_DRIVETYPEINFORMATIONW {
     [string] wchar_t   szVendor[128];
     [string] wchar_t   szProduct[128];
     DWORD              NumberOfHeads;
     DWORD              DeviceType;
 } NTMS_DRIVETYPEINFORMATIONW;
  
 typedef struct _NTMS_LIBREQUESTINFORMATIONA {
     DWORD              OperationCode;
     DWORD              OperationOption;
     DWORD              State;
     NTMS_GUID          PartitionId;
     NTMS_GUID          DriveId;
     NTMS_GUID          PhysMediaId;
     NTMS_GUID          Library;
     NTMS_GUID          SlotId;
     SYSTEMTIME         TimeQueued;
     SYSTEMTIME         TimeCompleted;
     char               szApplication[64];
     char               szUser[64];
     char               szComputer[64];
     DWORD              dwErrorCode;       
     NTMS_GUID          WorkItemId;      
     DWORD              dwPriority;          
 } NTMS_LIBREQUESTINFORMATIONA;
  
 typedef struct _NTMS_LIBREQUESTINFORMATIONW {
     DWORD              OperationCode;
     DWORD              OperationOption;
     DWORD              State;
     NTMS_GUID          PartitionId;
     NTMS_GUID          DriveId;
     NTMS_GUID          PhysMediaId;
     NTMS_GUID          Library;
     NTMS_GUID          SlotId;
     SYSTEMTIME         TimeQueued;
     SYSTEMTIME         TimeCompleted;
     [string] wchar_t   szApplication[64];
     [string] wchar_t   szUser[64];
     [string] wchar_t   szComputer[64];
     DWORD              dwErrorCode;                 
     NTMS_GUID          WorkItemId;                
     DWORD              dwPriority;           
 } NTMS_LIBREQUESTINFORMATIONW;
  
 typedef struct _NTMS_MEDIAPOOLINFORMATION {
      DWORD             PoolType;
      NTMS_GUID         MediaType;
      NTMS_GUID         Parent;
      DWORD             AllocationPolicy;
      DWORD             DeallocationPolicy;
      DWORD             dwMaxAllocates;
      DWORD             dwNumberOfPhysicalMedia;
      DWORD             dwNumberOfLogicalMedia;
      DWORD             dwNumberOfMediaPools;
 } NTMS_MEDIAPOOLINFORMATION;
  
 typedef struct _NTMS_MEDIATYPEINFORMATION {
     DWORD              MediaType;   
     DWORD              NumberOfSides;
     DWORD              ReadWriteCharacteristics;
     DWORD              DeviceType;
 } NTMS_MEDIATYPEINFORMATION;
  
 typedef struct _NTMS_STORAGESLOTINFORMATION {
     DWORD              Number;
     DWORD              State;
     NTMS_GUID          Library;
 } NTMS_STORAGESLOTINFORMATION;
  
 typedef struct _NTMS_IEDOORINFORMATION {
   DWORD                Number;
   DWORD                State;
   unsigned short       MaxOpenSecs;
   NTMS_GUID            Library;
 } NTMS_IEDOORINFORMATION;
  
 typedef struct _NTMS_IEPORTINFORMATION {
     DWORD              Number;
     DWORD              Content;
     DWORD              Position;
     unsigned short     MaxExtendSecs;
     NTMS_GUID          Library;
 } NTMS_IEPORTINFORMATION;
  
 typedef struct _NTMS_LMIDINFORMATION {
     NTMS_GUID          MediaPool;
     DWORD              dwNumberOfPartitions;
 } NTMS_LMIDINFORMATION;
  
 typedef struct _NTMS_COMPUTERINFORMATION {
     DWORD              dwLibRequestPurgeTime;
     DWORD              dwOpRequestPurgeTime;
     DWORD              dwLibRequestFlags;
     DWORD              dwOpRequestFlags;
     DWORD              dwMediaPoolPolicy;
 } NTMS_COMPUTERINFORMATION;
  
 typedef struct _NTMS_OPREQUESTINFORMATIONA {
     DWORD              Request;
     SYSTEMTIME         Submitted;
     DWORD              State;
     char               szMessage[256];
     DWORD              Arg1Type;
     NTMS_GUID          Arg1;
     DWORD              Arg2Type;
     NTMS_GUID          Arg2;
     char               szApplication[64];
     char               szUser[64];
     char               szComputer[64];
 } NTMS_OPREQUESTINFORMATIONA;
  
 typedef struct _NTMS_OPREQUESTINFORMATIONW {
     DWORD              Request;
     SYSTEMTIME         Submitted;
     DWORD              State;
     [string] wchar_t   szMessage[256];
     DWORD              Arg1Type;
     NTMS_GUID          Arg1;
     DWORD              Arg2Type;
     NTMS_GUID          Arg2;
     [string] wchar_t   szApplication[64];
     [string] wchar_t   szUser[64];
     [string] wchar_t   szComputer[64];
 } NTMS_OPREQUESTINFORMATIONW;
  
 typedef struct _NTMS_PARTITIONINFORMATIONA {
     NTMS_GUID          PhysicalMedia;
     NTMS_GUID          LogicalMedia;
     DWORD              State;
     unsigned short     Side;
     DWORD              dwOmidLabelIdLength;   
     byte               OmidLabelId[255];
     char               szOmidLabelType[64];   
     char               szOmidLabelInfo[256];    
     DWORD              dwMountCount;
     DWORD              dwAllocateCount;
     LARGE_INTEGER      Capacity;
 } NTMS_PARTITIONINFORMATIONA;
  
 typedef struct _NTMS_PARTITIONINFORMATIONW {
     NTMS_GUID          PhysicalMedia;
     NTMS_GUID          LogicalMedia;
     DWORD              State;
     unsigned short     Side;
     DWORD              dwOmidLabelIdLength;  
     byte               OmidLabelId[255];
     [string] wchar_t   szOmidLabelType[64];   
     [string] wchar_t   szOmidLabelInfo[256];     
     DWORD              dwMountCount;
     DWORD              dwAllocateCount;
     LARGE_INTEGER      Capacity;
 } NTMS_PARTITIONINFORMATIONW;
  
 typedef struct _NTMS_PMIDINFORMATIONA {
     NTMS_GUID          CurrentLibrary;             
     NTMS_GUID          MediaPool;                  
     NTMS_GUID          Location;              
     DWORD              LocationType;
     NTMS_GUID          MediaType;
     NTMS_GUID          HomeSlot;     
     char               szBarCode[64]; 
     DWORD              BarCodeState;              
     char               szSequenceNumber[32];
     DWORD              MediaState;               
     DWORD              dwNumberOfPartitions;
     DWORD              dwMediaTypeCode;
     DWORD              dwDensityCode;
     NTMS_GUID          MountedPartition;
 } NTMS_PMIDINFORMATIONA;
  
 typedef struct _NTMS_PMIDINFORMATIONW {
     NTMS_GUID          CurrentLibrary;   
     NTMS_GUID          MediaPool;                 
     NTMS_GUID          Location;                  
     DWORD              LocationType;
     NTMS_GUID          MediaType;
     NTMS_GUID          HomeSlot;                 
     [string] wchar_t   szBarCode[64]; 
     DWORD              BarCodeState;              
     [string] wchar_t   szSequenceNumber[32];
     DWORD              MediaState;                
     DWORD              dwNumberOfPartitions;
     DWORD              dwMediaTypeCode;
     DWORD              dwDensityCode;
     NTMS_GUID          MountedPartition;
 } NTMS_PMIDINFORMATIONW;
  
 typedef struct _RSM_MESSAGE  {
     [unique] LPGUID             lpguidOperation;
     DWORD                       dwNtmsType;
     DWORD                       dwState;
     DWORD                       dwFlags;
     DWORD                       dwPriority;
     DWORD                       dwErrorCode;
     [string, unique] wchar_t *  lpszComputerName;
     [string] wchar_t *          lpszApplication;
     [string] wchar_t *          lpszUser;
     [string] wchar_t *          lpszTimeSubmitted;
     [string] wchar_t *          lpszMessage;
 } RSM_MESSAGE, *LPRSM_MESSAGE;
  
 typedef struct _NTMS_OBJECTINFORMATIONA {
     DWORD                       dwSize;
     DWORD                       dwType;
     SYSTEMTIME                  Created;
     SYSTEMTIME                  Modified;
     NTMS_GUID                   ObjectGuid;
     BOOL                        Enabled;
     DWORD                       dwOperationalState;
     char                        szName[64];
     char                        szDescription[127];
     [switch_is(dwType)] union {
         [case(NTMS_DRIVE)]           NTMS_DRIVEINFORMATIONA Drive;
         [case(NTMS_DRIVE_TYPE)]      NTMS_DRIVETYPEINFORMATIONA DriveType;
         [case(NTMS_LIBRARY)]         NTMS_LIBRARYINFORMATION Library;
         [case(NTMS_CHANGER)]         NTMS_CHANGERINFORMATIONA Changer;
         [case(NTMS_CHANGER_TYPE)]    NTMS_CHANGERTYPEINFORMATIONA ChangerType;
         [case(NTMS_STORAGESLOT)]     NTMS_STORAGESLOTINFORMATION StorageSlot;
         [case(NTMS_IEDOOR)]          NTMS_IEDOORINFORMATION IEDoor;
         [case(NTMS_IEPORT)]          NTMS_IEPORTINFORMATION IEPort;
         [case(NTMS_PHYSICAL_MEDIA)]  NTMS_PMIDINFORMATIONA PhysicalMedia;
         [case(NTMS_LOGICAL_MEDIA)]   NTMS_LMIDINFORMATION LogicalMedia;
         [case(NTMS_PARTITION)]       NTMS_PARTITIONINFORMATIONA Partition;
         [case(NTMS_MEDIA_POOL)]      NTMS_MEDIAPOOLINFORMATION MediaPool;
         [case(NTMS_MEDIA_TYPE)]      NTMS_MEDIATYPEINFORMATION MediaType;
         [case(NTMS_LIBREQUEST)]      NTMS_LIBREQUESTINFORMATIONA LibRequest;
         [case(NTMS_OPREQUEST)]       NTMS_OPREQUESTINFORMATIONA OpRequest;
         [case(NTMS_COMPUTER)]        NTMS_COMPUTERINFORMATION Computer;
     } Info;
 } NTMS_OBJECTINFORMATIONA, *LPNTMS_OBJECTINFORMATIONA;
  
 typedef struct _NTMS_OBJECTINFORMATIONW {
     DWORD                       dwSize;
     DWORD                       dwType;
     SYSTEMTIME                  Created;
     SYSTEMTIME                  Modified;
     NTMS_GUID                   ObjectGuid;
     BOOL                        Enabled;
     DWORD                       dwOperationalState;
     [string] wchar_t            szName[64];
     [string] wchar_t            szDescription[127];
     [switch_is(dwType)] union {
         [case(NTMS_DRIVE)]           NTMS_DRIVEINFORMATIONW Drive;
         [case(NTMS_DRIVE_TYPE)]      NTMS_DRIVETYPEINFORMATIONW DriveType;
         [case(NTMS_LIBRARY)]         NTMS_LIBRARYINFORMATION Library;
         [case(NTMS_CHANGER)]         NTMS_CHANGERINFORMATIONW Changer;
         [case(NTMS_CHANGER_TYPE)]    NTMS_CHANGERTYPEINFORMATIONW ChangerType;
         [case(NTMS_STORAGESLOT)]     NTMS_STORAGESLOTINFORMATION StorageSlot;
         [case(NTMS_IEDOOR)]          NTMS_IEDOORINFORMATION IEDoor;
         [case(NTMS_IEPORT)]          NTMS_IEPORTINFORMATION IEPort;
         [case(NTMS_PHYSICAL_MEDIA)]  NTMS_PMIDINFORMATIONW PhysicalMedia;
         [case(NTMS_LOGICAL_MEDIA)]   NTMS_LMIDINFORMATION LogicalMedia;
         [case(NTMS_PARTITION)]       NTMS_PARTITIONINFORMATIONW Partition;
         [case(NTMS_MEDIA_POOL)]      NTMS_MEDIAPOOLINFORMATION MediaPool;
         [case(NTMS_MEDIA_TYPE)]      NTMS_MEDIATYPEINFORMATION MediaType;
         [case(NTMS_LIBREQUEST)]      NTMS_LIBREQUESTINFORMATIONW LibRequest;
         [case(NTMS_OPREQUEST)]       NTMS_OPREQUESTINFORMATIONW OpRequest;
         [case(NTMS_COMPUTER)]        NTMS_COMPUTERINFORMATION Computer;
     } Info;
 } NTMS_OBJECTINFORMATIONW, *LPNTMS_OBJECTINFORMATIONW;
  
  
  
 // interfaces 
  
 [
         object,
         uuid(4e934f30-341a-11d1-8fb1-00a024cb6019),
         helpstring("INtms Library Control Interface"),
         pointer_default(unique)
 ]
 interface INtmsLibraryControl1 : IUnknown
 {
  
 HRESULT EjectNtmsMedia(
         [in, unique] LPNTMS_GUID  lpMediaId,
         [in, out] LPNTMS_GUID     lpEjectOperation,
         [in] DWORD                dwAction
         );
  
 HRESULT InjectNtmsMedia(
         [in] LPNTMS_GUID          lpLibraryId,
         [in, out] LPNTMS_GUID     lpInjectOperation,
         [in] DWORD                dwAction
         );
  
 HRESULT AccessNtmsLibraryDoor(
         [in] LPNTMS_GUID          lpLibraryId,
         [in] DWORD                dwAction
         );
  
 HRESULT CleanNtmsDrive(
         [in] LPNTMS_GUID          lpDriveId
         );
  
 HRESULT DismountNtmsDrive(
         [in] LPNTMS_GUID          lpDriveId
         );
  
 HRESULT InventoryNtmsLibrary(
         [in] LPNTMS_GUID          lpLibraryId,
         [in] DWORD                dwAction
         );
  
 HRESULT INtmsLibraryControl1_LocalOnlyOpnum09( 
     );
  
 HRESULT CancelNtmsLibraryRequest(
         [in] LPNTMS_GUID          lpRequestId
         );
  
 HRESULT ReserveNtmsCleanerSlot (
         [in] LPNTMS_GUID          lpLibrary,
         [in] LPNTMS_GUID          lpSlot
         );
  
 HRESULT ReleaseNtmsCleanerSlot (
         [in] LPNTMS_GUID          lpLibrary
         );
  
 HRESULT InjectNtmsCleaner (
         [in] LPNTMS_GUID          lpLibrary,
         [in,out] LPNTMS_GUID      lpInjectOperation,
         [in] DWORD                dwNumberOfCleansLeft,
         [in] DWORD                dwAction
         );
  
 HRESULT EjectNtmsCleaner (
         [in] LPNTMS_GUID          lpLibrary,
         [in,out] LPNTMS_GUID      lpEjectOperation,
         [in] DWORD                dwAction
         );
  
 HRESULT DeleteNtmsLibrary(
         [in] LPNTMS_GUID          lpLibraryId
         );
  
 HRESULT DeleteNtmsDrive(
         [in] LPNTMS_GUID          lpDriveId
         );
  
 HRESULT GetNtmsRequestOrder(
         [in]  LPNTMS_GUID         lpRequestId,
         [out] DWORD *             lpdwOrderNumber
         );
  
 HRESULT SetNtmsRequestOrder(
         [in]  LPNTMS_GUID         lpRequestId,
         [in]  DWORD               dwOrderNumber
         );
  
 HRESULT DeleteNtmsRequests(
         [in, 
             size_is(dwCount)] 
             LPNTMS_GUID           lpRequestId,
         [in] DWORD                dwType,
         [in] DWORD                dwCount
         );
  
 HRESULT BeginNtmsDeviceChangeDetection(
         [out] NTMS_HANDLE *       lpDetectHandle
         );
  
 HRESULT SetNtmsDeviceChangeDetection(
         [in] NTMS_HANDLE          DetectHandle,
         [in, 
             size_is(dwCount)] 
             LPNTMS_GUID           lpObjectId,
         [in] DWORD                dwType,
         [in] DWORD                dwCount
         );
  
 HRESULT EndNtmsDeviceChangeDetection(
         [in] NTMS_HANDLE          DetectHandle
         );
  
 };
  
  
 [
         object,
         uuid(d02e4be0-3419-11d1-8fb1-00a024cb6019),
         helpstring("INtms Media Services Interface"),
         pointer_default(unique)
 ]
 interface INtmsMediaServices1 : IUnknown
 {
  
 HRESULT MountNtmsMedia(
         [in, 
             size_is(dwCount)]
             LPNTMS_GUID                lpMediaId,
         [in, out, 
             size_is(dwCount)]
             LPNTMS_GUID                lpDriveId,
         [in] DWORD                     dwCount,
         [in] DWORD                     dwOptions,
         [in] int                       dwPriority,
         [in] DWORD                     dwTimeout,
         [in,out] 
             LPNTMS_MOUNT_INFORMATION   lpMountInformation
         );
  
 HRESULT DismountNtmsMedia(
         [in, 
             size_is(dwCount)] 
             LPNTMS_GUID                lpMediaId,
         [in] DWORD                     dwCount,
         [in] DWORD                     dwOptions
         );
  
 HRESULT Opnum5NotUsedOnWire();
  
 HRESULT AllocateNtmsMedia(
         [in] LPNTMS_GUID               lpMediaPool,
         [in, unique] LPNTMS_GUID       lpPartition,   
         [in, out] LPNTMS_GUID          lpMediaId,     
         [in] DWORD                     dwOptions,
         [in] DWORD                     dwTimeout,
         [in, out] LPNTMS_ALLOCATION_INFORMATION
                                        lpAllocateInformation
         );
  
 HRESULT DeallocateNtmsMedia(
         [in] LPNTMS_GUID               lpMediaId,
         [in] DWORD                     dwOptions
         );
  
 HRESULT SwapNtmsMedia(
         [in] LPNTMS_GUID               lpMediaId1,
         [in] LPNTMS_GUID               lpMediaId2
         );
  
 HRESULT DecommissionNtmsMedia(
         [in] LPNTMS_GUID               lpMediaId
         );
  
 HRESULT SetNtmsMediaComplete(
         [in] LPNTMS_GUID               lpMediaId
         );
  
 HRESULT DeleteNtmsMedia(
         [in] LPNTMS_GUID               lpMediaId
         );
  
 HRESULT CreateNtmsMediaPoolA(
         [in, string] const char *              lpPoolName,
         [in, unique] LPNTMS_GUID       lpMediaType,
         [in] DWORD                     dwOptions,
         [in, unique] 
             LPSECURITY_ATTRIBUTES_NTMS lpSecurityAttributes,
         [out] LPNTMS_GUID              lpPoolId         
         );
  
 HRESULT CreateNtmsMediaPoolW(
         [in, string] const wchar_t *   lpPoolName,
         [in, unique] LPNTMS_GUID       lpMediaType,
         [in] DWORD                     dwOptions,
         [in, unique] 
             LPSECURITY_ATTRIBUTES_NTMS lpSecurityAttributes,
         [out] LPNTMS_GUID              lpPoolId        
         );
  
 HRESULT GetNtmsMediaPoolNameA(
         [in]  LPNTMS_GUID              lpPoolId,
         [out, size_is(*lpdwNameSizeBuf),
             length_is(*lpdwNameSizeBuf)]
             unsigned char *            lpBufName,
         [in] DWORD *                   lpdwNameSizeBuf,
         [out] DWORD *                  lpdwNameSize
         );
  
 HRESULT GetNtmsMediaPoolNameW(
         [in]  LPNTMS_GUID              lpPoolId,
         [out, 
             size_is(*lpdwNameSizeBuf),
             length_is(*lpdwNameSizeBuf)]
             wchar_t *                  lpBufName,
         [in] DWORD *                   lpdwNameSizeBuf,
         [out] DWORD *                  lpdwNameSize
         );
  
 HRESULT MoveToNtmsMediaPool(
         [in] LPNTMS_GUID               lpMediaId,
         [in] LPNTMS_GUID               lpPoolId
         );
  
 HRESULT DeleteNtmsMediaPool(
         [in] LPNTMS_GUID               lpPoolId
         );
  
 HRESULT AddNtmsMediaType(
         [in] LPNTMS_GUID               lpMediaTypeId,
         [in] LPNTMS_GUID               lpLibId
         );
  
 HRESULT DeleteNtmsMediaType(
         [in] LPNTMS_GUID               lpMediaTypeId,
         [in] LPNTMS_GUID               lpLibId
         );
  
 HRESULT ChangeNtmsMediaType(
         [in] LPNTMS_GUID               lpMediaId,
         [in] LPNTMS_GUID               lpPoolId
         );
  
 };
  
  
 [
         object,
         uuid(69ab7050-3059-11d1-8faf-00a024cb6019),
         helpstring("INtmsObjectInfo1 Interface"),
         pointer_default(unique)
 ]
  
 interface INtmsObjectInfo1 : IUnknown
 {
  
 HRESULT GetNtmsServerObjectInformationA(
         [in, unique] LPNTMS_GUID             lpObjectId,
         [out] LPNTMS_OBJECTINFORMATIONA      lpInfo,
         [in] DWORD                           dwType,
         [in] DWORD                           dwSize
         );
  
 HRESULT GetNtmsServerObjectInformationW(
         [in] LPNTMS_GUID                     lpObjectId,
         [out] LPNTMS_OBJECTINFORMATIONW      lpInfo,
         [in] DWORD                           dwType,
         [in] DWORD                           dwSize
         );
  
 HRESULT SetNtmsObjectInformationA(
         [in] LPNTMS_GUID                     lpObjectId,
         [in] LPNTMS_OBJECTINFORMATIONA       lpInfo
         );
  
 HRESULT SetNtmsObjectInformationW(
         [in] LPNTMS_GUID                     lpObjectId,
         [in] LPNTMS_OBJECTINFORMATIONW       lpInfo
         );
  
 HRESULT CreateNtmsMediaA(
         [in, out] LPNTMS_OBJECTINFORMATIONA  lpMedia,
         [in, out, 
             size_is(*lpdwListBufferSize),
             length_is(dwListCount)]
             LPNTMS_OBJECTINFORMATIONA        lpList,
         [in] DWORD *                         lpdwListBufferSize,
         [in] DWORD                           dwListCount,
         [in] DWORD                           dwOptions
         );
  
 HRESULT CreateNtmsMediaW(
         [in, out] LPNTMS_OBJECTINFORMATIONW  lpMedia,
         [in, out, 
             size_is(*lpdwListBufferSize),
             length_is(dwListCount)]
             LPNTMS_OBJECTINFORMATIONW        lpList,
         [in] DWORD *                         lpdwListBufferSize,
         [in] DWORD                           dwListCount,
         [in] DWORD                           dwOptions
         );
 };
  
  
  
  
 [
         object,
         uuid(b057dc50-3059-11d1-8faf-00a024cb6019),
         helpstring("INtms Object Management Interface"),
         pointer_default(unique)
 ]
 interface INtmsObjectManagement1 : IUnknown
 {
  
  
 HRESULT GetNtmsObjectSecurity(
         [in] LPNTMS_GUID                     lpObjectId,
         [in] DWORD                           dwType,
         [in] DWORD                           SecurityInformation,
         [out,
             size_is(nLength)] 
             PSECURITY_DESCRIPTOR_NTMS        lpSecurityDescriptor,
         [in] DWORD                           nLength,
         [out] DWORD *                        lpnLengthNeeded
         );
  
 HRESULT SetNtmsObjectSecurity(
         [in] LPNTMS_GUID                     lpObjectId,
         [in] DWORD                           dwType,
         [in] DWORD                           SecurityInformation,
         [in,
             size_is(nLength)] 
             PSECURITY_DESCRIPTOR_NTMS        lpSecurityDescriptor,
         [in] DWORD                           nLength
         );
  
  
 HRESULT GetNtmsObjectAttributeA(
         [in] LPNTMS_GUID                     lpObjectId,
         [in] DWORD                           dwType,
         [in] const char *                    lpAttributeName,
         [out, 
             size_is(*lpdwAttributeBufferSize),
             length_is(*lpAttributeSize)] 
             byte *                           lpAttributeData,
         [in] DWORD *                         lpdwAttributeBufferSize,
         [out] DWORD *                        lpAttributeSize
         );
  
 HRESULT GetNtmsObjectAttributeW(
         [in] LPNTMS_GUID                     lpObjectId,
         [in] DWORD                           dwType,
         [in,string] const wchar_t *          lpAttributeName,
         [out, 
             size_is(*lpdwAttributeBufferSize), 
             length_is(*lpAttributeSize)] 
             byte *                           lpAttributeData,
         [in] DWORD *                         lpdwAttributeBufferSize,
         [out] DWORD *                        lpAttributeSize
         );
  
 HRESULT SetNtmsObjectAttributeA(
         [in] LPNTMS_GUID                     lpObjectId,
         [in] DWORD                           dwType,
         [in] const char *                    lpAttributeName,
         [in, size_is(AttributeSize)] byte *  lpAttributeData,
         [in] DWORD                           AttributeSize
         );
  
 HRESULT SetNtmsObjectAttributeW(
         [in] LPNTMS_GUID                     lpObjectId,
         [in] DWORD                           dwType,
         [in, string] const wchar_t *         lpAttributeName,
         [in, size_is(AttributeSize)] byte *  lpAttributeData,
         [in] DWORD                           AttributeSize
         );
  
 HRESULT EnumerateNtmsObject(
         [in, unique] const LPNTMS_GUID       lpContainerId,
         [out, 
             size_is(*lpdwListBufferSize),
             length_is(*lpdwListBufferSize)] 
             LPNTMS_GUID                      lpList,
         [in] DWORD *                         lpdwListBufferSize,
         [out] DWORD *                        lpdwListSize,
         [in] DWORD                           dwType,
         [in] DWORD                           dwOptions
         );
  
 HRESULT DisableNtmsObject(
         [in] DWORD                           dwType,
         [in] LPNTMS_GUID                     lpObjectId
         );
  
 HRESULT EnableNtmsObject(
         [in] DWORD                           dwType,
         [in] LPNTMS_GUID                     lpObjectId
         );
  
 };
  
  
 [
         object,
         uuid(8da03f40-3419-11d1-8fb1-00a024cb6019),
         helpstring("INtms Session Interface"),
         pointer_default(unique)
 ]
 interface INtmsSession1 : IUnknown
 {
  
 HRESULT OpenNtmsServerSessionW(
         [in, string, unique] const wchar_t * lpServer,
         [in, string, unique] const wchar_t * lpApplication,
         [in, string] const wchar_t *         lpClientName,
         [in, string] const wchar_t *         lpUserName,
         [in] DWORD                           dwOptions
         );
  
 HRESULT OpenNtmsServerSessionA(
         [in, unique] const char *            lpServer,
         [in, unique] const char *            lpApplication,
         [in] const char *                    lpClientName,
         [in] const char *                    lpUserName,
         [in] DWORD                           dwOptions
         );
  
 HRESULT CloseNtmsSession(
         );
  
 HRESULT SubmitNtmsOperatorRequestW(
         [in] DWORD                           dwRequest,
         [in, string, unique] const wchar_t * lpMessage,
         [in, unique] LPNTMS_GUID             lpArg1Id,
         [in, unique] LPNTMS_GUID             lpArg2Id,
         [out] LPNTMS_GUID                    lpRequestId
         );
  
 HRESULT SubmitNtmsOperatorRequestA(
         [in] DWORD                           dwRequest,
         [in, unique] const char *            lpMessage,
         [in, unique] LPNTMS_GUID             lpArg1Id,
         [in, unique] LPNTMS_GUID             lpArg2Id,
         [out] LPNTMS_GUID                    lpRequestId
         );
  
 HRESULT WaitForNtmsOperatorRequest(
         [in] LPNTMS_GUID                     lpRequestId,
         [in] DWORD                           dwTimeout
         );
  
 HRESULT CancelNtmsOperatorRequest(
         [in] LPNTMS_GUID                     lpRequestId
         );
  
 HRESULT SatisfyNtmsOperatorRequest(
         [in] LPNTMS_GUID                     lpRequestId
         );
  
 HRESULT ImportNtmsDatabase(
         );
  
 HRESULT ExportNtmsDatabase(
         );
  
 HRESULT Opnum13NotUsedOnWire();
  
 HRESULT AddNotification(
         [in] DWORD                           dwType
         );
  
 HRESULT RemoveNotification(
         [in] DWORD                           dwType
         );
  
 HRESULT DispatchNotification(
         [in]  DWORD                          dwType,
         [in]  DWORD                          dwOperation,
         [in]  LPNTMS_GUID                    lpIdentifier
         );
  
 };
  
  
 [
         object,
         uuid(879C8BBE-41B0-11d1-BE11-00C04FB6BF70),
         helpstring("IClientSink Interface"),
         pointer_default(unique)
 ]
 interface IClientSink : IUnknown
 {
         HRESULT OnNotify(
         [in] DWORD                           dwType,
         [in] DWORD                           dwOperation,
         [in] LPNTMS_GUID                     lpIdentifier
         );
  
 };
  
 [
         object,
         uuid(DB90832F-6910-4d46-9F5E-9FD6BFA73903),
         helpstring("New INtms Library Control Interface "),
         pointer_default(unique)
 ]
  
 interface INtmsLibraryControl2  : INtmsLibraryControl1
 {
 HRESULT IdentifyNtmsSlot(
         [in] LPNTMS_GUID                     lpSlotId,
         [in] DWORD                           dwOption
         );
  
 };
  
  
  
  
 [
         object,
         uuid(895A2C86-270D-489d-A6C0-DC2A9B35280E),
         helpstring("Robust INtms Object Management Interface"),
         pointer_default(unique)
 ]
 interface INtmsObjectManagement2  : INtmsObjectManagement1
 {
 HRESULT EnumerateNtmsObjectR(
         [in, unique] const LPNTMS_GUID       lpContainerId,
         [out, 
             size_is(*lpdwListBufferSize),
             length_is(*lpdwListSize)] 
             LPNTMS_GUID                      lpList,
         [in] DWORD *                         lpdwListBufferSize,
         [out] DWORD *                        lpdwListSize,
         [out] DWORD *                        lpdwOutputSize,
         [in] DWORD                           dwType,
         [in] DWORD                           dwOptions
         );
  
  
 HRESULT GetNtmsUIOptionsA(
         [in, unique] const LPNTMS_GUID       lpObjectId,
         [in] DWORD                           dwType,
         [out, 
             size_is(*lpdwBufSize),
             length_is(*lpdwDataSize)] 
             unsigned char *                  lpszDestination,
         [in] DWORD *                         lpdwBufSize,
         [out] DWORD *                        lpdwDataSize,
         [out] DWORD *                        lpdwOutSize
         );
  
 HRESULT GetNtmsUIOptionsW(
         [in, unique] const LPNTMS_GUID       lpObjectId,
         [in] DWORD                           dwType,
         [out, 
             size_is(*lpdwBufSize),
             length_is(*lpdwDataSize)] 
             wchar_t *                        lpszDestination,
         [in] DWORD *                         lpdwBufSize,
         [out] DWORD *                        lpdwDataSize,
         [out] DWORD *                        lpdwOutSize
         );
  
 HRESULT SetNtmsUIOptionsA(
         [in, unique] const LPNTMS_GUID       lpObjectId,
         [in] DWORD                           dwType,
         [in] DWORD                           dwOperation,
         [in, string] const char *            lpszDestination
         );
  
 HRESULT SetNtmsUIOptionsW(
         [in, unique] const LPNTMS_GUID       lpObjectId,
         [in] DWORD                           dwType,
         [in] DWORD                           dwOperation,
         [in, string] const wchar_t *         lpszDestination
         );
  
 };
  
  
 [
         object,
         uuid(3BBED8D9-2C9A-4b21-8936-ACB2F995BE6C),
         helpstring("INtms Object Management Interface 3"),
         pointer_default(unique)
 ]
 interface INtmsObjectManagement3  : INtmsObjectManagement2
 {
  
 HRESULT GetNtmsObjectAttributeAR(
         [in] LPNTMS_GUID                     lpObjectId,
         [in] DWORD                           dwType,
         [in] const char *                    lpAttributeName,
         [out, 
             size_is(*lpdwAttributeBufferSize),
             length_is(*lpAttributeSize)] 
             byte *                           lpAttributeData,
         [in] DWORD *                         lpdwAttributeBufferSize,
         [out] DWORD *                        lpAttributeSize,
         [out] DWORD *                        lpActualAttributeSize
         );
  
 HRESULT GetNtmsObjectAttributeWR(
         [in] LPNTMS_GUID                     lpObjectId,
         [in] DWORD                           dwType,
         [in, string] const wchar_t *         lpAttributeName,
         [out, 
             size_is(*lpdwAttributeBufferSize),
             length_is(*lpAttributeSize)] 
             byte *                           lpAttributeData,
         [in] DWORD *                         lpdwAttributeBufferSize,
         [out] DWORD *                        lpAttributeSize,  
         [out] DWORD *                        lpActualAttributeSize
         );
  
 }
  
 [   
         object,
         uuid(7D07F313-A53F-459a-BB12-012C15B1846E),
         helpstring("Robust INtms Media Services Interface"),
         pointer_default(unique)
 ]
 interface IRobustNtmsMediaServices1 : INtmsMediaServices1
 {
 HRESULT GetNtmsMediaPoolNameAR(
         [in]  LPNTMS_GUID                    lpPoolId,
         [out, 
             size_is(*lpdwNameSizeBuf),
             length_is(*lpdwNameSize)]
             unsigned char *                  lpBufName,
         [in] DWORD *                         lpdwNameSizeBuf,
         [out] DWORD *                        lpdwNameSize,
         [out] DWORD *                        lpdwOutputSize
         );
  
 HRESULT GetNtmsMediaPoolNameWR(
         [in]  LPNTMS_GUID                    lpPoolId,
         [out, 
             size_is(*lpdwNameSizeBuf),
             length_is(*lpdwNameSize)]
             wchar_t *                        lpBufName,
         [in] DWORD *                         lpdwNameSizeBuf,
         [out] DWORD *                        lpdwNameSize,
         [out] DWORD *                        lpdwOutputSize
         );
 };
  
 [
   object,
   uuid(00000000-0000-0000-C000-000000000046),
  
   pointer_default(unique)
 ]
  
 interface IUnknown
 {
     typedef [unique] IUnknown *LPUNKNOWN;
  
     HRESULT QueryInterface(
         [in] REFIID               riid,
         [out, iid_is(riid)] void  **ppvObject);
     DWORD AddRef();
     DWORD Release();
 }
  
 [
     object,
     uuid(081E7188-C080-4FF3-9238-29F66D6CABFD),
     helpstring("IMessenger Interface"),
     pointer_default(unique)
 ]
 interface IMessenger : IUnknown
 {
  
 [helpstring("method SendMessage")]
 HRESULT SendMessage(
         [in, unique] LPRSM_MESSAGE   lpRsmMessage
         );
  
 [helpstring("method RecallMessage")]
 HRESULT RecallMessage(
         [in] LPGUID                  lpGuid
         );
  
 };
  
  
 [
     object,
     uuid(BB39332C-BFEE-4380-AD8A-BADC8AFF5BB6),
     helpstring("INtmsNotifySink Interface"),
     pointer_default(unique)
 ]
  
 interface INtmsNotifySink : IUnknown
 {
  
 [helpstring("method ConnectCallback")]
 HRESULT ConnectCallback(
         [in] IUnknown*        pUnkCP,
         [in] IUnknown*        pUnkSink
         );
  
 [helpstring("method OnNotify")]
 HRESULT OnNotify(
         [in] DWORD            dwType,
         [in] DWORD            dwOperation,
         [in] LPGUID           lpIdentifier
 );
  
  
 [helpstring("method ReleaseCallback")]
 HRESULT ReleaseCallback(
 );
  
 };
  
 [
     uuid(D61A27C6-8F53-11D0-BFA0-00A024151983),
     helpstring("Removable Storage Manager Class"),
 ]
 coclass  CNtmsSvr
 {
     [default]  interface  INtmsSession1;
 };