Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.11.2011, 13:27   #11
Fanliss
Пользователь
 
Регистрация: 01.11.2011
Сообщений: 13
По умолчанию

Вот как раз через стандартный механизм хуков и не получается, потому что не понятно что ловить. Попробую ловить DialogBoxParamW.
Хотя конечно то, что "идентификаторы могут разниться от версии shell32" несколько напрягает. И еще удаление бывает в корзину, бывает мимо, диалоги разные.

Еще удаление бывает в других программах, например Тотал командер или вообще в какой-то своей, там наверное тоже будет по-другому. Хотелось бы что-то более универсальное... Хотя хотя бы с эксплорером справиться.
Попробую еще NtSetInformationFile
Fanliss вне форума Ответить с цитированием
Старый 08.11.2011, 13:43   #12
haruhi
Форумчанин
 
Аватар для haruhi
 
Регистрация: 05.10.2011
Сообщений: 368
По умолчанию

запрет через NtSetInformationFile сложно реализуем так какэтой функции передаётся хендл файла. получение имени по хендлу трудоёмкая задача, система будет тормозить так как каждый при вызове NtSetInformationFile для всех файлов в системе ваш перехватчик будет получать имя файла по хендлу.
намного удобнее и проще перехватывать NtOpenFile и запрещать доступ к искомому файлу если программа запрашивает доступ на запись/изменение
а ещё лучше перехватывать NtCreateFile так как NtOpenFile это оболочка вокруг NtCreateFile
Не стоит будить спящего Бога! (с) Меланхолия Харухи Судзумии
haruhi вне форума Ответить с цитированием
Старый 08.11.2011, 15:33   #13
Fanliss
Пользователь
 
Регистрация: 01.11.2011
Сообщений: 13
По умолчанию

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

Блин, хоть бы какой-нибудь примерчик рабочий. Как вообще это все делается?

Последний раз редактировалось Fanliss; 08.11.2011 в 16:21.
Fanliss вне форума Ответить с цитированием
Старый 08.11.2011, 19:43   #14
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

NtOpenFile не является никакой оберткой это такой же отдельный сервис как и NtCreateFile.
TotalCmd для вывода формы об удалении файлов\каталогов использует MessageBoxA (моя версия коммандера, по крайней мере) с uType = MB_YESNOCANCEL, то есть возвращаемые параметры аналогичны будут эксплороровским. Для отлова нужных MsgBox - проверка в обработчике перехвата параметра lpText, lpCaption = "Total Commander".
"Рабочие примерчики" вам придется писать самому т.к. кроме вас это никому не нужно. То что вас напрягает возможность изменения ID ресурса, опять же, повторяю - ищите динамически или хардкорьте в коде идентификаторы для различных версий. Удаление помимо корзины (Shift+Del) имеет точно тот же диалог, что и удаление в корзину.
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Старый 08.11.2011, 20:20   #15
haruhi
Форумчанин
 
Аватар для haruhi
 
Регистрация: 05.10.2011
Сообщений: 368
По умолчанию

Цитата:
Сообщение от Fanliss Посмотреть сообщение
я никак не могу понять как NtOpenFile связан с удалением файлов? он же открывает? И если я запрещу NtOpenFile, они же тогда и открываться не будут?
для того чтобы удалить файл надо сначала получить его хендл с доступом на запись (и ещё парой мелочей, но главное флаг записи). если программа не получит хендла, то и удалить его не сможет
Не стоит будить спящего Бога! (с) Меланхолия Харухи Судзумии
haruhi вне форума Ответить с цитированием
Старый 10.11.2011, 10:21   #16
Fanliss
Пользователь
 
Регистрация: 01.11.2011
Сообщений: 13
По умолчанию

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

Такой вопрос: а откуда эта информация:

Цитата:
Диалог удаления файлов в эксплорере вызывается функцией DialogBoxParamW, ресурсы диалога берутся из библиотеки shell32.dll номера диалогов в ресурсах, в ХР: 1011 -удаление файла,1012 - удаление папки, 1013 - удаление группы объектов
И как я ее могу получить (эту или другую)?

Я стараюсь сделать диалоги подобные виндовским. С удалением все нормально. Не понятно как отловить перемещение в корзину. Еще нужно получать имя удаляемого файла или папки, а если их много, то количество (ну как в винде). Получится это при перехвате DialogBoxParamW?
Fanliss вне форума Ответить с цитированием
Старый 10.11.2011, 10:54   #17
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

Из отладчика и редактора ресурсов эта информация. Вступайте и декомпелируйте
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Старый 10.11.2011, 12:31   #18
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

И опять же, вам не нужно подделывать форму - просто в самом перехватчике вызовите диалоговое окно из shell32.dll, параметры все приходят в процедуру перехвата и возвращайте результат IDNO на выходе из перехвата, далее по коду анализируется этот результат работы функции и отталкиваясь от него происходит удаление..или не происходит удаление. То же самое и в ТоталКоммандере, с той лишь разницей, что там функция MessageBoxA и уже явно придется парсить строки содержащиеся в окне, чтобы ловить именно МсгБокс удаления файлов
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Старый 10.11.2011, 13:39   #19
Fanliss
Пользователь
 
Регистрация: 01.11.2011
Сообщений: 13
По умолчанию

Я никогда не пользовался отладчиком.... Он декомпилирует в ассемблер? Это сложновато А что за отладчик?
Форму мне надо именно свою, потому как она сложная и просто готовым диалоговым окном не обойтись я думаю? Или вы не об этом?

я делаю замену первых байт функции на переход на мою:

Код:
Procedure SetHook();
var
 hDll: dword;
 Bytes: dword;
begin
  hDll:= GetModuleHandleA('user32.dll');
  MbAdr:=GetProcAddress(hDll, 'DialogBoxParamW');
  JmpMb.PuhsOp  := $68;
  JmpMb.PushArg := @NewDialogBoxParamW;
  JmpMb.RetOp   := $C3;
  ReadProcessMemory(INVALID_HANDLE_VALUE, MbAdr, @OldMb, SizeOf(OldCode), Bytes);
  WriteProcessMemory(INVALID_HANDLE_VALUE, MbAdr, @JmpMb, SizeOf(far_jmp), Bytes);
end;
А моя выглядит так:
Код:
function NewDialogBoxParamW(hInstance: HINST; lpTemplateName: PWideChar;
  hWndParent: HWND; lpDialogFunc: TFNDlgProc; dwInitParam: LPARAM): Integer; stdcall;
var
  SLabel,SCaption: string;
begin
  if hInstance=GetModuleHandle('shell32.dll') then
  begin
    if lpTemplateName=PWideChar(MakeIntResource(1011)) then {файл}
    begin
      SLabel:='Вы действительно хотите удалить файл?';
      SCaption:='Подтверждение удаления файла';
      result:=ShowModalForm(SLabel,SCaption);
    end
    else
      if lpTemplateName=PWideChar(MakeIntResource(1012)) then   {папка}
      begin
        SLabel:='Вы действительно хотите удалить папку?';
        SCaption:='Подтверждение удаления папки';
        result:=ShowModalForm(SLabel,SCaption);
      end
      else
      if lpTemplateName=PWideChar(MakeIntResource(1013)) then   {ãðóïïà îáúåêòîâ}
      begin
        SLabel:='Вы действительно хотите удалить эти объекты?';
        SCaption:='Подтверждение удаления группы файлов';
        result:=ShowModalForm(SLabel,SCaption);
      end
      else
        result:=TrueDialogBoxParamW(hInstance, lpTemplateName, hWndParent, lpDialogFunc, dwInitParam);
    end
    else
      result:=TrueDialogBoxParamW(hInstance, lpTemplateName, hWndParent, lpDialogFunc, dwInitParam);
   
end;
ShowModalForm тоже моя, которая создает форму.
Параметры как я понимаю приходят в dwInitParam? Потому что где еще? Но что с ним делать?
Fanliss вне форума Ответить с цитированием
Старый 11.11.2011, 16:03   #20
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

(все имена структур вымышенные, любые совпадения - случайны и вообще все справедливо для установленной у меня версии Explorer, не факт что это не меняется)
DialogBoxParamW:
lParam указатель на структуру xSplorer
xSplorer:
xSplorer+4h указатель на имя первого файла\папки fiest_name_pointer
xSplorer+28h количество указанных файлов\папок

fiest_name_pointer:
file_name_pointer-8h указатель на массив имен all_files
all_files заканчивается dd 0 каждое имя заканчивается dw 0

получаем имя первого из файлов, по смещению в 4 байта (там находится адрес строки) от указателя в lParam
по смещению в 0х28 - счетчик числа удаляемых объектов, т.е. если там единица, то доступ к массиву имен не нужен
если счетчик более единицы, то от указателя на имя первого файла отнимаем 8 байт и получаем в данной ячейке указатель на массив имен заканчивающийся четырьмя нулевыми байтами, имена разделены двойным нулевым байтом ибо везде юникод
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отмена удаления в Windows artemavd Общие вопросы Delphi 8 30.11.2010 13:43
Защита файлов от удаления (assembler) Omega1 Помощь студентам 16 17.11.2010 16:14
Программа для удаления файлов 1malder1 Софт 10 29.05.2010 15:38
Защита файлов от удаления Viteef Свободное общение 5 15.06.2007 22:44
Защита файлов от удаления Viteef Общие вопросы Delphi 10 02.06.2007 07:40