|
|
| Посл.отвђт | Сообщен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 грузить. Может так и проще, но хочется все в идеале, и не пладить кучу файлов. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.213 |