Перейти к содержанию
    

Драйвер PCI

Приветствую ВСЕХ!!!

Подскажите уважаемые Знатоки, чем воспользоваться для решения вот такой задачи!

Написан драйвер под ХР, для платы 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;
}

в результате ни чего и ошибки!(

направьте на путь истинный!

Спасибо!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...