Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как обеспечить доступ к ресурсам PCI устройства из приложени  (Прочитано 5420 раз)
0 Пользователей и 1 Гость смотрят эту тему.
FRA
Гость
« : 24-06-2004 12:35 » 

Начитался в книжке как осуществить работу с памятью и IO PCI устройства через ReadFile/WriteFile из пользовательского приложения при использовании HAL функция в драйвере. А как сделать чтобы из пользовательского приложения писать в память устройства просто по указателю Не понял?
Записан
СергейСВ
Гость
« Ответ #1 : 25-06-2004 08:24 » 

След. код исполняется в любом ядрёном драйвере и даёт юзеру
тот самый указатель Avirtual по физическому адресу Lphysical.
Проверялось на видеопамяти под W2K.

NTSTATUS MapIntoUserSpace( ULONG length,
  ULONG Lphysical,
  ULONG* Avirtual)
{
  NTSTATUS ntStatus;
  UNICODE_STRING physicalMemoryUnicodeString;
  OBJECT_ATTRIBUTES  objectAttributes;
  PHYSICAL_ADDRESS  mappedLength;
  PHYSICAL_ADDRESS  viewBase;
  PHYSICAL_ADDRESS  physicalAddressBase;
  PVOID virtualAddress;
  HANDLE  physicalMemoryHandle  = NULL;
  PVOID  PhysicalMemorySection = NULL;

  RtlInitUnicodeString (&physicalMemoryUnicodeString,
  L"\\Device\\PhysicalMemory");
  InitializeObjectAttributes (&objectAttributes,
 &physicalMemoryUnicodeString,
 OBJ_CASE_INSENSITIVE,
 (HANDLE) NULL,
 (PSECURITY_DESCRIPTOR) NULL);
  ntStatus = ZwOpenSection (&physicalMemoryHandle,
  SECTION_ALL_ACCESS,
  &objectAttributes);
  ntStatus = ObReferenceObjectByHandle (physicalMemoryHandle,
  SECTION_ALL_ACCESS,
  (POBJECT_TYPE) NULL,
  KernelMode,
  &PhysicalMemorySection,
 (POBJECT_HANDLE_INFORMATION) NULL);

mappedLength=RtlConvertUlongToLargeInteger(length);
viewBase = RtlConvertUlongToLargeInteger(Lphysical);
physicalAddressBase=viewBase;
virtualAddress = NULL;

ntStatus = ZwMapViewOfSection (physicalMemoryHandle,
  (HANDLE) -1,
  &virtualAddress,
  0L,
  length,
  &viewBase,
  &length,
  ViewShare,
  0,
  PAGE_READWRITE | PAGE_NOCACHE);
      #if DBG
DbgPrint("MAP: status=%8X\n",ntStatus);
DbgPrint("MAP: virtual=%08X\n",(ULONG)virtualAddress);
      #endif

*Avirtual=(ULONG)virtualAddress;
  return ntStatus;
}  // MapIntoUserSpace
Записан
FRA
Гость
« Ответ #2 : 28-06-2004 08:17 » 

Ну..... не работает.....  
Может скажешь где что почитать по этому поводу Не понял?
А так статус - саксес, а адрес нулевой......
Записан
FRA
Гость
« Ответ #3 : 29-06-2004 09:52 » 

Отвечу сам себе, может еще кому-нибудь пригодится.
Прямой ответ на мой вопрос находится в статье :
http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q189327

лично попробовал - отлично работает
всем спасибо  8)
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines