В ходе моих экспериментов с 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;
}
Дополнительная функция в PCIIDEX.SYS
Re: Дополнительная функция в PCIIDEX.SYS
ай красява... только вот надо делать так, в жире создаешь багрипорт, описание тесткейс, прилагнаешь туда пачvgal wrote:В ходе моих экспериментов с RoS IDE драйверами добавил функцию PciIdeXPdoQueryResource (dispatch IRP_MN_QUERY_RESOURCES) в ..\drivers\storage\ide\pciidex\pdo.c. Может кому пригодится.
<cut >
}
в случае отсутсвия какбы бага, просто нечто вразумительнопонятное о фиксе - его увидят и отуда могут вставить в исходники, а на форуме он таки будет валятся, хотя попинав девелоперов... но это будет неправильно... ибо нужна ссылка на АВТОРА коим ты являесся
Re: Дополнительная функция в PCIIDEX.SYS
Сначала так и хотел сделать. Это как бы не баг (а может и баг, не знаю). И переводить на английский для меня сложновато.
Поэтому и написал сюда. Кому понадобится - возьмет. Пока нет драйвера ата порта, и так всё работает (в PCIIDEX).
Поэтому и написал сюда. Кому понадобится - возьмет. Пока нет драйвера ата порта, и так всё работает (в PCIIDEX).
Re: Дополнительная функция в PCIIDEX.SYS
из разговора с девелоперами... почти цитируюvgal wrote:Сначала так и хотел сделать. Это как бы не баг (а может и баг, не знаю). И переводить на английский для меня сложновато.
Поэтому и написал сюда. Кому понадобится - возьмет. Пока нет драйвера ата порта, и так всё работает (в PCIIDEX).
<ThFabba> No, you don't have to use a driver to write code for it ;p
нет вы не используете драйвер для написания кода для него
выглядит странно ситуация, возникают вопросы, но спрашивать еще раз...
вобщем типа совета, а что если в тот пачик вставить ассерты, эти асерты или дприныт будут в дебаг логе?
от себя... сорри поленился собрать с ВАШИМ пачиком и потестить
Re: Дополнительная функция в PCIIDEX.SYS
Насчет 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)?
Если закомментировать:
//#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)?
Re: Дополнительная функция в PCIIDEX.SYS
Да и ещё... повторюсь.
Эта функция, которую я добавил (PciIdeXPdoQueryResource), она пригодится только для PnP драйвера ATA/ATAPI.
На данный момент работает связка CLASS2 + SCSI + UNIATA. А они не PnP (IRP_MJ_PNP обрабатывает только CLASS2).
Поэтому им эта функция не нужна. И многие другие в PCIIDEX тоже.
Эта функция, которую я добавил (PciIdeXPdoQueryResource), она пригодится только для PnP драйвера ATA/ATAPI.
На данный момент работает связка CLASS2 + SCSI + UNIATA. А они не PnP (IRP_MJ_PNP обрабатывает только CLASS2).
Поэтому им эта функция не нужна. И многие другие в PCIIDEX тоже.
Re: Дополнительная функция в PCIIDEX.SYS
печальноvgal wrote:Да и ещё... повторюсь.
Эта функция, которую я добавил (PciIdeXPdoQueryResource), она пригодится только для PnP драйвера ATA/ATAPI.
На данный момент работает связка CLASS2 + SCSI + UNIATA. А они не PnP (IRP_MJ_PNP обрабатывает только CLASS2).
Поэтому им эта функция не нужна. И многие другие в PCIIDEX тоже. ;)
мы строили строоили... и наконец построили © чабурашко & гено
Re: Дополнительная функция в PCIIDEX.SYS
Отвечу тогда тоже, понимаешь ли, цитатой: http://www.youtube.com/watch?v=9I50DPfiM88
Re: Дополнительная функция в PCIIDEX.SYS
Проблема, как оказалось, была не в отсутствии функции...
Всё - таки написал отчёт об ошибке: 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
Всё - таки написал отчёт об ошибке: 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
Who is online
Users browsing this forum: No registered users and 13 guests