Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.03.2011, 23:49   #1
Dj_lemon
Новичок
Джуниор
 
Регистрация: 17.03.2011
Сообщений: 1
По умолчанию Ядро NT. Не доходит до спикера.

Здравствуйте! Вынужден обратиться за помощью, т.к. столкнулся с рядом проблем по время написания драйвера для Windows. Проблема в том что почему то данные не доходят до спикера. Выложил код на С помогите пожалуйста, т.к. сдать надо в скором времени...Спасибо огромное!

#include <ntddk.h>

#define IOCTL_PLAY CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS)

#define SPEAKER_PORT 0x61
#define PIT_CONTROL 0x43
#define PIT_CHANNEL_2 0x42
#define PIT_FREQ 0x1234DD
#define DELAY_LENGTH 100

VOID Play(PUCHAR Buffer, ULONG Length)
{
UCHAR count_values[256] = {0};
ULONG i, j;

for(i = 0; i <= 255; i++)
{
count_values[i] = (UCHAR)((i * 54) / 255);
}

DbgPrint("Completing the table ok\n");

_outp(PIT_CONTROL, 0x90);

DbgPrint("Writing to PIT_CONTROL ok\n");

_outp(SPEAKER_PORT,(_inp(0x61)|0x03 ));

DbgPrint("Writing to SPEAKER_PORT ok\n");

__asm cli

DbgPrint("CLI ok\n");

for(i = 0; i <= Length; i++)
{
_outp(PIT_CHANNEL_2, count_values[Buffer[i]]);

for(j = 0; j <= DELAY_LENGTH; j++);

_outp(PIT_CHANNEL_2, count_values[Buffer[i]]);

for(j = 0; j <= DELAY_LENGTH; j++);
}

__asm sti

_outp(SPEAKER_PORT,_inp(SPEAKER_POR T)&0xfc);
_outp(PIT_CONTROL, 0xb6);
}

NTSTATUS CompleteIrp(PIRP Irp, NTSTATUS status, ULONG info)
{
Irp->IoStatus.Status = status;
Irp->IoStatus.Information = info;
IoCompleteRequest(Irp, IO_NO_INCREMENT);

return status;
}

NTSTATUS CreateDevice(IN PDEVICE_OBJECT fdo, IN PIRP Irp)
{
DbgPrint("Device opened");
return CompleteIrp(Irp, STATUS_SUCCESS, 0);
}

NTSTATUS CloseDevice(IN PDEVICE_OBJECT fdo, IN PIRP Irp)
{
DbgPrint("Device closed");
return CompleteIrp(Irp, STATUS_SUCCESS, 0);
}

NTSTATUS DriverIOCTL(IN PDEVICE_OBJECT fdo, IN PIRP Irp)
{
NTSTATUS status = STATUS_SUCCESS;
PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp);
ULONG ControlCode = IrpStack->Parameters.DeviceIoControl.IoContr olCode;
ULONG method = ControlCode & 0x03;
ULONG BytesTxd = 0;
UCHAR * Buffer;

DbgPrint("IOCTL");

if(ControlCode == IOCTL_PLAY)
{
ULONG InputLength = IrpStack->Parameters.DeviceIoControl.InputBu fferLength;
ULONG OutputLength = IrpStack->Parameters.DeviceIoControl.OutputB ufferLength;

Buffer = (PUCHAR)Irp->AssociatedIrp.SystemBuffer;

DbgPrint("Buffer received");
Play(Buffer, InputLength);

BytesTxd = 0;
}

return CompleteIrp(Irp, status, BytesTxd);
}

VOID DriverUnload(IN PDRIVER_OBJECT DriverObject)
{
WCHAR DOSNameBuffer[] = L"\\DosDevices\\giveio";
UNICODE_STRING uniDOSString;

RtlInitUnicodeString(&uniDOSString, DOSNameBuffer);

IoDeleteSymbolicLink (&uniDOSString);
IoDeleteDevice(DriverObject->DeviceObject);
}

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
ULONG i;
UNICODE_STRING devName, symLink;
NTSTATUS status = STATUS_SUCCESS;
PDEVICE_OBJECT fdo;

DbgPrint("Driver_Entry\n");

for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
{
DriverObject->MajorFunction[i] = NULL;
}

DriverObject->MajorFunction[IRP_MJ_CREATE] = CreateDevice;
DriverObject->MajorFunction[IRP_MJ_CLOSE] = CloseDevice;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DriverIOCTL;
DriverObject->DriverUnload = DriverUnload;

RtlInitUnicodeString(&devName,L"\\D evice\\giveio");
RtlInitUnicodeString(&symLink,L"\\D osDevices\\giveio");

status = IoCreateDevice(DriverObject,0, &devName, FILE_DEVICE_UNKNOWN, 0, TRUE, &fdo);

if(!NT_SUCCESS(status))
{
DbgPrint("IoCreateDevice ERROR\n");
return status;
}

status = IoCreateSymbolicLink(&symLink, &devName);

if(!NT_SUCCESS(status))
{
IoDeleteDevice(fdo);
DbgPrint("IoCreateSymbolicLink ERROR\n");
return status;
}

return status;
}
Dj_lemon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не доходит до моей тупой башки Катька=) Помощь студентам 5 17.03.2011 20:15
Неизвестный звук спикера balaxai Компьютерное железо 3 01.03.2011 21:50
Не доходит!Защита листа и группировка magana Microsoft Office Excel 3 04.09.2010 11:39
Ядро Adblock PHP 13 22.06.2010 21:16
ATL DLL ядро и интерфейс на C# ForveAvar Общие вопросы .NET 0 19.10.2009 19:42