Leaked source code of windows server 2003
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.
 
 
 
 
 
 

190 lines
6.0 KiB

//==========================================================================;
//
// MiniDriver entry points for stream class driver
//
// $Date: 05 Aug 1998 11:11:18 $
// $Revision: 1.0 $
// $Author: Tashjian $
//
// $Copyright: (c) 1997 - 1998 ATI Technologies Inc. All Rights Reserved. $
//
//==========================================================================;
extern "C"
{
#include "strmini.h"
#include "ksmedia.h"
}
#include "DrvEntry.h"
#include "wdmvdec.h"
#include "wdmdrv.h"
#include "capdebug.h"
#include "VidStrm.h"
/*^^*
* DriverEntry()
* Purpose : Called when an SRB_INITIALIZE_DEVICE request is received
*
* Inputs : IN PDRIVER_OBJECT pDriverObject
* IN PUNICODE_STRING pRegistryPath
*
* Outputs : result of StreamClassregisterAdapter()
* Author : IKLEBANOV
*^^*/
extern "C"
ULONG DriverEntry ( IN PDRIVER_OBJECT pDriverObject,
IN PUNICODE_STRING pRegistryPath )
{
HW_INITIALIZATION_DATA HwInitData;
SetMiniDriverDebugLevel(pRegistryPath);
DBGTRACE(("DriverEntry\n"));
RtlZeroMemory(&HwInitData, sizeof(HwInitData));
HwInitData.HwInitializationDataSize = sizeof(HwInitData);
// Entry points for Port Driver
HwInitData.HwInterrupt = NULL; // HwInterrupt;
HwInitData.HwReceivePacket = ReceivePacket;
HwInitData.HwCancelPacket = CancelPacket;
HwInitData.HwRequestTimeoutHandler = TimeoutPacket;
HwInitData.DeviceExtensionSize = DeivceExtensionSize();
HwInitData.PerRequestExtensionSize = sizeof(SRB_DATA_EXTENSION);
HwInitData.FilterInstanceExtensionSize = 0;
HwInitData.PerStreamExtensionSize = streamDataExtensionSize;
HwInitData.BusMasterDMA = FALSE;
HwInitData.Dma24BitAddresses = FALSE;
HwInitData.BufferAlignment = 3;
HwInitData.TurnOffSynchronization = TRUE;
HwInitData.DmaBufferSize = 0;
DBGTRACE(("StreamClassRegisterAdapter\n"));
return(StreamClassRegisterAdapter(pDriverObject, pRegistryPath, &HwInitData));
}
/*^^*
* ReceivePacket()
* Purpose : Main entry point for receiving adapter based request SRBs from the Class Driver.
* Will always be called at High Priority.
* Note : This is an asyncronous entry point. The request does not complete on return from
* this function, the request only completes when a StreamClassDeviceNotification
* on this request block, of type DeviceRequestComplete, is issued.
*
* Inputs : PHW_STREAM_REQUEST_BLOCK pSrb : pointer to the current Srb
*
* Outputs : none
* Author : IKLEBANOV
*^^*/
void STREAMAPI ReceivePacket(IN OUT PHW_STREAM_REQUEST_BLOCK pSrb)
{
DBGINFO(("ReceivePacket() SRB = %x, Command = %x\n",
pSrb, pSrb->Command));
// This needs to be a special case because no spinlocks, etc
// have been initialized until HwInitialize runs. Even though
// this minidriver handles synchronization itself, it assumes
// that no adapter SRBs will arrive until after this one
// completes.
if (pSrb->Command == SRB_INITIALIZE_DEVICE)
{
DBGTRACE(("SRB_INITIALIZE_DEVICE; SRB=%x\n", pSrb));
SrbInitializeDevice(pSrb);
StreamClassDeviceNotification(DeviceRequestComplete, pSrb->HwDeviceExtension, pSrb);
}
else
{
CWDMVideoDecoder* pCWDMVideoDecoder = (CWDMVideoDecoder*)pSrb->HwDeviceExtension;
// check the device extension pointer
if(pCWDMVideoDecoder == NULL)
{
DBGERROR(("ReceivePacket(): Device extension pointer is null!\n"));
TRAP();
pSrb->Status = STATUS_INVALID_PARAMETER;
StreamClassDeviceNotification(DeviceRequestComplete, pSrb->HwDeviceExtension, pSrb);
}
else
pCWDMVideoDecoder->ReceivePacket(pSrb);
}
}
void STREAMAPI CancelPacket(IN OUT PHW_STREAM_REQUEST_BLOCK pSrb)
{
CWDMVideoDecoder* pCWDMVideoDecoder = (CWDMVideoDecoder*)pSrb->HwDeviceExtension;
pCWDMVideoDecoder->CancelPacket(pSrb);
}
void STREAMAPI TimeoutPacket(IN OUT PHW_STREAM_REQUEST_BLOCK pSrb)
{
CWDMVideoDecoder* pCWDMVideoDecoder = (CWDMVideoDecoder*)pSrb->HwDeviceExtension;
pCWDMVideoDecoder->TimeoutPacket(pSrb);
}
/*^^*
* SrbInitializeDevice()
* Purpose : Called when SRB_INITIALIZE_DEVICE SRB is received.
* Performs checking of the hardware presence and I2C provider availability.
* Sets the hardware in an initial state.
* Note : The request does not completed unless we know everything
* about the hardware and we are sure it is capable to work in the current configuration.
* The hardware Caps are also aquised at this point.
*
* Inputs : PHW_STREAM_REQUEST_BLOCK pSrb : pointer to the current Srb
*
* Outputs : none
* Author : IKLEBANOV
*^^*/
void SrbInitializeDevice(PHW_STREAM_REQUEST_BLOCK pSrb)
{
DBGTRACE(("SrbInitializeDevice()\n"));
PPORT_CONFIGURATION_INFORMATION pConfigInfo = pSrb->CommandData.ConfigInfo;
pSrb->Status = STATUS_SUCCESS;
ENSURE
{
PBYTE pHwDevExt = (PBYTE)pConfigInfo->HwDeviceExtension;
if (pConfigInfo->NumberOfAccessRanges != 0) {
DBGERROR(("Illegal config info!\n"));
pSrb->Status = STATUS_NO_SUCH_DEVICE;
TRAP();
FAIL;
}
CVideoDecoderDevice * pDevice = InitializeDevice(pConfigInfo, pHwDevExt);
if (!pDevice)
{
DBGERROR(("CI2CScript creation failure!\n"));
pSrb->Status = STATUS_NO_SUCH_DEVICE;
TRAP();
FAIL;
}
CWDMVideoDecoder *pCWDMVideoDecoder = (CWDMVideoDecoder *) new ((PVOID)pHwDevExt)
CWDMVideoDecoder(pConfigInfo, pDevice);
} END_ENSURE;
DBGTRACE(("Exit : SrbInitializeDevice()\n"));
}