#include #include #include #include #include #include "debug.h" #include "reg.h" #include "ksi.h" extern "C" HANDLE hHeap; const int StrLenGuid = 38; // "{01234567-0123-0123-0123-012345678901}" __inline void MyStringFromGuid(PTSTR pstr, LPCGUID Guid) { wsprintf(pstr, TEXT("{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}"), Guid->Data1, Guid->Data2, Guid->Data3, Guid->Data4[0], Guid->Data4[1], Guid->Data4[2], Guid->Data4[3], Guid->Data4[4], Guid->Data4[5], Guid->Data4[6], Guid->Data4[7]); } LONG KsGetFilterStatePropertySets(IN HANDLE hKsObject, OUT GUID *ppaPropertySets[], OUT int *pcPropertySets) { KSPROPERTY Property; ULONG cbData; LONG result; Property.Set = KSPROPSETID_Audio; Property.Id = KSPROPERTY_AUDIO_FILTER_STATE; Property.Flags = KSPROPERTY_TYPE_GET; if (DeviceIoControl(hKsObject, IOCTL_KS_PROPERTY, &Property, sizeof(Property), NULL, 0, &cbData, NULL)) { // dprintf(TEXT("KsGetFilterStatePropertySets: succeeded, cbData=%d\n"), cbData); result = NO_ERROR; } else { result = GetLastError(); // dprintf(TEXT("KsGetFilterStatePropertySets: failed getting FilterState property size, LastError=%d\n"), result); if (ERROR_MORE_DATA == result) { // dprintf(TEXT("KsGetFilterStatePropertySets: note: %d bytes in FilterState\n"), cbData); result = NO_ERROR; } } if (NO_ERROR == result) { if (cbData > 0) { LPGUID paPropertySets; paPropertySets = (LPGUID)HeapAlloc(hHeap, 0, cbData); if (paPropertySets) { Property.Set = KSPROPSETID_Audio; Property.Id = KSPROPERTY_AUDIO_FILTER_STATE; Property.Flags = KSPROPERTY_TYPE_GET; if (DeviceIoControl(hKsObject, IOCTL_KS_PROPERTY, &Property, sizeof(Property), paPropertySets, cbData, &cbData, NULL)) { *ppaPropertySets = paPropertySets; *pcPropertySets = cbData / sizeof(paPropertySets[0]); } else { result = GetLastError(); // dprintf(TEXT("KsGetFilterStatePropertySets: failed getting FilterState property, LastError=%d\n"), result); } if (NO_ERROR != result) { HeapFree(hHeap, 0, paPropertySets); } } else { result = ERROR_OUTOFMEMORY; } } else { *ppaPropertySets = NULL; *pcPropertySets = 0; } } return result; } LONG KsSerializePropertySetToReg(IN HANDLE hKsObject, IN LPCGUID PropertySet, IN HKEY hKey) { TCHAR strGuid[StrLenGuid+1]; KSPROPERTY Property; ULONG cbData; LONG result; MyStringFromGuid(strGuid, PropertySet); // dprintf(TEXT("KsSerializePropertySetToReg: note: serializing set %s\n"), strGuid); Property.Set = *PropertySet; Property.Id = 0; Property.Flags = KSPROPERTY_TYPE_SERIALIZESET; if (DeviceIoControl(hKsObject, IOCTL_KS_PROPERTY, &Property, sizeof(Property), NULL, 0, &cbData, NULL)) { // dprintf(TEXT("KsSerializePropertySetToReg: succeeded, cbData=%d\n"), cbData); result = NO_ERROR; } else { result = GetLastError(); // dprintf(TEXT("KsSerializePropertySetToReg: failed getting serialized size, LastError=%d\n"), result); if (ERROR_MORE_DATA == result) { // dprintf(TEXT("KsSerializePropertySetToReg: note: %d bytes to serialize\n"), cbData); result = NO_ERROR; } } if (NO_ERROR == result && cbData > 0) { PVOID pvData = HeapAlloc(hHeap, 0, cbData); if (pvData) { Property.Set = *PropertySet; Property.Id = 0; Property.Flags = KSPROPERTY_TYPE_SERIALIZESET; if (DeviceIoControl(hKsObject, IOCTL_KS_PROPERTY, &Property, sizeof(Property), pvData, cbData, &cbData, NULL)) { result = RegSetBinaryValue(hKey, strGuid, (PBYTE)pvData, cbData); } else { result = GetLastError(); // dprintf(TEXT("KsSerializePropertySetToReg: failed to serialize, LastError=%d\n"), result); } HeapFree(hHeap, 0, pvData); } else { result = ERROR_OUTOFMEMORY; } } return result; } LONG KsSerializeFilterStateToReg(IN HANDLE hKsObject, IN HKEY hKey) { LPGUID paPropertySets; int cPropertySets; LONG result; result = KsGetFilterStatePropertySets(hKsObject, &paPropertySets, &cPropertySets); if (NO_ERROR == result && cPropertySets > 0) { int i; for (i = 0; i < cPropertySets; i++) { KsSerializePropertySetToReg(hKsObject, &paPropertySets[i], hKey); } HeapFree(hHeap, 0, paPropertySets); } return result; } LONG KsUnserializePropertySetFromReg(IN HANDLE hKsObject, IN LPCGUID PropertySet, IN HKEY hKey) { TCHAR strGuid[StrLenGuid+1]; KSPROPERTY Property; PBYTE pData; ULONG cbData; LONG result; MyStringFromGuid(strGuid, PropertySet); // dprintf(TEXT("KsUnserializePropertySetFromReg: note: serializing set %s\n"), strGuid); result = RegQueryBinaryValue(hKey, strGuid, (PBYTE*)&pData, &cbData); if (NO_ERROR == result) { Property.Set = *PropertySet; Property.Id = 0; Property.Flags = KSPROPERTY_TYPE_UNSERIALIZESET; if (DeviceIoControl(hKsObject, IOCTL_KS_PROPERTY, &Property, sizeof(Property), pData, cbData, &cbData, NULL)) { // dprintf(TEXT("KsUnserializePropertySetFromReg: succeeded\n")); result = NO_ERROR; } else { result = GetLastError(); // dprintf(TEXT("KsUnserializePropertySetFromReg: failed to unserialize, LastError=%d\n"), result); } HeapFree(hHeap, 0, pData); } return result; } LONG KsUnserializeFilterStateFromReg(IN HANDLE hKsObject, IN HKEY hKey) { LPGUID paPropertySets; int cPropertySets; LONG result; result = KsGetFilterStatePropertySets(hKsObject, &paPropertySets, &cPropertySets); if (NO_ERROR == result && cPropertySets > 0) { int i; for (i = 0; i < cPropertySets; i++) { KsUnserializePropertySetFromReg(hKsObject, &paPropertySets[i], hKey); } HeapFree(hHeap, 0, paPropertySets); } return result; } LONG KsSetAudioGfxXxxTargetDeviceId(IN HANDLE hGfx, IN ULONG PropertyId, IN PCTSTR DeviceId) { KSPROPERTY Property; ULONG cbData; LONG result; ASSERT(hGfx); ASSERT(!IsBadStringPtr(DeviceId, (UINT_PTR)(-1))); ASSERT(lstrlen(DeviceId)); Property.Set = KSPROPSETID_AudioGfx; Property.Id = PropertyId; Property.Flags = KSPROPERTY_TYPE_SET; cbData = (lstrlen(DeviceId) + 1) * sizeof(DeviceId[0]); if (DeviceIoControl(hGfx, IOCTL_KS_PROPERTY, &Property, sizeof(Property), (LPVOID)DeviceId, cbData, &cbData, NULL)) { result = NO_ERROR; } else { result = GetLastError(); dprintf(TEXT("KsSetAudioGfxXxxTargetDeviceId: failed, LastError=%d\n"), result); } return result; } LONG KsSetAudioGfxRenderTargetDeviceId(IN HANDLE hGfx, IN PCTSTR DeviceId) { return KsSetAudioGfxXxxTargetDeviceId(hGfx, KSPROPERTY_AUDIOGFX_RENDERTARGETDEVICEID, DeviceId); } LONG KsSetAudioGfxCaptureTargetDeviceId(IN HANDLE hGfx, IN PCTSTR DeviceId) { return KsSetAudioGfxXxxTargetDeviceId(hGfx, KSPROPERTY_AUDIOGFX_CAPTURETARGETDEVICEID, DeviceId); }