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.
103 lines
3.9 KiB
103 lines
3.9 KiB
#include "drmkPCH.h"
|
|
#include <winerror.h>
|
|
#include "VRoot.h"
|
|
//------------------------------------------------------------------------------
|
|
VRoot::VRoot(){
|
|
outPinType=IsUndefined;
|
|
outPinUnk=NULL;
|
|
outPinFileObject=NULL;
|
|
outPinDeviceObject=NULL;
|
|
};
|
|
//------------------------------------------------------------------------------
|
|
DRM_STATUS VRoot::initiateValidation(PFILE_OBJECT OutPinFileObject, PDEVICE_OBJECT OutPinDeviceObject, DWORD StreamId){
|
|
// validate myself - kick off by forwarding to myself
|
|
outPinFileObject=OutPinFileObject;
|
|
outPinDeviceObject = OutPinDeviceObject;
|
|
outPinType=IsFileObject;
|
|
myStreamId=StreamId;
|
|
IUnknown* myUnk=static_cast<IUnknown*>(this);
|
|
|
|
// numMethods is 3 (IUnknown) + 1 (IDrmAudioStream)
|
|
ULONG numComMethods=3 + 1;
|
|
NTSTATUS stat = DrmForwardContentToInterface(StreamId, myUnk, numComMethods);
|
|
if(!NT_SUCCESS(stat)){
|
|
_DbgPrintF(DEBUGLVL_VERBOSE,("DrmForwardContentToInterface(FILE_OBJECT) error on stream %d (Status=%d, %x)", StreamId, stat, stat));
|
|
return stat;
|
|
};
|
|
// In the process of the above ForwardContent call weexpect some callbacks into
|
|
// StreamMgr telling us about DispatchTable and COM fucntions that will touch premium content
|
|
return DRM_OK;
|
|
};
|
|
//------------------------------------------------------------------------------
|
|
DRM_STATUS VRoot::initiateValidation(IUnknown* OutPin, DWORD StreamId){
|
|
myStreamId=StreamId;
|
|
outPinUnk=OutPin;
|
|
outPinType=IsCOM;
|
|
IUnknown* myUnk=static_cast<IUnknown*>(this);
|
|
|
|
NTSTATUS stat = DrmForwardContentToInterface(StreamId, myUnk, 4);
|
|
if(!NT_SUCCESS(stat)){
|
|
_DbgPrintF(DEBUGLVL_VERBOSE,("DrmForwardContentToInterface(INTERFACE) error on stream %d (Status=%d, %x)", StreamId, stat, stat));
|
|
return stat;
|
|
};
|
|
// In the process of the above ForwardContent call weexpect some callbacks into
|
|
// StreamMgr telling us about DispatchTable and COM fucntions that will touch premium content
|
|
return DRM_OK;
|
|
};
|
|
//------------------------------------------------------------------------------
|
|
STDMETHODIMP VRoot::QueryInterface(REFIID iid, void ** ppInt){
|
|
if(iid==IID_IUnknown){
|
|
*ppInt=static_cast<void*> (this);
|
|
AddRef();
|
|
return S_OK;
|
|
};
|
|
if(iid==IID_IDrmAudioStream){
|
|
*ppInt = static_cast<void*> (this);
|
|
AddRef();
|
|
return S_OK;
|
|
};
|
|
*ppInt=NULL;
|
|
return E_NOINTERFACE;
|
|
};
|
|
//------------------------------------------------------------------------------
|
|
STDMETHODIMP_(ULONG) VRoot::AddRef(void){
|
|
return 0;
|
|
};
|
|
//------------------------------------------------------------------------------
|
|
STDMETHODIMP_(ULONG) VRoot::Release(void){
|
|
return 0;
|
|
};
|
|
//------------------------------------------------------------------------------
|
|
NTSTATUS __stdcall VRoot::SetContentId(IN ULONG ContentId, IN PCDRMRIGHTS DrmRights){
|
|
|
|
DWORD theStreamId= ContentId;
|
|
_DbgPrintF(DEBUGLVL_VERBOSE,("VRoot for %d on behest of %d", myStreamId, theStreamId));
|
|
if(outPinType==IsCOM){
|
|
if(outPinUnk==NULL){
|
|
_DbgPrintF(DEBUGLVL_VERBOSE,("VRoot:: OutInterface not set for for stream %x", ContentId));
|
|
return STATUS_INVALID_PARAMETER;
|
|
}
|
|
|
|
NTSTATUS stat = DrmForwardContentToInterface(theStreamId, outPinUnk, 4);
|
|
return stat;
|
|
};
|
|
if(outPinType==IsFileObject){
|
|
if(outPinFileObject==NULL){
|
|
_DbgPrintF(DEBUGLVL_VERBOSE,("VRoot:: out FILE_OBJECT not set for for stream %x", ContentId));
|
|
return STATUS_INVALID_PARAMETER;
|
|
}
|
|
DRMFORWARD DrmForward;
|
|
RtlZeroMemory(&DrmForward, sizeof(DrmForward));
|
|
DrmForward.Flags = 0;
|
|
DrmForward.DeviceObject = outPinDeviceObject;
|
|
DrmForward.FileObject = outPinFileObject;
|
|
DrmForward.Context = outPinFileObject;
|
|
DRM_STATUS stat=DrmForwardContentToDeviceObject(theStreamId, NULL, &DrmForward);
|
|
return stat;
|
|
};
|
|
// should not get here
|
|
_DbgPrintF(DEBUGLVL_ERROR,("DRMK: No output pin set"));
|
|
return STATUS_INVALID_PARAMETER;
|
|
|
|
};
|
|
//------------------------------------------------------------------------------
|