Вот может пригодится исходник. Правда тут ZwQueryDirectoryFile перехватывается, но может поможет разобраться в перехвате...
Всем Привет!!! Koshak или кто нибуть еще, ПОМОГИТЕ! Попал в тупик, вот код дллки: Код (Text): library Hook; uses Windows, advApiHook, HSNtDef, NtDll; {$R *.res} const MutexName='__API_HOOK'; var SH:HHOOK = 0; NtCreateFileNextHook: function (FileHandle: PHandle; const DesiredAccess: ACCESS_MASK; ObjectAttributes: POBJECT_ATTRIBUTES; IoStatusBlock: PIoStatusBlock; AllocationSize: PLARGE_INTEGER; FileAttributes, ShareAccess, CreateDisposition, CreateOptions: ULONG; EaBuffer: PVOID; EaLength: ULONG): NTSTATUS; stdcall; NtOpenFileNextHook: function (FileHandle: PHandle; const DesiredAccess: ACCESS_MASK; ObjectAttributes: POBJECT_ATTRIBUTES; IoStatusBlock: PIoStatusBlock; const ShareAccess, OpenOptions: ULONG) : NTSTATUS; stdcall; //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ function NtCreateFileHookProc(FileHandle: PHandle; const DesiredAccess: ACCESS_MASK; ObjectAttributes: POBJECT_ATTRIBUTES; IoStatusBlock: PIoStatusBlock; AllocationSize: PLARGE_INTEGER; FileAttributes, ShareAccess, CreateDisposition, CreateOptions: ULONG; EaBuffer: PVOID; EaLength: ULONG): NTSTATUS; stdcall; var res : Integer; text : PUNICODE_STRING; buf:_OFSTRUCT; ff:hFile; buffer :PChar; rwd : DWORD; begin ff:= CreateFile('C:\towrite.txt',GENERIC_READ or GENERIC_WRITE,0, nil, OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL, 0); buffer:='NtCreateFile: '; SetFilePointer(ff,0,0,FILE_END); WriteFile(ff,buffer[0],length(buffer),rwd,nil); text:= ObjectAttributes.ObjectName; SetFilePointer(ff,0,0,FILE_END); WriteFile(ff,PByte(text.Buffer)^,length(text.Buffer),rwd,nil); CloseHandle(ff); NtCreateFileNextHook(FileHandle, DesiredAccess, ObjectAttributes, IoStatusBlock, AllocationSize, FileAttributes, ShareAccess, CreateDisposition, CreateOptions, EaBuffer, EaLength); end; function NtOpenFileHookProc(FileHandle: PHandle; const DesiredAccess: ACCESS_MASK; ObjectAttributes: POBJECT_ATTRIBUTES; IoStatusBlock: PIoStatusBlock; const ShareAccess, OpenOptions: ULONG) : NTSTATUS; stdcall; var res : Integer; text : PUNICODE_STRING; buf:_OFSTRUCT; f:hFile; buffer :PChar; rwd : DWORD; begin f:= CreateFile('C:\towrite.txt',GENERIC_READ or GENERIC_WRITE,0, nil, OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL, 0); buffer:=#13+#10+'NtOpenFile: '; SetFilePointer(f,0,0,FILE_END); WriteFile(f,buffer[0],length(buffer),rwd,nil); text:= ObjectAttributes.ObjectName; SetFilePointer(f,0,0,FILE_END); WriteFile(f,PByte(text.Buffer)^,length(text.Buffer),rwd,nil); CloseHandle(f); NtOpenFileNextHook(FileHandle, DesiredAccess, ObjectAttributes, IoStatusBlock, ShareAccess, OpenOptions); end; function MsgProc(code:DWORD;wParam,lparam:DWORD):DWORD;stdcall; begin CallNextHookEx(SH,code,wParam,lparam); end; procedure SetWindowsHook(e:Boolean); stdcall; var M:THandle; begin if e then begin m:=CreateMutex(0,false,MutexName); if m=0 then exit; SH:=SetWindowsHookEx(WH_GETMESSAGE,@MsgProc,HInstance,0); end else UnhookWindowsHookEx(sh); end; procedure HandleEvents(reason: integer)export;stdcall; begin case reason of DLL_PROCESS_ATTACH: begin SetWindowsHook(true); //установка глобального хука HookProc('ntdll.dll', 'NtCreateFile', @NtCreateFileHookProc, @NtCreateFileNextHook);//установка перехвата на NtCreateFile //HookProc('ntdll.dll', 'NtOpenFile', @NtOpenFileHookProc, @NtOpenFileNextHook); end; DLL_PROCESS_DETACH: begin SetWindowsHook(false); //снимаю глобальный хук UnhookCode(@NtCreateFileNextHook);//снимаю перехват NtCreateFile //UnhookCode(@NtOpenFileNextHook); end; end; end; begin DllProc := @HandleEvents; MessageBox(0, 'Запускаем дллку', 'start', MB_OK); HandleEvents(DLL_PROCESS_ATTACH); end. Получается вот какая штука, когда ее запускаешь она подгружается ко всем процессам и начинает перехватывать NtOpenFile. Но дело в том что я ссылку на старую функцию сохраняю сюда: NtCreateFileNextHook: function (FileHandle: PHandle; const DesiredAccess: ACCESS_MASK; ObjectAttributes: POBJECT_ATTRIBUTES; IoStatusBlock: PIoStatusBlock; AllocationSize: PLARGE_INTEGER; FileAttributes, ShareAccess, CreateDisposition, CreateOptions: ULONG; EaBuffer: PVOID; EaLength: ULONG): NTSTATUS; stdcall; А винда такое ощущение что вызывает перехватываемую функцию постоянно, и получается так что ссылка на старую функцию все время перезаписывается на в новь отловленную. При этом если я хочу запустить какой нибуть экзешник или просмотреть текстовик, то вылазиет ошибка чтто, типа не правильно указаны парамметры. Посоветуйте как быть.