Jump to content

    
Sign in to follow this  
sabbatazh

Драйвер PCI

Recommended Posts

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

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

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

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

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

Спасибо!!!

Share this post


Link to post
Share on other sites

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:

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this