Перехват вызовов ADO

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
drronnie
Постоялец
Постоялец
 
Сообщения: 793
Зарегистрирован: 04.03.2002 (Пн) 22:29
Откуда: Украина, Алчевск

Перехват вызовов ADO

Сообщение drronnie » 24.11.2008 (Пн) 23:33

Господа, помогите с проблемой.
Есть чужая прога, она работает с ADO. Возможно ли как-нибудь перехватить создание объектов ADO и вызовы методов, чтобы подменить параметры некоторых. Читал на RSDN про перехват методов COM интерфесов, но не совсем понятно. Подскажите в каком направлении копать? Заранее спасибо.
Компиляция - перевод словесного поноса в машинный код.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Перехват вызовов ADO

Сообщение alibek » 25.11.2008 (Вт) 8:37

drronnie, tag_warning (1).
Копать в направлении "Читать правила".
Переношу.
Lasciate ogni speranza, voi ch'entrate.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Re: Перехват вызовов ADO

Сообщение Sebas » 25.11.2008 (Вт) 11:02

проще, таблицы на вьюхи заменить...
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

drronnie
Постоялец
Постоялец
 
Сообщения: 793
Зарегистрирован: 04.03.2002 (Пн) 22:29
Откуда: Украина, Алчевск

Re: Перехват вызовов ADO

Сообщение drronnie » 25.11.2008 (Вт) 11:48

Нельзя, с базой работают другие программы, для которых таблица должна оставаться исходной.
Компиляция - перевод словесного поноса в машинный код.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Re: Перехват вызовов ADO

Сообщение Sebas » 25.11.2008 (Вт) 12:27

drronnie писал(а):Нельзя, с базой работают другие программы, для которых таблица должна оставаться исходной.


Вопрос компетенции)
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

drronnie
Постоялец
Постоялец
 
Сообщения: 793
Зарегистрирован: 04.03.2002 (Пн) 22:29
Откуда: Украина, Алчевск

Re: Перехват вызовов ADO

Сообщение drronnie » 25.11.2008 (Вт) 13:43

Sebas писал(а):
drronnie писал(а):Нельзя, с базой работают другие программы, для которых таблица должна оставаться исходной.

Вопрос компетенции)

Причем тут компетенция? Грубо говоря есть таблица, в которой сто записей.
И одна программа должна получить сто записей, а другая только 10. Мне в голову приходит только подкорректировать запрос второй программы, но т.к. она не в исходном коде, то нужно перехватить вызов метода, и подменить запрос.
Компиляция - перевод словесного поноса в машинный код.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Re: Перехват вызовов ADO

Сообщение Sebas » 25.11.2008 (Вт) 15:07

база какая?
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

drronnie
Постоялец
Постоялец
 
Сообщения: 793
Зарегистрирован: 04.03.2002 (Пн) 22:29
Откуда: Украина, Алчевск

Re: Перехват вызовов ADO

Сообщение drronnie » 25.11.2008 (Вт) 15:17

Access
Компиляция - перевод словесного поноса в машинный код.

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Re: Перехват вызовов ADO

Сообщение SSecurity » 25.11.2008 (Вт) 21:49

резонный вопрос - как узнать, что программа спросившая БД относится к первой или второй (т.е. как разграничить 10/100 записей)
или обе проги авторизуются?
а какие именно 10 из 100 записей должна вторая прога видеть?
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Перехват вызовов ADO

Сообщение alibek » 26.11.2008 (Ср) 9:23

SSecurity писал(а):резонный вопрос - как узнать, что программа спросившая БД относится к первой или второй (т.е. как разграничить 10/100 записей)
или обе проги авторизуются?

Это разве вопрос?
Перехватывать уже работающую программу не получится, вторая программа будет просто запускаться из под написанного стартера, который и будет осуществлять перехват вызовов.
Lasciate ogni speranza, voi ch'entrate.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Re: Перехват вызовов ADO

Сообщение Sebas » 26.11.2008 (Ср) 9:43

С VBA в Access Не оч знаком.
Если можно в функции вытащить имя юзера или аргументы запуска. То вариант со вьюхой должен прокатить.

В SQL Server это на раз два. Не раз делал себе "Лицензии")... Ой, о чём это я?
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

drronnie
Постоялец
Постоялец
 
Сообщения: 793
Зарегистрирован: 04.03.2002 (Пн) 22:29
Откуда: Украина, Алчевск

Re: Перехват вызовов ADO

Сообщение drronnie » 26.11.2008 (Ср) 11:12

Пардон за заблуждение, речь идет не об ADO, а о DAO.
Ещё один нюанс: я внутри программы могу запустить скрипт на VBS, внутри которого могу получить объект DAO.Database. Может быть как-нибуть можно заменить адрес Invoke своей функцией, в результате чего я смогу вызывать оригинальный Invoke, а параметры изменять?
Компиляция - перевод словесного поноса в машинный код.

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Re: Перехват вызовов ADO

Сообщение SSecurity » 26.11.2008 (Ср) 11:42

drronnie писал(а):Пардон за заблуждение, речь идет не об ADO, а о DAO.
Ещё один нюанс: я внутри программы могу запустить скрипт на VBS, внутри которого могу получить объект DAO.Database. Может быть как-нибуть можно заменить адрес Invoke своей функцией, в результате чего я смогу вызывать оригинальный Invoke, а параметры изменять?

:)
разве что переименовать Таблицу "Источник" в "Источник2", создать запрос "Источник" который бы из "Источник2" нужные строки тянул. Но это все так ... вопрос считывания, поскольку при первой же попытке редактирования записей выпадет ЕРРОР:)

Если уже читал значит надо разбираться :))
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

drronnie
Постоялец
Постоялец
 
Сообщения: 793
Зарегистрирован: 04.03.2002 (Пн) 22:29
Откуда: Украина, Алчевск

Re: Перехват вызовов ADO

Сообщение drronnie » 26.11.2008 (Ср) 12:05

Sebas писал(а):проще, таблицы на вьюхи заменить...

drronnie писал(а):Нельзя, с базой работают другие программы, для которых таблица должна оставаться исходной.
Компиляция - перевод словесного поноса в машинный код.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Re: Перехват вызовов ADO

Сообщение Sebas » 26.11.2008 (Ср) 12:27

drronnie писал(а):
Sebas писал(а):проще, таблицы на вьюхи заменить...

drronnie писал(а):Нельзя, с базой работают другие программы, для которых таблица должна оставаться исходной.


ну, если ресь о Access.... опыта нет. В скуле не вопрос...
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Перехват вызовов ADO

Сообщение alibek » 26.11.2008 (Ср) 14:04

Если использовать сторонний компонент, то можно так:
http://www.microsoft.com/msj/0199/inter ... rcept.aspx

Возможно также пригодится и это:
http://www.rsdn.ru/Forum/?mid=190510
Lasciate ogni speranza, voi ch'entrate.

drronnie
Постоялец
Постоялец
 
Сообщения: 793
Зарегистрирован: 04.03.2002 (Пн) 22:29
Откуда: Украина, Алчевск

Re: Перехват вызовов ADO

Сообщение drronnie » 27.11.2008 (Чт) 14:06

Вот кое-какие наработки:
Модуль
Код: Выделить всё
Option Explicit

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Const PAGE_EXECUTE_READWRITE& = &H40&
Private Declare Function VirtualProtect Lib "kernel32" (ByVal lpAddress As Long, ByVal dwSize As Long, ByVal flNewProtect As Long, lpflOldProtect As Long) As Long


Public Sub Doo(Obj As Object)
  Dim mem As Long, lacc As Long
  CopyMemory mem, ByVal ObjPtr(Obj), 4
  mem = mem + 28 + 1 * 4
  VirtualProtect mem, 4&, PAGE_EXECUTE_READWRITE&, lacc
  CopyMemory ByVal mem, adr(AddressOf Repl), 4  'put VT entry
  VirtualProtect mem, 4&, lacc, ByVal 0&
End Sub

Public Function Repl(ByVal This As Long) As Long
  MsgBox "A"
  Repl = 22
End Function

Private Function adr(ByVal a As Long) As Long
  adr = a
End Function


форма
Код: Выделить всё
Private Sub Form_Load()
  Dim db As DAO.Database
  Set db = OpenDatabase("C:\1.mdb")
  MsgBox db.CollatingOrder
  Doo db
  MsgBox db.CollatingOrder
End Sub


Метод взят от балды, чисто теория... он идёт вторым. Заменяем указатель на CollatingOrder своим. при первом вызове CollatingOrder, возвращает 1033 (не знаю что это значит) потом заменяем указатель (вызов функции Doo), и на втором вызове CollatingOrder - вызывется моя функция Repl. Но при выходе из неё возникает ошибка
Инструкция обратилась к памяти по адресу 0х00000000. Почему?
Компиляция - перевод словесного поноса в машинный код.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Перехват вызовов ADO

Сообщение alibek » 27.11.2008 (Чт) 14:54

Независимо от того, правильно сделано или нет, советую убирать MsgBox (и вообще всякую интерактивность) из подобных мест.
Лучше использовать Debug.Print или выводить в файл.
Lasciate ogni speranza, voi ch'entrate.

drronnie
Постоялец
Постоялец
 
Сообщения: 793
Зарегистрирован: 04.03.2002 (Пн) 22:29
Откуда: Украина, Алчевск

Re: Перехват вызовов ADO

Сообщение drronnie » 27.11.2008 (Чт) 16:38

alibek писал(а):Независимо от того, правильно сделано или нет, советую убирать MsgBox (и вообще всякую интерактивность) из подобных мест.
Лучше использовать Debug.Print или выводить в файл.

Да это так, проверить - вызывается или нет. Ещё интересно, как передаются параметры? Т.е. как их объявлять у функции? Все как Byval As Long?
Код: Выделить всё
Property* CreateProperty([in, optional] VARIANT Name, [in, optional] VARIANT Type, [in, optional] VARIANT Value, [in, optional] VARIANT DDL);

Сделал свою реализацию методов Execute, OpenRecordset.
Подменил, всё ок. Когда я их руками вызываю - заходитв мои функции, но вот программа их почему-то не вызывает никогда :( Или у неё какой-то свой экземпляр Database, или одно из двух.
Компиляция - перевод словесного поноса в машинный код.

drronnie
Постоялец
Постоялец
 
Сообщения: 793
Зарегистрирован: 04.03.2002 (Пн) 22:29
Откуда: Украина, Алчевск

Re: Перехват вызовов ADO

Сообщение drronnie » 01.12.2008 (Пн) 9:36

Господа, а вот в ходе дела наткнулся на следующую проблему. Страница памяти, в которую нужно внести изменения имеет флаг PAGE_READONLY, а изменить его при помощи VirtualProtect не получается, а мне нужно PAGE_READWRITE. Это как-нибудь можно обойти?
Компиляция - перевод словесного поноса в машинный код.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Перехват вызовов ADO

Сообщение Twister » 01.12.2008 (Пн) 12:31

а изменить его при помощи VirtualProtect не получается
Что значит не получается? Я сомневаюсь, что страница в памяти какого-нибудь Access'а будет иметь атрибут супервизора. Скорее всего код кривой. Что возвращает VirtualProtect? Как ты ее вызываешь?
А я все практикую лечение травами...

drronnie
Постоялец
Постоялец
 
Сообщения: 793
Зарегистрирован: 04.03.2002 (Пн) 22:29
Откуда: Украина, Алчевск

Re: Перехват вызовов ADO

Сообщение drronnie » 01.12.2008 (Пн) 13:53

Я беру DAO.Database в программе. Объект каждый раз разный, поэтому подменив ему vtable я ничего не добьюсь, т.к. сама программа работает с другим экземпляром и у него vtable оригинальный. Я решил, что нужно помотреть куда ссылается необходимый метод (ведь данные у кадого объекта свои, а методы одни), и там вместо оригинального кода вставить свой. Но там у страницы стоит флаг PAGE_READONLY, когда пытаюсь изменить его на PAGE_EXECUTE_READWRITE, он меняется на PAGE_WRITECOPY, ну и соответственно при записи - память не может быть "written".
Вроде бы такая же проблема у человека тут.

Т.е. я хочу не подменить vtable экземпляру объекта на новый, а в оригинальном vtable изменить указатель на оригинальную на указатель на свою функцию.
Компиляция - перевод словесного поноса в машинный код.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Перехват вызовов ADO

Сообщение Twister » 02.12.2008 (Вт) 12:01

когда пытаюсь изменить его на PAGE_EXECUTE_READWRITE, он меняется на PAGE_WRITECOPY, ну и соответственно при записи - память не может быть "written"
Начнем с того, что PAGE_WRITECOPY эквивалентна PAGE_READONLY (не по значению константы, а по поведению). Имеменно поэтому "память не может быть written".

Дальше. Вот тут задавался аналогичный вопрос, но мудрые мелгомягкие послали его далеко-далеко на свой форум, от куда чувак, по видимому, не вернулся... Однако, я думаю, что ответ был у него под боком:
You can set the access protection value on committed pages only. If the state of any page in the specified region is not committed, the function fails and returns without modifying the access protection of any pages in the specified region.

Короче говоря, если страница не передана процессу (commit), а является всего-лишь проекцией (mapping), то ее атрибуты изменить нельзя.

Следовательно - память, атрибуты которой ты собираешься изменить, спроецирована с помощью MapViewOfFileEx (точнее с помощью NtCreateSection и NtMapViewOfSection, если копнуть глубже :) ).
А я все практикую лечение травами...

drronnie
Постоялец
Постоялец
 
Сообщения: 793
Зарегистрирован: 04.03.2002 (Пн) 22:29
Откуда: Украина, Алчевск

Re: Перехват вызовов ADO

Сообщение drronnie » 04.12.2008 (Чт) 13:34

Спасибо за ответ, Twister
Компиляция - перевод словесного поноса в машинный код.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 76

    TopList