Дополнительная функция в PCIIDEX.SYS

Обсуждаем ReactOS по-русски

Moderators: fog, fireball

Post Reply
vgal
Posts: 88
Joined: Mon Jan 26, 2015 7:38 am

Дополнительная функция в PCIIDEX.SYS

Post by vgal » Sat Jul 11, 2015 10:29 am

В ходе моих экспериментов с RoS IDE драйверами добавил функцию PciIdeXPdoQueryResource (dispatch IRP_MN_QUERY_RESOURCES) в ..\drivers\storage\ide\pciidex\pdo.c. Может кому пригодится.

static NTSTATUS
PciIdeXPdoQueryResource(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
OUT ULONG_PTR* Information)
{
ULONG Channel;
ULONG BaseIoAddress1, BaseIoAddress2, InterruptLevel;
ULONG ListSize;
PCM_RESOURCE_LIST List;
PCM_PARTIAL_RESOURCE_LIST PartialList;

Channel = ((PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->Channel;

ListSize = sizeof(CM_RESOURCE_LIST) + 2 * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR);
List = ExAllocatePool(PagedPool, ListSize);
(!List) return STATUS_INSUFFICIENT_RESOURCES;
RtlZeroMemory(List, ListSize);

List->Count = 1;
List->List[0].PartialResourceList.Count = 3;

PartialList = &List->List[0].PartialResourceList;

if ( Channel == PRIMARY_CHANNEL_NUMBER )
{
BaseIoAddress1 = 0x1F0;
BaseIoAddress2 = 0x3F6;
InterruptLevel = 14;
}
else
{
BaseIoAddress1 = 0x170;
BaseIoAddress2 = 0x376;
InterruptLevel = 15;
}

PartialList->PartialDescriptors[0].Type = CmResourceTypePort;
PartialList->PartialDescriptors[0].ShareDisposition = CmResourceShareDeviceExclusive;
PartialList->PartialDescriptors[0].Flags = CM_RESOURCE_PORT_IO | CM_RESOURCE_PORT_16_BIT_DECODE;
PartialList->PartialDescriptors[0].u.Port.Start.QuadPart = (ULONGLONG)BaseIoAddress1;
PartialList->PartialDescriptors[0].u.Port.Length = 8;

PartialList->PartialDescriptors[1].Type = CmResourceTypePort;
PartialList->PartialDescriptors[1].ShareDisposition = CmResourceShareDeviceExclusive;
PartialList->PartialDescriptors[1].Flags = CM_RESOURCE_PORT_IO | CM_RESOURCE_PORT_16_BIT_DECODE;
PartialList->PartialDescriptors[1].u.Port.Start.QuadPart = (ULONGLONG)BaseIoAddress2;
PartialList->PartialDescriptors[1].u.Port.Length = 1;

PartialList->PartialDescriptors[2].Type = CmResourceTypeInterrupt;
PartialList->PartialDescriptors[2].ShareDisposition = CmResourceShareDeviceExclusive;
PartialList->PartialDescriptors[2].Flags = CM_RESOURCE_INTERRUPT_LATCHED;
PartialList->PartialDescriptors[2].u.Interrupt.Level = InterruptLevel;
PartialList->PartialDescriptors[2].u.Interrupt.Vector = InterruptLevel;
PartialList->PartialDescriptors[2].u.Interrupt.Affinity = 1;

*Information = (ULONG_PTR)List;
return STATUS_SUCCESS;
}

towerr
Posts: 258
Joined: Wed Jun 20, 2007 3:01 am

Re: Дополнительная функция в PCIIDEX.SYS

Post by towerr » Sat Jul 11, 2015 4:59 pm

vgal wrote:В ходе моих экспериментов с RoS IDE драйверами добавил функцию PciIdeXPdoQueryResource (dispatch IRP_MN_QUERY_RESOURCES) в ..\drivers\storage\ide\pciidex\pdo.c. Может кому пригодится.
<cut >
}
ай красява... только вот надо делать так, в жире создаешь багрипорт, описание тесткейс, прилагнаешь туда пач
в случае отсутсвия какбы бага, просто нечто вразумительнопонятное о фиксе - его увидят и отуда могут вставить в исходники, а на форуме он таки будет валятся, хотя попинав девелоперов... но это будет неправильно... ибо нужна ссылка на АВТОРА коим ты являесся

vgal
Posts: 88
Joined: Mon Jan 26, 2015 7:38 am

Re: Дополнительная функция в PCIIDEX.SYS

Post by vgal » Sat Jul 11, 2015 5:48 pm

Сначала так и хотел сделать. Это как бы не баг (а может и баг, не знаю). И переводить на английский для меня сложновато.
Поэтому и написал сюда. Кому понадобится - возьмет. Пока нет драйвера ата порта, и так всё работает (в PCIIDEX).

towerr
Posts: 258
Joined: Wed Jun 20, 2007 3:01 am

Re: Дополнительная функция в PCIIDEX.SYS

Post by towerr » Sat Jul 11, 2015 9:16 pm

vgal wrote:Сначала так и хотел сделать. Это как бы не баг (а может и баг, не знаю). И переводить на английский для меня сложновато.
Поэтому и написал сюда. Кому понадобится - возьмет. Пока нет драйвера ата порта, и так всё работает (в PCIIDEX).
из разговора с девелоперами... почти цитирую
<ThFabba> No, you don't have to use a driver to write code for it ;p
нет вы не используете драйвер для написания кода для него
выглядит странно ситуация, возникают вопросы, но спрашивать еще раз...
вобщем типа совета, а что если в тот пачик вставить ассерты, эти асерты или дприныт будут в дебаг логе?
от себя... сорри поленился собрать с ВАШИМ пачиком и потестить

vgal
Posts: 88
Joined: Mon Jan 26, 2015 7:38 am

Re: Дополнительная функция в PCIIDEX.SYS

Post by vgal » Mon Jul 13, 2015 5:55 am

Насчет DPRINTs.

Если закомментировать:

//#define NDEBUG
#include <debug.h>

то ВСЕ DPRINTs должны выводиться. DPRINT1 выводятся ВСЕГДА (даже если "#define NDEBUG" не закоменчен).

С ассертами дело тонкое...

Например, что произойдёт, если "сверху упадёт" IRP, который не обрабатывается PciIdeXPdoPnpDispatch (IRP_MN_QUERY_STOP_DEVICE например)?

switch (MinorFunction)
{
...
default:
{
/* We can't forward request to the lower driver, because
* we are a Pdo, so we don't have lower driver... */
DPRINT1("IRP_MJ_PNP / Unknown minor function 0x%lx\n", MinorFunction);
ASSERT(FALSE);
Information = Irp->IoStatus.Information;
Status = Irp->IoStatus.Status;
}

У меня в этом месте вылетает исключение...
На сколько я понимаю, если мы не обрабатываем ирп и у нас ничего нет внизу, то просто завершаем ирп и всё.
Зачем ASSERT(FALSE)?

vgal
Posts: 88
Joined: Mon Jan 26, 2015 7:38 am

Re: Дополнительная функция в PCIIDEX.SYS

Post by vgal » Mon Jul 13, 2015 7:17 am

Да и ещё... повторюсь.
Эта функция, которую я добавил (PciIdeXPdoQueryResource), она пригодится только для PnP драйвера ATA/ATAPI.
На данный момент работает связка CLASS2 + SCSI + UNIATA. А они не PnP (IRP_MJ_PNP обрабатывает только CLASS2).
Поэтому им эта функция не нужна. И многие другие в PCIIDEX тоже. ;)

towerr
Posts: 258
Joined: Wed Jun 20, 2007 3:01 am

Re: Дополнительная функция в PCIIDEX.SYS

Post by towerr » Mon Jul 13, 2015 7:06 pm

vgal wrote:Да и ещё... повторюсь.
Эта функция, которую я добавил (PciIdeXPdoQueryResource), она пригодится только для PnP драйвера ATA/ATAPI.
На данный момент работает связка CLASS2 + SCSI + UNIATA. А они не PnP (IRP_MJ_PNP обрабатывает только CLASS2).
Поэтому им эта функция не нужна. И многие другие в PCIIDEX тоже. ;)
печально
мы строили строоили... и наконец построили © чабурашко & гено

vgal
Posts: 88
Joined: Mon Jan 26, 2015 7:38 am

Re: Дополнительная функция в PCIIDEX.SYS

Post by vgal » Tue Jul 14, 2015 4:00 am

Отвечу тогда тоже, понимаешь ли, цитатой: http://www.youtube.com/watch?v=9I50DPfiM88

vgal
Posts: 88
Joined: Mon Jan 26, 2015 7:38 am

Re: Дополнительная функция в PCIIDEX.SYS

Post by vgal » Mon Jul 27, 2015 5:50 pm

Проблема, как оказалось, была не в отсутствии функции...
Всё - таки написал отчёт об ошибке: https://jira.reactos.org/browse/CORE-9922.
Переводил с помощью Translate.Ru http://www.translate.ru/#!/Computer/

Ресурсы, кстати, "берутся" в моей функции, возможно потому что "The PnP manager uses this IRP to get a device's boot configuration resources". https://msdn.microsoft.com/en-us/librar ... s.85).aspx

Post Reply

Who is online

Users browsing this forum: Ahrefs [Bot] and 1 guest