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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите с "пустышкой" драйвера  (Прочитано 5157 раз)
0 Пользователей и 1 Гость смотрят эту тему.
vzhukov
Гость
« : 10-11-2006 14:42 » new

Народ!
Помогите с "пустышкой" драйвера.
Нужно обратиться к железу, из программы этого сделать не позволяет ОС.
Нужно записать и считать данные по физическому адресу в процессоре.

Подскажите, как организовать драйвер и обратиться к нему из программы пользователя?

Использую Platphorm Builder 5.0
Драйвер создал по примерам с MSDN и консольное приложение.

Как их можно связать между собой?
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 14-11-2006 13:01 » 

драйвер должен предоставить интерфейс (DeviceIOControl или Create/Read/Write) и ссылку на себя. ссылка простейшим образом делается при помощи IoCreateSymbolicLink.


#define PCI_DEVICE_NAME L"\\Device\\XXXX_00" //имя физического устройства (device)
#define DOS_DEVICE_NAME L"\\DosDevices\\XXXX"//имя драйвера (driver)

NTSTATUS    AddDevice(   IN  PDRIVER_OBJECT  DriverObject,
         IN  PDEVICE_OBJECT  PhysicalDeviceObject)
{
NTSTATUS          status;
PDEVICE_OBJECT       DeviceObject;
PDEVICE_EXTENSION_MY    devExt;

//как поступать с этими переменными я не в курсе,
//по уму то их вроде удалить надоть, когда они не нужны...
UNICODE_STRING       uniNtDeviceName;   //обратить особое внимание !!!*
UNICODE_STRING       uniWin32NameString;   //обратить особое внимание !!!*

    PAGED_CODE();

    KdPrint( (" AddDevice\n"));
SOFT_ICE_DEBUG1;
   
   
    //SOFT_ICE_DEBUG1;
    //+здесь стоит нумеровать девайсы?
//я не размещал память для UNICODE_STRING, и соответственно не удалял ее...
//но вроде функция RtlInitUnicodeString - сама инициализирует указатель uniNtDeviceName.Buffer адресом строки
//а uniNtDeviceName.MaximumLength длинной uniNtDeviceName

    RtlInitUnicodeString(&uniNtDeviceName,PCI_DEVICE_NAME);    //судя по примерам из 2000DDK, эта ссылка удаляется ядром
   
    status = IoCreateDevice(   DriverObject,
            sizeof(DEVICE_EXTENSION_MY),
            &uniNtDeviceName,      //имя
            FILE_DEVICE_UNKNOWN,   //тип
            0,         //FILE_AUTOGENERATED_DEVICE_NAME,   //характеристики
                     FALSE,         //эксклюзивность процесса(толкьо один handle)
            &DeviceObject);
   
    if (!NT_SUCCESS(status))
    {
   return status;
    };
    ASSERT(DeviceObject != NULL);
    g_XXX.InstanceCount++;
   
    RtlInitUnicodeString(&uniWin32NameString, DOS_DEVICE_NAME);   
    status = IoCreateSymbolicLink(&uniWin32NameString,&uniNtDeviceName);
    if (status != STATUS_SUCCESS)
    {
   //не получается открыть символическую ссылку для имен WIN32
   IoDeleteDevice(DeviceObject);
   return status;
    };

    devExt = (DEVICE_EXTENSION_MY*)DeviceObject->DeviceExtension;
....
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines