//*@@@+++@@@@****************************************************************** // // Microsoft Windows Media Digital Rights Management // Copyright (C) Microsoft Corporation. All rights reserved. // //*@@@---@@@@****************************************************************** import "oaidl.idl"; import "ocidl.idl"; import "mfobjects.idl"; import "mfidl.idl"; /////////////////////////////////////////////////////////////////////////////// // // The following is the list of DRM actions available for applications // Used by IWMDRMLicenseManagement::AcquireLicense, MonitorLicenseAcquisition, // and CreateLicenseEnumeration among other things // /////////////////////////////////////////////////////////////////////////////// cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY WCHAR *g_wszWMDRM_ACTIONLIST_TAG = L\"ACTIONLIST\";" ) cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY WCHAR *g_wszWMDRM_ACTION_TAG = L\"ACTION\";" ) cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY WCHAR *g_wszWMDRM_RIGHT_PLAYBACK = L\"Play\";" ) cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY WCHAR *g_wszWMDRM_RIGHT_COPY = L\"Copy\";" ) cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY WCHAR *g_wszWMDRM_RIGHT_PLAYLIST_BURN = L\"PlaylistBurn\";" ) cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY WCHAR *g_wszWMDRM_RIGHT_CREATE_THUMBNAIL_IMAGE = L\"CreateThumbnailImage\";" ) cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY WCHAR *g_wszWMDRM_RIGHT_COPY_TO_CD = L\"Print.redbook\";" ) cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY WCHAR *g_wszWMDRM_RIGHT_COPY_TO_SDMI_DEVICE = L\"Transfer.SDMI\";" ) cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY WCHAR *g_wszWMDRM_RIGHT_COPY_TO_NON_SDMI_DEVICE = L\"Transfer.NONSDMI\";" ) cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY WCHAR *g_wszWMDRM_RIGHT_BACKUP = L\"Backup\";" ) cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY WCHAR *g_wszWMDRM_RIGHT_COLLABORATIVE_PLAY = L\"CollaborativePlay\";" ) /////////////////////////////////////////////////////////////////////////////// // // Actions for IWMDRMLicenseQuery::QueryActionAllowed // /////////////////////////////////////////////////////////////////////////////// // Prefix string cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY WCHAR *g_wszWMDRM_ActionAllowed = L\"ActionAllowed.\";" ) cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY WCHAR *g_wszWMDRM_ActionAllowed_Playback = L\"ActionAllowed.Play\";" ) cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY WCHAR *g_wszWMDRM_ActionAllowed_Copy = L\"ActionAllowed.Copy\";" ) cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY WCHAR *g_wszWMDRM_ActionAllowed_PlaylistBurn = L\"ActionAllowed.PlaylistBurn\";" ) cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY WCHAR *g_wszWMDRM_ActionAllowed_CreateThumbnailImage = L\"ActionAllowed.CreateThumbnailImage\";" ) cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY WCHAR *g_wszWMDRM_ActionAllowed_CopyToCD = L\"ActionAllowed.Print.redbook\";" ) // Note: The following 4 constants are NOT supported by IWMDRMLicenseQuery::QueryActionAllowed // They are defined in this file in order to maintain backward compatibility with the FSDK. cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY WCHAR *g_wszWMDRM_ActionAllowed_CopyToSDMIDevice = L\"ActionAllowed.Transfer.SDMI\";" ) cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY WCHAR *g_wszWMDRM_ActionAllowed_CopyToNonSDMIDevice = L\"ActionAllowed.Transfer.NONSDMI\";" ) cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY WCHAR *g_wszWMDRM_ActionAllowed_Backup = L\"ActionAllowed.Backup\";" ) cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY WCHAR *g_wszWMDRM_ActionAllowed_CollaborativePlay = L\"ActionAllowed.CollaborativePlay\";" ) /////////////////////////////////////////////////////////////////////////////// // // Actions for IWMDRMLicenseQuery::QueryLicenseState // /////////////////////////////////////////////////////////////////////////////// // Prefix string cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY WCHAR *g_wszWMDRM_LicenseState = L\"LicenseStateData.\";" ) cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY WCHAR *g_wszWMDRM_LicenseState_Playback = L\"LicenseStateData.Play\";" ) cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY WCHAR *g_wszWMDRM_LicenseState_Copy = L\"LicenseStateData.Copy\";" ) cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY WCHAR *g_wszWMDRM_LicenseState_PlaylistBurn = L\"LicenseStateData.PlaylistBurn\";" ) cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY WCHAR *g_wszWMDRM_LicenseState_CreateThumbnailImage = L\"LicenseStateData.CreateThumbnailImage\";" ) cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY WCHAR *g_wszWMDRM_LicenseState_CopyToCD = L\"LicenseStateData.Print.redbook\";" ) cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY WCHAR *g_wszWMDRM_LicenseState_CopyToSDMIDevice = L\"LicenseStateData.Transfer.SDMI\";" ) cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY WCHAR *g_wszWMDRM_LicenseState_CopyToNonSDMIDevice = L\"LicenseStateData.Transfer.NONSDMI\";" ) cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY WCHAR *g_wszWMDRM_LicenseState_Backup = L\"LicenseStateData.Backup\";" ) cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY WCHAR *g_wszWMDRM_LicenseState_CollaborativePlay = L\"LicenseStateData.CollaborativePlay\";" ) /////////////////////////////////////////////////////////////////////////////// // // WMDRMNET strings for IWMDRMLicense::GetLicenseProperty // /////////////////////////////////////////////////////////////////////////////// cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY WCHAR *g_wszWMDRMNET_Revocation = L\"WMDRMNET_REVOCATION\";" ) /////////////////////////////////////////////////////////////////////////////// // // SAP strings for IWMDRMLicense::GetLicenseProperty // /////////////////////////////////////////////////////////////////////////////// cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY WCHAR *g_wszWMDRM_SAPLEVEL = L\"SAPLEVEL\";" ) cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY WCHAR *g_wszWMDRM_SAPRequired = L\"SAPRequired\";" ) /////////////////////////////////////////////////////////////////////////////// // // Misc strings for IWMDRMLicense::GetLicenseProperty // /////////////////////////////////////////////////////////////////////////////// cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY WCHAR *g_wszWMDRM_SOURCEID = L\"SOURCEID\";" ) cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY WCHAR *g_wszWMDRM_PRIORITY = L\"PRIORITY\";" ) cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY WCHAR *g_wszWMDRM_ISSUEDATE = L\"ISSUEDATE\";" ) cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY WCHAR *g_wszWMDRM_UplinkID = L\"UplinkID\";" ) cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY WCHAR *g_wszWMDRM_REVINFOVERSION = L\"REVINFOVERSION\";" ) /////////////////////////////////////////////////////////////////////////////// // // License state bit masks for DRM_LICENSE_STATE_DATA.dwVague // /////////////////////////////////////////////////////////////////////////////// cpp_quote( "#define DRM_LICENSE_STATE_DATA_VAGUE 1" ) cpp_quote( "#define DRM_LICENSE_STATE_DATA_OPL_PRESENT 2" ) cpp_quote( "#define DRM_LICENSE_STATE_DATA_SAP_PRESENT 4" ) /////////////////////////////////////////////////////////////////////////////// // // Backup/restore flags for IWMDRMLicenseManagement::BackupLicenses and RestoreLicenses // /////////////////////////////////////////////////////////////////////////////// cpp_quote( "#define WMDRM_BACKUP_OVERWRITE ((DWORD) 0x00000001)" ) cpp_quote( "#define WMDRM_RESTORE_INDIVIDUALIZE ((DWORD) 0x00000002)" ) /////////////////////////////////////////////////////////////////////////////// // // WMDRM Security Perform Flags for IWMDRMSecurity::PerformSecurityUpdate // /////////////////////////////////////////////////////////////////////////////// cpp_quote("#define WMDRM_SECURITY_PERFORM_INDIV 0x00000001L") // Indiv only if necessary cpp_quote("#define WMDRM_SECURITY_PERFORM_REVOCATION_REFRESH 0x00000002L") // Refresh Revocation Data cpp_quote("#define WMDRM_SECURITY_PERFORM_FORCE_INDIV 0x00000004L") // Force indiv /////////////////////////////////////////////////////////////////////////////// // // License type flags for IWMDRMLicense::GetLicense // /////////////////////////////////////////////////////////////////////////////// cpp_quote("#define WMDRM_LICENSE_TYPE_XML 0x00000001L") cpp_quote("#define WMDRM_LICENSE_TYPE_XMR 0x00000002L") /////////////////////////////////////////////////////////////////////////////// // // Certificate type flags for IWMDRMSecurity::GetMachineCertificate // /////////////////////////////////////////////////////////////////////////////// cpp_quote("#define WMDRM_CERTIFICATE_TYPE_V1 0x00000001L") cpp_quote("#define WMDRM_CERTIFICATE_TYPE_V2 0x00000002L") /////////////////////////////////////////////////////////////////////////////// // // License request type flags for IWMDRMLicenseManagement::AcquireLicense // /////////////////////////////////////////////////////////////////////////////// cpp_quote("#define WMDRM_ACQUIRE_LICENSE_SILENT 0x00000001L") cpp_quote("#define WMDRM_ACQUIRE_LICENSE_NONSILENT 0x00000002L") // Just generate a challenge cpp_quote("#define WMDRM_ACQUIRE_LICENSE_LEGACY_NONSILENT 0x00000004L") // Just generate a V1 challenge /////////////////////////////////////////////////////////////////////////////// // // DRM license deletion flags for IWMDRMLicenseManagement::DeleteLicense // /////////////////////////////////////////////////////////////////////////////// cpp_quote( "#define WMDRM_DELETE_LICENSE_IMMEDIATELY 0x00000001L" ) cpp_quote( "#define WMDRM_DELETE_LICENSE_MARK_FOR_PURGE 0x00000002L" ) /////////////////////////////////////////////////////////////////////////////// // // DRM license store cleanup flags for IWMDRMLicenseManagement::CleanLicenseStore // /////////////////////////////////////////////////////////////////////////////// cpp_quote( "#define WMDRM_CLEAN_LICENSE_STORE_SYNC 0x00000001L" ) cpp_quote( "#define WMDRM_CLEAN_LICENSE_STORE_ASYNC 0x00000002L" ) /////////////////////////////////////////////////////////////////////////////// // // Types of certificates for IWMDRMLicense::CreateSecureDecryptor (dwCertificateType) // /////////////////////////////////////////////////////////////////////////////// cpp_quote( "#define WMDRM_CERTIFICATE_TYPE_XML 1" ) /////////////////////////////////////////////////////////////////////////////// // // Types of protection for IWMDRMLicense::CreateSecureDecryptor (dwFlags) // /////////////////////////////////////////////////////////////////////////////// cpp_quote( "#define WMDRM_PROTECTION_TYPE_RC4 1" ) /////////////////////////////////////////////////////////////////////////////// // // Revocation Type GUIDs for various methods in IWMDRMSecurity // /////////////////////////////////////////////////////////////////////////////// cpp_quote( "EXTERN_GUID( WMDRM_REVOCATIONTYPE_APP, 0x90A37313, 0x0ECF, 0x4CAA, 0xA9, 0x06, 0xB1, 0x88, 0xF6, 0x12, 0x93, 0x00 );" ) cpp_quote( "EXTERN_GUID( WMDRM_REVOCATIONTYPE_DEVICE, 0x3129E375, 0xCEB0, 0x47D5, 0x9C, 0xCA, 0x9D, 0xB7, 0x4C, 0xFD, 0x43, 0x32 );" ) cpp_quote( "EXTERN_GUID( WMDRM_REVOCATIONTYPE_CARDEA, 0xCD75E604, 0x543D, 0x4A9C, 0x9F, 0x09, 0xFE, 0x6D, 0x24, 0xE8, 0xBF, 0x90 );" ) cpp_quote( "EXTERN_GUID( WMDRM_REVOCATIONTYPE_REVINFO, 0xCCDE5A55, 0xA688, 0x4405, 0xA8, 0x8B, 0xD1, 0x3F, 0x90, 0xD5, 0xBA, 0x3E );" ) cpp_quote( "EXTERN_GUID( WMDRM_REVOCATIONTYPE_GRL, 0xa2190240, 0xb2ca, 0x40b3, 0xb4, 0x8d, 0x9b, 0xc4, 0xc2, 0xdc, 0x42, 0x8d );" ) cpp_quote( "EXTERN_GUID( WMDRM_REVOCATIONTYPE_HDCP, 0xe627553a, 0x820f, 0x40fd, 0xb4, 0x65, 0xa4, 0x28, 0x30, 0xa5, 0x74, 0xc9 );" ) /////////////////////////////////////////////////////////////////////////////// // // This enum indicates the type of crypto algorithm and paramters // that will be passed to the DRM encrypt and decrypt functions // /////////////////////////////////////////////////////////////////////////////// typedef enum DRM_CRYPTO_TYPE { CRYPTO_TYPE_MCE = 0 } DRM_CRYPTO_TYPE; cpp_quote( "#if !DRM_LICENSE_STATE_TYPES_DEFINED" ) cpp_quote( "#define DRM_LICENSE_STATE_TYPES_DEFINED 1" ) /////////////////////////////////////////////////////////////////////////////// // // This enum indicates the category for each possible output string to be // displayed. These are: // // 0 - Playback not permitted. // 1 - Playback unlimited. // 2 - Playback valid 5 times. // 3 - Playback valid from 7/12/00. // 4 - Playback valid until 7/12/00. // 5 - Playback valid from 5/12 to 9/12. // 6 - Playback valid 5 times from 7/12/00. // 7 - Playback valid 5 times until 7/12/00. // 8 - Playback valid 5 times from 5/12 to 9/12. // 9 - Playback valid for 24 hours from first use. // /////////////////////////////////////////////////////////////////////////////// typedef enum DRM_LICENSE_STATE_CATEGORY { WM_DRM_LICENSE_STATE_NORIGHT = 0, WM_DRM_LICENSE_STATE_UNLIM, WM_DRM_LICENSE_STATE_COUNT, WM_DRM_LICENSE_STATE_FROM, WM_DRM_LICENSE_STATE_UNTIL, WM_DRM_LICENSE_STATE_FROM_UNTIL, WM_DRM_LICENSE_STATE_COUNT_FROM, WM_DRM_LICENSE_STATE_COUNT_UNTIL, WM_DRM_LICENSE_STATE_COUNT_FROM_UNTIL, WM_DRM_LICENSE_STATE_EXPIRATION_AFTER_FIRSTUSE, } DRM_LICENSE_STATE_CATEGORY; /////////////////////////////////////////////////////////////////////////////// // // Structure to hold license state data // /////////////////////////////////////////////////////////////////////////////// typedef struct _DRM_LICENSE_STATE_DATA { DWORD dwStreamId; // 0 -> All streams, != 0 -> A particular stream. DRM_LICENSE_STATE_CATEGORY dwCategory; // Indicates the category of string to be displayed. DWORD dwNumCounts; // Number of items supplied in dwCount. DWORD dwCount[4]; // Up to 4 counts. DWORD dwNumDates; // Number of items supplied in dwDate. FILETIME datetime[4]; // Up to 4 dates. DWORD dwVague; // Bit mask of DRM_LICENSE_STATE_DATA_VAGUE // DRM_LICENSE_STATE_DATA_OPL_PRESENT // DRM_LICENSE_STATE_DATA_SAP_PRESENT } DRM_LICENSE_STATE_DATA; cpp_quote( "#endif" ) /////////////////////////////////////////////////////////////////////////////// // // This enum indicates the status of the state DRM is in // /////////////////////////////////////////////////////////////////////////////// typedef enum MSDRM_STATUS { DRM_ERROR = 0, DRM_INFORMATION = 1, DRM_BACKUPRESTORE_BEGIN = 2, DRM_BACKUPRESTORE_END = 3, DRM_BACKUPRESTORE_CONNECTING = 4, DRM_BACKUPRESTORE_DISCONNECTING = 5, DRM_ERROR_WITHURL = 6, DRM_RESTRICTED_LICENSE = 7, DRM_NEEDS_INDIVIDUALIZATION = 8, DRM_PLAY_OPL_NOTIFICATION = 9, DRM_COPY_OPL_NOTIFICATION = 10, DRM_REFRESHCRL_COMPLETE = 11, } MSDRM_STATUS; /////////////////////////////////////////////////////////////////////////////// // // This enum defines the different data types supported as attributes by DRM // /////////////////////////////////////////////////////////////////////////////// typedef enum DRM_ATTR_DATATYPE { DRM_TYPE_DWORD = 0, DRM_TYPE_STRING = 1, DRM_TYPE_BINARY = 2, DRM_TYPE_BOOL = 3, DRM_TYPE_QWORD = 4, DRM_TYPE_WORD = 5, DRM_TYPE_GUID = 6, } DRM_ATTR_DATATYPE; /////////////////////////////////////////////////////////////////////////////// // // This enum contains the DRM http status states // /////////////////////////////////////////////////////////////////////////////// typedef enum DRM_HTTP_STATUS { HTTP_NOTINITIATED = 0, HTTP_CONNECTING, HTTP_REQUESTING, HTTP_RECEIVING, HTTP_COMPLETED, } DRM_HTTP_STATUS; /////////////////////////////////////////////////////////////////////////////// // // This enum contains the DRM individualization status states // /////////////////////////////////////////////////////////////////////////////// typedef enum DRM_INDIVIDUALIZATION_STATUS { INDI_UNDEFINED = 0x0000, INDI_BEGIN = 0x0001, INDI_SUCCEED = 0x0002, INDI_FAIL = 0x0004, INDI_CANCEL = 0x0008, INDI_DOWNLOAD = 0x0010, INDI_INSTALL = 0x0020, } DRM_INDIVIDUALIZATION_STATUS; /////////////////////////////////////////////////////////////////////////////// // // This enum contains the DRM IWMDRMLicenseQuery::QueryActionAllowed status states // /////////////////////////////////////////////////////////////////////////////// typedef enum _DRM_ACTION_ALLOWED_QUERY_RESULTS { DRM_ACTION_ALLOWED_QUERY_NOT_ENABLED = 0x00000001, DRM_ACTION_ALLOWED_QUERY_NOT_ENABLED_NO_LICENSE = 0x00000002, DRM_ACTION_ALLOWED_QUERY_NOT_ENABLED_NO_RIGHT = 0x00000004, DRM_ACTION_ALLOWED_QUERY_NOT_ENABLED_EXHAUSTED = 0x00000008, DRM_ACTION_ALLOWED_QUERY_NOT_ENABLED_EXPIRED = 0x00000010, DRM_ACTION_ALLOWED_QUERY_NOT_ENABLED_NOT_STARTED = 0x00000020, DRM_ACTION_ALLOWED_QUERY_NOT_ENABLED_APPSEC_TOO_LOW = 0x00000040, DRM_ACTION_ALLOWED_QUERY_NOT_ENABLED_REQ_INDIV = 0x00000080, DRM_ACTION_ALLOWED_QUERY_NOT_ENABLED_COPY_OPL_TOO_LOW = 0x00000100, DRM_ACTION_ALLOWED_QUERY_NOT_ENABLED_COPY_OPL_EXCLUDED = 0x00000200, DRM_ACTION_ALLOWED_QUERY_NOT_ENABLED_NO_CLOCK_SUPPORT = 0x00000400, DRM_ACTION_ALLOWED_QUERY_NOT_ENABLED_NO_METERING_SUPPORT = 0x00000800, DRM_ACTION_ALLOWED_QUERY_NOT_ENABLED_CHAIN_DEPTH_TOO_HIGH = 0x00001000, } DRM_ACTION_ALLOWED_QUERY_RESULTS; /////////////////////////////////////////////////////////////////////////////// // // structure to hold crypto algorithm and associated data for DRM // encrypt/decrypt functions // /////////////////////////////////////////////////////////////////////////////// typedef struct _WMDRMCryptoData { DRM_CRYPTO_TYPE cryptoType; unsigned __int64 qwCounterID; unsigned __int64 qwOffset; } WMDRMCryptoData; /////////////////////////////////////////////////////////////////////////////// // // structure to hold DRM async individualization status information // /////////////////////////////////////////////////////////////////////////////// typedef struct _WMIndividualizeStatus { HRESULT hr; DRM_INDIVIDUALIZATION_STATUS enIndiStatus; LPSTR pszIndiRespUrl; DWORD dwHTTPRequest; DRM_HTTP_STATUS enHTTPStatus; DWORD dwHTTPReadProgress; DWORD dwHTTPReadTotal; } WM_INDIVIDUALIZE_STATUS; /////////////////////////////////////////////////////////////////////////////// // // structure to hold Backup/Restore data // /////////////////////////////////////////////////////////////////////////////// typedef struct _WMBackupRestoreData { MSDRM_STATUS eStatus; BSTR bstrError; } WM_BACKUP_RESTORE_STATUS; /////////////////////////////////////////////////////////////////////////////// // // Conditionaly compiled Structures and definitions for // DRM internal/legacy Output Protection Levels (OPL) // /////////////////////////////////////////////////////////////////////////////// cpp_quote( "#ifndef DRM_OPL_TYPES" ) cpp_quote( "#define DRM_OPL_TYPES 1") cpp_quote( "#define WMDRM_OPL_PLAY ((DWORD) 0x00000001)" ) cpp_quote( "#define WMDRM_OPL_COPY ((DWORD) 0x00000002)" ) typedef struct __tagDRM_MINIMUM_OUTPUT_PROTECTION_LEVELS { WORD wCompressedDigitalVideo; WORD wUncompressedDigitalVideo; WORD wAnalogVideo; WORD wCompressedDigitalAudio; WORD wUncompressedDigitalAudio; } DRM_MINIMUM_OUTPUT_PROTECTION_LEVELS; typedef struct __tagDRM_OPL_OUTPUT_IDS { WORD cIds; GUID *rgIds; } DRM_OPL_OUTPUT_IDS; cpp_quote( "#define VER_DRM_PLAY_OPL_V1 1" ) cpp_quote( "#define VER_DRM_PLAY_OPL 2" ) cpp_quote( "#define VER_DRM_VIDEO_OUTPUT_PROTECTION 2" ) typedef struct __tagDRM_OUTPUT_PROTECTION { GUID guidId; BYTE bConfigData; } DRM_OUTPUT_PROTECTION; typedef struct __tagDRM_OUTPUT_PROTECTION_EX { DWORD dwVersion; GUID guidId; DWORD dwConfigData; } DRM_OUTPUT_PROTECTION_EX; typedef DRM_OUTPUT_PROTECTION DRM_AUDIO_OUTPUT_PROTECTION; typedef DRM_OUTPUT_PROTECTION DRM_VIDEO_OUTPUT_PROTECTION; typedef DRM_OUTPUT_PROTECTION_EX DRM_AUDIO_OUTPUT_PROTECTION_EX; typedef DRM_OUTPUT_PROTECTION_EX DRM_VIDEO_OUTPUT_PROTECTION_EX; typedef struct __tagDRM_VIDEO_OUTPUT_PROTECTION_IDS { WORD cEntries; DRM_VIDEO_OUTPUT_PROTECTION *rgVop; } DRM_VIDEO_OUTPUT_PROTECTION_IDS; typedef struct __tagDRM_VIDEO_OUTPUT_PROTECTION_IDS_EX { DWORD dwVersion; WORD cEntries; DRM_VIDEO_OUTPUT_PROTECTION_EX *rgVop; } DRM_VIDEO_OUTPUT_PROTECTION_IDS_EX; typedef struct __tagDRM_AUDIO_OUTPUT_PROTECTION_IDS { WORD cEntries; DRM_AUDIO_OUTPUT_PROTECTION *rgAop; } DRM_AUDIO_OUTPUT_PROTECTION_IDS; typedef struct __tagDRM_AUDIO_OUTPUT_PROTECTION_IDS_EX { DWORD dwVersion; WORD cEntries; DRM_AUDIO_OUTPUT_PROTECTION_EX *rgAop; } DRM_AUDIO_OUTPUT_PROTECTION_IDS_EX; typedef struct __tagDRM_PLAY_OPL { DRM_MINIMUM_OUTPUT_PROTECTION_LEVELS minOPL; DRM_OPL_OUTPUT_IDS oplIdReserved; DRM_VIDEO_OUTPUT_PROTECTION_IDS vopi; } DRM_PLAY_OPL; typedef struct __tagDRM_PLAY_OPL_EX { DWORD dwVersion; DRM_MINIMUM_OUTPUT_PROTECTION_LEVELS minOPL; DRM_OPL_OUTPUT_IDS oplIdReserved; DRM_VIDEO_OUTPUT_PROTECTION_IDS_EX vopi; } DRM_PLAY_OPL_EX; typedef struct __tagDRM_COPY_OPL { WORD wMinimumCopyLevel; DRM_OPL_OUTPUT_IDS oplIdIncludes; DRM_OPL_OUTPUT_IDS oplIdExcludes; } DRM_COPY_OPL; cpp_quote( "#endif // DRM_OPL_TYPES" ) /////////////////////////////////////////////////////////////////////////////// // // structure to hold consolidated DRM OPL values // /////////////////////////////////////////////////////////////////////////////// typedef struct _WMDRMOutputProtectionLevels { WORD wCompressedDigitalVideo; WORD wUncompressedDigitalVideo; WORD wAnalogVideo; WORD wCompressedDigitalAudio; WORD wUncompressedDigitalAudio; WORD wMinimumCopyProtectionLevel; } WMDRM_OUTPUT_PROTECTION_LEVELS; /////////////////////////////////////////////////////////////////////////////// // // structure to hold DRM Analog video Restrictions // /////////////////////////////////////////////////////////////////////////////// typedef struct _WMDRMAnalogVideoRestrictions { GUID guidRestrictionID; DWORD dwRestrictionData; } WMDRM_ANALOG_VIDEO_RESTRICTIONS; typedef struct _WMDRMAnalogVideoRestrictionsEx { DWORD dwVersion; GUID guidRestrictionID; DWORD cbRestrictionData; BYTE *pbRestrictionData; } WMDRM_ANALOG_VIDEO_RESTRICTIONS_EX; /////////////////////////////////////////////////////////////////////////////// // // Structures for specifying policy for WMDRM-ND // /////////////////////////////////////////////////////////////////////////////// typedef enum _WMDRMNET_POLICY_TYPE { WMDRMNET_POLICY_TYPE_UNDEFINED = 0x0000, WMDRMNET_POLICY_TYPE_TRANSCRYPTPLAY = 0x0001 } WMDRMNET_POLICY_TYPE; typedef struct _tagWMDRMNET_POLICY { WMDRMNET_POLICY_TYPE ePolicyType; BYTE *pbPolicy; } WMDRMNET_POLICY; typedef struct _WMDRMNET_POLICY_TRANSCRYPTPLAY { DWORD cbData; BYTE *pbData; // This blob is opaque and should only be interpreted by the platform } WMDRMNET_POLICY_TRANSCRYPTPLAY; /////////////////////////////////////////////////////////////////////////////// // // Structures for descrambling and encrypting DRM data // /////////////////////////////////////////////////////////////////////////////// typedef struct _WMDRM_ENCRYPT_SCATTER_INFO { DWORD dwStreamID; DWORD dwSampleProtectionVersion; DWORD cbProtectionInfo; BYTE *pbProtectionInfo; } WMDRM_ENCRYPT_SCATTER_INFO; typedef struct WMDRM_ENCRYPT_SCATTER_BLOCK { DWORD dwStreamID; DWORD cbBlock; BYTE *pbBlock; } WMDRM_ENCRYPT_SCATTER_BLOCK; /////////////////////////////////////////////////////////////////////////////// // // functions to init/shutdown WMDRMSDK.DLL // /////////////////////////////////////////////////////////////////////////////// cpp_quote ( "EXTERN_C HRESULT STDMETHODCALLTYPE WMDRMStartup( );" ) cpp_quote ( "EXTERN_C HRESULT STDMETHODCALLTYPE WMDRMShutdown( );" ) /////////////////////////////////////////////////////////////////////////////// // // function to create a DRM Provider // /////////////////////////////////////////////////////////////////////////////// cpp_quote ( "EXTERN_C HRESULT STDMETHODCALLTYPE WMDRMCreateProvider( OUT IWMDRMProvider **ppDRMProvider );" ) cpp_quote ( "//" ) cpp_quote ( "// WMDRMCreateProtectedProvider is only available via a Microsoft issued WMDRMSDK stub library" ) cpp_quote ( "//" ) cpp_quote ( "EXTERN_C HRESULT STDMETHODCALLTYPE WMDRMCreateProtectedProvider( OUT IWMDRMProvider **ppDRMProvider );" ) /////////////////////////////////////////////////////////////////////////////// // // Interface for DRM asynchronous callback status // /////////////////////////////////////////////////////////////////////////////// [ object, uuid( 08548704-75B1-4982-9B26-FB385DEE741D ), helpstring("IDRMStatusCallback Interface"), pointer_default(unique), local ] interface IDRMStatusCallback : IUnknown { HRESULT OnStatus( [in] MSDRM_STATUS Status, [in] HRESULT hr, [in] DRM_ATTR_DATATYPE dwType, [in] BYTE *pValue, [in] void *pvContext ); }; /////////////////////////////////////////////////////////////////////////////// // // Interface for DRM event Generation. This is an extension of // IMFMediaEventGenerator so that the operation can be canceled // Before a final release of any interface that derives from // IWMDRMEventGenerator the caller should issue a call to Shutdown to ensure // any outstanding events or references are flushed and released. /////////////////////////////////////////////////////////////////////////////// [ object, uuid( CE11CC91-E615-4E0B-BE1F-09B5AEC033F2 ), helpstring("IWMDRMEventGenerator Interface"), pointer_default(unique), local ] interface IWMDRMEventGenerator : IMFMediaEventGenerator { HRESULT CancelAsyncOperation( [in] IUnknown *punkCancelationCookie ); HRESULT Shutdown( ); }; /////////////////////////////////////////////////////////////////////////////// // // Interface to provide WMDRMSDK objects based on Interface ID // /////////////////////////////////////////////////////////////////////////////// [ object, uuid( 98DC8917-8640-4b1d-9F1E-A590D40357EE ), helpstring("IWMDRMProvider Interface"), pointer_default(unique), local ] interface IWMDRMProvider : IUnknown { HRESULT CreateObject( [in] REFIID riid, [out, iid_is(riid)] void **ppvObject ); } /////////////////////////////////////////////////////////////////////////////// // // Interface for performing, setting and extracting DRM Security Functionality // /////////////////////////////////////////////////////////////////////////////// [ object, uuid( 70800F56-5239-4a0b-A8B8-D53C6BAE4171 ), helpstring("IWMDRMSecurity Interface"), pointer_default(unique), local ] interface IWMDRMSecurity : IWMDRMEventGenerator { HRESULT GetSecurityVersion( [out] BSTR *pbstrVersion ); HRESULT GetMachineCertificate( [in] DWORD dwCertificateType, [out] BYTE rgbVersion[4], [out,size_is( ,*pcbCertificate)] BYTE **ppbCertificate, [out] DWORD *pcbCertificate ); HRESULT PerformSecurityUpdate( [in] DWORD dwFlags, // exactly one of WMDRM Security Perform Flags defined above [out] IUnknown **ppunkCancelationCookie ); HRESULT SetRevocationData( [in] REFGUID guidRevocationType, [in,size_is(cbCRL)] BYTE *pbCRL, [in] DWORD cbCRL); HRESULT GetRevocationData( [in] REFGUID guidRevocationType, [out,size_is(*pcbCRL)] BYTE *pbCRL, [in, out] DWORD *pcbCRL); HRESULT GetRevocationDataVersion( [in] REFGUID guidRevocationType, [out] ULONGLONG *pdwCRLVersion); HRESULT CheckCertForRevocation( [in] REFGUID rguidRevocationList, [in,size_is(cbCert)] BYTE *pbCert, [in] DWORD cbCert, [out] BOOL *pfRevoked ); HRESULT GetContentEnablersForRevocations( [in, size_is(cCerts)] BYTE **rgpbCerts, [in, size_is(cCerts)] DWORD *rgpdwCertSizes, [in, size_is(cCerts)] GUID **rgpguidCerts, [in] DWORD cCerts, [in] HRESULT hResultHint, [out,size_is(*pcContentEnablers)] IMFContentEnabler **prgContentEnablers, [in,out] DWORD *pcContentEnablers ); HRESULT GetContentEnablersFromHashes( [in, size_is(cCerts)] BSTR *rgpbCertHashes, [in] DWORD cCerts, [in] HRESULT hResultHint, [out,size_is(*pcContentEnablers)] IMFContentEnabler **prgContentEnablers, [in,out] DWORD *pcContentEnablers ); }; /////////////////////////////////////////////////////////////////////////////// // // Interface for encrypting DRM data // /////////////////////////////////////////////////////////////////////////////// [ object, uuid( C9E0A5F4-DD22-4dc4-B795-88FA91F0516B ), helpstring("IWMDRMEncrypt Interface"), pointer_default(unique), local ] interface IWMDRMEncrypt : IUnknown { HRESULT Encrypt( [in,out, size_is( cbData )] BYTE *pbData, [in] DWORD cbData, [in] WMDRMCryptoData *pWMCryptoData); }; /////////////////////////////////////////////////////////////////////////////// // // Interface for descrambling and encrypting DRM data // /////////////////////////////////////////////////////////////////////////////// [ object, uuid( 2662fa39-4c62-481a-956c-7bfcb33c2888 ), helpstring("IWMDRMEncryptScatter Interface"), pointer_default(unique), local ] interface IWMDRMEncryptScatter : IUnknown { HRESULT InitEncryptScatter( [in] DWORD cStreams, [in, size_is( cStreams )] WMDRM_ENCRYPT_SCATTER_INFO *rgInfos ); HRESULT EncryptScatter( [in] DWORD cBlocks, [in, size_is( cBlocks )] WMDRM_ENCRYPT_SCATTER_BLOCK *rgBlocks, [in] WMDRMCryptoData *pWMCryptoData, [in] DWORD cbOutput, [out, size_is( cbOutput )] BYTE *pbOutput ); }; /////////////////////////////////////////////////////////////////////////////// // // Interface for decrypting DRM data // /////////////////////////////////////////////////////////////////////////////// [ object, uuid( C9E0A5F5-DD22-4dc4-B795-88FA91F0516B ), helpstring("IWMDRMDecrypt Interface"), pointer_default(unique), local ] interface IWMDRMDecrypt : IUnknown { HRESULT Decrypt( [in,out, size_is( cbData )] BYTE *pbData, [in] DWORD cbData, [in] WMDRMCryptoData *pWMCryptoData); }; /////////////////////////////////////////////////////////////////////////////// // // Interface for the WMDRM license // /////////////////////////////////////////////////////////////////////////////// [ object, uuid( C9E0A5F3-DD22-4dc4-B795-88FA91F0516B ), helpstring("IWMDRMLicense Interface"), pointer_default(unique), local ] interface IWMDRMLicense : IUnknown { HRESULT ResetEnumeration( void ); HRESULT GetNext( void ); HRESULT GetLicense( [out, size_is( ,*pcbLicense)] BYTE **ppbLicense, [out] DWORD *pcbLicense, [out] DWORD *pdwLicenseType ); HRESULT GetLicenseProperty( [in] BSTR bstrName, [out] PROPVARIANT *ppropVariant ); HRESULT CreateDecryptor( [out] IWMDRMDecrypt **ppDecryptor ); // Not available if bstrKID was NULL // requires stublib HRESULT CreateSecureDecryptor( [in,size_is(cbCertificate)] BYTE *pbCertificate, [in] DWORD cbCertificate, [in] DWORD dwCertificateType, [in] DWORD dwFlags, [out] BYTE *pbInitializationVector, [out] DWORD *pcbInitializationVector, [out] IWMDRMDecrypt **ppDecryptor ); // Not available if bstrKID was NULL // requires stublib HRESULT CreateEncryptor( [out] IWMDRMEncrypt **ppEncryptor ); // Not available if bstrKID was NULL // requires stublib HRESULT PersistLicense( void ); // // License OPL and Rights Extraction // HRESULT CanPersist( [out] BOOL* pfCanPersist ); HRESULT GetAnalogVideoRestrictionLevels( [out,size_is(*pcRestrictions)] WMDRM_ANALOG_VIDEO_RESTRICTIONS rgAnalogVideoRestrictions[], [in, out] DWORD *pcRestrictions ); HRESULT GetOutputProtectionLevels( [out] WMDRM_OUTPUT_PROTECTION_LEVELS* pOPLs ); // // An array of GUIDs will be allocated an returned to the caller. This should be freed with CoTaskMemFree. // HRESULT GetInclusionList( [out,size_is( ,*pcGuids)] GUID **ppGuids, [out] DWORD *pcGuids ); HRESULT GetPolicy( [out, size_is( ,*pcbPolicy)] BYTE **ppbPolicy, [out] DWORD *pcbPolicy ); }; /////////////////////////////////////////////////////////////////////////////// // // Interface for the WMDRM license querying // /////////////////////////////////////////////////////////////////////////////// [ object, uuid(20B970DF-0A58-4d3c-817C-4E3CCBB253AC), helpstring("IWMDRMLicenseQuery Interface"), pointer_default(unique) ] interface IWMDRMLicenseQuery : IUnknown { // all licenses with the given KID will be searched and evaluated. The result // are aggregated into rgResultStateData[] HRESULT QueryLicenseState( [in] BSTR bstrKID, [in] DWORD cActionsToQuery, [in, size_is(cActionsToQuery)] BSTR rgbstrActionsToQuery[], [out, size_is(cActionsToQuery)] DRM_LICENSE_STATE_DATA rgResultStateData[]); // this function is called prior to calling QueryActionAllowed, if necessary HRESULT SetActionAllowedQueryParams( [in] BOOL fIsMF, // optional, default to TRUE for using MediaFoundation [in] DWORD dwAppSecLevel, // optional, if fIsMF is FALSE, this is the security level of the app [in] BOOL fHasSerialNumber, // optional, TRUE if the device has serial number for CanCopy query [in] BSTR bstrDeviceCert); // optional, The Janus device cert for CanCopy queyr // Licenses with the given KID are searched and evaluated until the // requested actions can be determined satisfied or all licenses with // the given KID are visited. HRESULT QueryActionAllowed( [in] BSTR bstrKID, [in] BSTR bstrMinReqIndivVersion, [in] DWORD cActionsToQuery, [in, size_is(cActionsToQuery)] BSTR rgbstrActionsToQuery[], [out, size_is(cActionsToQuery)] DWORD rgdwQueryResult[]); }; /////////////////////////////////////////////////////////////////////////////// // // Interface for the WMDRM license management, enumeration and backup/restore // /////////////////////////////////////////////////////////////////////////////// typedef struct WMDRM_LICENSE_FILTER { DWORD dwVersion; // Currently 0 is the only supported version BSTR bstrKID; // Base64 encoded DRM Kid value BSTR bstrRights; // List of rights to filter licenses on. This should be in the form of Play BSTR bstrAllowedSourceIDs; // List of source IDs the application has been granted access to } WMDRM_LICENSE_FILTER; [ object, uuid(F4828DC7-8945-4D05-AB05-667AB99D29EE), helpstring("IWMDRMLicenseManagement Interface"), pointer_default(unique) ] interface IWMDRMLicenseManagement : IWMDRMEventGenerator { HRESULT CreateLicenseEnumeration( [in] WMDRM_LICENSE_FILTER *pLicenseFilter, [out] IWMDRMLicense **pEnumerator ); HRESULT DeleteLicense( [in] BSTR bstrKID, [in] DWORD dwFlags ); HRESULT CleanLicenseStore( [in] DWORD dwFlags, [out] IUnknown **ppunkCancelationCookie ); HRESULT StoreLicense( [in] BSTR bstrLicenseResponse ); HRESULT AcquireLicense( [in] BSTR bstrURL, [in] BSTR bstrHeaderData, // If WMDRM_ACQUIRE_LICENSE_LEGACY_NONSILENT, this is just the KID. Otherwise, this is the entire header. [in] BSTR bstrActions, // From list of DRM actions as XML string, e.g. Play [in] DWORD dwFlags, // Exactly one of the License request type flags indicating Silent vs Non-silent request. If non-silent an event will be delivered with the LICACQ info. [out] IUnknown **ppunkCancelationCookie); HRESULT MonitorLicenseAcquisition( [in] BSTR bstrKID, [in] BSTR bstrHeader, [in] BSTR bstrActions, // From list of DRM actions as XML string, e.g. Play [out] IUnknown **ppunkCancelationCookie); HRESULT BackupLicenses( [in] BSTR bstrBackupDirectory, [in] DWORD dwFlags, [out] IUnknown **ppunkCancelationCookie); HRESULT RestoreLicenses( [in] BSTR bstrBackupDirectory, [in] DWORD dwFlags, [out] IUnknown **ppunkCancelationCookie); HRESULT CreateLicenseRevocationChallenge( [in, size_is( cbMachineID ) ] BYTE *pbMachineID, [in] DWORD cbMachineID, [in, size_is( cbChallenge )] BYTE *pbChallenge, [in] DWORD cbChallenge, [out, size_is( ,*pcbChallengeOutput )] BYTE **ppbChallengeOutput, [out] DWORD *pcbChallengeOutput ); HRESULT ProcessLicenseRevocationResponse( [in, size_is( cbSignedLRB )] BYTE *pbSignedLRB, [in] DWORD cbSignedLRB, [out, size_is( ,*pcbSignedACK )] BYTE **ppbSignedACK, [out] DWORD *pcbSignedACK ); HRESULT ProcessLicenseDeletionMessage( [in] BSTR bstrDeletionMessage ); }; /////////////////////////////////////////////////////////////////////////////// // // Interfaces for the WMDRM Net Receiver // /////////////////////////////////////////////////////////////////////////////// [ object, uuid( F9C074A4-15D6-44C0-8A6D-2446ACC109AE ), helpstring("IWMDRMNetReceiver Interface"), pointer_default(unique), local ] interface IWMDRMNetReceiver : IWMDRMEventGenerator { HRESULT GetRegistrationChallenge( [out, size_is( ,*pcbRegistrationChallenge ) ] BYTE **ppbRegistrationChallenge, [out] DWORD *pcbRegistrationChallenge ); HRESULT ProcessRegistrationResponse( [in, size_is( cbRegistrationResponse ) ] BYTE *pbRegistrationResponse, [in] DWORD cbRegistrationResponse, [out] IUnknown **ppunkCancellationCookie ); HRESULT GetLicenseChallenge( [in] BSTR bstrAction, [out, size_is( ,*pcbLicenseChallenge ) ] BYTE **ppbLicenseChallenge, [out] DWORD *pcbLicenseChallenge ); HRESULT ProcessLicenseResponse( [in, size_is( cbLicenseResponse ) ] BYTE *pbLicenseResponse, [in] DWORD cbLicenseResponse, [out, size_is( ,*pcbWMDRMNetLicenseRepresentation )] BYTE **ppbWMDRMNetLicenseRepresentation, [out] DWORD *pcbWMDRMNetLicenseRepresentation ); }; [ object, uuid( 7B97237F-4B5D-442d-86C7-4F88961AF76B ), helpstring("IWMDRMNetReceiver2 Interface"), pointer_default(unique), local ] interface IWMDRMNetReceiver2 : IWMDRMNetReceiver { HRESULT ProcessRegistrationResponseEx( [in, size_is( cbRegistrationResponse ) ] BYTE *pbRegistrationResponse, [in] DWORD cbRegistrationResponse, [in] DWORD dwLocalIPv6ScopeID, [out] IUnknown **ppunkCancellationCookie ); HRESULT ProcessLicenseUpdate( [in, size_is( cbLicenseUpdate ) ] BYTE *pbLicenseUpdate, [in] DWORD cbLicenseUpdate, [out] IWMDRMLicense **ppLicense ); }; /////////////////////////////////////////////////////////////////////////////// // // Interfaces for the WMDRM Net Transmitter // /////////////////////////////////////////////////////////////////////////////// [ object, uuid( F040C12B-4415-4F20-93F0-453EB519A756 ), helpstring("IWMDRMNetTransmitter Interface"), pointer_default(unique), local ] interface IWMDRMNetTransmitter : IUnknown { HRESULT SetLicenseChallenge( [in, size_is( cbLicenseChallenge )] BYTE *pbLicenseChallenge, [in] DWORD cbLicenseChallenge ); HRESULT GetRootLicenseResponse( [in] BSTR bstrKID, [out, size_is(,*pcbLicenseResponse)] BYTE **ppbLicenseResponse, [out] DWORD *pcbLicenseResponse ); HRESULT GetLeafLicenseResponse( [in] BSTR bstrKID, [in] WMDRMNET_POLICY *pPolicy, [out] IWMDRMEncrypt **ppIWMDRMEncrypt, [out, size_is(,*pcbLicenseResponse)] BYTE **ppbLicenseResponse, [out] DWORD *pcbLicenseResponse ); }; [ object, uuid( 26BCB422-30C0-48b4-A641-D9FB1E656265 ), helpstring("IWMDRMNetTransmitter2 Interface"), pointer_default(unique), local ] interface IWMDRMNetTransmitter2 : IWMDRMNetTransmitter { HRESULT GetSimpleLicenseResponse( [in] BSTR bstrKID, [in] WMDRMNET_POLICY *pPolicy, [out] IWMDRMEncrypt **ppIWMDRMEncrypt, [out, size_is(,*pcbLicenseResponse)] BYTE **ppbLicenseResponse, [out] DWORD *pcbLicenseResponse ); }; /////////////////////////////////////////////////////////////////////////////// // // Interface for the status on WMDRM Inidividualization // /////////////////////////////////////////////////////////////////////////////// [ object, uuid( 7DB091BD-DB6A-4FA4-BCBF-0783E256C78C ), helpstring("IWMDRMIndividualizationStatus Interface"), pointer_default(unique), local ] interface IWMDRMIndividualizationStatus : IUnknown { HRESULT GetStatus( [out] WM_INDIVIDUALIZE_STATUS *pStatus ); }; /////////////////////////////////////////////////////////////////////////////// // // Interface for the status on WMDRM Backup/Restore // /////////////////////////////////////////////////////////////////////////////// [ object, uuid( F653C5A2-0EB3-4503-9D88-C200552D0D55 ), helpstring("IWMDRMLicenseBackupRestoreStatus Interface"), pointer_default(unique), local ] interface IWMDRMLicenseBackupRestoreStatus : IUnknown { HRESULT GetStatus( [out] WM_BACKUP_RESTORE_STATUS *pStatus ); }; /////////////////////////////////////////////////////////////////////////////// // // Interface for getting information on WMDRM non silent license aquisition // /////////////////////////////////////////////////////////////////////////////// [ object, uuid( 8AE059DD-BE6B-481A-863A-59056B50B748 ), helpstring("IWMDRMNonSilentLicenseAquisition Interface"), pointer_default(unique), local ] interface IWMDRMNonSilentLicenseAquisition : IUnknown { HRESULT GetURL( [out] BSTR *pbstrURL ); HRESULT GetChallenge( [out] BSTR *pbstrChallenge ); }; // // CoClasses // [ uuid(82435be0-f7c1-4df9-8103-eeabebf3d6e1), version(1.0) ] library WMDRMContentEnablerLib { importlib("stdole32.tlb"); importlib("stdole2.tlb"); [ uuid( 82435bdf-f7c1-4df9-8103-eeabebf3d6e1 ) ] coclass WMDRMContentEnablerActivate { [default] interface IPersistStream; }; };