Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Запрет доступа к каталогу


Автор: KAlex1 18.10.2009, 00:57
Доброго времени суток, уважаемые коллеги!
Занимаюсь решением вопроса программного запрета доступа к каталогу. 
Поделитесь, пожалуйста, идеями о том каким способом этого можно достичь. 
Назначение прав доступа не подходит. И было бы неплохо узнать как запретить доступ не только из проводника, а и из фара. 
Заранее благодарен!

Автор: bra1ny 18.10.2009, 21:11
Думаю правильнее всего будет написать драйвер фильтр фс. Фильтровать все IRP_MJ_CREATE и уже смотреть какой каталог открывается и предпринимать действия пропускать дальше или возврашать STATUS_ACCESS_DENIED например.  

Автор: RapMan 18.10.2009, 22:53
думаю bra1ny прав, но добавлю что еще нужно фильтровать IRP_MJ_SET_INFORMATION иначе переименовать и удалить каталог будет можно

Автор: KAlex1 20.10.2009, 23:18
Огромное спасибо за советы! 
Порыл в этом направлении, почитал на WASM. Я так понял что драйвера фильтра фс относятся к драйверам режима ядра.
Скажи пожалуйста, вообще раеально этот драйвер написать на С, в MS Visual Studiо? или драйвера такого рода пишутся только на asm-e? 

Автор: xvr 21.10.2009, 12:38
Драйвера уже давно пишут на С (и даже на С++). Тебе нужен DDK или WDK

Автор: KAlex1 25.10.2009, 22:35
А если это реализовать перехватом WinAPI функций, то, допустим из командной строки или при помощи фара, каталог будет доступен?
xvr, благодарю за совет насчет WDK. WDK - мощнейший хелп)

Автор: bra1ny 25.10.2009, 23:37
Цитата

А если это реализовать перехватом WinAPI функций, то, допустим из командной строки или при помощи фара, каталог будет доступен?

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

Но перехват апи не даст вам той "власти" нежели  драйвер фильтр фс. Плюс к этому драйвер фильтр это документированный метод +)

Автор: KAlex1 9.11.2009, 18:37
Кроме драйверов фильтов файловой системы (file system filter drivers), также существуют драйвера минифильтра 
(file system minifilter drivers). )
Я так понял, они проще в реализации, но возможно ли с их помощью запретить доступ к каталогу? Они ведь не предусматривают возврат такого полезного статуса как, например STATUS_ACCESS_DENIED. 

Автор: bra1ny 10.11.2009, 00:19
В чем проблема в реализации драйвера фильтра фс ? Покажите код поможем.  

Автор: KAlex1 10.11.2009, 00:50
Код...Если бы) 
Я сейчас нахожусь на стадии выбора: реализовывать ли драйвер фильтра, или драйвер минифильтра. WDK говорит что минифильтр проще в реализации и лучше работает.  Но это ведь драйвер "минифильтра")
Вот я и хочу понять какие тут подводные камни, всязи с этим и возник вопрос: предоставит ли мне драйвер минифильтра  возможности необходимые для решения моего вопроса? То что драйвер фильтра способен мне помочь это понятно.

Автор: Alca 10.11.2009, 10:22
Код

HANDLE hFile = NULL;

void LockFile(const AnsiString & asFilePath, bool bLockFlag)  {
    if (bLockFlag == true) {
        hFile = CreateFile(
              ("\\\\.\\" + asFilePath).c_str(),
              GENERIC_WRITE,
              0,
              NULL,
              OPEN_EXISTING,
              FILE_ATTRIBUTE_NORMAL,
              NULL
        );
    } else {
        CloseHandle (hFile);
    }
}

Автор: KAlex1 10.11.2009, 12:42
The CreateFile function creates, opens, or truncates a file, COM port, device, service, or console.
Похоже что с директориями эта функция не работает, и ктому же если ее реализовать в резидентной программе, то эту программу можно будет легко прервать.
И как сказал bra1ny: это не даст вам той "власти" нежели  драйвер фильтр.
Поэтому я всеже буду ждать ответа на мой вопрос о драйверах минифильтра) 

Автор: SenkraD 10.11.2009, 12:58
KAlex1, а в сторону ACL (Access Controll Lists) не смотрел - http://support.microsoft.com/kb/102102

Автор: KAlex1 10.11.2009, 14:37
только что посмотрел, и понял что я уже далеко зашел в рассмотрении драйверов фильтра, и уже добью наверно их). я так понял, через ACL назначаются привилегий доступа, а это мне не совсем подходит. 
Благодарю за подсказку.Хорошая идея. Оставлю ее как запасной вариант)
И всеже буду ждать ответа на мой вопрос о драйверах минифильтра) 

Автор: bra1ny 10.11.2009, 16:48
по поводу фильтра фс , советую изучить исходники файлмона(на васме есть). Ну и если решитесь , то по любому столкнетесь  с фаст ио.
Вот Вам почитать.


Автор: KAlex1 10.11.2009, 19:32
Благодарю за док) Я думал что в WDK, fast I/O описываются достаточно, но если что обязательно воспользуюсь) 
Помоему в моем случае обработку фаст и/о делать не прийдется. Там достаточно будет поймать те IRP о которых говорилось ранее. 
К тому же к WDK прилогается пример драйвера минифильтра и должен прилогаться пример просто драйвера фильтра, но второго там почему-то нету, поэтому нужно всеголишь поискать в инете)

Автор: bra1ny 10.11.2009, 22:37
если будите писать драйвер фильтр фс , То фаст ио придется обрабатывать по любому иначе систему нагнете =) 
Ну там все просто где-то так:

Код

BOOLEAN
MyFastIoRead(
    IN PFILE_OBJECT FileObject,
    IN PLARGE_INTEGER FileOffset,
    IN ULONG Length,
    IN BOOLEAN Wait,
    IN ULONG LockKey,
    OUT PVOID Buffer,
    OUT PIO_STATUS_BLOCK IoStatus,
    IN PDEVICE_OBJECT DeviceObject
    )
{
    PDRIVER_OBJECT DriverObject;
    PDEVICE_EXTENSION pdx;

    pdx = DeviceObject->DeviceExtension;
    DriverObject = pdx->LowerDeviceObject->DriverObject;

    if( DriverObject->FastIoDispatch && DriverObject->FastIoDispatch->FastIoRead )
    {
        KdPrint(("FastIoRead!\n"));
        return DriverObject->FastIoDispatch->FastIoRead( FileObject ,
                                                         FileOffset ,
                                                         Length ,
                                                         Wait ,
                                                         LockKey ,
                                                         Buffer ,
                                                         IoStatus ,
                                                         pdx->LowerDeviceObject 
                                                       );
    }
    else
    {
        KdPrint(("FastIoRead not supported!\n"));
        return FALSE;
    }
}

ну и тд.

Автор: KAlex1 11.11.2009, 00:23
Да, в драйверах фильтра нужно было предусматривать обработчик фаст ио, даже если он ничего не должен делать, но он должен передать фаст ио следующему драйверу в стэке. 
А в драйверах минифильтра, обрабатываются только те сообщения которые нам нужны, а для остальных мы можем даже не предусматривать обработчики, все остальное там за нас делает filter manager)

Автор: bra1ny 11.11.2009, 13:34
Ну пока вы там с минифильтрами маетесь , я по быстрому вам скелет написал  smile 
Простой драйве фильтр фс , который запрещает доступ к каталогу Temp на диске С.
После запуска стэк устройств выглядит где-то так:
Код

lkd> !devstack 81e42950
  !DevObj   !DrvObj            !DevExt   ObjectName
  81b81f10  \Driver\folder_filter81b81fc8  
> 81e42950  \FileSystem\sr     81e42a08  
  81f38020  \FileSystem\Ntfs   81f380d8  




user posted image

user posted image



Автор: KAlex1 11.11.2009, 16:39
Благодарю Вас, bra1ny. Думаю Ваш код будет мне очень полезен) 
Буду надеяться, что после окончания ознакомления с документацией, я напишу свой драйвер с такой же скоростью что и Вы этот)

Автор: Alca 11.11.2009, 16:59
Цитата

 folder.rar 107,77 Kb

А как драйвер установить?

Автор: bra1ny 11.11.2009, 17:15
Полно программ. можете свою написать , через сервисы или NtLoadDriver. 

Автор: Alca 11.11.2009, 17:34
спасибо

Автор: KAlex1 13.11.2009, 14:41
А Microsoft Visual Studio предоставляет какие-либо возможности, которые могут помочь в разработке драйверов?

Автор: bra1ny 13.11.2009, 17:41
Эээ какие возможности вы имеете в виду?Как настроить студию чтобы там драйвера собирать? 
http://alter.org.ua/ru/docs/nt_kernel/vc6_proj/
http://alter.org.ua/ru/docs/nt_kernel/vc8_proj/

Еше на диске к книжке Уолтера Они есть мастер для построения проектов драйверов для студии.

Сам использую 6 студию + визуал асист , собираю драйвера в build . Уже привык , и менять ничего не собираюсь. 

Автор: KAlex1 15.11.2009, 20:43
Посоветуйте пожалуйста, что удобнее всего использовать для отладки драйвера фильтра и вообще драйверов?
Bra1ny, в вашем исходнике есть папка objchk_wxp_x86, скажите пожалуйста что это за папка, и как создаются файлы входящие в нее?) И еще, файлы makefile. и sources. создаются вручную?
Я так понял, вы имеете ввиду что драйвера лучше компилировать build-oм которые входит в WDK? Вы про этот говорите или про какой-то другой? Для меня это все ново, поэтому приходиться уточнять))

Автор: bra1ny 16.11.2009, 00:14
Цитата

файлы makefile. и sources. создаются вручную?

Да , вручную.

Цитата

Я так понял, вы имеете ввиду что драйвера лучше компилировать build-oм которые входит в WDK

Да , это эталонная сборка.

Цитата

Посоветуйте пожалуйста, что удобнее всего использовать для отладки драйвера фильтра и вообще драйверов?

WinDbg.
Так как перед тем , как у вас что-то заработает будет очень много синих экранов , советую поставить виртуальную машину. 
Вот инструкция как настроить виндебаг и вмварю для удаленной отладки. 
http://silverstr.ufies.org/lotr0/windbg-vmware.html

 

Автор: KAlex1 25.11.2009, 19:04
Bra1ny, благодарю за совет насчет vmware и windbg. Настроил, отлаживаю...  Настройка не легкая конечно)
Подскажите пожалуйста как посмотреть стэк устройств и есть ли какая-нибудь возможность посмотреть через какие драйвера IRP прошло или какими обрабатывалось и какими не успело обработаться, 
потому что я в своем драйвере обработку IRP завершаю (complete an I/O operation) со статусом STATUS_ACCESS_DENIED, but никакого эффекта на систему это не оказывает, и в папку всеравно заходит.
И скажите еще пожалуйста, какую группу (Load order group) присваивать драйверу?

Автор: bra1ny 26.11.2009, 00:10
стэк устройств можно посмотреть  командой !devstack  

Цитата

Подскажите пожалуйста как посмотреть стэк устройств и есть ли какая-нибудь возможность посмотреть через какие драйвера IRP прошло или какими обрабатывалось и какими не успело обработаться, 

Если с отладчиком не очень подружились вроде бы былая такая полезная штука как irptrace поищите.
Цитата

потому что я в своем драйвере обработку IRP завершаю (complete an I/O operation) со статусом STATUS_ACCESS_DENIED, but никакого эффекта на систему это не оказывает, и в папку всеравно заходит.

Давайте код , посмотрим.

Автор: KAlex1 26.11.2009, 00:14
Взгляните, пожалуйста. 
Код

FLT_PREOP_CALLBACK_STATUS
DADPreOperationCallback (
    __inout PFLT_CALLBACK_DATA Data,
    __in PCFLT_RELATED_OBJECTS FltObjects,
    __deref_out_opt PVOID *CompletionContext
    )
{
    PUNICODE_STRING nameToUse;
    NTSTATUS status;
    PFLT_FILE_NAME_INFORMATION nameInfo = NULL;

        if (FltObjects->FileObject != NULL) { 

            status = FltGetFileNameInformation( Data,   //Получить имя каталога который обрабатывается в данный момент
                                                FLT_FILE_NAME_NORMALIZED |
                                                    FLT_FILE_NAME_QUERY_ALWAYS_ALLOW_CACHE_LOOKUP,
                                                &nameInfo );
        } else {
            //  Can't get a name when there's no file object
            status = STATUS_UNSUCCESSFUL;
        }
            if (NT_SUCCESS( status )) 
            {
            nameToUse = &nameInfo->Name; 

#ifdef DBG
                ASSERT( NT_SUCCESS( FltParseFileNameInformation( nameInfo ) ) );
#else
                FltParseFileNameInformation( nameInfo );
#endif
 
            if ( !RtlCompareUnicodeString(&DADData.VolumeNameToUse, &nameInfo->Volume, TRUE))
                     { // сравненение имен разделов
                                    if ( !RtlCompareUnicodeString(&nameInfo->ParentDir, &DADData.DirectoryName, FALSE))
                        { // сравннение имен каталогов
                          // если имена каталогов совпадают, то блокируем доступ,
                         KdPrint(("Our folder!\n"));
                         Data->IoStatus.Status=STATUS_ACCESS_DENIED;
                         FltReleaseFileNameInformation( nameInfo );
                         return FLT_PREOP_COMPLETE;  
                        }
                     }
               if (!NT_SUCCESS(status))
               {
                    KdPrint(("Failed with status  : %08X\n" , status ));
                    if (NULL != nameInfo) {
                        FltReleaseFileNameInformation( nameInfo );
                    }
                    return FLT_PREOP_SUCCESS_NO_CALLBACK;
               }
             }
#if DBG
            //
            //  Debug support to break on certain errors.

            if (FltObjects->FileObject != NULL) {
                NTSTATUS retryStatus;

                if ((StatusToBreakOn != 0) && (status == StatusToBreakOn)) {

                    DbgBreakPoint();
                }
                retryStatus = FltGetFileNameInformation( Data,
                                                         FLT_FILE_NAME_NORMALIZED |
                                                            FLT_FILE_NAME_QUERY_ALWAYS_ALLOW_CACHE_LOOKUP,
                                                         &nameInfo );
                if (!NT_SUCCESS( retryStatus )) {
                    //  We always release nameInfo, so ignore return value.
                    NOTHING;
                }
            }
#endif

    if (NULL != nameInfo) {
            FltReleaseFileNameInformation( nameInfo );
        }
    return FLT_PREOP_SUCCESS_NO_CALLBACK;
}

Автор: bra1ny 26.11.2009, 02:02
FltCancelFileOpen?

Автор: KAlex1 30.11.2009, 23:33
Спасибо за подсказку. В ВДК написано что команда FltCancelFileOpen используется в PostOperationCallBack процедурах. Во всяком случае она мне не пригодилась, ошибка оказалась в сравнении имен каталогов. Это я уже исправил. Разработка продвигается)  smile 
Подскажите пожалуйста какую фунцкию использовать для динамического выделения памяти, под массив переменных определенного типа, в режиме ядра. Необходимо динамически выделить память под массив UNICODE_STRING-ов. И затем также выделить память под массив buffer каждой из структур UNICODE_STRING.

Автор: bra1ny 1.12.2009, 00:46
ExAllocatePool().
Выбирать тип пула надо в зависимости от irql.
Если работаете на уровне < DISPATCH_LEVEL тогда можно paged pool. 
С nonpaged пулом можно работать на любом irql, но надо помнить что это очень ценный ресурс  smile 

Автор: KAlex1 3.12.2009, 18:49
Благодаря документации и Вам, bra1ny, мне стало ясно что необходимо использовать ExAllocatePoolWithTag. 
Но у меня возникла очередная проблема: выделяется всего 4 байта, при том что мне нужно 5120 байт.
Из DriverEntry вызываю свою процедуру, и в ней уже происходит вызов ExAllocatePoolWithTag.
Вначале подумал что IRQL не тот, попробовал вызвать ExAllocatePoolWithTag их самой DriverEntry, но всеравно выделяются только 4 байта, вместо желаемых 5120. Выделяю из PagedPool. IRQL DriverEntry является PASSIVE_LEVEL. 
Вот он код:
Код

    PVOID buffer;
    
    buffer = ExAllocatePoolWithTag(PagedPool, 5120,'ffuB');
    resultLength=sizeof(buffer);


Буду рад, если у вас есть какие-нибудь идеи по этому поводу)

Автор: xvr 3.12.2009, 20:38
Цитата

Буду рад, если у вас есть какие-нибудь идеи по этому поводу) 
Есть идея, что sizeof(buffer); - это размер указателя buffer, а не выделенного буфера, на который он указывает. Так что спите спокойно - ваши 5120 байтов скорее всего выделились. Что бы стать совсем спокойным рекомендуется проверить этот самый buffer на NULL

Автор: bra1ny 3.12.2009, 22:40
Цитата(xvr @ 3.12.2009,  20:38)
Цитата

Буду рад, если у вас есть какие-нибудь идеи по этому поводу) 
Есть идея, что sizeof(buffer); - это размер указателя buffer, а не выделенного буфера, на который он указывает. Так что спите спокойно - ваши 5120 байтов скорее всего выделились. Что бы стать совсем спокойным рекомендуется проверить этот самый buffer на NULL

Вы совершенно правы. 

Цитата

мне стало ясно что необходимо использовать ExAllocatePoolWithTag. 


ExAllocatePool это "обертка" которая в свою очередь вызывает ExAllocatePoolWithTag с тэгом None. Ну это так для справки))

Автор: KAlex1 3.12.2009, 22:45
Я бы спал спокойно если бы мне функция ZwQueryValueKey не возвращала BufferTooSmall, при том что проверку я перед этим тоже делаю)) И дебаггер показывает  в buffer не нулевой адрес.
Код

...
    PVOID buffer;
    ULONG resultLength
    
    buffer = ExAllocatePoolWithTag(PagedPool, 5120,'ffuB');
    resultLength=sizeof(buffer);
    RtlZeroMemory(buffer,DIRECTORIES_LENGTH);
    resultLength=sizeof(buffer);

    if (buffer == NULL) 
    {
        return;
    }


    InitializeObjectAttributes( &attributes,
                                RegistryPath,
                                OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
                                NULL,
                                NULL );

    status = ZwOpenKey( &driverRegKey,
                        KEY_READ,
                        &attributes );

    if (!NT_SUCCESS( status )) {
        return;
    }

     RtlInitUnicodeString( &valueName, DIRECTORY_TOBECLOSED );

    pValuePartialInfo = (PKEY_VALUE_PARTIAL_INFORMATION) buffer;

    status = ZwQueryValueKey( driverRegKey,
        &valueName,
        KeyValuePartialInformation,  // Specifies that a KEY_VALUE_PARTIAL_INFORMATION structure is supplied. 
        buffer,
        sizeof(buffer),
        &resultLength );
...

Автор: xvr 3.12.2009, 22:54
Код

ZwQueryValueKey( driverRegKey,
        &valueName,
        KeyValuePartialInformation,  // Specifies that a KEY_VALUE_PARTIAL_INFORMATION structure is supplied. 
        buffer,
        sizeof(buffer),
        &resultLength );
Не надо сюда подавать sizeof(buffer),, это всего лишь 4, так что BufferTooSmall вполне оправданно. Подайте туда ваши 5120

Автор: KAlex1 9.12.2009, 22:34
Скажите пожалуйста, драйвера откомпилированные в Windows XP x86 build Enviroment будут работать на Win Xp x64, и на Windows 7?
Я думал что должно быть какое-нибудь Windows XP x64 build Enviroment, но его нету, поэтому драйвера получается будут 32х-битные.

Автор: bra1ny 9.12.2009, 23:11
Цитата

Я думал что должно быть какое-нибудь Windows XP x64 build Enviroment

на сколько помню можно 2003 x64 использовать , схожие архитектуры. 

Автор: KAlex1 9.12.2009, 23:58
А вообще, драйвера откомпилированные в Windows XP x86 build Enviroment будут работать на Win Xp x64, и на Windows 7?

Автор: bra1ny 10.12.2009, 00:11
Цитата

А вообще, драйвера откомпилированные в Windows XP x86 build Enviroment будут работать на Win Xp x64

Вообще-то тоскают с собой драйвера для разных платформ. Для x86 отдельно , для x64 отдельно. 

Автор: KAlex1 20.12.2009, 17:15
Подскажите пожалуйста как настраивать MVS 2005 для создния user-mode application, которые смогли бы взаимодействовать с kernel-mode драйвером? 

Автор: smoke_man 20.12.2009, 18:07
В смысле настраивать? Создаешь приложение, а для работы с драйвером используешь следующие функции:
CreateFile -> IRP_MJ_CREATE 
CloseHandle -> IRP_MJ_CLEANUP & IRP_MJ_CLOSE 
WriteFile -> IRP_MJ_WRITE 
ReadFile-> IRP_MJ_READ 
DeviceIoControl -> IRP_MJ_DEVICE_CONTROL

Автор: KAlex1 20.12.2009, 18:38
Всмысле какие папки указывать в настройка, типа Additional library directories, возможно какие-нибудь настройки линковщика. ЧТо-то наподобии http://alter.org.ua/ru/docs/nt_kernel/vc8_proj/ вот этого, если такое вообще есть.
Потому что я пробовал подключить .h файл с нужной мне функцией, указыв на него необходимые пути в настройках проекта, но всеравно при линковании ошибки. 

Автор: bra1ny 20.12.2009, 18:40
не понял что-то на что ругается линковщик? пример хидера пожалуйста. 

Автор: smoke_man 20.12.2009, 18:43
А что за ошибки? И если есть возможность  - можешь показать h-файл?

Автор: bra1ny 20.12.2009, 19:04
В ддк кстати есть пример  как общаться с драйвером. 
Код

src\general\ioctl

Автор: xvr 20.12.2009, 20:00
user-mode application не могут напрямую вызывать kernel-mode драйвера, только стандартными, определенными в Win32 API методами (их 
smoke_man уже перечислил)
Т.ч. ничего специально настраивать не надо

Автор: KAlex1 21.12.2009, 00:26
Для загрузки драйвера минифильтра используется функция FilterLoad (The FilterLoad function dynamically loads a minifilter driver into the system). Объявление содержится в fltuser.h, который входит в WDK.  Ее мне и нужно вызывать.
При компиляции выдается ошибка: c:\ddk\inc\ddk\fltuserstructures.h(22) : fatal error C1012: unmatched parenthesis : missing ')'. А ведь fltuserstructures.h является майрософтским файлом. 
Навсякий случай прикрепляю эти два файла.

Автор: smoke_man 21.12.2009, 09:49
Посмотри http://www.osronline.com/showthread.cfm?link=104885

Автор: KAlex1 21.12.2009, 23:22
Smoke_man, Благодарю за полезную ссылку. оттуда я вынес что нужно в include directories добавить еще C:\WDK\inc\api.
Добавив это, ошибка сменилась на error C3861: 'FilterLoad': identifier not found. Хотя нужный fltuser.h подключен.
FilterLoad это функция которую я вызываю. 
Я предпологаю, что это из-за того что не выполняется условие #if FLT_MGR_BASELINE, после которого в хедере идет объявление FilterLoad
Кусочек кода fltuser.h : 
Код

...
#define FLT_MGR_BASELINE (((OSVER(NTDDI_VERSION) == NTDDI_WIN2K) && (SPVER(NTDDI_VERSION) >= SPVER(NTDDI_WIN2KSP4))) || \
                          ((OSVER(NTDDI_VERSION) == NTDDI_WINXP) && (SPVER(NTDDI_VERSION) >= SPVER(NTDDI_WINXPSP2))) || \
                          ((OSVER(NTDDI_VERSION) == NTDDI_WS03)  && (SPVER(NTDDI_VERSION) >= SPVER(NTDDI_WS03SP1))) ||  \
                          (NTDDI_VERSION >= NTDDI_VISTA))

#define FLT_MGR_AFTER_XPSP2 (((OSVER(NTDDI_VERSION) == NTDDI_WIN2K) && (SPVER(NTDDI_VERSION) >= SPVER(NTDDI_WIN2KSP4))) ||  \
                             ((OSVER(NTDDI_VERSION) == NTDDI_WINXP) && (SPVER(NTDDI_VERSION) >  SPVER(NTDDI_WINXPSP2))) ||  \
                             ((OSVER(NTDDI_VERSION) == NTDDI_WS03)  && (SPVER(NTDDI_VERSION) >= SPVER(NTDDI_WS03SP1))) ||   \
                             (NTDDI_VERSION >= NTDDI_VISTA))
...
#include <fltUserStructures.h>

#ifdef __cplusplus
extern "C" {
#endif

#if FLT_MGR_BASELINE
//
//  Functions for loading, unloading and monitoring Filters
//

__checkReturn
HRESULT
WINAPI
FilterLoad (
    __in LPCWSTR lpFilterName
    );

__checkReturn
HRESULT
WINAPI
FilterUnload (
    __in LPCWSTR lpFilterName
    );
...
#endif

Вот на каких основаниях я пологаю что не выполняется условие #if FLT_MGR_BASELINE:
Включив в C/C++ -> Preprocessor -> Generate Processed File - "With Line Numbers (/P)". На этапе компиляции я получаю кучу файлов .i
И вставив в свой код вот такую вот проверку: 
Код

int test(void)
{
    FLT_MGR_BASELINE;
}

В .i файле я нахожу вот что:
Код

int test(void)
{
(((((0x05010000) & 0xFFFF0000) == 0x05000000) && ((((0x05010000) & 0x0000FF00) >> 8) >= (((0x05000400) & 0x0000FF00) >> 8))) || ((((0x05010000) & 0xFFFF0000) == 0x05010000) && ((((0x05010000) & 0x0000FF00) >> 8) >= (((0x05010200) & 0x0000FF00) >> 8))) || ((((0x05010000) & 0xFFFF0000) == 0x05020000) && ((((0x05010000) & 0x0000FF00) >> 8) >= (((0x05020100) & 0x0000FF00) >> 8))) || (0x05010000 >= 0x06000000));
}


Заменив проверку на :
Код

#if FLT_MGR_BASELINE
int test(void)
{
    FLT_MGR_BASELINE;
}
#endif

В .i файле я такого не нахожу. Что говорит, о том что #if FLT_MGR_BASELINE не выполняется. 

Причем с включенной опцией C/C++ -> Preprocessor -> Generate Processed File - "With Line Numbers (/P)". Мне выдает ошибку что cannot open file '.\Debug\stdafx.obj'. Т.е. этого файла просто нет. Но это неважно потому что если откулючить эту опцию, то такой ошибки не возникает.

Система WINXP SP3.

Есть ли у кого-нибудь идеи почему не выполняется #if FLT_MGR_BASELINE?  

Автор: smoke_man 21.12.2009, 23:57
А если добавить:
Код

#define WINVER 0x500
#define _WIN32_WINNT 0x0500
#define NTDDI_VERSION NTDDI_WINXP

Автор: KAlex1 22.12.2009, 00:21
К той ошибке что была \usermodeapp1\usermodeapp1dlg.cpp(288) : error C3861: 'FilterLoad': identifier not found
добавляется вот это:
 warning C4005: 'WINVER' : macro redefinition
...\usermodeapp1\stdafx.h(18) : see previous definition of 'WINVER'
....\usermodeapp1\usermodeapp1dlg.cpp(20) : warning C4005: '_WIN32_WINNT' : macro redefinition
....\usermodeapp1\stdafx.h(22) : see previous definition of '_WIN32_WINNT'
...\usermodeapp1\usermodeapp1dlg.cpp(21) : warning C4005: 'NTDDI_VERSION' : macro redefinition
 c:\ddk\inc\api\sdkddkver.h(203) : see previous definition of 'NTDDI_VERSION'

Автор: bra1ny 22.12.2009, 00:47
скомпильте build'ом. 

Автор: KAlex1 22.12.2009, 01:04
У меня user-mode приложение содержит окно созданное при помощи классов MFC. 
Скомпилит ли build в этом случае? Я себе не совсем представляю как буду выглядеть файлы sources. и makefile. ) 

Автор: xvr 22.12.2009, 13:21
Проверь как определен NTDDI_VERSION (в \ddk\inc\api\sdkddkver.h)
Он должен быть или NTDDI_VISTA, а для XP должен быть сервис пак не ниже 2

Автор: bra1ny 22.12.2009, 14:27
Цитата

У меня user-mode приложение содержит окно созданное при помощи классов MFC. 

понятно) 

Я просто ради интереса скомпилил пример scanner из ддк(юзермодную часть) , которая использует FilterLoad(). Посмотрите файл sources к ней.

Автор: bra1ny 24.12.2009, 22:11
А почему бы просто  не подгрузить(GetProcAddress)  fltlib.dll и Вызвать FilterLoad. 

Автор: KAlex1 26.12.2009, 14:26
я думаю, динамически вызывать FilterLoad не пойдет, потому что если бы ее можно было вызывать когда угодно, то в хедере не было бы всяких условий.  Попробую скомпилить build-oм.

Автор: bra1ny 26.12.2009, 14:45
Код

typedef HRESULT (__stdcall *MYPROC)( LPCWSTR  lpFilterName  );
       MYPROC addr;
    HRESULT res;
    addr = (MYPROC) GetProcAddress( LoadLibrary("fltlib.dll") , "FilterLoad");
    printf("FilterLoad at : %08X\n" , addr );
    res = addr(L"ololo");
    if( res != S_OK ) printf(" epic fail!\n");
    if( res == HRESULT_FROM_WIN32 (ERROR_FILE_NOT_FOUND) ) printf("yep!\n");


Я бы так сделал)

Автор: bra1ny 27.12.2009, 03:37
И так можете меня считать извращенцем )) Но я разреверсил FilterLoad и написал свой аналог)) 
Кратко Говоря вызов FilterLoad сводится к NtDeviceIoControlFile на FltMgr. Посылается структура 2 байта + строка. 
Код

typedef struct _tagLOAD
{
    WORD Len;
    WCHAR ServiceName[512];
} LOAD , *PLOAD;

 

Ну вот мой пример(тестил на примере из ддк (scanner) ).

Код

#include<stdio.h>
#include<windows.h>

typedef struct _tagLOAD
{
    WORD Len;
    WCHAR ServiceName[512];
} LOAD , *PLOAD;

#define MAGIC_IOCTL 0x00088004 

int main( int argc , char *argv[] )
{
    HANDLE hDevice;
    LOAD service_to_load;
    BOOL err;
    DWORD dwRet=0;


    hDevice = CreateFile ("\\\\.\\FltMgr" , GENERIC_READ | GENERIC_WRITE , FILE_SHARE_READ | FILE_SHARE_WRITE , NULL , OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , NULL );
    if( hDevice == INVALID_HANDLE_VALUE )
    {
        printf("CreateFile failed with status : %d\n" , GetLastError() );
        return -1;
    }

    wcscpy( service_to_load.ServiceName , L"Scanner");
    service_to_load.Len = wcslen( service_to_load.ServiceName )*sizeof(WCHAR);
    err = DeviceIoControl( hDevice , MAGIC_IOCTL , &service_to_load , sizeof(service_to_load) , NULL , 0 , &dwRet , NULL );
    if( !err )
    {
        printf("sorry\n");
        goto __end;
    }
    printf(":)\n");

__end:

    CloseHandle( hDevice );
    return 0;
}


user posted image

Автор: xvr 27.12.2009, 12:14
А теперь выйдет очередной SP к Винде, или программу запустят на другой Винде, и MAGIC_IOCTL изменится, или _tagLOAD поменяется, и все, приплыли  smile Лучше разберитесь с оригиналом

Автор: bra1ny 27.12.2009, 14:36
Цитата(xvr @ 27.12.2009,  12:14)
А теперь выйдет очередной SP к Винде, или программу запустят на другой Винде, и MAGIC_IOCTL изменится, или _tagLOAD поменяется, и все, приплыли  smile Лучше разберитесь с оригиналом

Да это все понятно) Это так чисто интерес в 4 утра) 

Автор: KAlex1 28.12.2009, 15:45
bra1ny, интерес как раз для 4х утра))

Если кто желает поиграться драйвером) Пожалуйста. 
юзер-мод приложение незаконченное немного. 

Автор: bra1ny 28.12.2009, 20:07
У меня ничего не заработало))) 

Автор: KAlex1 28.12.2009, 20:50
Вначеле драйвер устанавливаете при помощи .inf файла. Затем запускате прогу выбираете папки для блокирования. 
После того как выбрали. Нажимаете "Заблокировать". После нажимаете "Load". Если изменяете список папок, вначале нажмите "Unload". Потом ""Заблокировать" и потом "Load".

Автор: bra1ny 28.12.2009, 22:37
а вот в чем фишка) Надо сначала указать папки, а потом load =)

Автор: KAlex1 28.1.2010, 22:52
Вопрос считаю, на определенном уровне, решенным. 
Благодарю за полезные советы!  smile 

Автор: Heal 22.4.2011, 16:39
Здравствуйте. Я написал программу, которая запрещает/разрешает доступ к каталогу на уровне прав доступа. Я так понимаю, что это не эффективно, т.к. можно вручную снять это ограничение. Про читая ваши посты, я понял, что драйвер получается ниже и так просто ограничение не снимешь. Подскажите какую информация мне посмотреть, что бы написать такой же драйвер и можно ли его написать на Builder'e 6?

Автор: xvr 23.4.2011, 07:50
Цитата(Heal @  22.4.2011,  16:39 Найти цитируемый пост)
Подскажите какую информация мне посмотреть, что бы написать такой же драйвер

DDK/WDK в MSDN на MS

Цитата(Heal @  22.4.2011,  16:39 Найти цитируемый пост)
можно ли его написать на Builder'e 6? 

Нет

Автор: Heal 23.4.2011, 13:13
Спасибо. Т е его надо собирать в Visual studio, которая заточена на сбор драйвера???

Автор: xvr 23.4.2011, 15:51
Цитата(Heal @  23.4.2011,  13:13 Найти цитируемый пост)
Т е его надо собирать в Visual studio, которая заточена на сбор драйвера???

Штатное средство сборки входит в состав DDK/WDK. При большом желании можно собрать и студией, но понадобится большой шаманский бубен  smile 

Автор: Heal 24.4.2011, 16:04
Нубский вопрос, но все таки задам - там в чем его собирать?  smile 

Автор: bra1ny 24.4.2011, 18:04
build' ом

Автор: KAlex1 31.5.2012, 20:51
выкладываю сорцы(со вспомогательными проектами) 3х летней давности) может быть кому-нибудь будет полезно, для общего развития.

помню что за этот курсовой получил твердую 5, и всем студентам того же желаю.

Благодарю всех, кто принимал участие, и подсказывал. Особенно  bra1ny и xvr.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)