· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ELECTRONICS —› Driver filter ???

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Ноя 2, 2004 15:17:38

Как создать драйвер фильтр для comm port, помогите начинающему, лучще разбор на примере ...


Дата: Ноя 2, 2004 17:37:06

ну кидай свой пример - разберем что не работает.


Дата: Ноя 2, 2004 19:20:42

relikt, драйвера то писать умеешь, или нет?
Если умеешь, то ставь HOOK на виндовский драйвер порта.


Дата: Ноя 3, 2004 13:07:45

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

А вот насчет HOOKов батенька вы ошибаетесь, это вам не Реестр перехватывать типа
{
RealRegOpenKey = SYSCALL( ZwOpenKey );
SYSCALL( ZwOpenKey ) = (PVOID) HookRegOpenKey;
}

Траблы в понимании как происходит захват порта и передача наверх прилажению, я делаю:
DriverEntry
{
IoCreateDevice //мой девайс

ZwCreateFile(\device\serial0..7)
если успешно
{
IoGetRelatedDeviceObject
IoCreateDevice
IoAttachDeviceByPointer
}
}
Далее как и где хранить данные по захваченным портам чтобы передать их наверх, думаю так:
При захвате IRP девайса порта надо сделать его копию и послать пакет своему родному DeviceObject, (как это сделать?, использовать системную очередь или придется стряпать свою?), далее свой уже обрабатывает IOCTL_MY_CTL1..2 которая возвращает данные об этом пакете наружу, если данных нет, тоды STATUS_PENDING типа ждемс.
Как отловить обработанные нижним драйвером пакеты, которые идут к приложению, ну что то типа снизу вверх, например при асинхроннном IRP_MJ_CLOSE (обработанные потом хрен знает где в случайнои контексте).
Можа я все запутанно изложил, но в том что у меня тама в исходниках еще запутанней.
Заранее благодарен.
P.S. на вопрос "драйвера то писать умеешь, или нет?" умел бы писать не спрашивал бы, затем сюда и залез, за хорошим советом, а не за всякой херней.


Дата: Ноя 3, 2004 13:17:39

Пояснения:
ZwCreateFile(\device\serial0..7)
если успешно
{
IoGetRelatedDeviceObject
IoCreateDevice
IoAttachDeviceByPointer
}
Это цикл.

например при асинхроннном IRP_MJ_CLOSE, неудачный пример,лучше IRP_MJ_READ


Дата: Ноя 4, 2004 12:56:02

[ relikt: Далее как и где хранить данные по захваченным портам чтобы передать их наверх, думаю так:
При захвате IRP девайса порта надо сделать его копию и послать пакет своему родному DeviceObject, (как это сделать?
]

Скорее всего полная копия IRP тебе не нужна, а нужны только пересылаемые данные. Поэтому выделяешь кусок памяти нужного размера, копируешь туда содержимое буфера и добавляешь к себе с список (односвязный, двусвязный или как-нить ещё можно организовать). Всё это копится пока твой клиент не захочет получить эти данные. Когда захочет, то через DeviceIoControl или ReadFile сбрасываешь ему сколько влезет его буфер. Ну там синхронизируешь и всё такое.


[ relikt: Как отловить обработанные нижним драйвером пакеты, которые идут к приложению ]

IoSetCompletionRoutine


ЗЫ: Я заканчиваю первую часть статьи по фильтрации IRP. В начале следующей недели, надеюсь, будет лежать на сайте. Основная теория этого дела там будет.


Дата: Ноя 4, 2004 14:02:44

Спасибо, я уже разобрался, двухсвязанным списком собирать, и наверх проге.
Вопрос:
Правильно ли я думаю что когда например происходит ReadFile и драйвер порта ответит STATUS_PENDING, далее когда начнется обработка пакета например по прерыванию, прежде чем дойдет обработка пакета до порта, пакет снова попойдет сначало к фильтру.
если так тогда нету смысла в IoSetCompletionRoutine

1. STATUS_PENDING
2. STATUS_SUCCESS
Типа:

MyDispatch(...)
{
...
satus = IoCallDriver(..);
if (status == STATUS_SUCCESS)
{
...
ExInterlockedPushEntrySList(..);//в список данные
ZwDeviceIoControlFile(IOCTL_MYCTL_SET_TO_LIST);//для старта асинхронной обработки возвращеня данных внешней проге, т.к. в StartIo уже может непопасть (Busy), а внешняя прога будет тогда висеть на событии, прерываний то у меня нет. нечто вроде уведомления моему девайсу что типа можно обрабатывать юзерский запрос на получение если он есть.
}
}

[ЗЫ: Я заканчиваю первую часть статьи по фильтрации IRP. В начале следующей недели, надеюсь, будет лежать на сайте. Основная теория этого дела там будет.]
Эх нанедельку бы пораньше. Было бы легче.
Спасибо за ответы.


Дата: Ноя 4, 2004 15:40:22

Я мало что понял, но если ты повесил фильтр, то когда IRP идет вниз по стеку девайсов к тебе он попадет в любом случае, а вот когда он будет завершаться, то не поподет. А чтобы его опять перехватить на обратном пути как раз и надо IoSetCompletionRoutine. Это если конечно тебя интересуют результаты обработки IRP. STATUS_PENDING, в данном случае, ничего не меняет. Если ты не ставил CompletionRoutine, то какой бы код ни вернул нижестоящий драйвер IRP ты больше не увидишь.


Дата: Ноя 5, 2004 12:19:39

Я так понял что когда внешняя прога делает readfile(..,overlapped) а в очереди порта пока еще пусто, то IRP попадет мне тока один раз, а драйвер порта потом когда нибудь считает данные из буфера порта и отправит во нешнюю прогу и я несмогу увидеть что он там прочитал, чтобы это увидеть я должен буду работать через IoSetCompletionRoutine. Но я взял дамп PORTMON.SYS,(он находится в ресурснике PORTMON.EXE, Русинович.) и посмотрел импортируемые функции, все есть, вот тока как раз IoSetCompletionRoutine нету.
Дамп:
Old Executable Header

DOS File Size 6FF0h ( 28656. )
Load Image Size 450h ( 1104. )
Relocation Table entry count 0000h ( 0. )
Relocation Table address 0040h ( 64. )
Size of header record (in paragraphs) 0004h ( 4. )
Minimum Memory Requirement (in paragraphs) 0000h ( 0. )
Maximum Memory Requirement (in paragraphs) FFFFh ( 65535. )
File load checksum 0000h ( 0. )
Overlay Number 0000h ( 0. )

Initial Stack Segment (SS:SP) 0000:00B8
Program Entry Point (CS:IP) 0000:0000


Portable Executable (PE) File

Header base: 000000C0

CPU type 80386
Flags 30E [ executable backwards 32bit nodebug ]
DLL flags 0000 [ ]
Linker Version 5.C
Time stamp 3945501B : Tue Jun 13 01:03:23 2000
O/S Version 5.0
User Version 5.0
Subsystem Version 5.0
Subsystem 0001 [ Native ]
Object count 00000006
Symbols offset 00000000
Symbols count 00000000
Optional header size 00E0
Magic # 10B
Code size 00003460
Init Data size 000037C0
Uninit Data size 00000000
Entry RVA 00003210
Image base 00010000
Code base 000002C0
Data base 00003380
Object/File align 00000020/00000020
Reserved 00000000
Image size 00006EE0
Header size 000002C0
Checksum 000125DE
Stack reserve/commit 00040000/00001000
Heap reserve/commit 00100000/00001000
Number interesting RVAs 00000010
Name RVA Size
------------------ -------- --------
Exports 00000000 00000000
Imports 00006360 0000003C
Resources 00006700 00000390
Exceptions 00000000 00000000
Security 00000000 00000000
Fixups 00006AA0 000003D0
Debug 00003410 0000001C
Description 00000000 00000000
Global Ptr 00000000 00000000
TLS 00000000 00000000
Callbacks 00000000 00000000
Bound Imports 00000000 00000000
Import Addr Table 00003380 0000008C
Delayed Imports 00000000 00000000
COM Runtime 00000000 00000000
reserved 00000000 00000000

Object table:
# Name VirtSize RVA PhysSize Phys off Flags
-- -------- -------- -------- -------- -------- --------
01 .text 000030A9 000002C0 000030C0 000002C0 68000020 [CEPR]
02 .rdata 00000511 00003380 00000520 00003380 48000040 [IPR]
03 .data 00002AB0 000038A0 00002AC0 000038A0 C8000040 [IPRW]
04 INIT 0000038C 00006360 000003A0 00006360 E2000020 [CDERW]
05 .rsrc 00000390 00006700 000003A0 00006700 42000040 [DIR]
06 .reloc 00000440 00006AA0 00000440 00006AA0 42000040 [DIR]

Key to section flags:
C - contains code
D - discardable
E - executable
I - contains initialized data
P - may not be paged
R - readable
W - writeable

********************************************************************** ********
Section: Import
ImportLookUpTblRVA:000063AC
Time Stamp: 00000000
Forwarder Chain: 00000000 (index of first forwarder reference)

Imports from ntoskrnl.exe
(hint = 013A) IoGetCurrentProcess
(hint = 048C) isprint
(hint = 0498) sprintf
(hint = 0108) IoAttachDeviceByPointer
(hint = 02BA) ObfDereferenceObject
(hint = 04A0) strncmp
(hint = 011B) IoCreateDevice
(hint = 0144) IoGetRelatedDeviceObject
(hint = 0410) ZwClose
(hint = 02B5) ObReferenceObjectByHandle
(hint = 0415) ZwCreateFile
(hint = 02FA) RtlAnsiStringToUnicodeString
(hint = 0361) RtlInitAnsiString
(hint = 003A) ExAllocatePoolWithTag
(hint = 04A1) strncpy
(hint = 005E) ExInterlockedPopEntrySList
(hint = 0060) ExInterlockedPushEntrySList
(hint = 0194) IofCallDriver
(hint = 01DB) KeQuerySystemTime
(hint = 00FA) InterlockedIncrement
(hint = 0195) IofCompleteRequest
(hint = 024E) MmMapLockedPages
(hint = 004D) ExInitializeNPagedLookasideList
(hint = 01C8) KeInitializeSpinLock
(hint = 0121) IoCreateSymbolicLink
(hint = 0364) RtlInitUnicodeString
(hint = 04AA) vsprintf
(hint = 0125) IoDeleteDevice
(hint = 0047) ExFreePool
(hint = 0128) IoDetachDevice

Imports from HAL.dll
(hint = 0046) KeQueryPerformanceCounter
(hint = 004F) KfAcquireSpinLock
(hint = 0052) KfReleaseSpinLock

********************************************************************** ********
Section: Resources
Flags: 00000000
Time Stamp: 00000000
Major Version: 0000
Minor Version: 0000

Resources:
Type Name Lang Id
--------------------------------------------
[0 named entries, 1 ID entries]
type: Version (16) (next directory @00000018)

[0 named entries, 1 ID entries]
type: Cursor (1) (next directory @00000030)

[0 named entries, 1 ID entries]
type: Unknown (1033) (data @00000048)
Offset: 00006760
Size: 00000330
Code Page: 00000000
Reserved: 00000000


Дата: Ноя 5, 2004 19:02:00

[ relikt: все есть, вот тока как раз IoSetCompletionRoutine нету. ]

И не удивительно. IoSetCompletionRoutine - это не функция, а макрос!
.text:00013098 loc_13098:
.text:00013098           mov   eax, [ebp+Irp]
.text:0001309B           mov   ecx, [ebp+var_8]
.text:0001309E           mov   eax, [eax+60h]          ; IoGetCurrentIrpStackLocation

//  IoSetCompletionRoutine

.text:000130A1           mov   dword ptr [eax-8], offset IoCompletion
.text:000130A8           sub   eax, 24h                ; sizeof(IO_STACK_LOCATION)
.text:000130AB           mov   [eax+20h], ecx
.text:000130AE           mov   byte ptr [eax+3], 0E0h  ; SL_INVOKE_ON_CANCEL |
.text:000130AE                                         ; SL_INVOKE_ON_SUCCESS |
.text:000130AE                                         ; SL_INVOKE_ON_ERROR
.text:000130B2           jmp   short loc_130CC
.text:000130B4 ; ---------------------------------------------------------------------
 
.text:000130B4
.text:000130B4 loc_130B4:
.text:000130B4
.text:000130B4           mov   eax, [ebp+Irp]
.text:000130B7           mov   eax, [eax+60h]          ; IoGetCurrentIrpStackLocation

//  IoSetCompletionRoutine

.text:000130BA           and   dword ptr [eax-4], 0
.text:000130BE           sub   eax, 24h                ; sizeof(IO_STACK_LOCATION)
.text:000130C1           and   byte ptr [eax+3], 0
.text:000130C5           mov   dword ptr [eax+1Ch], offset IoCompletion
.text:000130CC
.text:000130CC loc_130CC:
.text:000130CC           mov   dl, [ebp+arg_3]         ; NewIrql
.text:000130CF           mov   ecx, esi                ; SpinLock
.text:000130D1           call  ds:KfReleaseSpinLock
.text:000130D7           mov   eax, [ebp+var_14]
.text:000130DA           mov   edx, [ebp+Irp]          ; Irp
.text:000130DD           mov   ecx, [eax+0Ch]          ; DeviceObject
.text:000130E0           call  ds:IofCallDriver


Дата: Ноя 9, 2004 13:20:24

Спасибо, теперь все встает на свои места.


Дата: Ноя 17, 2004 14:14:18

может кто подскажет?
Как установить и запустить драйвер фильтр программно.
не LegacyDriver, класс {4D36E978-E325-11CE-BFC1-08002BE10318},PNP0501.
Смотрел примеры установки:
...
OpenSCManager(...);
...
CreateService(...);
...
OpenService(...);
...
StartService(...);

Получается что таким образом можно установить тока LegacyDriver. Спасибо за советы.


Дата: Ноя 17, 2004 15:04:25

Вот еще траблы..
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root\LEGACY_ххх(\0000 \Control)

застряла эта запись в реестре, немогу удалить.....


Дата: Ноя 17, 2004 15:23:52

Могу ошибиться, но, наверное, смотреть в сторону SetupDi... функций. Вроде, даже в MSDN описаны.


Дата: Ноя 17, 2004 15:39:33

Ага, нашел что то, буду разбиратся, литературы на этот счет вообще мало.., спасибо.

Вообще в реестр можно и ручками запихать настройки, а вот стартануть, и остановить.

Правда в DDK, нашел пример INSTALL как с INF грузить.
Может так и проще, но хочется все в идеале, и не пладить кучу файлов.

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.213