//
//  Microsoft Windows Media Technologies
//  Copyright (C) Microsoft Corporation, 1999 - 2001. All rights reserved.
//

import "unknwn.idl";
import "objidl.idl";
import "wtypes.idl";

typedef struct _tWAVEFORMATEX
{
    WORD    wFormatTag;        /* format type */
    WORD    nChannels;         /* number of channels (i.e. mono, stereo...) */
    DWORD   nSamplesPerSec;    /* sample rate */
    DWORD   nAvgBytesPerSec;   /* for buffer estimation */
    WORD    nBlockAlign;       /* block size of data */
    WORD    wBitsPerSample;    /* Number of bits per sample of mono data */
    WORD    cbSize;            /* The count in bytes of the size of
                                    extra information (after cbSize) */

} _WAVEFORMATEX;

typedef struct _tagBITMAPINFOHEADER
{
  DWORD  biSize; 
  LONG   biWidth; 
  LONG   biHeight; 
  WORD   biPlanes; 
  WORD   biBitCount; 
  DWORD  biCompression; 
  DWORD  biSizeImage; 
  LONG   biXPelsPerMeter; 
  LONG   biYPelsPerMeter; 
  DWORD  biClrUsed; 
  DWORD  biClrImportant; 
} _BITMAPINFOHEADER; 

typedef struct _tagVIDEOINFOHEADER{
    RECT  rcSource;
    RECT  rcTarget;
    DWORD  dwBitRate;
    DWORD  dwBitErrorRate;
    LONGLONG  AvgTimePerFrame;
    _BITMAPINFOHEADER  bmiHeader;
} _VIDEOINFOHEADER;

typedef struct _tagWMFILECAPABILITIES
{ 
	LPWSTR	pwszMimeType;	// Mime type
	DWORD	dwReserved;		// Recerved for future use - Should be 0 for now.
} WMFILECAPABILITIES;


typedef struct __OPAQUECOMMAND
{
    GUID guidCommand;
    DWORD dwDataLen;
    [size_is(dwDataLen)]BYTE *pData;
	BYTE abMAC[20];
} OPAQUECOMMAND;

cpp_quote("#define WMDMID_LENGTH  128")
#define WMDMID_LENGTH  128

typedef struct __WMDMID
{
	UINT cbSize;
	DWORD dwVendorID;
	BYTE pID[WMDMID_LENGTH];
	UINT SerialNumberLength;
} WMDMID, *PWMDMID;

typedef struct _WMDMDATETIME {
    WORD wYear; 
    WORD wMonth; 
    WORD wDay; 
    WORD wHour; 
    WORD wMinute; 
    WORD wSecond; 
} WMDMDATETIME, *PWMDMDATETIME; 

typedef struct __WMDMRIGHTS
{
	UINT cbSize;
	DWORD dwContentType;
	DWORD fuFlags;
	DWORD fuRights;
	DWORD dwAppSec;
	DWORD dwPlaybackCount;
	WMDMDATETIME ExpirationDate;
} WMDMRIGHTS, *PWMDMRIGHTS;

cpp_quote("#define WMDM_MAC_LENGTH 8")
#define WMDM_MAC_LENGTH 8

cpp_quote("// WMDM HRESULTS")
cpp_quote("#define WMDM_E_BUSY                             0x80045000L")
cpp_quote("#define WMDM_E_INTERFACEDEAD                    0x80045001L")
cpp_quote("#define WMDM_E_INVALIDTYPE                      0x80045002L")
cpp_quote("#define WMDM_E_PROCESSFAILED                    0x80045003L")
cpp_quote("#define WMDM_E_NOTSUPPORTED                     0x80045004L")
cpp_quote("#define WMDM_E_NOTCERTIFIED                     0x80045005L")
cpp_quote("#define WMDM_E_NORIGHTS                         0x80045006L")
cpp_quote("#define WMDM_E_CALL_OUT_OF_SEQUENCE             0x80045007L")
cpp_quote("#define WMDM_E_BUFFERTOOSMALL                   0x80045008L")
cpp_quote("#define WMDM_E_MOREDATA                         0x80045009L")
cpp_quote("#define WMDM_E_MAC_CHECK_FAILED                 0x8004500AL")
cpp_quote("#define WMDM_E_USER_CANCELLED                   0x8004500BL")
cpp_quote("#define WMDM_E_SDMI_TRIGGER                     0x8004500CL")
cpp_quote("#define WMDM_E_SDMI_NOMORECOPIES                0x8004500DL")
cpp_quote("#define WMDM_E_REVOKED                          0x8004500EL")

cpp_quote("// Revocation Flags")
cpp_quote("#define WMDM_WMDM_REVOKED                       0x00000001")
cpp_quote("#define WMDM_APP_REVOKED                        0x00000002")
cpp_quote("#define WMDM_SP_REVOKED                         0x00000004")
cpp_quote("#define WMDM_SCP_REVOKED                        0x00000008")

cpp_quote("// GetFormatSupport2 Flags")
cpp_quote("#define WMDM_GET_FORMAT_SUPPORT_AUDIO           0x00000001")
cpp_quote("#define WMDM_GET_FORMAT_SUPPORT_VIDEO           0x00000002")
cpp_quote("#define WMDM_GET_FORMAT_SUPPORT_FILE            0x00000004")

cpp_quote("// MDMRIGHTS Flags")
cpp_quote("#define WMDM_RIGHTS_PLAYBACKCOUNT               0x00000001")
cpp_quote("#define WMDM_RIGHTS_EXPIRATIONDATE              0x00000002")
cpp_quote("#define WMDM_RIGHTS_GROUPID                     0x00000004")
cpp_quote("#define WMDM_RIGHTS_FREESERIALIDS               0x00000008")
cpp_quote("#define WMDM_RIGHTS_NAMEDSERIALIDS              0x00000010")
    
cpp_quote("// Device Type Flags")
cpp_quote("#define WMDM_DEVICE_TYPE_PLAYBACK               0x00000001")
cpp_quote("#define WMDM_DEVICE_TYPE_RECORD                 0x00000002")
cpp_quote("#define WMDM_DEVICE_TYPE_DECODE                 0x00000004")
cpp_quote("#define WMDM_DEVICE_TYPE_ENCODE                 0x00000008")
cpp_quote("#define WMDM_DEVICE_TYPE_STORAGE                0x00000010")
cpp_quote("#define WMDM_DEVICE_TYPE_VIRTUAL                0x00000020")
cpp_quote("#define WMDM_DEVICE_TYPE_SDMI                   0x00000040")
cpp_quote("#define WMDM_DEVICE_TYPE_NONSDMI                0x00000080")
cpp_quote("#define WMDM_DEVICE_TYPE_NONREENTRANT           0x00000100")
cpp_quote("#define WMDM_DEVICE_TYPE_FILELISTRESYNC         0x00000200")

cpp_quote("// Device Power Source Flags")
cpp_quote("#define WMDM_POWER_CAP_BATTERY                  0x00000001")
cpp_quote("#define WMDM_POWER_CAP_EXTERNAL                 0x00000002")
cpp_quote("#define WMDM_POWER_IS_BATTERY                   0x00000004")
cpp_quote("#define WMDM_POWER_IS_EXTERNAL                  0x00000008")
cpp_quote("#define WMDM_POWER_PERCENT_AVAILABLE            0x00000010")

cpp_quote("// Device Status Flags")
cpp_quote("#define WMDM_STATUS_READY                       0x00000001")
cpp_quote("#define WMDM_STATUS_BUSY                        0x00000002")
cpp_quote("#define WMDM_STATUS_DEVICE_NOTPRESENT           0x00000004")
cpp_quote("#define WMDM_STATUS_DEVICECONTROL_PLAYING       0x00000008")
cpp_quote("#define WMDM_STATUS_DEVICECONTROL_RECORDING     0x00000010")
cpp_quote("#define WMDM_STATUS_DEVICECONTROL_PAUSED        0x00000020")
cpp_quote("#define WMDM_STATUS_DEVICECONTROL_REMOTE        0x00000040")
cpp_quote("#define WMDM_STATUS_DEVICECONTROL_STREAM        0x00000080")
cpp_quote("#define WMDM_STATUS_STORAGE_NOTPRESENT          0x00000100")
cpp_quote("#define WMDM_STATUS_STORAGE_INITIALIZING        0x00000200")
cpp_quote("#define WMDM_STATUS_STORAGE_BROKEN              0x00000400")
cpp_quote("#define WMDM_STATUS_STORAGE_NOTSUPPORTED        0x00000800")
cpp_quote("#define WMDM_STATUS_STORAGE_UNFORMATTED         0x00001000")
cpp_quote("#define WMDM_STATUS_STORAGECONTROL_INSERTING    0x00002000")
cpp_quote("#define WMDM_STATUS_STORAGECONTROL_DELETING     0x00004000")
cpp_quote("#define WMDM_STATUS_STORAGECONTROL_APPENDING    0x00008000")
cpp_quote("#define WMDM_STATUS_STORAGECONTROL_MOVING       0x00010000")
cpp_quote("#define WMDM_STATUS_STORAGECONTROL_READING      0x00020000")

cpp_quote("// Device Capabilities Flags")
cpp_quote("#define WMDM_DEVICECAP_CANPLAY                  0x00000001")
cpp_quote("#define WMDM_DEVICECAP_CANSTREAMPLAY            0x00000002")
cpp_quote("#define WMDM_DEVICECAP_CANRECORD                0x00000004")
cpp_quote("#define WMDM_DEVICECAP_CANSTREAMRECORD          0x00000008")
cpp_quote("#define WMDM_DEVICECAP_CANPAUSE                 0x00000010")
cpp_quote("#define WMDM_DEVICECAP_CANRESUME                0x00000020")
cpp_quote("#define WMDM_DEVICECAP_CANSTOP                  0x00000040")
cpp_quote("#define WMDM_DEVICECAP_CANSEEK                  0x00000080")

cpp_quote("// WMDM Seek Flags")
cpp_quote("#define WMDM_SEEK_REMOTECONTROL                 0x00000001")
cpp_quote("#define WMDM_SEEK_STREAMINGAUDIO                0x00000002")

cpp_quote("// Storage Attributes Flags")
cpp_quote("#define WMDM_STORAGE_ATTR_FILESYSTEM            0x00000001")
cpp_quote("#define WMDM_STORAGE_ATTR_REMOVABLE             0x00000002")
cpp_quote("#define WMDM_STORAGE_ATTR_NONREMOVABLE          0x00000004")
cpp_quote("#define WMDM_FILE_ATTR_FOLDER                   0x00000008")
cpp_quote("#define WMDM_FILE_ATTR_LINK                     0x00000010")
cpp_quote("#define WMDM_FILE_ATTR_FILE                     0x00000020")
cpp_quote("#define WMDM_FILE_ATTR_VIDEO                    0x00000040")
cpp_quote("#define WMDM_STORAGE_ATTR_FOLDERS               0x00000100")
// These flag are defined below but can be used with this group of flags also
//cpp_quote("#define WMDM_STORAGECONTROL_INSERTBEFORE        0x00000200")
//cpp_quote("#define WMDM_STORAGECONTROL_INSERTAFTER         0x00000400")
//cpp_quote("#define WMDM_STORAGECONTROL_INSERTINTO          0x00000800")
cpp_quote("#define WMDM_FILE_ATTR_AUDIO                    0x00001000")
cpp_quote("#define WMDM_FILE_ATTR_DATA                     0x00002000")
cpp_quote("#define WMDM_FILE_ATTR_CANPLAY                  0x00004000")
cpp_quote("#define WMDM_FILE_ATTR_CANDELETE                0x00008000")
cpp_quote("#define WMDM_FILE_ATTR_CANMOVE                  0x00010000")
cpp_quote("#define WMDM_FILE_ATTR_CANRENAME                0x00020000")
cpp_quote("#define WMDM_FILE_ATTR_CANREAD                  0x00040000")
cpp_quote("#define WMDM_FILE_ATTR_MUSIC                    0x00080000")
cpp_quote("#define WMDM_FILE_CREATE_OVERWRITE              0x00100000")
cpp_quote("#define WMDM_FILE_ATTR_AUDIOBOOK                0x00200000")
cpp_quote("#define WMDM_FILE_ATTR_HIDDEN                   0x00400000")
cpp_quote("#define WMDM_FILE_ATTR_SYSTEM                   0x00800000")
cpp_quote("#define WMDM_FILE_ATTR_READONLY                 0x01000000")
cpp_quote("#define WMDM_STORAGE_ATTR_HAS_FOLDERS           0x02000000")
cpp_quote("#define WMDM_STORAGE_ATTR_HAS_FILES             0x04000000")
cpp_quote("#define WMDM_STORAGE_IS_DEFAULT                 0x08000000")
cpp_quote("#define WMDM_STORAGE_CONTAINS_DEFAULT           0x10000000")

cpp_quote("// Storage Capabilities Flags")
cpp_quote("#define WMDM_STORAGECAP_FOLDERSINROOT           0x00000001")
cpp_quote("#define WMDM_STORAGECAP_FILESINROOT             0x00000002")
cpp_quote("#define WMDM_STORAGECAP_FOLDERSINFOLDERS        0x00000004")
cpp_quote("#define WMDM_STORAGECAP_FILESINFOLDERS          0x00000008")
cpp_quote("#define WMDM_STORAGECAP_FOLDERLIMITEXISTS       0x00000010")
cpp_quote("#define WMDM_STORAGECAP_FILELIMITEXISTS         0x00000020")

cpp_quote("// WMDM Mode Flags")
cpp_quote("#define WMDM_MODE_BLOCK                         0x00000001")
cpp_quote("#define WMDM_MODE_THREAD                        0x00000002")
cpp_quote("#define WMDM_CONTENT_FILE                       0x00000004")
cpp_quote("#define WMDM_CONTENT_FOLDER                     0x00000008")
cpp_quote("#define WMDM_CONTENT_OPERATIONINTERFACE         0x00000010")
cpp_quote("#define WMDM_MODE_QUERY                         0x00000020")
cpp_quote("#define WMDM_MODE_PROGRESS                      0x00000040")
cpp_quote("#define WMDM_MODE_TRANSFER_PROTECTED            0x00000080")
cpp_quote("#define WMDM_MODE_TRANSFER_UNPROTECTED          0x00000100")
cpp_quote("#define WMDM_STORAGECONTROL_INSERTBEFORE        0x00000200")
cpp_quote("#define WMDM_STORAGECONTROL_INSERTAFTER         0x00000400")
cpp_quote("#define WMDM_STORAGECONTROL_INSERTINTO          0x00000800")
cpp_quote("#define WMDM_MODE_RECURSIVE                     0x00001000")
//cpp_quote("#define WMDM_FILE_CREATE_OVERWRITE              0x00100000")

cpp_quote("// WMDM Rights Flags")
cpp_quote("// NON_SDMI = !SDMI_PROTECTED")
cpp_quote("// SDMI = SDMI_VALIDATED")
cpp_quote("#define WMDM_RIGHTS_PLAY_ON_PC                  0x00000001")
cpp_quote("#define WMDM_RIGHTS_COPY_TO_NON_SDMI_DEVICE     0x00000002")
cpp_quote("#define WMDM_RIGHTS_COPY_TO_CD                  0x00000008")
cpp_quote("#define WMDM_RIGHTS_COPY_TO_SDMI_DEVICE         0x00000010")

cpp_quote("// WMDM Seek Flags")
cpp_quote("#define WMDM_SEEK_BEGIN                         0x00000001")
cpp_quote("#define WMDM_SEEK_CURRENT                       0x00000002")
cpp_quote("#define WMDM_SEEK_END                           0x00000008")


interface IWMDMStorage;
interface IWMDMStorage2;
interface IWMDMProgress;
interface IWMDMProgress2;
interface IWMDMDevice;
interface IWMDMDevice2;
interface IWMDMEnumDevice;
interface IWMDMEnumStorage;
interface IWMDMRevoked;

// IWMDeviceManager
[
	object,
	uuid(1DCB3A00-33ED-11d3-8470-00C04F79DBC0),
	pointer_default(unique)
]
interface IWMDeviceManager : IUnknown
{
	HRESULT GetRevision([out] DWORD *pdwRevision);
	HRESULT GetDeviceCount([out]DWORD *pdwCount);
	HRESULT EnumDevices([out] IWMDMEnumDevice **ppEnumDevice);
};


// IWMDeviceManager2
[
	object,
	uuid(923E5249-8731-4c5b-9B1C-B8B60B6E46AF),
	pointer_default(unique)
]
interface IWMDeviceManager2 : IWMDeviceManager
{
	HRESULT GetDeviceFromPnPName(   [in, string] LPCWSTR pwszPnPName, 
									[out] IWMDMDevice** ppDevice );
}

// IWMDMStorageGlobals
[
	object,
	uuid(1DCB3A07-33ED-11d3-8470-00C04F79DBC0),
	pointer_default(unique)
]
interface IWMDMStorageGlobals : IUnknown
{
    HRESULT GetCapabilities([out] DWORD *pdwCapabilities);
    HRESULT GetSerialNumber([out] PWMDMID pSerialNum,
                            [in, out] BYTE abMac[WMDM_MAC_LENGTH]);
	HRESULT GetTotalSize([out] DWORD *pdwTotalSizeLow,
                         [out] DWORD *pdwTotalSizeHigh);
    HRESULT GetTotalFree([out] DWORD *pdwFreeLow,
                         [out] DWORD *pdwFreeHigh);
    HRESULT GetTotalBad([out] DWORD *pdwBadLow,
                        [out] DWORD *pdwBadHigh);
    HRESULT GetStatus([out] DWORD *pdwStatus);
    HRESULT Initialize([in] UINT fuMode,
                       [in] IWMDMProgress *pProgress);
};

// IWMDMStorage
[
	object,
	uuid(1DCB3A06-33ED-11d3-8470-00C04F79DBC0),
	pointer_default(unique)
]
interface IWMDMStorage : IUnknown
{
	HRESULT SetAttributes([in] DWORD dwAttributes,
	                      [in] _WAVEFORMATEX *pFormat);
    HRESULT GetStorageGlobals([out]IWMDMStorageGlobals **ppStorageGlobals);
    HRESULT GetAttributes([out] DWORD *pdwAttributes,
                          [out] _WAVEFORMATEX *pFormat);
    HRESULT GetName([out,string,size_is(nMaxChars)] LPWSTR pwszName,
                    [in] UINT nMaxChars);
    HRESULT GetDate([out] PWMDMDATETIME pDateTimeUTC);
    HRESULT GetSize([out] DWORD *pdwSizeLow,
                    [out] DWORD *pdwSizeHigh);
    HRESULT GetRights([out, size_is(, *pnRightsCount)] PWMDMRIGHTS *ppRights,
                      [out] UINT *pnRightsCount,
                      [in, out] BYTE abMac[WMDM_MAC_LENGTH]);
    HRESULT EnumStorage([out] IWMDMEnumStorage **pEnumStorage);
    HRESULT SendOpaqueCommand([in,out] OPAQUECOMMAND *pCommand);
};

// IWMDMStorage2
[
	object,
	uuid(1ED5A144-5CD5-4683-9EFF-72CBDB2D9533),
	pointer_default(unique)
]
interface IWMDMStorage2 : IWMDMStorage
{
	HRESULT GetStorage([in, string] LPCWSTR pszStorageName, [out] IWMDMStorage** ppStorage );
 
    HRESULT SetAttributes2( [in] DWORD dwAttributes, 
							[in] DWORD dwAttributesEx, 
						    [in] _WAVEFORMATEX *pFormat,
							[in] _VIDEOINFOHEADER* pVideoFormat );
    HRESULT GetAttributes2( [out] DWORD *pdwAttributes,
							[out] DWORD *pdwAttributesEx,
                            [out] _WAVEFORMATEX *pAudioFormat,
							[out] _VIDEOINFOHEADER* pVideoFormat );
}


// IWMDMOperation
[
	object,
	uuid(1DCB3A0B-33ED-11d3-8470-00C04F79DBC0),
	pointer_default(unique)
]
interface IWMDMOperation : IUnknown
{
    HRESULT BeginRead();
    HRESULT BeginWrite();
    HRESULT GetObjectName([out,string,size_is(nMaxChars)] LPWSTR pwszName,
                          [in] UINT nMaxChars);
    HRESULT SetObjectName([in,string,size_is(nMaxChars)] LPWSTR pwszName,
                          [in] UINT nMaxChars);
    HRESULT GetObjectAttributes([out] DWORD *pdwAttributes,
                                [out] _WAVEFORMATEX *pFormat);
    HRESULT SetObjectAttributes([in] DWORD dwAttributes,
                                [in] _WAVEFORMATEX *pFormat);
    HRESULT GetObjectTotalSize([out] DWORD *pdwSize,
                               [out] DWORD *pdwSizeHigh);
    HRESULT SetObjectTotalSize([in] DWORD dwSize,
                               [in] DWORD dwSizeHigh);
    HRESULT TransferObjectData([in,out,size_is(*pdwSize)] BYTE *pData,
                               [in,out] DWORD *pdwSize,
                               [in, out] BYTE abMac[WMDM_MAC_LENGTH]);
    HRESULT End([in] HRESULT *phCompletionCode,
                [in] IUnknown *pNewObject);
};


// IWMDMOperation2
[
	object,
	uuid(33445B48-7DF7-425c-AD8F-0FC6D82F9F75),
	pointer_default(unique)
]
interface IWMDMOperation2 : IWMDMOperation
{
    HRESULT SetObjectAttributes2(   [in] DWORD dwAttributes, 
									[in] DWORD dwAttributesEx, 
									[in] _WAVEFORMATEX *pFormat,
									[in] _VIDEOINFOHEADER* pVideoFormat );
    HRESULT GetObjectAttributes2(   [out] DWORD *pdwAttributes,
									[out] DWORD *pdwAttributesEx,
									[out] _WAVEFORMATEX *pAudioFormat,
									[out] _VIDEOINFOHEADER* pVideoFormat );
};

// IWMDMProgress
[
	object,
	uuid(1DCB3A0C-33ED-11d3-8470-00C04F79DBC0),
	pointer_default(unique)
]
interface IWMDMProgress : IUnknown
{
    HRESULT Begin([in] DWORD dwEstimatedTicks);
    HRESULT Progress([in] DWORD dwTranspiredTicks);
    HRESULT End();
};

// IWMDMProgress2
[
	object,
	uuid(3A43F550-B383-4e92-B04A-E6BBC660FEFC),
	pointer_default(unique)
]
interface IWMDMProgress2 : IWMDMProgress
{
    HRESULT End2([in] HRESULT hrCompletionCode );
};


// IWMDMDevice
[
	object,
	uuid(1DCB3A02-33ED-11d3-8470-00C04F79DBC0),
	pointer_default(unique)
]
interface IWMDMDevice : IUnknown
{
	HRESULT GetName([out,string,size_is(nMaxChars)] LPWSTR pwszName,
	                [in] UINT nMaxChars);
    HRESULT GetManufacturer([out,string,size_is(nMaxChars)] LPWSTR pwszName,
                            [in] UINT nMaxChars);
    HRESULT GetVersion([out] DWORD *pdwVersion);
    HRESULT GetType([out] DWORD *pdwType);
    HRESULT GetSerialNumber([out] PWMDMID pSerialNumber,
							[in, out] BYTE abMac[WMDM_MAC_LENGTH]); 
    HRESULT GetPowerSource([out] DWORD *pdwPowerSource,
                           [out] DWORD *pdwPercentRemaining);
    HRESULT GetStatus([out] DWORD *pdwStatus);
    HRESULT GetDeviceIcon([out] ULONG *hIcon);
    HRESULT EnumStorage([out] IWMDMEnumStorage **ppEnumStorage);
    HRESULT GetFormatSupport([out, size_is( , *pnFormatCount)] _WAVEFORMATEX **ppFormatEx,
                             [out] UINT *pnFormatCount,
                             [out, size_is( , *pnMimeTypeCount)] LPWSTR **pppwszMimeType,
                             [out] UINT *pnMimeTypeCount);
    HRESULT SendOpaqueCommand([in,out] OPAQUECOMMAND *pCommand);
};

// IWMDMDevice2
[
	object,
	uuid(E34F3D37-9D67-4fc1-9252-62D28B2F8B55),
	pointer_default(unique)
]
interface IWMDMDevice2 : IWMDMDevice
{
	HRESULT GetStorage([in, string] LPCWSTR pszStorageName, [out] IWMDMStorage** ppStorage );
 
    HRESULT GetFormatSupport2( 
			[in] DWORD dwFlags,
			[out, size_is( , *pnAudioFormatCount)] _WAVEFORMATEX** ppAudioFormatEx,
            [out, ref] UINT *pnAudioFormatCount,
			[out, size_is( , *pnVideoFormatCount)] _VIDEOINFOHEADER** ppVideoFormatEx,
            [out, ref] UINT *pnVideoFormatCount,
            [out, size_is( , *pnFileTypeCount)] WMFILECAPABILITIES** ppFileType,
            [out, ref] UINT* pnFileTypeCount);

	
    HRESULT GetSpecifyPropertyPages([out, ref] ISpecifyPropertyPages** ppSpecifyPropPages, 
									[out, ref, size_is(,*pcUnks)] IUnknown*** pppUnknowns, 
									[out, ref] ULONG* pcUnks );

	HRESULT GetPnPName([out, size_is(nMaxChars)] LPWSTR pwszPnPName,
			   	       [in] UINT nMaxChars );


};

// IWMDMEnumDevice
[
	object,
	uuid(1DCB3A01-33ED-11d3-8470-00C04F79DBC0),
	pointer_default(unique)
]
interface IWMDMEnumDevice : IUnknown
{
    HRESULT Next([in]ULONG celt,
	             [out, size_is(celt), length_is(*pceltFetched)] IWMDMDevice **ppDevice,
				 [out] ULONG *pceltFetched);

	HRESULT Skip([in] ULONG celt, [out] ULONG *pceltFetched);
	HRESULT Reset();
	HRESULT Clone([out] IWMDMEnumDevice **ppEnumDevice);
};


// IWMDMDeviceControl
[
	object,
	uuid(1DCB3A04-33ED-11d3-8470-00C04F79DBC0),
	pointer_default(unique)
]
interface IWMDMDeviceControl : IUnknown
{
    HRESULT GetStatus([out] DWORD *pdwStatus);
    HRESULT GetCapabilities([out] DWORD *pdwCapabilitiesMask);
    HRESULT Play();
    HRESULT Record([in] _WAVEFORMATEX *pFormat);
    HRESULT Pause();
    HRESULT Resume();
    HRESULT Stop();
    HRESULT Seek([in] UINT fuMode, [in] int nOffset);
};

// IWMDMEnumStorage
[
	object,
	uuid(1DCB3A05-33ED-11d3-8470-00C04F79DBC0),
	pointer_default(unique)
]
interface IWMDMEnumStorage : IUnknown
{
	HRESULT Next([in]ULONG celt,
	             [out, size_is(celt), length_is(*pceltFetched)] IWMDMStorage **ppStorage,
				 [out] ULONG *pceltFetched);
	HRESULT Skip([in] ULONG celt, [out] ULONG *pceltFetched);
	HRESULT Reset();
	HRESULT Clone([out] IWMDMEnumStorage **ppEnumStorage);
};

// IWMDMStorageControl
[
	object,
	uuid(1DCB3A08-33ED-11d3-8470-00C04F79DBC0),
	pointer_default(unique)
]
interface IWMDMStorageControl : IUnknown
{
    HRESULT Insert([in] UINT fuMode,
                   [in,unique] LPWSTR pwszFile,
                   [in] IWMDMOperation *pOperation,
                   [in] IWMDMProgress *pProgress,
                   [out] IWMDMStorage **ppNewObject);
    HRESULT Delete([in] UINT fuMode,
                   [in] IWMDMProgress *pProgress);
    HRESULT Rename([in] UINT fuMode,
                   [in] LPWSTR pwszNewName,
                   [in] IWMDMProgress *pProgress);
    HRESULT Read([in] UINT fuMode,
                 [in,unique] LPWSTR pwszFile,
                 [in] IWMDMProgress *pProgress,
                 [in] IWMDMOperation *pOperation);
    HRESULT Move([in] UINT fuMode,
                 [in] IWMDMStorage *pTargetObject,
                 [in] IWMDMProgress *pProgress);
};


// IWMDMStorageControl2
[
	object,
	uuid(972C2E88-BD6C-4125-8E09-84F837E637B6),
	pointer_default(unique)
]
interface IWMDMStorageControl2 : IWMDMStorageControl
{
    HRESULT Insert2([in] UINT fuMode,
                    [in,unique] LPWSTR pwszFileSource,
                    [in,unique] LPWSTR pwszFileDest,
                    [in] IWMDMOperation *pOperation,
                    [in] IWMDMProgress *pProgress,
					[in] IUnknown* pUnknown,
                    [in,out,unique] IWMDMStorage **ppNewObject);
};

// IWMDMObjectInfo
[
	object,
	uuid(1DCB3A09-33ED-11d3-8470-00C04F79DBC0),
	pointer_default(unique)
]
interface IWMDMObjectInfo : IUnknown
{
    HRESULT GetPlayLength([out] DWORD *pdwLength);
    HRESULT SetPlayLength([in] DWORD dwLength);
    HRESULT GetPlayOffset([out] DWORD *pdwOffset);
    HRESULT SetPlayOffset([in] DWORD dwOffset);
    HRESULT GetTotalLength([out] DWORD *pdwLength);
    HRESULT GetLastPlayPosition([out] DWORD *pdwLastPos);
    HRESULT GetLongestPlayPosition([out] DWORD *pdwLongestPos);
};

// IWMDMRevoked
[
	object,
	uuid(EBECCEDB-88EE-4e55-B6A4-8D9F07D696AA),
	pointer_default(ref)
]
interface IWMDMRevoked : IUnknown
{
    HRESULT GetRevocationURL( [in,out, string, size_is(, *pdwBufferLen)] LPWSTR* ppwszRevocationURL,
                              [in,out] DWORD*  pdwBufferLen,
							  [out] DWORD* pdwRevokedBitFlag );
};