Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование драйверов
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
Nixel
0 / 0 / 0
Регистрация: 04.03.2010
Сообщений: 10
1

Драйвер фильтр FS

09.09.2010, 19:17. Просмотров 2338. Ответов 1
Метки нет (Все метки)

Привет всем, есть проблемка ((
Изучаю программирование драйверов, потихоньку приходит понимание как и что работает, только вот одного понять не могу. как написать драйвер фильтр файловой системы?? теоретическую основу я понимаю и представляю как все работает, а вот практики нет (

Есть небольшой пример из книги "Уолтер Они - Использование Microsoft Windows Driver Model - 2003"
я его урезал и сделал "бесполезным". но осталась "основа".

Вот он
C
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
typedef 
struct     tagDEVICE_EXTENSION {
            PDEVICE_OBJECT DeviceObject;
            PDEVICE_OBJECT LowerDeviceObject;
            PDEVICE_OBJECT Pdo;
        } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
 
 
NTSTATUS AddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT pdo);
VOID DriverUnload(IN PDRIVER_OBJECT DriverObject);
NTSTATUS DispatchAny(IN PDEVICE_OBJECT fido, IN PIRP Irp);
 
#pragma PAGEDCODE
 
extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,    IN PUNICODE_STRING RegistryPath)
{
    DbgPrint("Filter - Entering DriverEntry: DriverObject %8.8lX\n", DriverObject);
 
    DriverObject->DriverUnload = DriverUnload;
    DriverObject->DriverExtension->AddDevice = AddDevice;
 
    for (int i = 0; i < arraysize(DriverObject->MajorFunction); ++i)
        DriverObject->MajorFunction[i] = DispatchAny;
    
    return STATUS_SUCCESS;
}
 
 
 
#pragma PAGEDCODE
 
VOID DriverUnload(IN PDRIVER_OBJECT DriverObject)
{
    PAGED_CODE();
    DbgPrint("Filter - Entering DriverUnload: DriverObject %8.8lX\n", DriverObject);
}
 
#pragma PAGEDCODE
 
NTSTATUS AddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT pdo)
    {
    PAGED_CODE();
    NTSTATUS status;
    PDEVICE_OBJECT fdo;
    PDEVICE_EXTENSION pdx;
    HANDLE hkey;
    
    DbgPrint("Filter - Entering AddDevice: DriverObject %8.8lX, pdo %8.8lX\n", DriverObject, pdo);
 
    status = IoCreateDevice(DriverObject, sizeof(DEVICE_EXTENSION), NULL, GetDeviceTypeToUse(pdo), 0, FALSE, &fdo);
        
    if (!NT_SUCCESS(status))
    {
        DbgPrint("Filter - IoCreateDevice failed - %X\n", status);
        return status;
    }
    
    pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;
 
    do{
        pdx->DeviceObject = fdo;
        pdx->Pdo = pdo;
 
        PDEVICE_OBJECT ldo = IoAttachDeviceToDeviceStack(fdo, pdo);
        if (!ldo)
        {
            DbgPrint("Filter - IoAttachDeviceToDeviceStack failed\n");
            status = STATUS_DEVICE_REMOVED;
            break;
        }
 
        pdx->LowerDeviceObject = ldo;
 
        fdo->Flags |= ldo->Flags & (DO_DIRECT_IO | DO_BUFFERED_IO | DO_POWER_PAGABLE);
 
        status = IoOpenDeviceRegistryKey(pdo, PLUGPLAY_REGKEY_DEVICE, KEY_READ, &hkey);
        
        if (NT_SUCCESS(status))
        {
            UNICODE_STRING valname;
            RtlInitUnicodeString(&valname, L"FileLogging");
 
            ULONG junk;
            KEY_VALUE_PARTIAL_INFORMATION value;    
 
            status = ZwQueryValueKey(hkey, &valname, KeyValuePartialInformation,
                &value, sizeof(value), &junk);
 
            if (NT_SUCCESS(status) && value.DataLength == sizeof(ULONG))
                pdx->filetrace = *(PULONG) value.Data != 0;
 
            ZwClose(hkey);
        }
 
        status = STATUS_SUCCESS;
 
        PowerTrace(pdx, "Filter - Initiating trace\n");
 
        fdo->Flags &= ~DO_DEVICE_INITIALIZING;
    }
    while (FALSE);
 
    if (!NT_SUCCESS(status))
    {
        if (pdx->LowerDeviceObject)
            IoDetachDevice(pdx->LowerDeviceObject);
        IoDeleteDevice(fdo);
    }
 
    return status;
}
 
 
#pragma LOCKEDCODE
 
NTSTATUS DispatchAny(IN PDEVICE_OBJECT fido, IN PIRP Irp)
{
    PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fido->DeviceExtension;
    
    DbgPrint("Filter - Entering DispatchAny");
    
    IoSkipCurrentIrpStackLocation(Irp);
    status = IoCallDriver(pdx->LowerDeviceObject, Irp);
    return status;
}
Зачем нужна секция с 76 по 93 строчку листинга выше? за что она отвечает?
Зачем делать цикл с 60 по 101 строку? нельзя ли обойтись без зацикливания и просто прогнать?

Не могу понять, каким образом данный драйвер понимает что нужно подключится именно к стеку файловой системы а не к другому стеку, например клавиатуры?? Подозреваю что дело в .inf файле данного драйвера, поэтому его я тоже выкладываю.

C
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
[Version]
Signature=$CHICAGO$
Provider=%MFGNAME%
 
[DestinationDirs]
DefaultDestDir=10,system32\drivers
FiltJectCopyFiles=11
 
[SourceDisksFiles]
filter.sys=1
filtject.dll=1
 
[SourceDisksNames]
1=%INSTDISK%,,,objchk_wxp_x86\i386
 
;------------------------------------------------------------------------------
;  Windows 2000 Sections
;------------------------------------------------------------------------------
 
[DefaultInstall.ntx86]
CopyFiles=DriverCopyFiles,FiltJectCopyFiles
AddReg=FiltJectAddReg.ntx86
 
[DriverCopyFiles]
filter.sys,,,0x60        ; replace newer, suppress dialog
 
[FiltJectCopyFiles]
filtject.dll,,,0x60
 
[FiltJectAddReg.ntx86]
HKLM,%RUNONCEKEYNAME%,InjectFilter,,"rundll32 filtject,InjectFilter ""IOCTL Sample Device"" filter"
 
[DefaultInstall.ntx86.services]
AddService=filter,,FilterService
 
[FilterService]
ServiceType=1
StartType=3
ErrorControl=1
ServiceBinary=%10%\system32\drivers\filter.sys
 
;------------------------------------------------------------------------------
;  Windows 98 Sections
;------------------------------------------------------------------------------
 
[DefaultInstall]
CopyFiles=DriverCopyFiles,FiltJectCopyFiles
AddReg=FiltJectAddReg
 
[FiltJectAddReg]
HKLM,%RUNONCEKEYNAME%,InjectFilter,,"rundll32 filtject,InjectFilter ""IOCTL Sample Device"" filter.sys"
;HKLM,%RUNONCEKEYNAME%,InjectFilter,,"rundll32 filtject,InjectFilter ""IOCTL Sample Device"" wdmstub.sys -lower"
 
;------------------------------------------------------------------------------
;  String Definitions
;------------------------------------------------------------------------------
 
[Strings]
MFGNAME="Walter Oney Software"
INSTDISK="WDM Book Companion Disc"
DESCRIPTION="Sample Filter Driver"
RUNONCEKEYNAME="Software\Microsoft\Windows\CurrentVersion\RunOnce"
Заранее БОЛЬШОЕ СПАСИБО за ответы! ))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.09.2010, 19:17
Ответы с готовыми решениями:

Драйвер фильтр USB
Всем привет! Пробую писать фильтр запросов к USB-устройствам. Пока застрял на...

Драйвер-фильтр для COM порта
Всем привет и доброго времени суток! //Я надеюсь кто-нибудь сможет мне...

Вызвать ZwOpenFile в примере input\moufiltr\moufiltr.c (драйвер-фильтр для мыши)
Задача следующая: нужно записывать в лог все действия пользователя с мышью...

Зачем нужен драйвер и как написать простейший драйвер
Хотя в интернете и есть на русском языке некоторые обяснения что такое драйвер...

Драйвер-фильтр на C/C++
Нужно написать драйвер-фильтр на C/C++.Он должен создавать &quot;виртуальный&quot;...

1
erthalion
42 / 39 / 4
Регистрация: 29.03.2010
Сообщений: 233
10.09.2010, 14:40 2
ну вот, что есть в той же книженции
информация о фильтрующих драйверах хранится в двух разделах реестра,связанных с устройством....бла_бла_бла....параметры UpperFilters и LowerFilters, которые определяют фильтрующие драйверы
ну, видимо, стек устройств действительно должен определяться в inf (содержать секции для добавления нужных ключей в реестр)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.09.2010, 14:40

Драйвер Фильтр
Здрастье! В Windows Driver Kit есть исходники и описания для драйверов фильтров...

User-mode драйвер / фильтр для сканера штрих-кодов. Какой правильный подход при разработке?
У меня сейчас стоит задача сделать некую программу или юзермодный драйвер если...

Скачал драйвер для ATI и при загрузке пишет не найден драйвер
Скачал драйвер для ATI и при загрузке пишет ненайден драйвер поиска,что делать7


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru