638 lines
16 KiB
C++
638 lines
16 KiB
C++
/***************************************************************************
|
|
*
|
|
* Copyright (C) 2000-2001 Microsoft Corporation. All Rights Reserved.
|
|
*
|
|
* File: kshlp.cpp
|
|
* Content: WDM/CSA helper functions.
|
|
* History:
|
|
* Date By Reason
|
|
* ==== == ======
|
|
* 05/16/2000 jstokes Created.
|
|
* 03/09/2001 duganp Fixed return code mistranslation.
|
|
*
|
|
***************************************************************************/
|
|
|
|
#include <windows.h>
|
|
#include <ks.h>
|
|
#include <ksmedia.h>
|
|
#include "ksdbgprop.h"
|
|
#include "kshlp.h"
|
|
|
|
#include <devioctl.h>
|
|
#include "runtime.h"
|
|
|
|
|
|
/***************************************************************************
|
|
*
|
|
* SyncIoctl
|
|
*
|
|
***************************************************************************/
|
|
|
|
static BOOL SyncIoctl
|
|
(
|
|
IN HANDLE handle,
|
|
IN ULONG ulIoctl,
|
|
IN PVOID pvInBuffer OPTIONAL,
|
|
IN ULONG ulInSize,
|
|
OUT PVOID pvOutBuffer OPTIONAL,
|
|
IN ULONG ulOutSize,
|
|
OUT PULONG pulBytesReturned
|
|
)
|
|
{
|
|
OVERLAPPED overlapped;
|
|
memset(&overlapped, 0, sizeof overlapped);
|
|
overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
|
|
if (!overlapped.hEvent)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL fResult = DeviceIoControl(handle,
|
|
ulIoctl,
|
|
pvInBuffer,
|
|
ulInSize,
|
|
pvOutBuffer,
|
|
ulOutSize,
|
|
pulBytesReturned,
|
|
&overlapped);
|
|
|
|
DWORD dwError = GetLastError();
|
|
|
|
if (!fResult && dwError == ERROR_IO_PENDING)
|
|
{
|
|
if (WaitForSingleObject(overlapped.hEvent, INFINITE) != WAIT_FAILED)
|
|
{
|
|
fResult = TRUE;
|
|
}
|
|
}
|
|
else if (!fResult)
|
|
{
|
|
if ( (ulIoctl == IOCTL_KS_PROPERTY)
|
|
&& (ulOutSize == 0)
|
|
&& (dwError == ERROR_MORE_DATA)
|
|
)
|
|
{
|
|
fResult = TRUE;
|
|
}
|
|
else
|
|
{
|
|
*pulBytesReturned = 0;
|
|
}
|
|
}
|
|
|
|
CloseHandle(overlapped.hEvent);
|
|
|
|
return fResult;
|
|
}
|
|
|
|
|
|
/***************************************************************************
|
|
*
|
|
* KsGetProperty
|
|
*
|
|
* Description:
|
|
* Retrieves a particular property on a device.
|
|
*
|
|
* Arguments:
|
|
* HANDLE [in]: device handle.
|
|
* REFGUID [in]: property set id.
|
|
* DWORD [in]: property id.
|
|
* LPVOID [out]: receives property data.
|
|
* DWORD [in]: size of above buffer.
|
|
*
|
|
* Returns:
|
|
* HRESULT: DirectSound/COM result code.
|
|
*
|
|
***************************************************************************/
|
|
|
|
#undef DPF_FNAME
|
|
#define DPF_FNAME "KsGetProperty"
|
|
|
|
HRESULT
|
|
KsGetProperty
|
|
(
|
|
HANDLE hDevice,
|
|
REFGUID guidPropertySet,
|
|
ULONG ulPropertyId,
|
|
LPVOID pvData,
|
|
ULONG cbData,
|
|
PULONG pcbDataReturned
|
|
)
|
|
{
|
|
KSPROPERTY Property;
|
|
HRESULT hr;
|
|
|
|
Property.Set = guidPropertySet;
|
|
Property.Id = ulPropertyId;
|
|
Property.Flags = KSPROPERTY_TYPE_GET;
|
|
|
|
if (SyncIoctl(hDevice, IOCTL_KS_PROPERTY, &Property, sizeof Property, pvData, cbData, pcbDataReturned))
|
|
{
|
|
hr = cbData ? S_OK : S_FALSE;
|
|
}
|
|
else
|
|
{
|
|
DWORD dwError = GetLastError();
|
|
hr = HRESULT_FROM_WIN32(dwError);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
/***************************************************************************
|
|
*
|
|
* KsSetProperty
|
|
*
|
|
* Description:
|
|
* Sets a particular property on a device.
|
|
*
|
|
* Arguments:
|
|
* HANDLE [in]: device handle.
|
|
* REFGUID [in]: property set id.
|
|
* DWORD [in]: property id.
|
|
* LPVOID [in]: property data.
|
|
* DWORD [in]: size of above buffer.
|
|
*
|
|
* Returns:
|
|
* HRESULT: DirectSound/COM result code.
|
|
*
|
|
***************************************************************************/
|
|
|
|
#undef DPF_FNAME
|
|
#define DPF_FNAME "KsSetProperty"
|
|
|
|
HRESULT
|
|
KsSetProperty
|
|
(
|
|
HANDLE hDevice,
|
|
REFGUID guidPropertySet,
|
|
ULONG ulPropertyId,
|
|
LPVOID pvData,
|
|
ULONG cbData
|
|
)
|
|
{
|
|
KSPROPERTY Property;
|
|
HRESULT hr;
|
|
ULONG ulBytesReturned;
|
|
|
|
Property.Set = guidPropertySet;
|
|
Property.Id = ulPropertyId;
|
|
Property.Flags = KSPROPERTY_TYPE_SET;
|
|
|
|
if (SyncIoctl(hDevice, IOCTL_KS_PROPERTY, &Property, sizeof Property, pvData, cbData, &ulBytesReturned))
|
|
{
|
|
hr = cbData ? S_OK : S_FALSE;
|
|
}
|
|
else
|
|
{
|
|
DWORD dwError = GetLastError();
|
|
hr = HRESULT_FROM_WIN32(dwError);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
/***************************************************************************
|
|
*
|
|
* KsGetPinProperty
|
|
*
|
|
* Description:
|
|
* Retrieves a particular property on a pin.
|
|
*
|
|
* Arguments:
|
|
* HANDLE [in]: device handle.
|
|
* DWORD [in]: property id.
|
|
* DWORD [in]: pin id.
|
|
* LPVOID [out]: receives property data.
|
|
* DWORD [in]: size of above buffer.
|
|
*
|
|
* Returns:
|
|
* HRESULT: DirectSound/COM result code.
|
|
*
|
|
***************************************************************************/
|
|
|
|
#undef DPF_FNAME
|
|
#define DPF_FNAME "KsGetPinProperty"
|
|
|
|
HRESULT
|
|
KsGetPinProperty
|
|
(
|
|
HANDLE hDevice,
|
|
ULONG ulPropertyId,
|
|
ULONG ulPinId,
|
|
LPVOID pvData,
|
|
ULONG cbData,
|
|
PULONG pcbDataReturned
|
|
)
|
|
{
|
|
KSP_PIN Pin;
|
|
HRESULT hr;
|
|
|
|
Pin.Property.Set = KSPROPSETID_Pin;
|
|
Pin.Property.Id = ulPropertyId;
|
|
Pin.Property.Flags = KSPROPERTY_TYPE_GET;
|
|
|
|
Pin.PinId = ulPinId;
|
|
Pin.Reserved = 0;
|
|
|
|
if (SyncIoctl(hDevice, IOCTL_KS_PROPERTY, &Pin, sizeof Pin, pvData, cbData, pcbDataReturned))
|
|
{
|
|
hr = cbData ? S_OK : S_FALSE;
|
|
}
|
|
else
|
|
{
|
|
DWORD dwError = GetLastError();
|
|
hr = HRESULT_FROM_WIN32(dwError);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
/***************************************************************************
|
|
*
|
|
* KsSetPinProperty
|
|
*
|
|
* Description:
|
|
* Sets a particular property on a pin.
|
|
*
|
|
* Arguments:
|
|
* HANDLE [in]: device handle.
|
|
* DWORD [in]: property id.
|
|
* DWORD [in]: pin id.
|
|
* LPVOID [out]: property data.
|
|
* DWORD [in]: size of above buffer.
|
|
*
|
|
* Returns:
|
|
* HRESULT: DirectSound/COM result code.
|
|
*
|
|
***************************************************************************/
|
|
|
|
#undef DPF_FNAME
|
|
#define DPF_FNAME "KsSetPinProperty"
|
|
|
|
HRESULT
|
|
KsSetPinProperty
|
|
(
|
|
HANDLE hDevice,
|
|
ULONG ulPropertyId,
|
|
ULONG ulPinId,
|
|
LPVOID pvData,
|
|
ULONG cbData
|
|
)
|
|
{
|
|
KSP_PIN Pin;
|
|
HRESULT hr;
|
|
ULONG ulBytesReturned;
|
|
|
|
Pin.Property.Set = KSPROPSETID_Pin;
|
|
Pin.Property.Id = ulPropertyId;
|
|
Pin.Property.Flags = KSPROPERTY_TYPE_SET;
|
|
|
|
Pin.PinId = ulPinId;
|
|
Pin.Reserved = 0;
|
|
|
|
if (SyncIoctl(hDevice, IOCTL_KS_PROPERTY, &Pin, sizeof Pin, pvData, cbData, &ulBytesReturned))
|
|
{
|
|
hr = cbData ? S_OK : S_FALSE;
|
|
}
|
|
else
|
|
{
|
|
DWORD dwError = GetLastError();
|
|
hr = HRESULT_FROM_WIN32(dwError);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
/***************************************************************************
|
|
*
|
|
* KsGetNodeProperty
|
|
*
|
|
* Description:
|
|
* Retrieves a particular property on a topology node.
|
|
*
|
|
* Arguments:
|
|
* HANDLE [in]: device handle.
|
|
* REFGUID [in]: property set id.
|
|
* ULONG [in]: property id.
|
|
* ULONG [in]: node id.
|
|
* ULONG [in]: flags.
|
|
* LPVOID [out]: receives property data.
|
|
* DWORD [in]: size of above buffer.
|
|
*
|
|
* Returns:
|
|
* HRESULT: DirectSound/COM result code.
|
|
*
|
|
***************************************************************************/
|
|
|
|
#undef DPF_FNAME
|
|
#define DPF_FNAME "KsGetNodeProperty"
|
|
|
|
HRESULT
|
|
KsGetNodeProperty
|
|
(
|
|
HANDLE hDevice,
|
|
REFGUID guidPropertySet,
|
|
ULONG ulPropertyId,
|
|
ULONG ulNodeId,
|
|
LPVOID pvData,
|
|
ULONG cbData,
|
|
PULONG pcbDataReturned
|
|
)
|
|
{
|
|
KSNODEPROPERTY NodeProperty;
|
|
HRESULT hr;
|
|
|
|
NodeProperty.Property.Set = guidPropertySet;
|
|
NodeProperty.Property.Id = ulPropertyId;
|
|
NodeProperty.Property.Flags = KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_TOPOLOGY;
|
|
|
|
NodeProperty.NodeId = ulNodeId;
|
|
NodeProperty.Reserved = 0;
|
|
|
|
if (SyncIoctl(hDevice, IOCTL_KS_PROPERTY, &NodeProperty, sizeof(NodeProperty), pvData, cbData, pcbDataReturned))
|
|
{
|
|
hr = cbData ? S_OK : S_FALSE;
|
|
}
|
|
else
|
|
{
|
|
DWORD dwError = GetLastError();
|
|
hr = HRESULT_FROM_WIN32(dwError);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
/***************************************************************************
|
|
*
|
|
* KsSetNodeProperty
|
|
*
|
|
* Description:
|
|
* Sets a particular property on a topology node.
|
|
*
|
|
* Arguments:
|
|
* HANDLE [in]: device handle.
|
|
* REFGUID [in]: property set id.
|
|
* ULONG [in]: property id.
|
|
* ULONG [in]: node id.
|
|
* ULONG [in]: flags.
|
|
* LPVOID [in]: property data.
|
|
* DWORD [in]: size of above buffer.
|
|
*
|
|
* Returns:
|
|
* HRESULT: DirectSound/COM result code.
|
|
*
|
|
***************************************************************************/
|
|
|
|
#undef DPF_FNAME
|
|
#define DPF_FNAME "KsSetNodeProperty"
|
|
|
|
HRESULT
|
|
KsSetNodeProperty
|
|
(
|
|
HANDLE hDevice,
|
|
REFGUID guidPropertySet,
|
|
ULONG ulPropertyId,
|
|
ULONG ulNodeId,
|
|
LPVOID pvData,
|
|
ULONG cbData
|
|
)
|
|
{
|
|
KSNODEPROPERTY NodeProperty;
|
|
HRESULT hr;
|
|
ULONG ulBytesReturned;
|
|
|
|
NodeProperty.Property.Set = guidPropertySet;
|
|
NodeProperty.Property.Id = ulPropertyId;
|
|
NodeProperty.Property.Flags = KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_TOPOLOGY;
|
|
|
|
NodeProperty.NodeId = ulNodeId;
|
|
NodeProperty.Reserved = 0;
|
|
|
|
if (SyncIoctl(hDevice, IOCTL_KS_PROPERTY, &NodeProperty, sizeof NodeProperty, pvData, cbData, &ulBytesReturned))
|
|
{
|
|
hr = cbData ? S_OK : S_FALSE;
|
|
}
|
|
else
|
|
{
|
|
DWORD dwError = GetLastError();
|
|
hr = HRESULT_FROM_WIN32(dwError);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
/***************************************************************************
|
|
*
|
|
* KsGetDebugNodeProperty
|
|
*
|
|
* Description:
|
|
* Retrieves a particular property on a topology node.
|
|
*
|
|
* Arguments:
|
|
* HANDLE [in]: device handle.
|
|
* REFGUID [in]: property set id.
|
|
* ULONG [in]: property id.
|
|
* ULONG [in]: node id.
|
|
* ULONG [in]: flags.
|
|
* LPVOID [out]: receives property data.
|
|
* DWORD [in]: size of above buffer.
|
|
*
|
|
* Returns:
|
|
* HRESULT: DirectSound/COM result code.
|
|
*
|
|
***************************************************************************/
|
|
/*
|
|
#undef DPF_FNAME
|
|
#define DPF_FNAME "KsGetDebugNodeProperty"
|
|
|
|
HRESULT
|
|
KsGetDebugNodeProperty
|
|
(
|
|
HANDLE hDevice,
|
|
REFGUID guidPropertySet,
|
|
ULONG ulPropertyId,
|
|
ULONG ulNodeId,
|
|
ULONG ulDebugId,
|
|
LPVOID pvData,
|
|
ULONG cbData,
|
|
PULONG pcbDataReturned
|
|
)
|
|
{
|
|
KSDEBUGNODEPROPERTY DebugNodeProperty;
|
|
HRESULT hr;
|
|
|
|
DebugNodeProperty.NodeProperty.Property.Set = guidPropertySet;
|
|
DebugNodeProperty.NodeProperty.Property.Id = ulPropertyId;
|
|
DebugNodeProperty.NodeProperty.Property.Flags = KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_TOPOLOGY;
|
|
|
|
DebugNodeProperty.NodeProperty.NodeId = ulNodeId;
|
|
DebugNodeProperty.NodeProperty.Reserved = 0;
|
|
|
|
DebugNodeProperty.DebugId = ulDebugId;
|
|
DebugNodeProperty.Reserved = 0;
|
|
|
|
hr = SyncIoctl(hDevice, IOCTL_KS_PROPERTY, &DebugNodeProperty, sizeof DebugNodeProperty, pvData, cbData, pcbDataReturned);
|
|
|
|
return hr;
|
|
}
|
|
*/
|
|
|
|
/***************************************************************************
|
|
*
|
|
* KsSetDebugNodeProperty
|
|
*
|
|
* Description:
|
|
* Sets a particular property on a topology node.
|
|
*
|
|
* Arguments:
|
|
* HANDLE [in]: device handle.
|
|
* REFGUID [in]: property set id.
|
|
* ULONG [in]: property id.
|
|
* ULONG [in]: node id.
|
|
* ULONG [in]: flags.
|
|
* LPVOID [in]: property data.
|
|
* DWORD [in]: size of above buffer.
|
|
*
|
|
* Returns:
|
|
* HRESULT: DirectSound/COM result code.
|
|
*
|
|
***************************************************************************/
|
|
/*
|
|
#undef DPF_FNAME
|
|
#define DPF_FNAME "KsSetDebugNodeProperty"
|
|
|
|
HRESULT
|
|
KsSetDebugNodeProperty
|
|
(
|
|
HANDLE hDevice,
|
|
REFGUID guidPropertySet,
|
|
ULONG ulPropertyId,
|
|
ULONG ulNodeId,
|
|
ULONG ulDebugId,
|
|
LPVOID pvData,
|
|
ULONG cbData
|
|
)
|
|
{
|
|
KSDEBUGNODEPROPERTY DebugNodeProperty;
|
|
HRESULT hr;
|
|
ULONG ulBytesReturned;
|
|
|
|
DebugNodeProperty.NodeProperty.Property.Set = guidPropertySet;
|
|
DebugNodeProperty.NodeProperty.Property.Id = ulPropertyId;
|
|
DebugNodeProperty.NodeProperty.Property.Flags = KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_TOPOLOGY;
|
|
|
|
DebugNodeProperty.NodeProperty.NodeId = ulNodeId;
|
|
DebugNodeProperty.NodeProperty.Reserved = 0;
|
|
|
|
DebugNodeProperty.DebugId = ulDebugId;
|
|
DebugNodeProperty.Reserved = 0;
|
|
|
|
hr = SyncIoctl(hDevice, IOCTL_KS_PROPERTY, &DebugNodeProperty, sizeof DebugNodeProperty, pvData, cbData, &ulBytesReturned);
|
|
|
|
return hr;
|
|
}
|
|
*/
|
|
|
|
/***************************************************************************
|
|
*
|
|
* KsSetTopologyNodeEnable
|
|
*
|
|
* Description:
|
|
* Enables or disables a topology node.
|
|
*
|
|
* Arguments:
|
|
* HANDLE [in]: device handle.
|
|
* ULONG [in]: node id.
|
|
* BOOL [in]: enable value.
|
|
*
|
|
* Returns:
|
|
* HRESULT: DirectSound/COM result code.
|
|
*
|
|
***************************************************************************/
|
|
|
|
#undef DPF_FNAME
|
|
#define DPF_FNAME "KsSetTopologyNodeEnable"
|
|
|
|
HRESULT
|
|
KsSetTopologyNodeEnable
|
|
(
|
|
HANDLE hDevice,
|
|
ULONG ulNodeId,
|
|
BOOL fEnable
|
|
)
|
|
{
|
|
return KsSetNodeProperty(hDevice, KSPROPSETID_TopologyNode, KSPROPERTY_TOPOLOGYNODE_ENABLE, ulNodeId, &fEnable, sizeof fEnable);
|
|
}
|
|
|
|
|
|
/***************************************************************************
|
|
*
|
|
* KsGetTopologyNodeEnable
|
|
*
|
|
* Description:
|
|
* Gets the value for the topology node's enable flag.
|
|
*
|
|
* Arguments:
|
|
* HANDLE [in]: pin id.
|
|
* ULONG [in]: node id.
|
|
* PBOOL [out]: receives enable flag.
|
|
*
|
|
* Returns:
|
|
* HRESULT: DirectSound/COM result code.
|
|
*
|
|
***************************************************************************/
|
|
|
|
#undef DPF_FNAME
|
|
#define DPF_FNAME "KsGetTopologyNodeEnable"
|
|
|
|
HRESULT
|
|
KsGetTopologyNodeEnable
|
|
(
|
|
HANDLE hDevice,
|
|
ULONG ulNodeId,
|
|
PBOOL pEnable
|
|
)
|
|
{
|
|
return KsGetNodeProperty(hDevice, KSPROPSETID_TopologyNode, KSPROPERTY_TOPOLOGYNODE_ENABLE, ulNodeId, pEnable, sizeof BOOL);
|
|
}
|
|
|
|
|
|
/***************************************************************************
|
|
*
|
|
* KsTopologyNodeReset
|
|
*
|
|
* Description:
|
|
* Resets a topology node.
|
|
*
|
|
* Arguments:
|
|
* HANDLE [in]: device handle.
|
|
* ULONG [in]: node id.
|
|
* BOOL [in]: enable value.
|
|
*
|
|
* Returns:
|
|
* HRESULT: DirectSound/COM result code.
|
|
*
|
|
***************************************************************************/
|
|
|
|
#undef DPF_FNAME
|
|
#define DPF_FNAME "KsTopologyNodeReset"
|
|
|
|
HRESULT
|
|
KsTopologyNodeReset
|
|
(
|
|
HANDLE hDevice,
|
|
ULONG ulNodeId,
|
|
BOOL fReset
|
|
)
|
|
{
|
|
return KsSetNodeProperty(hDevice, KSPROPSETID_TopologyNode, KSPROPERTY_TOPOLOGYNODE_RESET, ulNodeId, &fReset, sizeof fReset);
|
|
}
|
|
|