Пример #1
1
NTSTATUS PciDtfDeviceGetInfo(IN WDFDEVICE Device, IN WDFREQUEST Request)
{
	PCIDTF_DEV_INFO *ReqData;
	ULONG Value, Length;
	NTSTATUS Status = STATUS_SUCCESS;

	__try {
		Status = WdfRequestRetrieveOutputBuffer(Request,
							sizeof(PCIDTF_DEV_INFO),
							(PVOID *) & ReqData,
							NULL);
		if (!NT_SUCCESS(Status)) {
			TRACE_ERR("WdfRequestRetrieveOutputBuffer", Status);
			__leave;
		}
		Status = WdfDeviceQueryProperty(Device,
						DevicePropertyBusNumber,
						sizeof(Value), &Value, &Length);
		if (!NT_SUCCESS(Status)) {
			TRACE_ERR
			    ("WdfDeviceQueryProperty(DevicePropertyBusNumber)",
			     Status);
			__leave;
		}
		ReqData->bus = (UINT8) Value;
		Status = WdfDeviceQueryProperty(Device,
						DevicePropertyAddress,
						sizeof(Value), &Value, &Length);
		if (!NT_SUCCESS(Status)) {
			TRACE_ERR
			    ("WdfDeviceQueryProperty(DevicePropertyAddress)",
			     Status);
			__leave;
		}
		ReqData->devfn = (UINT8) Value;
		ReqData->reg_count = (int)
		    WdfCollectionGetCount(GetDeviceData(Device)->RegSpaces);
		TRACE_MSG(TRACE_LEVEL_VERBOSE, TRACE_FLAG_QUEUE,
			  "bus=0x%X, devfn=0x%X, reg_count=%d\n", ReqData->bus,
			  ReqData->devfn, ReqData->reg_count);
		WdfRequestSetInformation(Request, sizeof(PCIDTF_DEV_INFO));
	}
	__finally {
		WdfRequestComplete(Request, Status);
	}
	return Status;
}
Пример #2
0
BOOL CreateD3D9DeviceData(IN LPDIRECT3D9_DISPLAYADAPTER pDisplayAdapter, IN LPD3D9_DEVICEDATA pDeviceData)
{
    HDC hDC;

    /* Test DC creation for the display device */
    if (NULL == (hDC = CreateDCA(NULL, pDisplayAdapter->szDeviceName, NULL, NULL)))
    {
        DPRINT1("Could not create dc for display adapter: %s", pDisplayAdapter->szDeviceName);
        return FALSE;
    }

    pDeviceData->hDC = hDC;
    pDeviceData->DisplayGuid = pDisplayAdapter->DisplayGuid;
    pDeviceData->DeviceType = D3DDEVTYPE_HAL;
    lstrcpynA(pDeviceData->szDeviceName, pDisplayAdapter->szDeviceName, CCHDEVICENAME);
    pDeviceData->szDeviceName[CCHDEVICENAME-1] = '\0';

    if (pDisplayAdapter->bInUseFlag)
    {
        pDeviceData->D3D9Callbacks.DeviceType = D3DDEVTYPE_HAL;
    }
    else if (IsGDIDriver(hDC))
    {
        pDeviceData->D3D9Callbacks.DeviceType = D3DDEVTYPE_REF;
    }

    if (FALSE == GetDeviceData(pDeviceData))
    {
        DPRINT1("Could not get device data for display adapter: %s", pDisplayAdapter->szDeviceName);
        return FALSE;
    }

    return TRUE;
}
Пример #3
0
NTSTATUS PciDtfDeviceFreeDma(IN WDFDEVICE Device, IN WDFREQUEST Request)
{
	PDEVICE_DATA DeviceData = GetDeviceData(Device);
	int *ID;
	WDFCOMMONBUFFER CommonBuffer;
	NTSTATUS Status = STATUS_SUCCESS;

	__try {
		Status = WdfRequestRetrieveInputBuffer(Request,
						       sizeof(int),
						       (PVOID *) & ID, NULL);
		if (!NT_SUCCESS(Status)) {
			TRACE_ERR("WdfRequestRetrieveInputBuffer", Status);
			__leave;
		}
		CommonBuffer = PciDtfCommonBufferFind(DeviceData, *ID, TRUE);
		if (CommonBuffer == NULL) {
			Status = STATUS_INVALID_PARAMETER;
			__leave;
		}
		TRACE_MSG(TRACE_LEVEL_VERBOSE, TRACE_FLAG_QUEUE,
			  "Delete common buffer 0x%p (ID=%d)\n", CommonBuffer,
			  *ID);
		WdfObjectDelete(CommonBuffer);
	}
	__finally {
		WdfRequestComplete(Request, Status);
	}
	return Status;
}
Пример #4
0
//int CPROC CompressFrame( PCOMPRESS pCompress, POINTER *data, INDEX *len )
int CPROC CompressFrame( uintptr_t psv, PCAPTURE_DEVICE pDevice )
{
   PCOMPRESS pCompress = (PCOMPRESS)psv;
	int xerr;
   Image frame;
   GetDeviceData( pDevice, &frame, NULL );

	{  // setup constant factors about encoding behavior
      pCompress->xframe.version = XVID_VERSION;
		//pCompress->xframe.general = 0;
		pCompress->xframe.motion = 0; /*PMV_ADVANCEDDIAMOND16;*/
		pCompress->xframe.quant = 0; //1-31 specify quantizer...
		//pCompress->xframe.intra = -0; // 1- force keyframe, 0-force not keyframe
		pCompress->xframe.quant_intra_matrix = NULL;
		pCompress->xframe.quant_inter_matrix = NULL;

														 /* setup the input frame here... */
      pCompress->xframe.type = XVID_TYPE_AUTO;
		pCompress->xframe.input.csp = XVID_CSP_BGRA;
		pCompress->xframe.input.plane[0] = frame->image;
		pCompress->xframe.input.stride[0] = frame->pwidth*sizeof(CDATA);

		if( !pCompress->xframe.bitstream )
		{
			pCompress->xframe.length = frame->pwidth * frame->height; //frame->width * frame->height * 4;
			pCompress->xframe.bitstream = Allocate( frame->pwidth * frame->height );
		}

	}
   pCompress->xstats.version = XVID_VERSION;
	xerr = xvid_encore( pCompress->xparam.handle, XVID_ENC_ENCODE, &pCompress->xframe, &pCompress->xstats );
   if(0)
	lprintf( WIDE("stats! %d %d %d %d %d %d")
          , xerr
			 , pCompress->xstats.length
			 , pCompress->xstats.hlength
			 , pCompress->xstats.kblks
			 , pCompress->xstats.mblks
			 , pCompress->xstats.ublks );
	if( xerr < 0 || xerr > 512000 )
	{
		lprintf( WIDE("Resulting %d data was %p(%d)")
				 , xerr
				 , pCompress->xframe.bitstream
				 , pCompress->xframe.length );
	}
   MemCpy( pCompress->bitstream, pCompress->xframe.bitstream, xerr );
   SetDeviceData( pDevice, pCompress->bitstream, xerr );
   // at this point pCompress->xframe.intra 0 did not result in keyframe
	// 1 is a keyframe (scene change) 2 is keyframe (max keyfram interval)
   return 1;
}
Пример #5
0
NTSTATUS PciDtfDeviceReadWriteCfg(IN WDFDEVICE Device, IN WDFREQUEST Request,
				  IN BOOLEAN Read)
{
	PDEVICE_DATA DeviceData = GetDeviceData(Device);
	PCIDTF_CFG_DATA *ReqData;
	NTSTATUS Status = STATUS_SUCCESS;

	__try {
		Status = WdfRequestRetrieveInputBuffer(Request,
						       sizeof(PCIDTF_CFG_DATA),
						       (PVOID *) & ReqData,
						       NULL);
		if (!NT_SUCCESS(Status)) {
			TRACE_ERR("WdfRequestRetrieveInputBuffer", Status);
			__leave;
		}
		if (Read) {
			Status = WdfRequestRetrieveOutputBuffer(Request,
								sizeof
								(PCIDTF_CFG_DATA),
								(PVOID *) &
								ReqData, NULL);
			if (!NT_SUCCESS(Status)) {
				TRACE_ERR("WdfRequestRetrieveOutputBuffer",
					  Status);
				__leave;
			}
			Status =
			    PciDtfConfigRead(&DeviceData->BusIntf, ReqData->off,
					     ReqData->len, &ReqData->val);
			if (!NT_SUCCESS(Status)) {
				TRACE_ERR("PciDtfConfigRead", Status);
				__leave;
			}
			WdfRequestSetInformation(Request,
						 sizeof(PCIDTF_CFG_DATA));
		} else {
			Status = PciDtfConfigWrite(&DeviceData->BusIntf,
						   ReqData->off, ReqData->len,
						   ReqData->val);
			if (!NT_SUCCESS(Status)) {
				TRACE_ERR("PciDtfConfigWrite", Status);
				__leave;
			}
		}
	}
	__finally {
		WdfRequestComplete(Request, Status);
	}
	return Status;
}
Пример #6
0
NTSTATUS PciDtfDeviceGetDma(IN WDFDEVICE Device, IN WDFREQUEST Request)
{
	PDEVICE_DATA DeviceData = GetDeviceData(Device);
	PCIDTF_DMA_INFO *ReqData;
	WDFCOMMONBUFFER CommonBuffer;
	NTSTATUS Status = STATUS_SUCCESS;

	__try {
		Status = WdfRequestRetrieveInputBuffer(Request,
						       sizeof(PCIDTF_DMA_INFO),
						       (PVOID *) & ReqData,
						       NULL);
		if (!NT_SUCCESS(Status)) {
			TRACE_ERR("WdfRequestRetrieveInputBuffer", Status);
			__leave;
		}
		Status = WdfRequestRetrieveOutputBuffer(Request,
							sizeof(PCIDTF_DMA_INFO),
							(PVOID *) & ReqData,
							NULL);
		if (!NT_SUCCESS(Status)) {
			TRACE_ERR("WdfRequestRetrieveOutputBuffer", Status);
			__leave;
		}
		CommonBuffer =
		    PciDtfCommonBufferFind(DeviceData, ReqData->id, FALSE);
		if (CommonBuffer == NULL) {
			Status = STATUS_INVALID_PARAMETER;
			__leave;
		}
		ReqData->addr =
		    WdfCommonBufferGetAlignedLogicalAddress
		    (CommonBuffer).QuadPart;
		ReqData->len = (int)WdfCommonBufferGetLength(CommonBuffer);
		WdfRequestSetInformation(Request, sizeof(PCIDTF_DMA_INFO));
	}
	__finally {
		WdfRequestComplete(Request, Status);
	}
	return Status;
}
Пример #7
0
NTSTATUS PciDtfDeviceReadWriteDma(IN WDFDEVICE Device, IN WDFREQUEST Request,
				  IN BOOLEAN Read)
{
	PDEVICE_DATA DeviceData = GetDeviceData(Device);
	PCIDTF_DMA_DATA *ReqData;
	WDFCOMMONBUFFER CommonBuffer;
	NTSTATUS Status = STATUS_SUCCESS;

	__try {
		Status = WdfRequestRetrieveInputBuffer(Request,
						       sizeof(PCIDTF_DMA_DATA),
						       (PVOID *) & ReqData,
						       NULL);
		if (!NT_SUCCESS(Status)) {
			TRACE_ERR("WdfRequestRetrieveInputBuffer", Status);
			__leave;
		}
		TRACE_MSG(TRACE_LEVEL_VERBOSE, TRACE_FLAG_QUEUE,
			  "id=%d, off=%d, len=%d, buf=0x%p, read=%u\n",
			  ReqData->id, ReqData->off, ReqData->len, ReqData->buf,
			  Read);
		CommonBuffer = PciDtfCommonBufferFind(DeviceData,
						      ReqData->id, FALSE);
		if (CommonBuffer == NULL) {
			Status = STATUS_INVALID_PARAMETER;
			__leave;
		}
		Status = PciDtfDmaReadWrite(ReqData,
					    WdfCommonBufferGetAlignedVirtualAddress
					    (CommonBuffer),
					    (ULONG) WdfCommonBufferGetLength
					    (CommonBuffer), Read);
	}
	__finally {
		WdfRequestComplete(Request, Status);
	}
	return Status;
}
Пример #8
0
NTSTATUS PciDtfDeviceAllocDma(IN WDFDEVICE Device, IN WDFREQUEST Request)
{
	PDEVICE_DATA DeviceData = GetDeviceData(Device);
	PCIDTF_DMA_INFO *ReqData;
	WDF_OBJECT_ATTRIBUTES ObjectAttributes;
	WDFCOMMONBUFFER CommonBuffer = NULL;
	PCOMMON_BUFFER_DATA CommonBufferData;
	NTSTATUS Status = STATUS_SUCCESS;

	__try {
		Status = WdfRequestRetrieveInputBuffer(Request,
						       sizeof(PCIDTF_DMA_INFO),
						       (PVOID *) & ReqData,
						       NULL);
		if (!NT_SUCCESS(Status)) {
			TRACE_ERR("WdfRequestRetrieveInputBuffer", Status);
			__leave;
		}
		Status = WdfRequestRetrieveOutputBuffer(Request,
							sizeof(PCIDTF_DMA_INFO),
							(PVOID *) & ReqData,
							NULL);
		if (!NT_SUCCESS(Status)) {
			TRACE_ERR("WdfRequestRetrieveOutputBuffer", Status);
			__leave;
		}
		WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&ObjectAttributes,
							COMMON_BUFFER_DATA);
		Status = WdfCommonBufferCreate(DeviceData->DmaEnabler,
					       ReqData->len, &ObjectAttributes,
					       &CommonBuffer);
		if (!NT_SUCCESS(Status)) {
			TRACE_ERR("WdfCommonBufferCreate", Status);
			__leave;
		}
		CommonBufferData = GetCommonBufferData(CommonBuffer);
		CommonBufferData->ID = PciDtfCommonBufferAssignId(DeviceData);
		Status = WdfCollectionAdd(DeviceData->CommonBuffers,
					  CommonBuffer);
		if (!NT_SUCCESS(Status)) {
			TRACE_ERR("WdfCollectionAdd", Status);
			__leave;
		}
		ReqData->id = CommonBufferData->ID;
		ReqData->addr =
		    WdfCommonBufferGetAlignedLogicalAddress
		    (CommonBuffer).QuadPart;
		WdfRequestSetInformation(Request, sizeof(PCIDTF_DMA_INFO));

		TRACE_MSG(TRACE_LEVEL_VERBOSE, TRACE_FLAG_QUEUE,
			  "va 0x%p, pa 0x%llX, len 0x%X\n",
			  WdfCommonBufferGetAlignedVirtualAddress(CommonBuffer),
			  WdfCommonBufferGetAlignedLogicalAddress
			  (CommonBuffer).QuadPart,
			  WdfCommonBufferGetLength(CommonBuffer));
	}
	__finally {
		if (!NT_SUCCESS(Status) && CommonBuffer != NULL) {
			WdfObjectDelete(CommonBuffer);
		}
		WdfRequestComplete(Request, Status);
	}
	return Status;
}
// returns FALSE on END command, TRUE otherwise
bool tScriptState::ExecuteCommand(tCommand& cmd)
{
    bool bContinue = TRUE;
    switch(cmd.cmdId)
    {
        case cmdLabel:
            break;
        case cmdGoto:
            {
                ULONG step;
                const tParameter *pParam = cmd.params.GetAt(0);
                if (!FindLabelByName(*pParam, &step))
                {
                    FailCase("Can't find label %s", (LPCSTR)pParam->String());
                }
                else
                {
                    currentCommandIndex = step;
                }
            }
            break;
        case cmdIf:
            {
                bool bTrue = EvaluateCondition(cmd.params[0]->String());
                if (!bTrue)
                {
                    currentCommandIndex = cmd.elseStepForIf;
                }
            }
            break;
        case cmdEnd:
            bContinue = FALSE;
            break;
        case cmdSet:
            {
                ULONG data;
                ULONG value = cmd.params[1]->Value();
                if (!GetVariable(cmd.params[0]->String(), data) || data != value)
                {
                    data = value;
                    SetVariable(cmd.params[0]->String(), data);
                }
            }
            break;
        case cmdAdd:
            {
                ULONG data;
                if (GetVariable(cmd.params[0]->String(), data))
                {
                    data += cmd.params[1]->Value();
                    SetVariable(cmd.params[0]->String(), data);
                }
                else
                {
                    FailCase("Can't add %s", cmd.params[0]->String());
                }
            }
            break;
        case cmdPrepare:
            {
                ULONG data;
                if (GetVariable("use_merged_buffers", data))
                    bUseMergedBuffers = !!data;
                if (GetVariable("use_published_events", data))
                    bUsePublishedIndices = !!data;
                if (GetVariable("use_msix", data))
                    bMSIXUsed = !!data;
                SimulationPrepare();
            }
            break;
        case cmdTxAsync:
            {
                bAsyncTransmit = !!cmd.params[0]->Value();
            }
            break;
        case cmdSend:
            {
                AddTxBuffers(cmd.params[0]->Value(), cmd.params[1]->Value());
            }
            break;
        case cmdTxComplete:
            {
                CompleteTx((int)cmd.params[0]->Value());
            }
            break;
        case cmdTxGet:
            {
                GetTxBuffer(cmd.params[0]->Value());
            }
            break;
        case cmdRxReturn:
            {
                ReturnRxBuffer(cmd.params[0]->Value());
            }
            break;
        case cmdRxReceive:
            {
                RxReceivePacket((UCHAR)cmd.params[0]->Value());
            }
            break;
        case cmdDataGet:
            {
                UCHAR offset, val, res;
                offset = (UCHAR)cmd.params[0]->Value();
                val = (UCHAR)cmd.params[1]->Value();
                res = GetDeviceData(offset);
                if (res != val)
                {
                    FailCase("cmdDataGet(%d) = %d, expected %d", offset, res, val);
                }
            }
            break;
        case cmdDataSet:
            {
                UCHAR offset, val;
                offset = (UCHAR)cmd.params[0]->Value();
                val = (UCHAR)cmd.params[1]->Value();
                SetDeviceData(offset, val);
            }
            break;

        case cmdRxRestart:
            {
                BOOLEAN bExpected = (BOOLEAN)cmd.params[0]->Value();
                BOOLEAN b = RxRestart();
                if (b != bExpected)
                {
                    FailCase("RxRestart: %d, expected %d", b, bExpected);
                }
            }
            break;
        case cmdTxRestart:
            {
                BOOLEAN bExpected = (BOOLEAN)cmd.params[0]->Value();
                BOOLEAN b = TxRestart();
                if (b != bExpected)
                {
                    FailCase("TxRestart: %d, expected %d", b, bExpected);
                }
            }
            break;
        case cmdTxEnableInterrupt:
            {
                TxEnableInterrupt();
            }
            break;
        case cmdTxDisableInterrupt:
            {
                TxDisableInterrupt();
            }
            break;
        case cmdRxEnableInterrupt:
            {
                RxEnableInterrupt();
            }
            break;
        case cmdRxDisableInterrupt:
            {
                RxDisableInterrupt();
            }
            break;
        case cmdRxGet:
            {
                ULONG len;
                GetRxBuffer(&len);
            }
            break;
        case cmdControlRxMode:
            {
                SetRxMode((UCHAR)cmd.params[0]->Value(), cmd.params[1]->Value() != 0);
            }
            break;
        case cmdControlVlanAdd:
            {
                USHORT us = (USHORT)cmd.params[0]->Value();
                VlansAdd(&us, 1);
            }
            break;
        case cmdControlVlanDel:
            {
                USHORT us = (USHORT)cmd.params[0]->Value();
                VlansDel(&us, 1);
            }
            break;
        case cmdControlMacTable:
            {
                SetMacAddresses(cmd.params[0]->Value());
            }
        default:
            result = 1;
            break;
    }
    return bContinue;
}
Пример #10
0
DWORD
ProcessSessionThreadRequest(SessionInfo* session_info)
{
    MMRESULT result = MMSYSERR_NOERROR;

    switch ( session_info->thread.function )
    {
        case WODM_WRITE :
        {
            result = QueueWaveBuffer(session_info,
                                     (LPWAVEHDR) session_info->thread.parameter);
            break;
        }

        case WODM_RESET :
        {
            /* TODO */
            break;
        }

        case WODM_PAUSE :
        {
            /* TODO */
            break;
        }

        case WODM_RESTART :
        {
            /* TODO */
            break;
        }

        case WODM_GETPOS :
        {
            /* TODO */
            break;
        }

        case WODM_SETPITCH :
        {
            result = SetDeviceData(session_info->kernel_device_handle,
                                   IOCTL_WAVE_SET_PITCH,
                                   (PBYTE) session_info->thread.parameter,
                                   sizeof(DWORD));
            break;
        }

        case WODM_GETPITCH :
        {
            result = GetDeviceData(session_info->kernel_device_handle,
                                   IOCTL_WAVE_GET_PITCH,
                                   (PBYTE) session_info->thread.parameter,
                                   sizeof(DWORD));
            break;
        }

        case WODM_SETVOLUME :
        {
            break;
        }

        case WODM_GETVOLUME :
        {
#if 0
            result = GetDeviceData(session_info->kernel_device_handle,
                                   IOCTL_WAVE_GET_VOLUME,
                                   (PBYTE) session_info->thread.parameter,);
#endif
            break;
        }

        case WODM_SETPLAYBACKRATE :
        {
            result = SetDeviceData(session_info->kernel_device_handle,
                                   IOCTL_WAVE_SET_PLAYBACK_RATE,
                                   (PBYTE) session_info->thread.parameter,
                                   sizeof(DWORD));
            break;
        }

        case WODM_GETPLAYBACKRATE :
        {
            result = GetDeviceData(session_info->kernel_device_handle,
                                   IOCTL_WAVE_GET_PLAYBACK_RATE,
                                   (PBYTE) session_info->thread.parameter,
                                   sizeof(DWORD));
            break;
        }

        case WODM_CLOSE :
        {
            DPRINT("Thread was asked if OK to close device\n");

            if ( session_info->wave_queue != NULL )
                result = WAVERR_STILLPLAYING;
            else
                result = MMSYSERR_NOERROR;

            break;
        }

        case DRVM_TERMINATE :
        {
            DPRINT("Terminating thread...\n");
            result = MMSYSERR_NOERROR;
            break;
        }

        default :
        {
            DPRINT("INVALID FUNCTION\n");
            result = MMSYSERR_ERROR;
            break;
        }
    }

    /* We're done with the function now */

    return result;
}