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

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

Большое спасибо автору - получилась программка "Hello, driver!" которая помогает преодолеть мистический страх перед DDK Ага
Всегда самое тяжелое - это с чего-то начать...

Все компилируется и работает но
в текст консольного приложения - "клиента" нужно добавить нижеследующее, иначе компилятор будет выражаться Улыбаюсь
Я выслал на сайт файлы проекта, может будет  проще скачать их, чем копировать текст из статьи...
.....
#include <windows.h>
#include <winbase.h>
#include <winioctl.h>

HANDLE hDevice;
SC_HANDLE hSCManager,hService;

enum error_index {
   _OpenSCManager,
   _GetFullPathName,
   _CreateService,
   _OpenService,
   _StartService,
   _DeleteService,
   _SERVICE_CONTROL_STOP,
   _CreateFile,
   _CloseHandle,
   _CloseServiceHandle
};

bool drvLoad(char* name);
int drvUnLoad(PCHAR name);
bool OpenManager();
bool drvCreateService(PCHAR pDrvName);
bool drvStartService(PCHAR name);
void error(error_index erIndex);
bool drvOpenService(PCHAR name);
void CloseService();
bool drvDeleteService(PCHAR name);
int TestSmth(void);//0x800 + 101

void main()
{
..............
Записан
sss
Специалист

ru
Offline Offline

« Ответ #1 : 31-07-2003 08:27 » 

Смотрел, смотрел и решил поделиться ...
Пользуйтесь  Отлично

#ifndef _SSS_TYPES
#define _SSS_TYPES

#define INVALID_ADDRESS     ((PVOID) -1)

// =================================================================
// (1) INTEL X86 Регистры, селекторы
// =================================================================

// РОНЫ
typedef DWORD X86_REGISTER, *PX86_REGISTER, **PPX86_REGISTER;

// Селекторы
typedef struct _X86_SELECTOR
{union
   {struct
      {
       WORD wValue;         // Упакованный вид
       WORD wReserved;      // Резерв
      };
    struct
      {
         unsigned   RPL   :   2; // запрашиваемый уровень привелегий RPL
         unsigned   TI      :   1; // Индикатор таблицы 0=GDT, 1=LDT
         unsigned Index   :   13; // индекс в таблице дескрипторов xDT
         unsigned Reserved :   16; //Резерв для WIN64 Не понял
      };
    };
} X86_SELECTOR, *PX86_SELECTOR, **PPX86_SELECTOR;

#define X86_SELECTOR_ sizeof (X86_SELECTOR)

// Элемент таблицы дескрипторов
typedef struct _X86_DESCRIPTOR
{union
   {struct
      {
       DWORD dValueLow;        // Упакованный вид
       DWORD dValueHigh;
      };
    struct
      {
       unsigned Limit1   : 16; // предел сегмента bits 15..00
       unsigned Base1    : 16; // база сегмента bits 15..00
       unsigned Base2    :  8; // база сегмента bits 23..16
       unsigned Type     :  4; // тип сегмента (очень обширно тип, подчиняемость, расширяемость, разрешения чтения/записи)
       unsigned S        :  1; // ещё тип (0=system, 1=code/data)
       unsigned DPL      :  2; // уровень привилегий дескриптора DPL
       unsigned P        :  1; // флаг присутствия в памяти
       unsigned Limit2   :  4; // предел сегмента bits 19..16
       unsigned AVL      :  1; // флаг - в распоряжении програмиста (available to programmer)
       unsigned Reserved :  1;
       unsigned DB       :  1; // B: если сегмент данных определяет макс. размер 0= 64 кБ 1= 4ГБ
                               // B: если сегмент стека определяет разрядность ESP и разрядность данных в операциях POP и PUSH 0= 16 bit 1= 32 bit
                               // D: если кодовый сегмент определяет разрядность адресов и операндов  0= 16 bit 1= 32 bit
       unsigned G        :  1; // гранулярность (1=4KB)
       unsigned Base3    :  8; // база сегмента bits 31..24
            };
   };
} X86_DESCRIPTOR, *PX86_DESCRIPTOR, **PPX86_DESCRIPTOR;

#define X86_DESCRIPTOR_ sizeof (X86_DESCRIPTOR)

// Дескриптор шлюза (вентиль)
typedef struct _X86_GATE
{union
   {struct
      {
       DWORD dValueLow;          //  Упакованный вид
       DWORD dValueHigh;
      };
    struct
      {
       unsigned Offset1    : 16; // смещение точки входа в целевом сегменте bits 15..00
       unsigned Selector   : 16; // селектор целевого сегмента
       unsigned Parameters :  5; // только в шлюзах вызовов
                                 // для 286 количество слов из старого стека
                                 // для 386 количество двойных слов из старого стека
       unsigned Reserved   :  3;
       unsigned Type       :  4; // тип шлюза (gate type and size)
       unsigned S          :  1; // всегда 0
       unsigned DPL        :  2; // уровень привелегий дескриптора
       unsigned P          :  1; // действительность сегмента
       unsigned Offset2    : 16; // смещение точки входа в целевом сегменте bits 31..16
      };
   };
} X86_GATE, *PX86_GATE, **PPX86_GATE;

#define X86_GATE_ sizeof (X86_GATE)

// Структура для чтений SGDT, SIDT (48 bit)
typedef struct _X86_TABLE
{
   WORD wReserved;                   // для выравнивания на 32-bit
   WORD wLimit;                      // размер таблицы
union{
   PX86_DESCRIPTOR pDescriptors; // используется для SGDT инструкции
   PX86_GATE       pGates;       // используется для SIDT инструкции
      };
} X86_TABLE, *PX86_TABLE, **PPX86_TABLE;

#define X86_TABLE_ sizeof (X86_TABLE)

// Индексы сегментов (для внутреннего использования)
#define X86_SEGMENT_OTHER           0
#define X86_SEGMENT_CS              1
#define X86_SEGMENT_DS              2
#define X86_SEGMENT_ES              3
#define X86_SEGMENT_FS              4
#define X86_SEGMENT_GS              5
#define X86_SEGMENT_SS              6
#define X86_SEGMENT_TSS             7

// Маски доступа (для внутреннего использования)
#define X86_SELECTOR_RPL            0x0003
#define X86_SELECTOR_TI             0x0004
#define X86_SELECTOR_INDEX          0xFFF8
#define X86_SELECTOR_SHIFT          3


#define X86_SELECTOR_LIMIT          (X86_SELECTOR_INDEX >> \
                                     X86_SELECTOR_SHIFT)

// Типы сегментов (поле Type в дескрипторах)

#define X86_DESCRIPTOR_NO_SYSTEM          0x0100000000000 // Системный сегмент
// Если X86_DESCRIPTOR_NO_SYSTEM = 0 то тип сегмента
#define X86_DESCRIPTOR_SYS_TSS16A       0x1   // Доступный сегмент задачи TSS286
#define X86_DESCRIPTOR_SYS_LDT          0x2   // Таблица локальных дескрипторов
#define X86_DESCRIPTOR_SYS_TSS16B       0x3   // Недоступный сегмент задачи TSS286 (Busy)
#define X86_DESCRIPTOR_SYS_CALL16       0x4   // шлюз вызова (Call gate) 286
#define X86_DESCRIPTOR_SYS_TASK         0x5   // шлюз задачи (Task gate)286
#define X86_DESCRIPTOR_SYS_INT16        0x6   // шлюз прерывания (Interrupt gate) 286
#define X86_DESCRIPTOR_SYS_TRAP16       0x7   // шлюз ловушки (Trap gate) 286
#define X86_DESCRIPTOR_SYS_TSS32A       0x9   // Доступный сегмент задачи TSS386+
#define X86_DESCRIPTOR_SYS_TSS32B       0xB   // Недоступный сегмент задачи TSS286 (Busy)
#define X86_DESCRIPTOR_SYS_CALL32       0xC   // шлюз вызова (Call gate)386+
#define X86_DESCRIPTOR_SYS_INT32        0xE   // шлюз прерывания (Interrupt gate)386+
#define X86_DESCRIPTOR_SYS_TRAP32       0xF   // шлюз ловушки (Trap gate) 386+

// Если X86_DESCRIPTOR_NO_SYSTEM = 1 то тип сегмента
#define   X86_DESCRIPTOR_APP_CODE            0x8   // 1 - кодовый 0 - данных
#define   X86_DESCRIPTOR_APP_ACCESSED      0x1   // Было обращение
#define   X86_DESCRIPTOR_APP_READ_WRITE      0x2   // для данных - запись разрешена
#define   X86_DESCRIPTOR_APP_EXECUTE_READ   0x2   // для кода - разрешено чтение
#define   X86_DESCRIPTOR_APP_EXPAND_DOWN   0x4   // для данных: 0 - расширение вверх 1 - расширение вниз (стек)
#define   X86_DESCRIPTOR_APP_CONFORMING      0x4   // для кода подчиненность разрешения выполнения: 1 {CPL <= DPL}; 0 {CPL = DPL}

// -----------------------------------------------------------------




// =================================================================
// (2) INTEL X86 Страницы
// =================================================================
//

// Структурное представление регистра CR3
//(базовый регистр каталога страниц) PDBR (page-directory base register)

typedef struct _X86_PDBR
{union
   {struct
      {
       DWORD dValue;            //  Упакованный вид
      };
    struct
      {      
       unsigned Reserved1 :  3;
       unsigned PWT       :  1; // политика кэширования (1 - write-through)
       unsigned PCD       :  1; // установка запрещает кэш страницы (таблицы)
       unsigned Reserved2 :  7;
       unsigned PFN       : 20; // Базовый адрес таблицы страниц (PhysAddr = PFN x PAGESIZE)
                                // пример: PFN = 2, PS = 0, PhysAddr = 2 * 0x1000 = 0x2000
                                // (номер страничного блока)
      };
   };
} X86_PDBR, *PX86_PDBR, **PPX86_PDBR;

#define X86_PDBR_ sizeof (X86_PDBR)

// строка каталога страниц 4 МБ
typedef struct _X86_PDE_4M
{union
   {struct
      {
       DWORD dValue;             //  Упакованный вид
      };
    struct
      {
       unsigned P         :  1; // Бит присутствия Гук стр 151
       unsigned RW        :  1; // Read/Write Гук стр 152
       unsigned US        :  1; // User/Supervisor Гук стр 152
       unsigned PWT       :  1; // политика кэширования (1 - write-through)
       unsigned PCD       :  1; // установка запрещает кэш страницы (таблицы)
       unsigned A           :  1; // (Accessed) к адресу, в трансляции которого учавствовала страница было обращение (r/w)
       unsigned D           :  1; // (Dirty) по адресу, в трансляции которого учавствовала страница была запись (write)
                                // (грязная), т.е. в случае замещения необходима выгрузка
                                // для каталога всегда D = 0
       unsigned PS        :  1; // размер страниц 1 - 4 MB
       unsigned G           :  1; // Глобальность (только P6)
        unsigned Available :  3; // Доступны программисту
       unsigned Reserved  : 10;
       unsigned PFN       : 10; // Базовый адрес таблицы страниц (PhysAddr = PFN x PAGESIZE)
                                // (номер страничного блока)
      };
   };
} X86_PDE_4M, *PX86_PDE_4M, **PPX86_PDE_4M;
#define X86_PDE_4M_ sizeof (X86_PDE_4M)

// строка каталога страниц 4 кБ
typedef struct _X86_PDE_4K
{union
   {struct
      {
       DWORD dValue;             //  Упакованный вид
      };
    struct
      {
       unsigned P         :  1; // Бит присутствия Гук стр 151
       unsigned RW        :  1; // Read/Write Гук стр 152
       unsigned US        :  1; // User/Supervisor Гук стр 152
       unsigned PWT       :  1; // политика кэширования (1 - write-through)
       unsigned PCD       :  1; // установка запрещает кэш страницы (таблицы)
       unsigned A           :  1; // (Accessed) к адресу, в трансляции которого учавствовала страница было обращение (r/w)
       unsigned Reserved  :  1; // (Dirty) по адресу, в трансляции которого учавствовала страница была запись (write)
                                // (грязная), т.е. в случае замещения необходима выгрузка
                                // для каталога всегда D = 0
       unsigned PS        :  1; // размер страниц 0 - 4 кБ
       unsigned G           :  1; // Глобальность (только P6)
        unsigned Available :  3; // Доступны программисту
       unsigned PFN       : 20; // Базовый адрес таблицы страниц (PhysAddr = PFN x PAGESIZE)
                                // (номер страничного блока)
      };
   };
} X86_PDE_4K, *PX86_PDE_4K, **PPX86_PDE_4K;

#define X86_PDE_4K_ sizeof (X86_PDE_4K)

// строка таблицы страниц 4 кБ
typedef struct _X86_PTE_4K
{union
   {struct
      {
       DWORD dValue;            //  Упакованный вид
      };
    struct
   {
       unsigned P         :  1; // Бит присутствия Гук стр 151
       unsigned RW        :  1; // Read/Write Гук стр 152
       unsigned US        :  1; // User/Supervisor Гук стр 152
       unsigned PWT       :  1; // политика кэширования (1 - write-through)
       unsigned PCD       :  1; // установка запрещает кэш страницы (таблицы)
       unsigned A           :  1; // (Accessed) к адресу, в трансляции которого учавствовала страница было обращение (r/w)
       unsigned D           :  1; // (Dirty) по адресу, в трансляции которого учавствовала страница была запись (write)
                                // (грязная), т.е. в случае замещения необходима выгрузка
                                // для каталога всегда D = 0
       unsigned Reserved  :  1;
       unsigned G           :  1; // Глобальность (только P6)
        unsigned Available :  3; // Доступны программисту
       unsigned PFN       : 20; // Базовый адрес таблицы страниц (PhysAddr = PFN x PAGESIZE)
                                // (номер страничного блока)
      };
   };
} X86_PTE_4K, *PX86_PTE_4K, **PPX86_PTE_4K;

#define X86_PTE_4K_ sizeof (X86_PTE_4K)

// Запись страницы отсутствующей в памяти
typedef struct _X86_PNPE
{union
   {struct
      {
       DWORD dValue;            //  Упакованный вид
      };
    struct
      {
         unsigned P         :  1; // (0 = not present) Бит присутствия Гук стр 151
         unsigned Reserved1 :  9;
         unsigned PageFile  :  1; // Страница выгружена в pagefile (undoc)
         unsigned Reserved2 : 21;
      };
   };
} X86_PNPE, *PX86_PNPE, **PPX86_PNPE;

#define X86_PNPE_ sizeof (X86_PNPE)

// Общая структура-объединение строки страницы
typedef struct _X86_PE
{union
   {
      DWORD      dValue; //  Упакованный вид
      X86_PDBR   pdbr;   // базовый регистр каталога страниц
      X86_PDE_4M pde4M;  // строка каталога страниц 4 МБ
      X86_PDE_4K pde4K;  // строка каталога страниц 4 кБ
      X86_PTE_4K pte4K;  // строка таблицы страниц 4 кБ
      X86_PNPE   pnpe;   // строка страницы отсутствующей в памяти
   };
} X86_PE, *PX86_PE, **PPX86_PE;

#define X86_PE_ sizeof (X86_PE)



// =================================================================
// (3) INTEL X86 Представление линейных адресов
// =================================================================

// Линейный адрес (страница 4 МБ)
typedef struct _X86_LINEAR_4M
{union
   {struct
      {
       PVOID pAddress;       // Упакованный адрес
      };
    struct
      {
       unsigned Offset : 22; // смещение в странице
       unsigned PDI    : 10; // индекс в каталоге страниц
                                
      };
   };
} X86_LINEAR_4M, *PX86_LINEAR_4M, **PPX86_LINEAR_4M;
#define X86_LINEAR_4M_ sizeof (X86_LINEAR_4M)

// Линейный адрес (страница 4 кБ)
typedef struct _X86_LINEAR_4K
{union
   {struct
      {
       PVOID pAddress;       // Упакованный адрес
      };
    struct
      {
       unsigned Offset : 12; // смещение в странице
       unsigned PTI    : 10; // индекс в таблице страниц
       unsigned PDI    : 10; // индекс в каталоге страниц
      };
   };
} X86_LINEAR_4K, *PX86_LINEAR_4K, **PPX86_LINEAR_4K;

#define X86_LINEAR_4K_ sizeof (X86_LINEAR_4K)

// Общая структура линейного адреса
typedef struct _X86_LINEAR
{union
   {
      PVOID         pAddress; // Упакованный адрес
      X86_LINEAR_4M linear4M; // Линейный адрес (страница 4 МБ)
      X86_LINEAR_4K linear4K; // Линейный адрес (страница 4 кБ)
   };
} X86_LINEAR, *PX86_LINEAR, **PPX86_LINEAR;

#define X86_LINEAR_ sizeof (X86_LINEAR)


// =================================================================
// (4) INTEL X86 Макросы и константы
// =================================================================
#ifndef SKMD_DIRECTIVE // определены в ntddk.h

// Макросы получения битовых полей из линейного адреса
#define PAGE_SHIFT               12
#define PTI_SHIFT                12
#define PDI_SHIFT                22
#endif


#define X86_PAGE_MASK (0 - (1 << PAGE_SHIFT)) // 0xFFFFF000
#define X86_PAGE(_p)  (((DWORD) (_p) & X86_PAGE_MASK) >> PAGE_SHIFT)

// Page directory index из линейного (виртуального) адреса
#define X86_PDI_MASK  (0 - (1 << PDI_SHIFT)) //0xFFC00000
#define X86_PDI(_p)   (((DWORD) (_p) & X86_PDI_MASK) >> PDI_SHIFT)

// Page table index из линейного (виртуального) адреса
#define X86_PTI_MASK  ((0 - (1 << PTI_SHIFT)) & ~X86_PDI_MASK) //0x003FF0000
#define X86_PTI(_p)   (((DWORD) (_p) & X86_PTI_MASK) >> PTI_SHIFT)

// Смещения из линейного адреса
#define X86_OFFSET(_p,_m) ((DWORD_PTR) (_p) & ~(_m))
#define X86_OFFSET_4M(_p) X86_OFFSET (_p, X86_PDI_MASK)
#define X86_OFFSET_4K(_p) X86_OFFSET (_p, X86_PDI_MASK|X86_PTI_MASK)

//Размеры страниц
#define X86_PAGE_4M   (1 << PDI_SHIFT)
#define X86_PAGE_4K   (1 << PTI_SHIFT)

// Число страниц необходимых для описания пространства в 4 ГБ
#define X86_PAGES_4M  (1 << (32 - PDI_SHIFT))
#define X86_PAGES_4K  (1 << (32 - PTI_SHIFT))

// Начало масива PTE для Win (NT4) 2000
#define X86_PAGES         0xC0000000

// Приведение начала масива PTE для Win (NT4) 2000
// к указателю (массиву !) на общую структуру
// строки страницы X86_PE
#define X86_PTE_ARRAY     ((PX86_PE) X86_PAGES)

#define X86_PDE_ARRAY     (X86_PTE_ARRAY + (X86_PAGES >> PTI_SHIFT))



// =================================================================
// (5) Kernel Mode Driver. Мютексы
// =================================================================

#define MUTEX_INITIALIZE(_mutex) \
        KeInitializeMutex        \
            (&(_mutex), 0)

#define MUTEX_WAIT(_mutex)       \
        KeWaitForMutexObject     \
            (&(_mutex), Executive, KernelMode, FALSE, NULL)

#define MUTEX_RELEASE(_mutex)    \
        KeReleaseMutex           \
            (&(_mutex), FALSE)

// =================================================================
// (6) Kernel Mode Driver. Константы для генерирования
// кодов IOCTL (распознавание номеров функций)
// =================================================================

// Формат бит управляющего кода (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
#define FILE_DEVICE_SKMD     0x8000

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

// Макрос упрощения генерации кода IOCTL
#define SKMD_IO(_code,_read,_write)                        \
        CTL_CODE ((FILE_DEVICE_SKMD),                      \
                  ((SKMD_IO_BASE) + (_code)),              \
                  (METHOD_BUFFERED),                      \
                  (((_read)  ? (FILE_READ_ACCESS)  : 0) | \
                   ((_write) ? (FILE_WRITE_ACCESS) : 0)))

// =================================================================
// (6) Kernel Mode Driver. Ну вот и сами номера
// функций
// =================================================================
#ifndef _RC_PASS_
//                                         №    read    write
// Версия драйвера
// [null] -> (SKMD) -> [SKMD_VERSION_INFO]
#define SKMD_IO_VERSION_INFO   SKMD_IO ( 0, TRUE, FALSE)

// Дескриптор сегмента
// [селектор (dword)] -> (SKMD) -> [SKMD_SEGMENT]
#define SKMD_IO_SEGMENT         SKMD_IO ( 2, TRUE, FALSE)

// Дескриптор шлюза
// [селектор (dword)] -> (SKMD) -> [SKMD_INTERRUPT]
#define SKMD_IO_INTERRUPT      SKMD_IO ( 3, TRUE, FALSE)

// Преобразование адреса
// [указатель(pointer)] -> (SKMD) -> [PHYSICAL_ADDRESS]
#define SKMD_IO_PHYSICAL      SKMD_IO ( 4, TRUE, FALSE)

// Информация об регистрах
// [null] -> (SKMD) -> [SKMD_CPU_INFO]
#define SKMD_IO_CPU_INFO      SKMD_IO ( 5, TRUE, FALSE)

// Возврат каталога страниц (4 кБ = 1024 элемента)
// для текущего процесса (не процесса драйвера!!??)
// [null] -> (SKMD) -> [SKMD_PDE_ARRAY]
#define SKMD_IO_PDE_ARRAY      SKMD_IO ( 6, TRUE, FALSE)

// Возврат записи страницы линейного (виртуального ?!) драйвера
// [указатель(pointer)] -> (SKMD) -> [SKMD_PAGE_ENTRY]
#define SKMD_IO_PAGE_ENTRY      SKMD_IO ( 7, TRUE, FALSE)

// Возврат блока памяти
// [SKMD_MEMORY_BLOCK] -> (SKMD) -> [SKMD_MEMORY_DATA]
#define SKMD_IO_MEMORY_DATA   SKMD_IO ( 8, TRUE, FALSE)

// Возврат блока памяти
// [SKMD_MEMORY_BLOCK] -> (SKMD) -> [SKMD_MEMORY_DATA]
#define SKMD_IO_MEMORY_BLOCK   SKMD_IO ( 9, TRUE, FALSE)

// Возврат блока информатии об объекте
// [HANDLE] -> (SKMD) -> [SKMD_HANDLE_INFO]
#define SKMD_IO_HANDLE_INFO   SKMD_IO (10, TRUE, FALSE)


// Установить запись в PTE
// [SKMD_PTE_ENTRY_SET] -> (SKMD) -> [null]
#define SKMD_IO_SET_PTE_ENTRY      SKMD_IO ( 97, TRUE, FALSE)

// PTE INDEX -> X86_PE
// [cardinal] -> (SKMD) -> [X86_PE]
#define SKMD_IO_PTE_ENTRY      SKMD_IO ( 98, TRUE, FALSE)

#endif // _RC_PASS_
Записан

while (8==8)
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #2 : 31-07-2003 08:49 » 

sss, а пояснения - а форомить в текстовый файл, а сделать это как следовает   Вот такой я вот ну что ж вы так а??? Кто это найдет и поймет без объяснений  Я шокирован!
Записан

А птичку нашу прошу не обижать!!!
sss
Специалист

ru
Offline Offline

« Ответ #3 : 31-07-2003 09:18 » 

Гром, я занят по уши  Я шокирован! . Занимаюсь всякой херней. К драйверам уже год не возвращался. Опубликовал один свой старый header для драйвера и клиента. Там все комментарии на руском  Ага .  Есть еще вариант для Delphi. Но я не вижу ни кого с этим увлечением под данный компилятор  :?
Записан

while (8==8)
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #4 : 31-07-2003 09:42 » 

Ок - как будет время - краткий оммент не помешает.
Записан

А птичку нашу прошу не обижать!!!
sss
Специалист

ru
Offline Offline

« Ответ #5 : 01-08-2003 09:08 » 

// =================================================================
// (1) INTEL X86 Регистры, селекторы
// =================================================================
Описывается структура сегментных селекторов , доступных в уровне пользователя, а так же дескрипторы, их типы (доступны в кольце 0 [далее R0]). В комментах расписаны предназначения битов.  Описаны маски доступа к битовым полям дескрипторов.
Расшифровка дополнитеоьно
CPL - current priv. level
RPL - req.priv.level

// =================================================================
// (2) INTEL X86 Страницы
// =================================================================
Описание битовых полей регистра CR3 (не помню, по моему только R0).

...
Гром, это ужасно  Я шокирован! ! Лучше пусть вопросы будут конкретные ! У меня доступ только на работе. Времени чох! Тот кто понял что здесь, надеюсь будет рад.

Дополню, я конечно же читал Шрайбера  Ага
Записан

while (8==8)
dorador
Гость
« Ответ #6 : 19-08-2003 10:00 » 

Цитата

Я выслал на сайт файлы проекта, может будет  проще скачать их, чем копировать текст из статьи...

что-то не могу найти
и еще: если DDK от W2K, исправлять что-то надо?
Записан
YuriyAG
Гость
« Ответ #7 : 19-08-2003 10:16 » 

Цитата: dorador
Цитата

Я выслал на сайт файлы проекта, может будет  проще скачать их, чем копировать текст из статьи...

что-то не могу найти
и еще: если DDK от W2K, исправлять что-то надо?


Файлы видно где-то затерялись  Жаль
Не думаю что нужно что-то исправлять для W2k, пример простой, будет везде работать...
Записан
dorador
Гость
« Ответ #8 : 19-08-2003 11:31 » 

YuriyAG, УРА все получилось Отлично
спасибо автору и Вам
пришлось еще повозиться с crt.bat - у меня DDK на D, а файлы на E
%SystemRoot%\system32\cmd.exe /c "d:&&cd D:\DDK2000\bin&&setenv.bat D:\DDK2000&&e:&&cd e:\myProjects\myDrv \&&build -ceZ"
pause
еще в консольном приложении в функцию drvUnLoad добавил объявление
SERVICE_STATUS ServiceStatus;
и исправил IOCTL_TEST_SMTH на TEST_SMTH

а можно ли таким образом выгружать и загружать снова WDM драйвер PnP устройства (когда оно установлено)?
Хотелось бы использовать такой способ при отладке драйвера
Записан
Артем
Опытный

nz
Offline Offline
Пол: Мужской
Beware the wolf in sheep's clothing.


« Ответ #9 : 19-08-2003 11:34 » 

Цитата: dorador

а можно ли таким образом выгружать и загружать снова WDM драйвер PnP устройства (когда оно установлено)?
Хотелось бы использовать такой способ при отладке драйвера


По идее можно. Отлично  Только, если я не ошибаюсь, надо правильно написать AddDevice().
Записан
Артем
Опытный

nz
Offline Offline
Пол: Мужской
Beware the wolf in sheep's clothing.


« Ответ #10 : 19-08-2003 11:38 » 

2YuriyAG. Спасибо за поправки, действительно я не весь текст исходников приложения выложил :oops: Звиняйте
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #11 : 19-08-2003 13:00 » 

Хм странно - а я вроде все это не читал - как-то пропустил прошу пардону....
А файл затерялся при переезде - обязательно выложу...  :oops:
Записан

А птичку нашу прошу не обижать!!!
xander kej
Гость
« Ответ #12 : 04-05-2008 15:17 » 

в общем сделал, как писали, поправил всё как и писали, в общем подогнал к более менее рабочему варианту. Но при компиле консоли, выдаёт единственный еррор
Console.cpp(54) : error C2065: 'FILE_DEVICE_Drv' : undeclared identifier
такого текста нету в коде исходника
помогите плз
Записан
xander kej
Гость
« Ответ #13 : 04-05-2008 15:22 » 

отмена общей тревоги, разобралсо =)
Записан
xander kej
Гость
« Ответ #14 : 04-05-2008 16:11 » 

"Если драйвер загружен успешно, то вызываем функцию TestSmth(), внутри которой мы создаем, и посылаем драйверу IRP-пакет (с помощью вызова DeviceIoControl()). Приняв этот пакет, наш драйвер возвращает адрес своей процедуры DriverEntry.
После этого выгружаем драйвер. Все. "

при запуске в командной строке выдаёт следующее:
C:\хххх\Console.exe
Drv.sysThe specified service already exists.nopening this service...StartService
 failed with Error=2nDeleting service...DeleteService failed with Error=6n

эт значит , что типо уже запущено и ещё раз немогём?

както можно сделать чтоб эта прога правильно функционировала?

И вопрос номер2:
Мне надо сделать такой драйвер для модема accorp56k на ком-порте. Где мне взять список функций или хотя бы то, что должен делать элементарный модем такого класса?

заранее огромное спс
« Последнее редактирование: 04-05-2008 19:24 от xander kej » Записан
Артем
Опытный

nz
Offline Offline
Пол: Мужской
Beware the wolf in sheep's clothing.


« Ответ #15 : 05-05-2008 07:19 » 

xander kej,  драйверами я уже не занимаюсь года четыре, поэтому, к сожалению, что-то конкретное посоветовать не смогу Жаль
Единственное замечание: весь это пример был подготовлен для Win2000, и под WinXP возможны проблемы.

Что касается
при запуске в командной строке выдаёт следующее:
C:\хххх\Console.exe
Drv.sysThe specified service already exists.nopening this service...StartService
 failed with Error=2nDeleting service...DeleteService failed with Error=6n

эт значит , что типо уже запущено и ещё раз немогём?

То да, действительно  "уже запущено и ещё раз немогём" Улыбаюсь . При перезагрузке винды такого быть не должно. А как сделать правильно, чтоб работало без перезагрузки - надо смотреть работу со службами. В данном случае, скорее всего, ошибка при остановке/выгрузке драйвера (драйвер работает как служба).
« Последнее редактирование: 05-05-2008 07:21 от Артем » Записан
xander kej
Гость
« Ответ #16 : 06-05-2008 13:47 » 

То да, действительно  "уже запущено и ещё раз немогём" Улыбаюсь . При перезагрузке винды такого быть не должно. А как сделать правильно, чтоб работало без перезагрузки - надо смотреть работу со службами. В данном случае, скорее всего, ошибка при остановке/выгрузке драйвера (драйвер работает как служба).
при перезагрузки тож самое, поставил анлокер, по процессу нет никаких дескриптеров, проверил.
без понятия.
А вот у меня есть диск с драйвером к этому аккорпу, там есть только инф файл и *.cat файл. Может оттуда можно взять функции или чтот типо того, и чем его открывать, кстати, этот КАТ файл?

заранее спс
Записан
Ochkarik
Модератор

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

« Ответ #17 : 06-05-2008 15:42 » 

cat - это цифровая подпись к драйверу. типа сертификация майкрософтом и все такое)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
xander kej
Гость
« Ответ #18 : 06-05-2008 17:45 » 

Так собственно где лежит драйвер? у производителяскачал архив, тио драйвер, в архиве инф файл и кат и всё. Инф же как я понимаю для установки драйвера, кат это как уже сказали цифровая подпись, а где взять сам SYS?
Записан
xander kej
Гость
« Ответ #19 : 06-05-2008 18:16 » 

кстати, если разбодыть фирменый СИС файл, чем его можно править, и можно ли взять из него чтото ценное, для решения моей проблемы?
Записан
zubr
Гость
« Ответ #20 : 06-05-2008 21:21 » 

xander kej, для внешних модемов драйвера как такового нет, а инф-файл только содержит команды  инициализации твоего модема.
Записан
xander kej
Гость
« Ответ #21 : 11-05-2008 18:45 » 

Нашёл пример драйвера модема в ддк 2600,называется fakemodem. Переделал наше консольное приложение под этот фейкмодем. При запуске ЕХЕшника консольки выдаёт тоже самое сообщение. Я вообще в растерянности. Что это значит?
« Последнее редактирование: 11-05-2008 19:13 от xander kej » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines