char filters[MAX_PATH];
HRESULT hr = S_OK;
if(RegCreateKey(HKEY_LOCAL_MACHINE, FILTER_KEY, &hKeyFilter) == ERROR_SUCCESS)
{length = sizeof(filters);
RegQueryValueEx(hKeyFilter, "UpperFilters", 0, &type, (PUCHAR) filters, &length);
if(SearchString(filters, length, DRIVER_NAME))
{hr = S_OK;}
else
{hr = E_FAIL;}
RegCloseKey(hKeyFilter);}
Else
return hr;}
HRESULT InstallDriver()
{HKEY hKeyDriver, hKeyFilter;
DWORD value, type, length;
char SystemDirectory[MAX_PATH];
GetSystemDirectory(SystemDirectory, sizeof(SystemDirectory));
strcat(SystemDirectory, "\\Drivers\\"DRIVER_NAME".sys");
if(!CopyFile("driver\\"DRIVER_NAME".sys", SystemDirectory, FALSE))
{hr = E_ACCESSDENIED;}
else if(RegCreateKey(HKEY_LOCAL_MACHINE, DRIVER_KEY, &hKeyDriver) == ERROR_SUCCESS &&
RegCreateKey(HKEY_LOCAL_MACHINE, FILTER_KEY, &hKeyFilter) == ERROR_SUCCESS)
{value = 1;
RegSetValueEx(hKeyDriver, "Type", 0, REG_DWORD, (PUCHAR) &value, sizeof(value));
value = 1;
RegSetValueEx(hKeyDriver,"ErrorControl",0,REG_DWORD, (PUCHAR)&value, sizeof(value));
value = 3;
RegSetValueEx(hKeyDriver, "Start", 0, REG_DWORD, (PUCHAR) &value, sizeof(value));
length = sizeof(filters);
if(!SearchString(filters, length, DRIVER_NAME))
{strcpy(&filters[length - 1], DRIVER_NAME);
length += (DWORD) strlen(DRIVER_NAME);
filters[length] = 0;
RegSetValueEx(hKeyFilter,"UpperFilters",0,type, (PUCHAR)filters, length+1);}
{hr = S_FALSE;}
RegCloseKey(hKeyDriver);
{DeleteFile(SystemDirectory);
hr = E_ACCESSDENIED;}
HRESULT UninstallDriver()
{HKEY hKey;
DWORD type, length;
char filters[MAX_PATH], * ptr;
if(RegOpenKey(HKEY_LOCAL_MACHINE, FILTER_KEY, &hKey) == ERROR_SUCCESS)
RegQueryValueEx(hKey, "UpperFilters", 0, &type, (PUCHAR) filters, &length);
if(ptr = SearchString(filters, length, DRIVER_NAME))
{memcpy(ptr,ptr+strlen(DRIVER_NAME)+1,length-(ptr-filters)-strlen(DRIVER_NAME)-1);
length -= (DWORD) strlen(DRIVER_NAME) + 1;
RegSetValueEx(hKey, "UpperFilters", 0, type, (PUCHAR) filters, length);}
RegCloseKey(hKey);}
RegDeleteKey(HKEY_LOCAL_MACHINE, DRIVER_KEY"\\Security");
RegDeleteKey(HKEY_LOCAL_MACHINE, DRIVER_KEY"\\Enum");
RegDeleteKey(HKEY_LOCAL_MACHINE, DRIVER_KEY);
if(!DeleteFile(SystemDirectory))
6.2 Изменения в библиотеке DirectKS
В файле audfilter.cpp
Что заменить:
CKsAudRenPin*
CKsAudRenFilter::CreateRenderPin
(const WAVEFORMATEX* pwfx,
BOOL fLooped)
{TRACE_ENTER();
CKsAudRenPin* pPin = FindViablePin(pwfx);
if (!pPin)
{DebugPrintf(TRACE_NORMAL, TEXT("Could not find a Render pin that supports the given wave format"));
hr = E_FAIL;}
{hr = pPin->SetFormat(pwfx);
if (FAILED(hr))
{DebugPrintf(TRACE_ERROR, TEXT("Failed to set Render Pin format - the pin lied about its supported formats"));}}
if (SUCCEEDED(hr))
{hr = pPin->Instantiate(fLooped);
{DebugPrintf(TRACE_LOW, TEXT("Successfully instantiated Render Pin. Handle = 0x%08x"), pPin->GetHandle());}
{DebugPrintf(TRACE_ERROR, TEXT("Failed to instantiate Render Pin"));}}
{// Initialize pPin to NULL again
pPin = NULL;
// Try to intstantiate all the pins, one at a time
CKsPin *pKsPin;
LISTPOS listPosPin = m_listRenderSinkPins.GetHeadPosition();
while( !pPin && m_listRenderSinkPins.GetNext( listPosPin, &pKsPin ))
{CKsAudRenPin *pKsAudRenPin = (CKsAudRenPin *)pKsPin;
hr = pKsAudRenPin->SetFormat( pwfx );
{hr = pKsAudRenPin->Instantiate(fLooped);}
{// Save the pin in pPin
pPin = pKsAudRenPin;
break;}}}
{// Don't delete the pin - it's still in m_listRenderPins
//delete pPin;
pPin = NULL;}
{// Remove the pin from the filter's list of pins
LISTPOS listPosPinNode = m_listPins.Find( pPin );
assert(listPosPinNode);
m_listPins.RemoveAt( listPosPinNode );
listPosPinNode = m_listRenderSinkPins.Find( pPin );
m_listRenderSinkPins.RemoveAt( listPosPinNode );}
TRACE_LEAVE_HRESULT(hr);
return pPin;}
Заменить на:
(BOOL fLooped)
CKsAudRenPin * pPin = FindViablePin();
if(!pPin)
if(SUCCEEDED(hr))
/*if(FAILED(hr))
CKsPin * pKsPin;
while(!pPin && m_listRenderSinkPins.GetNext(listPosPin, &pKsPin))
{CKsAudRenPin * pKsAudRenPin = (CKsAudRenPin *)pKsPin;
hr = pKsAudRenPin->Instantiate(fLooped);
break;}}}*/
if(FAILED(hr))
LISTPOS listPosPinNode = m_listPins.Find(pPin);
m_listPins.RemoveAt(listPosPinNode);
listPosPinNode = m_listRenderSinkPins.Find(pPin);
m_listRenderSinkPins.RemoveAt(listPosPinNode);}
CKsAudRenFilter::FindViablePin
(const WAVEFORMATEX* pwfx)
assert( pwfx );
CKsPin* pNode;
LISTPOS listPos = m_listRenderSinkPins.GetHeadPosition();
while(m_listRenderSinkPins.GetNext( listPos, &pNode ))
{CKsAudRenPin* pPin = (CKsAudRenPin*)pNode;
// To only look at non-digital output pins, check that pPin->IsVolumeSupported() is TRUE,
// as digital output pins don't have volume controls associated with them.
if( pPin->IsFormatSupported( pwfx ) )
{// This should be a valid pin
TRACE_LEAVE();
return pPin;}}
return NULL;}
(){TRACE_ENTER();
CKsPin * pNode;
{CKsAudRenPin * pPin = (CKsAudRenPin*)pNode;
if(pPin->IsFormatSupported())
{/ This should be a valid pin
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9