PureFileMaster ein TotalCMD-Clone Released! (Version 3)

Anwendungen, Tools, Userlibs und anderes nützliches.
Benutzeravatar
al90
Beiträge: 1101
Registriert: 06.01.2005 23:15
Kontaktdaten:

Beitrag von al90 »

ts-soft hat geschrieben:Entweder den links wird korrekt gefolgt, siehe Bild, oder eben ausblenden.
Ah jetzt verstehe ich. Sowas ähnliches habe ich auch schon mit den *.LNK
files gemacht. Aber hierbei handelt es sich um Dirs. Die frage ist also wie
kann ich den korrekten pfad dazu ermitteln ? API ? Wenn ja welche ?
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Wenn ich das wüßte, hab zwar viel gefunden, um diese zu erstellen, aber das
war es dann auch. Keine Ahnung wie man denen folgt :(

Wo ich gerade dabei bin, da Du wahrscheinlich kein 64-Bit OS hast, bzw.
selbst wenn, Du verwendest ja auch Libs die sowieso nur 32-Bit unterstützen,
aber trotzdem könntest für mich einen Schalter einbauen, damit ich auch
ohne Wow64 Redirection arbeiten kann:
http://www.purebasic.fr/german/viewtopi ... 908#230908
Damit ich auch sehen kann, was wirklich im System32 Ordner ist :mrgreen:

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

al90 hat geschrieben:
5. Das Kontextmenü kann man fast überall aufrufen, vllt. nur auf den Explorer
beschränken.
Wenn mir dazu ne (Abfrage-) Lösung einfällt, werde ich es ändern. :wink:
beispiel:

Code: Alles auswählen

Procedure WinCallback(hWnd, uMsg, wParam, lParam)
  If uMsg = #WM_CONTEXTMENU
    If wParam = GadgetID(0)
      DisplayPopupMenu(0, WindowID(0))  
    EndIf
  EndIf
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

If OpenWindow(0, 0, 0, 400, 200, "ExplorerListGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  SetWindowCallback(@WinCallback())
  ExplorerListGadget(0, 30, 30, 330, 130, "c:", #PB_Explorer_MultiSelect)
  If CreatePopupMenu(0)      ; hier beginnt das Erstellen des Popup-Menüs...
    MenuItem(1, "Open")      ; Sie können alle Befehle zum Erstellen eines Menüs
    MenuItem(2, "Save")      ; verwenden, ganz wie bei einem normalen Menü...
    MenuItem(3, "Save as")
    MenuItem(4, "Quit")
    MenuBar()
    OpenSubMenu("Recent files")
    MenuItem(5, "PureBasic.exe")
    MenuItem(6, "Test.txt")
    CloseSubMenu()
  EndIf

  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf

PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
al90
Beiträge: 1101
Registriert: 06.01.2005 23:15
Kontaktdaten:

Beitrag von al90 »

ts-soft hat geschrieben: Wo ich gerade dabei bin, da Du wahrscheinlich kein 64-Bit OS hast, bzw.
selbst wenn, Du verwendest ja auch Libs die sowieso nur 32-Bit unterstützen,
aber trotzdem könntest für mich einen Schalter einbauen, damit ich auch
ohne Wow64 Redirection arbeiten kann:
http://www.purebasic.fr/german/viewtopi ... 908#230908
Damit ich auch sehen kann, was wirklich im System32 Ordner ist :mrgreen:
Ich glaub ich versteh schon wieder nur Bahnhof. :freak:
Mein auffassungsvermögen ist z.Z. wohl etwas angekratzt. D.H. also ich
brauche (nach 1 jahr) unbedingt mal Urlaub. :mrgreen:
beispiel:
Oh ja, das funzt ganz gut. Werd ich mal mit einbauen. :allright:
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

al90 hat geschrieben: Oh ja, das funzt ganz gut. Werd ich mal mit einbauen. :allright:
Du meinst die Redirection? Wäre fein, weil ansonsten kann man z.B.
die hosts Datei nicht öffnen, weil die einfach nicht vorhanden ist :mrgreen:
Mit TC komme ich da auch nicht ran, muß immer diesen lahmen Explorer
starten :freak:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

ts-soft hat geschrieben:Mit TC komme ich da auch nicht ran, muß immer diesen lahmen Explorer
starten :freak:
Bild
a²+b²=mc²
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag von cxAlex »

@ts-soft:

Du könntest doch die Redirection per DLL - Injection in den TC laden. Sollte nicht allzu schwer sein.
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag von cxAlex »

@ts: Hab mal schnell ein kleines Beispiel gemacht, wie du die Wow64Redirection im TC per DLL Hook deaktivierst. Denn Hook Code hab ich hier aus dem Forum, leider weiß ich nicht mehr von wem:

//Edit: Danke an Thorium, Super Code :allright:

inject.pbi :

Code: Alles auswählen

#THREAD_ALL_ACCESS = $1F03FF

Procedure InjectDLL(idTarget.i, FileName.s) ; ProzessID,DLLFileName.s
  Define.i FileNameLen, FileNameAddr, CodeAddr, BytesWritten, hKernel32, LoadLibraryAAddr, CodeBuffer, Position, idThread, hThread, hSnapshot, RetVal, LibKernel32, hTarget
  Define.CONTEXT ThreadContext
  Define.THREADENTRY32 ThreadInfo
  
  ;Zielprozess öffnen
  hTarget = OpenProcess_(#PROCESS_ALL_ACCESS, 0, IdTarget)
  If hTarget = 0
    ProcedureReturn 0
  EndIf
  
  ;ID des Hauptthreads ermitteln
  ThreadInfo\dwSize = SizeOf(ThreadInfo)
  hSnapshot = CreateToolhelp32Snapshot_(#TH32CS_SNAPTHREAD, 0)
  If hSnapshot<>0
    RetVal = Thread32First_(hSnapshot, @ThreadInfo)
    If RetVal<>0
      If ThreadInfo\th32OwnerProcessID = idTarget
        idThread = ThreadInfo\th32ThreadID
      Else
        Repeat
          RetVal = Thread32Next_(hSnapshot, @ThreadInfo)
          If RetVal = 0
            Break
          Else
            If ThreadInfo\th32OwnerProcessID = idTarget
              idThread = ThreadInfo\th32ThreadID
              Break
            EndIf
          EndIf
        Until RetVal = 0
      EndIf
      CloseHandle_(hSnapshot)
    EndIf
  EndIf
  If idThread = 0
    CloseHandle_(hTarget)
    ProcedureReturn 0
  EndIf
  
  ;Addresse von LoadLibraryA ermitteln
  hKernel32 = GetModuleHandle_("Kernel32.dll")
  If hKernel32 = 0
    CloseHandle_(hTarget)
    ProcedureReturn 0
  EndIf
  LoadLibraryAAddr = GetProcAddress_(hKernel32, "LoadLibraryA")
  If LoadLibraryAAddr = 0
    CloseHandle_(hTarget)
    ProcedureReturn 0
  EndIf
  
  ;Thread öffnen
  LibKernel32 = OpenLibrary(#PB_Any, "Kernel32.dll")
  hThread = CallFunction(LibKernel32, "OpenThread", #THREAD_ALL_ACCESS, 0, idThread)
  If hThread = 0
    CloseHandle_(hTarget)
    ProcedureReturn 0
  EndIf
  
  ;Dateiname der DLL in den Zielprozess schreiben
  FileNameLen = Len(FileName) + 1
  FileNameAddr = VirtualAllocEx_(hTarget, 0, FileNameLen, #MEM_COMMIT | #MEM_RESERVE, #PAGE_READWRITE)
  If FileNameAddr = 0
    CloseHandle_(hThread)
    CloseHandle_(hTarget)
    ProcedureReturn 0
  EndIf
  If WriteProcessMemory_(hTarget, FileNameAddr, FileName, FileNameLen, @BytesWritten) = 0
    CloseHandle_(hThread)
    CloseHandle_(hTarget)
    ProcedureReturn 0
  EndIf
  If BytesWritten<>FileNameLen
    CloseHandle_(hThread)
    CloseHandle_(hTarget)
    ProcedureReturn 0
  EndIf
  
  ;Speicher im Zielprozess für den Code allokieren
  CodeAddr = VirtualAllocEx_(hTarget, 0, 22, #MEM_COMMIT | #MEM_RESERVE, #PAGE_EXECUTE_READWRITE)
  If CodeAddr = 0
    CloseHandle_(hThread)
    VirtualFreeEx_(hTarget, FileNameAddr, 0, #MEM_RELEASE)
    CloseHandle_(hTarget)
    ProcedureReturn 0
  EndIf
  
  ;Speicher für die Codegenerierung allokieren
  CodeBuffer = AllocateMemory(22)
  
  ;Hauptthread anhalten
  If SuspendThread_(hThread) = -1
    CloseHandle_(hThread)
    VirtualFreeEx_(hTarget, FileNameAddr, 0, #MEM_RELEASE)
    VirtualFreeEx_(hTarget, CodeAddr, 0, #MEM_RELEASE)
    FreeMemory(CodeBuffer)
    CloseHandle_(hTarget)
    ProcedureReturn 0
  EndIf
  
  ;EIP-Register des Hauptthreads besorgen
  ThreadContext\ContextFlags = #CONTEXT_CONTROL
  If GetThreadContext_(hThread, @ThreadContext) = 0
    VirtualFreeEx_(hTarget, FileNameAddr, 0, #MEM_RELEASE)
    VirtualFreeEx_(hTarget, CodeAddr, 0, #MEM_RELEASE)
    FreeMemory(CodeBuffer)
    ResumeThread_(hThread)
    CloseHandle_(hThread)
    CloseHandle_(hTarget)
    ProcedureReturn 0
  EndIf
  
  ;Code generieren
  PokeB(CodeBuffer, $68) ;push
  Position + 1
  PokeL(CodeBuffer + Position, ThreadContext\Eip)
  Position + 4
  PokeB(CodeBuffer + Position, $9C) ;pushfd
  Position + 1
  PokeB(CodeBuffer + Position, $60) ;pushad
  Position + 1
  PokeB(CodeBuffer + Position, $68) ;push
  Position + 1
  PokeL(CodeBuffer + Position, FileNameAddr)
  Position + 4
  PokeB(CodeBuffer + Position, $B8) ;mov eax,const
  Position + 1
  PokeL(CodeBuffer + Position, LoadLibraryAAddr)
  Position + 4
  PokeW(CodeBuffer + Position, $D0FF) ;call eax
  Position + 2
  PokeB(CodeBuffer + Position, $61) ;popad
  Position + 1
  PokeB(CodeBuffer + Position, $9D) ;popfd
  Position + 1
  PokeB(CodeBuffer + Position, $C3) ;ret
  
  ;Code in den Zielprozess schreiben
  If WriteProcessMemory_(hTarget, CodeAddr, CodeBuffer, 22, @BytesWritten) = 0
    VirtualFreeEx_(hTarget, FileNameAddr, 0, #MEM_RELEASE)
    VirtualFreeEx_(hTarget, CodeAddr, 0, #MEM_RELEASE)
    FreeMemory(CodeBuffer)
    ResumeThread_(hThread)
    CloseHandle_(hThread)
    CloseHandle_(hTarget)
    ProcedureReturn 0
  EndIf
  If BytesWritten<>22
    VirtualFreeEx_(hTarget, FileNameAddr, 0, #MEM_RELEASE)
    VirtualFreeEx_(hTarget, CodeAddr, 0, #MEM_RELEASE)
    FreeMemory(CodeBuffer)
    ResumeThread_(hThread)
    CloseHandle_(hThread)
    CloseHandle_(hTarget)
    ProcedureReturn 0
  EndIf
  
  ;EIP-Register auf den Code setzen
  ThreadContext\Eip = CodeAddr
  ThreadContext\ContextFlags = #CONTEXT_CONTROL
  SetThreadContext_(hThread, @ThreadContext)
  
  ;Zielprozess weiterlaufen lassen
  ResumeThread_(hThread)
  
  ;Aufräumen
  Delay(1000)
  VirtualFreeEx_(hTarget, FileNameAddr, 0, #MEM_RELEASE)
  VirtualFreeEx_(hTarget, CodeAddr, 0, #MEM_RELEASE)
  FreeMemory(CodeBuffer)
  CloseHandle_(hThread)
  CloseHandle_(hTarget)
  
  ProcedureReturn 1
EndProcedure
Wow64Hook.dll:

Code: Alles auswählen

Procedure DisableWow64FsRedirection(Flag)
  If OSVersion()> = #PB_OS_Windows_Vista
    Protected DLL = OpenLibrary(#PB_Any, "kernel32.dll")
    Protected IsWow64, Result
    If DLL
      If CallFunction(DLL, "IsWow64Process", GetCurrentProcess_(), @IsWow64)
        If IsWow64
          Result = CallFunction(DLL, "Wow64EnableWow64FsRedirection", Flag ! 1)
        EndIf
      EndIf
      CloseLibrary(DLL)
    EndIf
  EndIf
  ProcedureReturn Result
EndProcedure

ProcedureDLL AttachProcess(Dummy)
  DisableWow64FsRedirection(#True)
EndProcedure
Launcher:

Code: Alles auswählen

XIncludeFile "inject.pbi"

Define TCName$, Window, Pid, DllName$

; Titel Des Total - Commanders
TCName$ = "Total Commander 7.04a - Thomas Schulze"

; Name der DLL
DllName$ = "Wow64Hook.dll"

Window = FindWindow_(0, TCName$)
If Window
  If GetWindowThreadProcessId_(Window, @Pid)
    InjectDLL(Pid, DllName$)
  EndIf
EndIf
// Edit:

Hab jetzt mal in ein paar Programme die DLL reingehookt. Die Ergebnisse sind ganz unterschiedlich, FreeCommander/WinAmp/Programmer's Notepad/PB/Firefox usw. machts anscheinend gar nichts wenn die DLL drinnen ist, der Windows Explorer und Notepad stürzen ab :?: .
Zuletzt geändert von cxAlex am 16.03.2009 23:12, insgesamt 1-mal geändert.
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

cxAlex hat geschrieben:@ts: Hab mal schnell ein kleines Beispiel gemacht, wie du die Wow64Redirection im TC per DLL Hook deaktivierst. Denn Hook Code hab ich hier aus dem Forum, leider weiß ich nicht mehr von wem:
[...]
Thorium
cxAlex hat geschrieben: Hab jetzt mal in ein paar Programme die DLL reingehookt. Die Ergebnisse sind ganz unterschiedlich, FreeCommander/WinAmp/Programmer's Notepad/PB/Firefox usw. machts anscheinend gar nichts wenn die DLL drinnen ist, der Windows Explorer und Notepad stürzen ab :?: .
Liegt es vielleicht an Unicode?
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

@cxAlex
danke für den Tip, bewirkt aber leider garnichts.
Kiffi hat geschrieben:
ts-soft hat geschrieben:Mit TC komme ich da auch nicht ran, muß immer diesen lahmen Explorer
starten :freak:
Bild
Dein lahmer 32-Bit Explorer kanns auch nicht :mrgreen:

Genug Offtopic, wollen nicht den Thread HiJacken :wink:

// Nachtrag:
Die Lösung für TC ist ja mal wieder ganz einfach :D
cd c:\Windows\Sysnative
in die Favoriten, das wars
Schade das TC keine Frau ist :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten