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.
291 lines
9.9 KiB
291 lines
9.9 KiB
/*++
|
|
|
|
© 1998 Seagate Software, Inc. All rights reserved.
|
|
|
|
Module Name:
|
|
|
|
NtTapeIo.h
|
|
|
|
Abstract:
|
|
|
|
Definition of the CNtTapeIo class
|
|
|
|
Author:
|
|
|
|
Brian Dodd [brian] 01-Apr-1997
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#if !defined(NtTapeIo_H)
|
|
#define NtTapeIo_H
|
|
|
|
#if _MSC_VER >= 1000
|
|
#pragma once
|
|
#endif // _MSC_VER >= 1000
|
|
|
|
#include "resource.h" // main symbols
|
|
#include "MTFSessn.h" // CMTFSession
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CNtTapeIo
|
|
|
|
class CNtTapeIo :
|
|
public CComDualImpl<IDataMover, &IID_IDataMover, &LIBID_MOVERLib>,
|
|
public IStream,
|
|
public ISupportErrorInfo,
|
|
public IWsbCollectable,
|
|
public CComObjectRoot,
|
|
public CComCoClass<CNtTapeIo,&CLSID_CNtTapeIo>
|
|
{
|
|
public:
|
|
CNtTapeIo() {}
|
|
BEGIN_COM_MAP(CNtTapeIo)
|
|
COM_INTERFACE_ENTRY2(IDispatch, IDataMover)
|
|
COM_INTERFACE_ENTRY(IDataMover)
|
|
COM_INTERFACE_ENTRY(IStream)
|
|
COM_INTERFACE_ENTRY(ISupportErrorInfo)
|
|
COM_INTERFACE_ENTRY(IWsbCollectable)
|
|
END_COM_MAP()
|
|
//DECLARE_NOT_AGGREGATABLE(CNtTapeIo)
|
|
// Remove the comment from the line above if you don't want your object to
|
|
// support aggregation.
|
|
|
|
DECLARE_REGISTRY_RESOURCEID(IDR_CNtTapeIo)
|
|
// ISupportsErrorInfo
|
|
STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);
|
|
|
|
// CComObjectRoot
|
|
public:
|
|
ULONG InternalAddRef(void);
|
|
ULONG InternalRelease(void);
|
|
STDMETHOD( FinalConstruct )(void);
|
|
STDMETHOD( FinalRelease )(void);
|
|
|
|
// IWsbCollectable
|
|
public:
|
|
STDMETHOD(CompareTo)( IN IUnknown *pCollectable, OUT SHORT *pResult);
|
|
STDMETHOD(IsEqual)(IUnknown* pCollectable);
|
|
|
|
// IDataMover
|
|
public:
|
|
STDMETHOD(GetObjectId)(OUT GUID *pObjectId);
|
|
|
|
STDMETHOD( BeginSession )(
|
|
IN BSTR remoteSessionName,
|
|
IN BSTR remoteSessionDescription,
|
|
IN SHORT remoteDataSet,
|
|
IN DWORD options);
|
|
|
|
STDMETHOD( EndSession )(void);
|
|
|
|
STDMETHOD( StoreData )(
|
|
IN BSTR localName,
|
|
IN ULARGE_INTEGER localDataStart,
|
|
IN ULARGE_INTEGER localDataSize,
|
|
IN DWORD flags,
|
|
OUT ULARGE_INTEGER *pRemoteDataSetStart,
|
|
OUT ULARGE_INTEGER *pRemoteFileStart,
|
|
OUT ULARGE_INTEGER *pRemoteFileSize,
|
|
OUT ULARGE_INTEGER *pRemoteDataStart,
|
|
OUT ULARGE_INTEGER *pRemoteDataSize,
|
|
OUT DWORD *pRemoteVerificationType,
|
|
OUT ULARGE_INTEGER *pRemoteVerificationData,
|
|
OUT DWORD *pDatastreamCRCType,
|
|
OUT ULARGE_INTEGER *pDatastreamCRC,
|
|
OUT ULARGE_INTEGER *pUsn);
|
|
|
|
STDMETHOD( RecallData )(
|
|
IN BSTR localName,
|
|
IN ULARGE_INTEGER localDataStart,
|
|
IN ULARGE_INTEGER localDataSize,
|
|
IN DWORD flags,
|
|
IN BSTR migrateSessionName,
|
|
IN ULARGE_INTEGER remoteDataSetStart,
|
|
IN ULARGE_INTEGER remoteFileStart,
|
|
IN ULARGE_INTEGER remoteFileSize,
|
|
IN ULARGE_INTEGER remoteDataStart,
|
|
IN ULARGE_INTEGER remoteDataSize,
|
|
IN DWORD remoteVerificationType,
|
|
IN ULARGE_INTEGER remoteVerificationData);
|
|
|
|
STDMETHOD( FormatLabel )(
|
|
IN BSTR displayName,
|
|
OUT BSTR *pLabel);
|
|
|
|
STDMETHOD( WriteLabel )(
|
|
IN BSTR label);
|
|
|
|
STDMETHOD( ReadLabel )(
|
|
IN OUT BSTR *pLabel );
|
|
|
|
STDMETHOD( VerifyLabel )(
|
|
IN BSTR label);
|
|
|
|
STDMETHOD( GetDeviceName )(
|
|
OUT BSTR *pName);
|
|
|
|
STDMETHOD( SetDeviceName )(
|
|
IN BSTR name,
|
|
IN BSTR unused);
|
|
|
|
STDMETHOD( GetLargestFreeSpace )(
|
|
OUT LONGLONG *pFreeSpace,
|
|
OUT LONGLONG *pCapacity,
|
|
IN ULONG defaultFreeSpaceLow = 0xFFFFFFFF,
|
|
IN LONG defaultFreeSpaceHigh = 0xFFFFFFFF);
|
|
|
|
STDMETHOD( SetInitialOffset )(
|
|
IN ULARGE_INTEGER initialOffset);
|
|
|
|
STDMETHOD( GetCartridge )(
|
|
OUT IRmsCartridge **ptr);
|
|
|
|
STDMETHOD( SetCartridge )(
|
|
IN IRmsCartridge *ptr);
|
|
|
|
STDMETHOD( Cancel )(void);
|
|
|
|
STDMETHOD( CreateLocalStream )(
|
|
IN BSTR name,
|
|
IN DWORD mode,
|
|
OUT IStream **ppStream);
|
|
|
|
STDMETHOD( CreateRemoteStream )(
|
|
IN BSTR name,
|
|
IN DWORD mode,
|
|
IN BSTR remoteSessionName,
|
|
IN BSTR remoteSessionDescription,
|
|
IN ULARGE_INTEGER remoteDataSetStart,
|
|
IN ULARGE_INTEGER remoteFileStart,
|
|
IN ULARGE_INTEGER remoteFileSize,
|
|
IN ULARGE_INTEGER remoteDataStart,
|
|
IN ULARGE_INTEGER remoteDataSize,
|
|
IN DWORD remoteVerificationType,
|
|
IN ULARGE_INTEGER remoteVerificationData,
|
|
OUT IStream **ppStream);
|
|
|
|
STDMETHOD( CloseStream )(void);
|
|
|
|
STDMETHOD( Duplicate )(
|
|
IN IDataMover *pDestination,
|
|
IN DWORD options,
|
|
OUT ULARGE_INTEGER *pBytesCopied,
|
|
OUT ULARGE_INTEGER *pBytesReclaimed);
|
|
|
|
STDMETHOD( FlushBuffers )(void);
|
|
|
|
STDMETHOD( Recover )(OUT BOOL *pDeleteFile);
|
|
|
|
// IStream
|
|
public:
|
|
STDMETHOD( Read )(
|
|
OUT void *pv,
|
|
IN ULONG cb,
|
|
OUT ULONG *pcbRead);
|
|
|
|
STDMETHOD( Write )(
|
|
OUT void const *pv,
|
|
IN ULONG cb,
|
|
OUT ULONG *pcbWritten);
|
|
|
|
STDMETHOD( Seek )(
|
|
IN LARGE_INTEGER dlibMove,
|
|
IN DWORD dwOrigin,
|
|
OUT ULARGE_INTEGER *plibNewPosition);
|
|
|
|
STDMETHOD( SetSize )(
|
|
IN ULARGE_INTEGER libNewSize);
|
|
|
|
STDMETHOD( CopyTo )(
|
|
IN IStream *pstm,
|
|
IN ULARGE_INTEGER cb,
|
|
OUT ULARGE_INTEGER *pcbRead,
|
|
OUT ULARGE_INTEGER *pcbWritten);
|
|
|
|
STDMETHOD( Commit )(
|
|
IN DWORD grfCommitFlags);
|
|
|
|
STDMETHOD( Revert )(void);
|
|
|
|
STDMETHOD( LockRegion )(
|
|
IN ULARGE_INTEGER libOffset,
|
|
IN ULARGE_INTEGER cb,
|
|
IN DWORD dwLockType);
|
|
|
|
STDMETHOD( UnlockRegion )(
|
|
IN ULARGE_INTEGER libOffset,
|
|
IN ULARGE_INTEGER cb,
|
|
IN DWORD dwLockType);
|
|
|
|
STDMETHOD( Stat )(
|
|
OUT STATSTG *pstatstg,
|
|
IN DWORD grfStatFlag);
|
|
|
|
STDMETHOD( Clone )(
|
|
OUT IStream **ppstm);
|
|
|
|
private:
|
|
enum { // Class specific constants:
|
|
//
|
|
Version = 1, // Class version, this should be
|
|
// incremented each time the
|
|
// the class definition changes.
|
|
DefaultBlockSize = RMS_DEFAULT_BLOCK_SIZE, // Default block size to use.
|
|
DefaultMinBufferSize = RMS_DEFAULT_BUFFER_SIZE, // Default minimum buffer size.
|
|
};
|
|
GUID m_ObjectId; // Unique ID for this object.
|
|
CMTFSession* m_pSession; // Holds all session information.
|
|
SHORT m_DataSetNumber; // Holds the current dataset number.
|
|
HANDLE m_hTape; // Tape drive handle.
|
|
CWsbBstrPtr m_DeviceName; // The name of the tape device.
|
|
DWORD m_Flags; // Holds data transfer type flag.
|
|
CWsbBstrPtr m_LastVolume; // Name of the last volume backed up.
|
|
CWsbBstrPtr m_LastPath; // Name of the last directory backed up.
|
|
BOOL m_ValidLabel; // True if the label is valid, the flag
|
|
// knocked down on BUS_RESET and Medium
|
|
// errors, and assumed valid at initialization.
|
|
|
|
TAPE_GET_MEDIA_PARAMETERS m_sMediaParameters; // We store media and drive parameters
|
|
// here when we open up the tape device...
|
|
TAPE_GET_DRIVE_PARAMETERS m_sDriveParameters; //
|
|
|
|
CWsbBstrPtr m_StreamName; // Stream state information...
|
|
ULONG m_Mode; // The kind of I/O. See MVR_MODE_*
|
|
ULARGE_INTEGER m_StreamPBA; // The PBA for the current Stream. Used to tell if read ops are aligned with tape.
|
|
ULARGE_INTEGER m_StreamOffset; // The Current offset into the data stream
|
|
ULARGE_INTEGER m_StreamSize; // The size of the data stream
|
|
|
|
BYTE * m_pStreamBuf; // Internal stream buffer used to handle I/O for boundary conditions
|
|
ULONG m_StreamBufSize; // Max size of the internal stream buffer
|
|
ULONG m_StreamBufUsed; // The number of bytes of the internal stream buffer containing valid data
|
|
ULONG m_StreamBufPosition; // The current position of the stream pointer.
|
|
ULARGE_INTEGER m_StreamBufStartPBA; // The corresponding starting PBA for the internal stream buffer
|
|
|
|
CComPtr<IRmsCartridge> m_pCartridge; // A reference to the Cartridge in use by the DataMover.
|
|
|
|
CRITICAL_SECTION m_CriticalSection; // Object sychronization support
|
|
BOOL m_bCritSecCreated; // Indicates whether all CritSec were created successfully (for cleanup)
|
|
static int s_InstanceCount; // Counter of the number of object instances.
|
|
// Tape I/O
|
|
HRESULT OpenTape(void);
|
|
HRESULT CloseTape(void);
|
|
HRESULT WriteBuffer(IN BYTE *pBuffer, IN ULONG nBytesToWrite, OUT ULONG *pBytesWritten);
|
|
HRESULT ReadBuffer(IN BYTE *pBuffer, IN ULONG nBytesToRead, OUT ULONG *pBytesRead);
|
|
HRESULT WriteFilemarks(IN ULONG count);
|
|
HRESULT GetPosition(OUT UINT64 *pPosition);
|
|
HRESULT SetPosition(IN UINT64 position);
|
|
HRESULT EnsurePosition(IN UINT64 position);
|
|
HRESULT SpaceFilemarks(IN LONG count, OUT UINT64 *pPosition);
|
|
HRESULT SpaceToEndOfData(OUT UINT64 *pPosition);
|
|
HRESULT RewindTape(void);
|
|
HRESULT MapTapeError(IN HRESULT hrToMap, IN WCHAR *pAction);
|
|
|
|
HRESULT IsAccessEnabled(void);
|
|
HRESULT Lock(void);
|
|
HRESULT Unlock(void);
|
|
|
|
};
|
|
|
|
#endif // !defined(NtTapeIo_H)
|