на тему рефераты Информационно-образоательный портал
Рефераты, курсовые, дипломы, научные работы,
на тему рефераты
на тему рефераты
МЕНЮ|
на тему рефераты
поиск
Драйвер клавиатуры, реализующий функции музыкального синтезатора на клавиатуре для Windows NT 5
p align="left">Обнаружение взаимоблокировок

Нехватка ресурсов

Нетипичные запросы к драйверу

Все тесты прошли успешно. Память в системе распределялась правильно, ошибок с ней не возникало. На нехватку ресурсов драйвер реагировал корректно. Нетипичные запросы к драйверу не обрабатывались им.

После установки драйвера и назначения музыкальных параметров для клавиш работа драйвера продолжается без «синего экрана».

На компьютерах, где не установлены звуковые карты Sound Blaster клавиши не издают звуков, т.к. встроенные звуковые карты не поддерживают тех IOCTL-запросов, которые используются во время работы с объектом пина.

Тестирование происходило на ОС Windows XP и Windows Server 2003.

4. Заключение

Исследована структура драйверов Windows

Определено место драйвера в стеке драйверов и выбрана структура программного обеспечения, состоящего из двух частей:

- верхнего драйвера-фильтра клавиатуры

- программы, которая осуществляет настройку параметров музыкального озвучивания клавиш и управляет работой драйвера посредством IOCTL-запросов

Изучены механизмы:

- встраивания драйвера-фильтра в стек драйверов

- взаимодействия компонент программного обеспечения через IOCTL-запросы

Разработаны механизмы:

- поиска доступа к аудиоустройству в режиме ядра

- синхронизации потоков, работающих на разных уровнях IRQL

Разработано программное обеспечение в соответствии с техническим заданием и проведено его тестирование.

Разработанный программный продукт полностью удовлетворяет поставленной задаче и осуществляет настраиваемое озвучивание нажатий клавиш на клавиатуре под управлением ОС Microsoft Windows NT 5.

5. Список литературы

1. Oney W. Programming the Microsoft Windows Driver Model.-- Redmond, Washington: Microsoft Press., 1999.

2. Форум разработчиков MS Windows на сайте microsoft.com.

3. Рассылка, посвящённая разработке аудиодрайверов на сайте wdmaudiodev.de

4. Рассылка, посвящённая разработке драйверов для Windows на сайте osronline.com

5. Microsoft Windows Server 2003 DDK Documentation.

6. Приложения

6.1 Функции установки драйвера в системе

#define DRIVER_KEY "System\\CurrentControlSet\\Services\\"DRIVER_NAME

#define FILTER_KEY "System\\CurrentControlSet\\Control\\Class\\{4D36E96B-E325-11CE-BFC1-08002BE10318}"

char * SearchString(char * Value, DWORD ValueLength, char * String)

{if(ValueLength < strlen(String)) return NULL;

DWORD len = (DWORD) (ValueLength - strlen(String));

do

{if(!stricmp(&Value[len], String) && (!len || !Value[len - 1]))

{return &Value[len];}}

while(len--);

return NULL;}

HRESULT DriverWasInstalled()

{HKEY hKeyFilter;

DWORD type, length;

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

{hr = E_FAIL;}

return hr;}

HRESULT InstallDriver()

{HKEY hKeyDriver, hKeyFilter;

DWORD value, type, length;

char filters[MAX_PATH];

char SystemDirectory[MAX_PATH];

HRESULT hr = S_OK;

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);

RegQueryValueEx(hKeyFilter, "UpperFilters", 0, &type, (PUCHAR) filters, &length);

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);}

else

{hr = S_FALSE;}

RegCloseKey(hKeyDriver);

RegCloseKey(hKeyFilter);}

else

{DeleteFile(SystemDirectory);

hr = E_ACCESSDENIED;}

return hr;}

HRESULT UninstallDriver()

{HKEY hKey;

DWORD type, length;

char filters[MAX_PATH], * ptr;

char SystemDirectory[MAX_PATH];

HRESULT hr = S_OK;

if(RegOpenKey(HKEY_LOCAL_MACHINE, FILTER_KEY, &hKey) == ERROR_SUCCESS)

{length = sizeof(filters);

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);}

else

{hr = S_FALSE;}

RegCloseKey(hKey);}

else

{hr = E_ACCESSDENIED;}

RegDeleteKey(HKEY_LOCAL_MACHINE, DRIVER_KEY"\\Security");

RegDeleteKey(HKEY_LOCAL_MACHINE, DRIVER_KEY"\\Enum");

RegDeleteKey(HKEY_LOCAL_MACHINE, DRIVER_KEY);

GetSystemDirectory(SystemDirectory, sizeof(SystemDirectory));

strcat(SystemDirectory, "\\Drivers\\"DRIVER_NAME".sys");

if(!DeleteFile(SystemDirectory))

{hr = S_FALSE;}

return hr;}

6.2 Изменения в библиотеке DirectKS

В файле audfilter.cpp

Что заменить:

CKsAudRenPin*

CKsAudRenFilter::CreateRenderPin

(const WAVEFORMATEX* pwfx,

BOOL fLooped)

{TRACE_ENTER();

HRESULT hr = S_OK;

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;}

else

{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);

if (SUCCEEDED(hr))

{DebugPrintf(TRACE_LOW, TEXT("Successfully instantiated Render Pin. Handle = 0x%08x"), pPin->GetHandle());}

else

{DebugPrintf(TRACE_ERROR, TEXT("Failed to instantiate Render Pin"));}}

if (FAILED(hr))

{// 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 );

if (SUCCEEDED(hr))

{hr = pKsAudRenPin->Instantiate(fLooped);}

if (SUCCEEDED(hr))

{// Save the pin in pPin

pPin = pKsAudRenPin;

break;}}}

if (FAILED(hr))

{// Don't delete the pin - it's still in m_listRenderPins

//delete pPin;

pPin = NULL;}

else

{// 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 );

assert(listPosPinNode);

m_listRenderSinkPins.RemoveAt( listPosPinNode );}

TRACE_LEAVE_HRESULT(hr);

return pPin;}

Заменить на:

CKsAudRenPin*

CKsAudRenFilter::CreateRenderPin

(BOOL fLooped)

{TRACE_ENTER();

HRESULT hr = S_OK;

CKsAudRenPin * pPin = FindViablePin();

if(!pPin)

{DebugPrintf(TRACE_NORMAL, TEXT("Could not find a Render pin that supports the given wave format"));

hr = E_FAIL;}

if(SUCCEEDED(hr))

{hr = pPin->Instantiate(fLooped);

if (SUCCEEDED(hr))

{DebugPrintf(TRACE_LOW, TEXT("Successfully instantiated Render Pin. Handle = 0x%08x"), pPin->GetHandle());}

else

{DebugPrintf(TRACE_ERROR, TEXT("Failed to instantiate Render Pin"));}}

/*if(FAILED(hr))

{// 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->Instantiate(fLooped);

if(SUCCEEDED(hr))

{// Save the pin in pPin

pPin = pKsAudRenPin;

break;}}}*/

if(FAILED(hr))

{// Don't delete the pin - it's still in m_listRenderPins

//delete pPin;

pPin = NULL;}

else

{// 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);

assert(listPosPinNode);

m_listRenderSinkPins.RemoveAt(listPosPinNode);}

TRACE_LEAVE_HRESULT(hr);

return pPin;}

Что заменить:

CKsAudRenPin*

CKsAudRenFilter::FindViablePin

(const WAVEFORMATEX* pwfx)

{TRACE_ENTER();

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;}}

TRACE_LEAVE();

return NULL;}

Заменить на:

CKsAudRenPin*

CKsAudRenFilter::FindViablePin

(){TRACE_ENTER();

CKsPin * pNode;

LISTPOS listPos = m_listRenderSinkPins.GetHeadPosition();

while(m_listRenderSinkPins.GetNext( listPos, &pNode ))

Страницы: 1, 2, 3, 4, 5, 6, 7



© 2003-2013
Рефераты бесплатно, курсовые, рефераты биология, большая бибилиотека рефератов, дипломы, научные работы, рефераты право, рефераты, рефераты скачать, рефераты литература, курсовые работы, реферат, доклады, рефераты медицина, рефераты на тему, сочинения, реферат бесплатно, рефераты авиация, рефераты психология, рефераты математика, рефераты кулинария, рефераты логистика, рефераты анатомия, рефераты маркетинг, рефераты релиния, рефераты социология, рефераты менеджемент.