purebasic.info

PureBasic forum
Текущее время: Пт сен 21, 2018 9:46 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 54 ]  На страницу Пред.  1, 2, 3, 4
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Сб июн 09, 2012 9:12 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11255
Благодарил (а): 4 раз.
Поблагодарили: 429 раз.
Димастый писал(а):
где-то, что-то, краем уха слышал (приснилось?), что в kernel-mode нельзя вызывать функции реализованные в user-modе.
Ну да, WinAPI официально нельзя вызывать из драйвера.
Но есть функции ядра системы.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс июн 10, 2012 11:51 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вс ноя 07, 2010 12:19 pm
Сообщений: 281
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Димастый
Вызывать можно, но из пользовательского потока. Для этого есть APC, теневые колбеки(KeUserModeCallback() - теневое ядро(win32k использует для обмена инфой с клиетской частью шадова(user32) etc. Чтобы вызвать чтото на другом CPL, нужно иметь соответствующее окружение(среду). К примеру юзермодный стек. И механизм перехода на менее привилегированный код должен быть безопасным. Все ресурсы ядра должны быть освобождены, от потока выполняющего вход в юзермод не должно зависеть ядро.

_________________
Materia Lucida


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс июн 10, 2012 7:36 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11255
Благодарил (а): 4 раз.
Поблагодарили: 429 раз.
Для тех кому интересна эта тема и хочется попробовать поработать с драйверами.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн июн 11, 2012 9:38 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11255
Благодарил (а): 4 раз.
Поблагодарили: 429 раз.
Захотел значит я создавать 64 битные драйвера с помощью пурика. :)
Взял большой шаманский бубен и давай танцевать с ним. :D
Пурик сначала сопротивлялся, но я его таки уболтал, :D и он выдал мне x64 дров. :lol:
Танцевать с бубном вокруг DDK пришлось еще дольше чем с пуриком. В нем было много полей в структурах, имеющих тип Integer в место Long. Для x86 это не имеет значения, но для x64, фатально!
Но даже после того как все (вроде) исправил, дров все равно некорректно работает.
Вот код.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Declare DriverEntry(*DriverObject, *RegistryPath)
 
!Public PureBasicStart
!PureBasicStart:
*A=@DriverEntry()
!jmp [p_A]
 
Procedure UnloadDriver(*DriverObject.DRIVER_OBJECT)
 
EndProcedure
 
Procedure DriverEntry(*DriverObject.DRIVER_OBJECT, *RegistryPath.UNICODE_STRING)
 
  *DriverObject\DriverUnload = @UnloadDriver()
 
  ProcedureReturn #STATUS_SUCCESS
EndProcedure

На x86, все работает как надо.
А на x64, глючит.
Инсталяция и запуск проходят успешно, а вот при остановке пишет что данное действие неприменимо к этому драйверу. Деинсталляция тоже проходит с предупреждением, типа дров занят, но он отмечен на удаление. Приходится перезагружать комп, иначе дров больше не устанавливается.
Код простейший и даже не знаю в чем проблема может быть.
Вот структура DRIVER_OBJECT. Вроде все ОК, и соответствует описанию микрософта. http://www.nirsoft.net/kernel_struct/vi ... BJECT.html
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
Structure UNICODE_STRING
  Length.w
  MaximumLength.w
  *Buffer
EndStructure
 
 
 
Structure DRIVER_OBJECT
  Type.w
  Size.w
 
  ;
  ; The following links all of the devices created by a single driver
  ; together on a list, and the Flags word provides an extensible flag
  ; location for driver objects.
  ;
 
  *DeviceObject
  Flags.l
 
  ;
  ; The following section describes where the driver is loaded. The count
  ; field is used to count the number of times the driver has had its
  ; registered reinitialization routine invoked.
  ;
 
  *DriverStart
  DriverSize.l
  *DriverSection
  *DriverExtension
 
  ;
  ; The driver name field is used by the error log thread
  ; determine the name of the driver that an I/O request is/was bound.
  ;
 
  DriverName.UNICODE_STRING
 
  ;
  ; The following section is for registry support. Thise is a pointer
  ; to the path to the hardware information in the registry
  ;
 
  *HardwareDatabase
 
  ;
  ; The following section contains the optional pointer to an array of
  ; alternate entry points to a driver for "fast I/O" support. Fast I/O
  ; is performed by invoking the driver routine directly with separate
  ; parameters, rather than using the standard IRP call mechanism. Note
  ; that these functions may only be used for synchronous I/O, and when
  ; the file is cached.
  ;
 
  *FastIoDispatch
 
  ;
  ; The following section describes the entry points to this particular
  ; driver. Note that the major function dispatch table must be the last
  ; field in the object so that it remains extensible.
  ;
 
  *DriverInit
  *DriverStartIo
  *DriverUnload
  *MajorFunction[#IRP_MJ_MAXIMUM_FUNCTION+1]
 
EndStructure; DRIVER_OBJECT

Может кто ткнет носом что не так.
Почему на x86 нормально работает, а на x64, глючит?

PS.
Вот как выглядит эта структура в DDK 7.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
typedef struct _DRIVER_OBJECT {
    CSHORT Type;
    CSHORT Size;
 
    //
    // The following links all of the devices created by a single driver
    // together on a list, and the Flags word provides an extensible flag
    // location for driver objects.
    //
 
    PDEVICE_OBJECT DeviceObject;
    ULONG Flags;
 
    //
    // The following section describes where the driver is loaded.  The count
    // field is used to count the number of times the driver has had its
    // registered reinitialization routine invoked.
    //
 
    PVOID DriverStart;
    ULONG DriverSize;
    PVOID DriverSection;
    PDRIVER_EXTENSION DriverExtension;
 
    //
    // The driver name field is used by the error log thread
    // determine the name of the driver that an I/O request is/was bound.
    //
 
    UNICODE_STRING DriverName;
 
    //
    // The following section is for registry support.  Thise is a pointer
    // to the path to the hardware information in the registry
    //
 
    PUNICODE_STRING HardwareDatabase;
 
    //
    // The following section contains the optional pointer to an array of
    // alternate entry points to a driver for "fast I/O" support.  Fast I/O
    // is performed by invoking the driver routine directly with separate
    // parameters, rather than using the standard IRP call mechanism.  Note
    // that these functions may only be used for synchronous I/O, and when
    // the file is cached.
    //
 
    PFAST_IO_DISPATCH FastIoDispatch;
 
    //
    // The following section describes the entry points to this particular
    // driver.  Note that the major function dispatch table must be the last
    // field in the object so that it remains extensible.
    //
 
    PDRIVER_INITIALIZE DriverInit;
    PDRIVER_STARTIO DriverStartIo;
    PDRIVER_UNLOAD DriverUnload;
    PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
 
} DRIVER_OBJECT;
typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT;


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс июл 07, 2013 4:41 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 81 раз.
Пункты репутации: 24
Кто нибудь может сделать сборку пурика для драйверов (5.11 или 5.2)? А то у меня не получается что-то. Буду очень благодарен

_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс июл 07, 2013 5:16 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6382
Благодарил (а): 20 раз.
Поблагодарили: 198 раз.
Пункты репутации: 48
Никита Однороб писал(а):
пурика для драйверов (5.11 или 5.2)?

Ты откуда проснулся? Что не загорается то?
Пётр уже давно выложил для 5.11
А для 5.2 делать ни кто не будет, пока нет релиза. Какой смысл?

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс июл 07, 2013 6:05 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 81 раз.
Пункты репутации: 24
Я только сегодня с Испании вернулся, поэтому не видел. Спасибо!

_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс июл 07, 2013 6:27 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6382
Благодарил (а): 20 раз.
Поблагодарили: 198 раз.
Пункты репутации: 48
Никита Однороб писал(а):
только сегодня с Испании вернулся

Видел фотки, нормальный отдых!

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс июл 07, 2013 6:31 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 81 раз.
Пункты репутации: 24
Спасибо! Если посмотрел, то лайк поставь :) Да и в друзья добавляйся! :)

_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 54 ]  На страницу Пред.  1, 2, 3, 4

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB