sabbatazh 0 21 марта, 2012 Опубликовано 21 марта, 2012 · Жалоба Приветствую ВСЕХ!!! Подскажите уважаемые Знатоки, чем воспользоваться для решения вот такой задачи! Написан драйвер под ХР, для платы PCI еще годов так n назад, в nuMega… и встал вопрос переноса его на win7… Кто-то ХР дрова переносил, сталкивался с проблемами и какими подручными средствами лучше всего воспользоваться?! пересмотрел примеры из ДДК и стряпал первый пробник... и пытаюсь прочитать с помощью NTSTATUS MDMAI_IO_READ_Handler(PIRP Irp, PIO_STACK_LOCATION pIoStackIrp, UINT *pdwDataWritten) { NTSTATUS status = STATUS_UNSUCCESSFUL; PCHAR pInputBuffer; PCHAR pOutputBuffer; PCHAR pReturnData; UINT dwDataRead = 0, dwDataWritten = 0; UINT dwDataSize = sizeof(ULONG); USHORT Port; DbgPrint("ReadDirectOutIO Called \r\n"); pInputBuffer = (PCHAR)Irp->AssociatedIrp.SystemBuffer; pOutputBuffer = NULL; if(Irp->MdlAddress) { pOutputBuffer = (PCHAR)MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority); } if(pInputBuffer && pOutputBuffer) { if(pIoStackIrp->Parameters.DeviceIoControl.OutputBufferLength >= dwDataSize) { Port = pInputBuffer[0]; pReturnData = (PCHAR)READ_PORT_UCHAR((PUCHAR)Port); // ну очень смущает!!!!!!!!! /* * We use "RtlCopyMemory" in the kernel instead of memcpy. * RtlCopyMemory *IS* memcpy, however it's best to use the * wrapper in case this changes in the future. */ RtlCopyMemory(pOutputBuffer, pReturnData, dwDataSize); *pdwDataWritten = dwDataSize; status = STATUS_SUCCESS; } else { *pdwDataWritten = dwDataSize; status = STATUS_BUFFER_TOO_SMALL; } } return status; } в результате ни чего и ошибки!( направьте на путь истинный! Спасибо!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 28 марта, 2012 Опубликовано 28 марта, 2012 · Жалоба 2 sabbatazh Из общих замечаний: сначала вы должны сделать map/translate ресурсов вашей карточки, это будет выглядеть как то так: .. rawResourceList = &ioStack->Parameters.StartDevice.AllocatedResources->List[0].PartialResourceList; rawResource = &rawResourceList->PartialDescriptors[0]; translatedResourceList = &ioStack->Parameters.StartDevice.AllocatedResourcesTranslated->List[0].PartialResourceList; translatedResource = &translatedResourceList->PartialDescriptors[0]; ... for (i = 0; i < rawResourceList->Count; i++, rawResource++, translatedResource++) ... deviceExtension->MemoryLength[idx] = translatedResource->u.Memory.Length; deviceExtension->MemoryStart[idx] = MmMapIoSpace ( translatedResource->u.Memory.Start, translatedResource->u.Memory.Length, MmNonCached); deviceExtension->Memory[idx] = translatedResource->u.Memory.Start; ... Ну а потом пишем читаем как то так: ... *pBufferDW = READ_REGISTER_ULONG ((PULONG) address_32); ... где "address_32" - это как раз наш map адрес + какое то смещение Я работал с девайсами которые имели только Mem, у вас судя по всему это IO, там заменить процедуры надо:laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться