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

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

Привет всем!

Есть драйвер, надо написать библиотеку функций для работы с драйвером в VS C#. Я новичок в VS, поэтому даже не знаю за что браться. Есть примеры на Билдере, но описания, сделанные в Билдере в VS не проходят.

Например, как это:
Код:
#define FILE_DEVICE_UNKNOWN             0x00000022
#define METHOD_BUFFERED                 0
#define FILE_ANY_ACCESS                 0

#define CTL_CODE( DeviceType, Function, Method, Access ) (                 \
    ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) )

#define IOCTL_CHECK_DRV         CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)
// RsRel48
#define IOCTL_READ_RSREL        CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
// TrRel48
#define IOCTL_WRITE_TRREL       CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_READ_TRREL        CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_SETRES_TRREL      CTL_CODE(FILE_DEVICE_UNKNOWN, 0x803, METHOD_BUFFERED, FILE_ANY_ACCESS)
// ITP
#define IOCTL_ITP_WRITE         CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
// GEN
#define IOCTL_GEN_WRITE         CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_GEN_BULBS         CTL_CODE(FILE_DEVICE_UNKNOWN, 0x803, METHOD_BUFFERED, FILE_ANY_ACCESS)
// IP
#define IOCTL_IP_WRITE          CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)

описать в VS, с чего начать?

А потом же нужны будут ещё функции...

Буду признательна за пример работы с драйвером
« Последнее редактирование: 13-12-2007 07:44 от Алексей1153++ » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 13-12-2007 07:45 » 

это же просто дефайны - один к одному можно вставить (именно этот кусок кода)

чувствую - вопрос не правильно задан )
Записан

sss
Специалист

ru
Offline Offline

« Ответ #2 : 13-12-2007 07:56 » 

Точно  Алексей1153++, правильно поставленный вопрос - половина ответа...
Записан

while (8==8)
Aline
Гость
« Ответ #3 : 13-12-2007 08:00 » 

Просто этот кусок я не могу вставить. Если вы попробуете создать новый проект в Visual C# Class Library и вставить туда просто этот кусок кода (дефайны), вы поймете о чем речь

Возможно это надо делать как-то вообще иначе, но я думала создать библиотеку dll, которую потом и подключить к своему проекту...

Записан
sss
Специалист

ru
Offline Offline

« Ответ #4 : 13-12-2007 09:13 » new

Aline, кусок кода выше это только описание управляющих кодов, которые передаются в функцию DeviceIoControl. Советую начать с ее изучения.
Записан

while (8==8)
Aline
Гость
« Ответ #5 : 13-12-2007 10:20 » 

Я прекрасно понимаю, что это только описание. Но даже реализация этого описания в VS отличается от реализации описания в Билдере.
DeviceIOControl  я уже изучала, на примере Билдера. Там это делается всё гораздо проще...
Записан
sss
Специалист

ru
Offline Offline

« Ответ #6 : 14-12-2007 01:55 » 

Ну тогда, если в С# нет #define, я ничем помочь не смогу. Портирование кода возможно при наличии знания обоих языков, а я C# не знаю. Все равно не могу понять, почему в Builder проще? Потому что есть примеры? Если в С# нет макросов то эта проблема походит на ту же проблему в Delphi. Вот как я выходил из положения давным давно, когда писал в Delphi ...
Код:

// =================================================================
// () Kernel Mode Driver. Константы для генерирования
// кодов IOCTL (распознавание номеров функций)
// =================================================================
const
// Формат бит управляющего кода (32 bit)
// 00 - 01 Метод
// 02 - 13 Функция
// 14 - 15 Права доступа для работы IOCTL
// 0 - ANY 1 - R 2 - W 3 - R/W
// 16 - 31 Тип устройства

// идентификатор типа устройства (16 bit).
// 0x0000 - 0x7FFF - зарезервировано Microsoft
  FILE_DEVICE_SKMD = $08000;

// идентификатор функции устройства (12 bit).
// 0x0000 - 0x07FF - зарезервировано Microsoft
  SKMD_IO_BASE = $0800;


// =================================================================
// () Kernel Mode Driver. Номера функций
// =================================================================
type
    SKMD_IO_FUNCTION = record
     case byte of
      0:( A: array [0..2] of byte);
      1:( Numb: byte;
          fRead: boolean;
          fWrite: boolean;)
    end;
const
//номер функции получения версии
 SKMD_IO_VERSION_INFO: SKMD_IO_FUNCTION = (A:(0, 1, 0));

//номер функции получения дескриптора сегмента по селектору
 SKMD_IO_SEGMENT: SKMD_IO_FUNCTION = (A:(2, 1, 0));

//номер функции получения дескриптора шлюза
 SKMD_IO_INTERRUPT: SKMD_IO_FUNCTION = (A:(3, 1, 0));

//номер функции преобразования линейного
// адреса в физический
 SKMD_IO_PHYSICAL: SKMD_IO_FUNCTION = (A:(4, 1, 0));

//номер функции получения регистров
 SKMD_IO_CPU_INFO: SKMD_IO_FUNCTION = (A:(5, 1, 0));

//номер функции получения массива каталога страниц (Page directory entry  array)
 SKMD_IO_PDE_ARRAY: SKMD_IO_FUNCTION = (A:(6, 1, 0));

//номер функции получения записи страницы  по линейному адресу
 SKMD_IO_PAGE_ENTRY: SKMD_IO_FUNCTION = (A:(7, 1, 0));

 //номер функции чтения блока памяти
 SKMD_IO_MEMORY_DATA: SKMD_IO_FUNCTION = (A:(8, 1, 0));

 //номер функции чтения блока памяти
 //возвращает false в случае если хотя бы один байт в блоке недоступен
 SKMD_IO_MEMORY_BLOCK: SKMD_IO_FUNCTION = (A:(9, 1, 0));

 //номер функции чтения информации объекта по его хэндлу
 SKMD_IO_HANDLE_INFO: SKMD_IO_FUNCTION = (A:(10, 1, 0));

 //номер функции получения PTE
 SKMD_IO_PTE_ENTRY: SKMD_IO_FUNCTION = (A:(98, 1, 0));

// Установить запись в PTE
 SKMD_IO_PTE_ENTRY_SET: SKMD_IO_FUNCTION = (A:(97, 1, 0));

Записан

while (8==8)
nikedeforest
Команда клуба

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

« Ответ #7 : 16-12-2007 17:57 » 

Дефайны в .НЕТ есть, но они используются только для условно компиляции. Т.е. дефайн можно только юзать примрно так

Код:
// preprocessor_define.cs
// compile with: /define:xx
// or uncomment the next line
// #define xx

 #define xx;
using System;
public class Test
{
    public static void Main()
    {
        #if (xx)
            Console.WriteLine("xx defined");
        #else
            Console.WriteLine("xx not defined");
        #endif
    }
}

Записан

ещё один вопрос ...
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #8 : 09-04-2008 13:02 » 

Есть драйвер, надо написать библиотеку функций для работы с драйвером в VS C#. Я новичок в VS, поэтому даже не знаю за что браться.

Что значит для работы с драйвером ? Через что ?
Есть примеры на Билдере, но описания, сделанные в Билдере в VS не проходят.
Что за примери ? Что они делают ? Експортируют набор каких то функций из системних dll ?
Если да, тогда тебе в сторону Platform Invoke. Смотри атрибут [DllImport]
Код:
//Например код функции на unmanaged коде
extern "C" __declspec(dllexport) __cdecl int sum(int a,int b);

//В C# выглядеть будет вот так
[DllImport("TestDll.dll", EntryPoint="sum", ExactSpelling=false,CallingConvention=CallingConvention.Cdecl)]
static extern int sum(int a,int b);

//Далее в C# коде юзаеш так
int totalSum = sum(10, 15);
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
Джон
просто
Администратор

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

« Ответ #9 : 09-04-2008 14:19 » 

О! МОРОЗ нашёлся. Здорово! Сколько лет!

Тема я думаю уже того... Так же как и автор.

На самом деле всё было гораздо проще, в гугле спросить "C# DeviceIoControl" и была бы куча счастья. Ага
например:
http://blogs.msdn.com/jeffrey_wall/archive/2004/09/13/229137.aspx
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #10 : 09-04-2008 14:45 » 

О! МОРОЗ нашёлся. Здорово! Сколько лет!
Здорово! И тебе не хворать!
На самом деле всё было гораздо проще, в гугле спросить "C# DeviceIoControl" и была бы куча счастья. Ага
Гуглить почему то всегда ленится большинство Улыбаюсь
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines