Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.02;
Скачать: CL | DM;

Вниз

получение активной директории приложения в Windows   Найти похожие ветки 

 
tradakad   (2004-11-18 11:54) [0]

Приветсвтвую!
подскажите плиз как получить текущую директорию активного приложения(процесса). т.е. открыл ТОтал командер выбрал диск D:\111 в нем активная директрия D:\111. Свернул ТОтал открыл Експлорер выбрал D:\222 - в нем активная директрия D:\222, а программа как бы должна смотреть какая текущая директория в активном приложении. к примеру по таймеру... GetDir или GetCurrentDir прекрасно работает но определяет текущую директорию запущенной делфи программы Ж) В фоне висит и чудесно определяет  :)
Заранее спасибо!


 
Игорь Шевченко ©   (2004-11-18 11:58) [1]

Можно, но сложно. Для NT-систем через PEB, для Win9x - не знаю.


 
КаПиБаРа ©   (2004-11-18 12:02) [2]

Есть идея.
Поставить глобальный хук и из dll вызывать GetCurrentDir.
Хотя возможно это бред.


 
tradakad   (2004-11-18 12:02) [3]

Простите но что за РЕВ? если можно


 
tradakad   (2004-11-18 12:10) [4]

Глобальный хук.. хм.. а как это на сисетмных ресурсах скажется?


 
DVM ©   (2004-11-18 12:12) [5]


> Глобальный хук.. хм.. а как это на сисетмных ресурсах скажется?

Плохо скажется. Но ИМХО самый легкий путь.


 
clickmaker ©   (2004-11-18 12:13) [6]


> [3] tradakad   (18.11.04 12:02)
> Простите но что за РЕВ? если можно

Process Environment Block - переменные окружения процесса


 
КаПиБаРа ©   (2004-11-18 12:17) [7]

DVM ©   (18.11.04 12:12) [5]
Плохо скажется.


Совсем плохо?


 
DVM ©   (2004-11-18 12:26) [8]


> Совсем плохо?

Смотря с чем сравнивать. Падение производительности наблюдается всегда при установке ловушек. Где-то больше где-то меньше.
Ловушки вообще вещь "нехорошая". Лучше бы их избегать по возможности.


 
Anatoly Podgoretsky ©   (2004-11-18 12:39) [9]

У каждой программы своя текущая папка.


 
tradakad   (2004-11-18 12:40) [10]

ну у меня идея не ловушки.. может как то можно иначе реализовать но ничего другого кроме GetDir я не придумал.. А может как то можно отследить сообщение при смене директори? т.е. кликнул в експлорере по папке , винде пошла команда что то типа SetCurrentDir и это сообщение отследить,?


 
tradakad   (2004-11-18 12:47) [11]

>Anatoly Podgoretsky ©   (18.11.04 12:39) [9]

>У каждой программы своя текущая папка.

я понимаю. о чем и говорю,прога должна видеть активную программу и ее текущую папку.


 
Игорь Шевченко ©   (2004-11-18 12:47) [12]

Для NT/Win2k/XP:

unit main;

interface
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls, Menus;

type
 TfMain = class(TForm)
   ListBox: TListBox;
   lbDir: TLabel;
   MainMenu1: TMainMenu;
   File1: TMenuItem;
   Exit1: TMenuItem;
   View1: TMenuItem;
   Refresh1: TMenuItem;
   procedure Exit1Click(Sender: TObject);
   procedure ListBoxClick(Sender: TObject);
   procedure FormCreate(Sender: TObject);
 private
   procedure RefreshWindows;
   function GetProcessCurrentDirectory (PID: Integer): string;
 end;

var
 fMain: TfMain;

implementation
uses
 NtPeb;

{$R *.DFM}

procedure TfMain.Exit1Click(Sender: TObject);
begin
 Close;
end;

procedure TfMain.ListBoxClick(Sender: TObject);
var
 Wnd: HWND;
 PID: Integer;
begin
 Wnd := HWND(ListBox.Items.Objects[ListBox.ItemIndex]);
 GetWindowThreadProcessId (Wnd, @PID);
 lbDir.Caption := Format("Current process directory: %s", [
   GetProcessCurrentDirectory(PID)]);
end;

procedure TfMain.FormCreate(Sender: TObject);
begin
 RefreshWindows;
end;

function EnumWndProc (Wnd: HWND; Param: LPARAM): LongBool; stdcall;
var
 WndName: array[0..Pred(MAX_PATH)] of char;
begin
 GetWindowText(Wnd, WndName, SizeOf(WndName));
 if WndName[0] <> #0 then
   with TListBox(Param) do
     Items.AddObject(WndName, TObject(Wnd));
 Result := true;
end;

procedure TfMain.RefreshWindows;
begin
 ListBox.Items.Clear;
 EnumWindows(@EnumWndProc, LPARAM(ListBox));
end;

function TfMain.GetProcessCurrentDirectory(PID: Integer): string;
const
 PEBAddress = $7FFDF000;
var
 AProcessHandle: THandle;
 ATargetProcessParametersPointer: Ptr32;
 ATargetProcessParameters: TRTL_USER_PROCESS_PARAMETERS;
 ATargetDirectory: array[0..MAX_PATH] of WideChar;
 AReturned: DWORD;
 APathBytes: WORD;
begin
 Result := "";
 if Win32Platform = VER_PLATFORM_WIN32_NT then begin
   AProcessHandle := OpenProcess(PROCESS_VM_READ, false, PID);
   if AProcessHandle = 0 then
     RaiseLastWin32Error;
   try
     if not ReadProcessMemory(AProcessHandle,
        @PPEB(PEBAddress)^.ProcessParameters,
        @ATargetProcessParametersPointer, SizeOf(Ptr32),
        AReturned) then
       RaiseLastWin32Error;
     if not ReadProcessMemory(AProcessHandle, ATargetProcessParametersPointer,
                              @ATargetProcessParameters,
                              SizeOf(ATargetProcessParameters),
                              AReturned) then
       RaiseLastWin32Error;
     APathBytes := ATargetProcessParameters.CurrentDirectory.DosPath.Length;
     if APathBytes > MAX_PATH * SizeOf(WideChar) then
       APathBytes := MAX_PATH * SizeOf(WideChar);
     if not ReadProcessMemory(AProcessHandle,
       ATargetProcessParameters.CurrentDirectory.DosPath.Buffer,
       @ATargetDirectory,
       APathBytes,
       AReturned) then
       RaiseLastWin32Error;
     Result := WideCharLenToString(ATargetDirectory,
               Pred(AReturned div SizeOf(WideChar)));
   finally
     CloseHandle(AProcessHandle);
   end;
 end;
end;

end.


 
Игорь Шевченко ©   (2004-11-18 12:48) [13]

{
  Модуль: NtPeb

  Описание: Определение структуры блока окружения процесса
            (Process Envirnment Block)
            Структура описана на основе книги Свена Шрайбера
            "Недокументированные возможности Windows 2000"
            и собственных исследований.

  Автор: Игорь Шевченко

  Дата создания: 03.09.2002

  История изменений:
}
unit NtPEB;

interface
uses
 Windows, HsNtDef;

type
 Uint4B = Cardinal;
 Uint2B = Word;
 UChar  = Byte;
 Ptr32  = Pointer;

 PLIST_ENTRY = ^TLIST_ENTRY;
 TLIST_ENTRY = packed record
   Flink            : PLIST_ENTRY;
   Blink            : PLIST_ENTRY;
 end;
 PPLIST_ENTRY = ^PLIST_ENTRY;

 TPEB_LDR_DATA = packed record
   Length           : Uint4B;
   Initialized      : UChar;
   AlignmentBytes   : array[1..3] of Byte;
   SsHandle         : Ptr32;
   { Список элементов TLDR_DATA_TABLE_ENTRY }
   InLoadOrderModuleList : PLIST_ENTRY;
   InMemoryOrderModuleList : PLIST_ENTRY; { Неизвестный список }
   InInitializationOrderModuleList : PLIST_ENTRY; { Неизвестный список }
   EntryInProgress  : Ptr32;
 end;
 PPEB_LDR_DATA = ^TPEB_LDR_DATA;

 TLDR_MODULE_INFO = packed record
   DllBase          : Ptr32;
   EntryPoint       : Ptr32;
   SizeOfImage      : Uint4B;
   FullDllName      : TUNICODE_STRING;
   BaseDllName      : TUNICODE_STRING;
   Flags            : Uint4B;
   LoadCount        : Uint2B;
   TlsIndex         : Uint2B;
   HashLinks        : TLIST_ENTRY;
   SectionPointer   : Ptr32;
   CheckSum         : Uint4B;
   TimeDateStamp    : Uint4B;
   LoadedImports    : Ptr32;
   EntryPointActivationContext : Ptr32; { Может, только в XP }
 end;

 TLDR_DATA_TABLE_ENTRY = packed record
   InLoadOrderLinks : TLIST_ENTRY;
   InMemoryOrderLinks : TLIST_ENTRY;
   InInitializationOrderLinks : TLIST_ENTRY;
   ModuleInfo       : TLDR_MODULE_INFO;
 end;
 PLDR_DATA_TABLE_ENTRY = ^TLDR_DATA_TABLE_ENTRY;

{ Текущий каталог }
type
 TCURDIR = packed record
  DosPath          : TUNICODE_STRING;
  Handle           : Ptr32;
 end;

{ User Process Parameters - пользовательские параметры процесса }
type
 TRTL_USER_PROCESS_PARAMETERS = packed record
  MaximumLength    : Uint4B;
  Length           : Uint4B;
  Flags            : Uint4B;
  DebugFlags       : Uint4B;
  ConsoleHandle    : Ptr32;
  ConsoleFlags     : Uint4B;
  StandardInput    : Ptr32;
  StandardOutput   : Ptr32;
  StandardError    : Ptr32;
  CurrentDirectory : TCURDIR;
  DllPath          : TUNICODE_STRING;
  ImagePathName    : TUNICODE_STRING;
  CommandLine      : TUNICODE_STRING;
  Environment      : Ptr32;
  StartingX        : Uint4B;
  StartingY        : Uint4B;
  CountX           : Uint4B;
  CountY           : Uint4B;
  CountCharsX      : Uint4B;
  CountCharsY      : Uint4B;
  FillAttribute    : Uint4B;
  WindowFlags      : Uint4B;
  ShowWindowFlags  : Uint4B;
  WindowTitle      : TUNICODE_STRING;
  DesktopInfo      : TUNICODE_STRING;
  ShellInfo        : TUNICODE_STRING;
  RuntimeData      : TUNICODE_STRING;
//   +0x090 CurrentDirectores : [32] _RTL_DRIVE_LETTER_CURDIR
 end;

 PRTL_USER_PROCESS_PARAMETERS = ^TRTL_USER_PROCESS_PARAMETERS;
{ Process Environment Block - блок окружения процесса }
type
 TPEB = packed record
   InheritedAddressSpace : UChar;
   ReadImageFileExecOptions : UChar;
   BeingDebugged    : UChar;
   SpareBool        : UChar;
   Mutant           : Ptr32;
   ImageBaseAddress : Ptr32;
   Ldr              : PPEB_LDR_DATA; { Данные загрузчика }
   ProcessParameters : PRTL_USER_PROCESS_PARAMETERS { _RTL_USER_PROCESS_PARAMETERS };
   SubSystemData    : Ptr32;
   ProcessHeap      : Ptr32;
   FastPebLock      : Ptr32; { _RTL_CRITICAL_SECTION }
   FastPebLockRoutine : Ptr32;
   FastPebUnlockRoutine : Ptr32;
   EnvironmentUpdateCount : Uint4B;
   KernelCallbackTable : Ptr32;
   SystemReserved   : Uint4B;
   ExecuteOptions   : Uint4B; {Pos 0, 2 Bits, SpareBits  : Pos 2, 30 Bits }
   FreeList         : Ptr32; { _PEB_FREE_BLOCK }
   TlsExpansionCounter : Uint4B;
   TlsBitmap        : Ptr32;
   TlsBitmapBits    : array[0..1] of Uint4B;
   ReadOnlySharedMemoryBase : Ptr32;
   ReadOnlySharedMemoryHeap : Ptr32;
   ReadOnlyStaticServerData : Ptr32;
   AnsiCodePageData : Ptr32;
   OemCodePageData  : Ptr32;
   UnicodeCaseTableData : Ptr32;
   NumberOfProcessors : Uint4B;
   NtGlobalFlag     : Uint4B;
   Reserved         : Uint4B;
   CriticalSectionTimeout : TLARGEINTEGER;
   HeapSegmentReserve : Uint4B;
   HeapSegmentCommit : Uint4B;
   HeapDeCommitTotalFreeThreshold : Uint4B;
   HeapDeCommitFreeBlockThreshold : Uint4B;
   NumberOfHeaps    : Uint4B;
   MaximumNumberOfHeaps : Uint4B;
   ProcessHeaps     : Ptr32;
   GdiSharedHandleTable : Ptr32;
   ProcessStarterHelper : Ptr32;
   GdiDCAttributeList : Uint4B;
   LoaderLock       : Ptr32;
   OSMajorVersion   : Uint4B;
   OSMinorVersion   : Uint4B;
   OSBuildNumber    : Uint2B;
   OSCSDVersion     : Uint2B;
   OSPlatformId     : Uint4B;
   ImageSubsystem   : Uint4B;
   ImageSubsystemMajorVersion : Uint4B;
   ImageSubsystemMinorVersion : Uint4B;
   ImageProcessAffinityMask : Uint4B;
   { Остальные данные опущены }
 end;

 PPEB = ^TPEB;

function GetPEB() : PPEB;

implementation

function GetPEB() : PPEB; assembler;
asm
 mov eax,fs:[24]
 mov eax,[eax+48]
end;

end.


 
Игорь Шевченко ©   (2004-11-18 12:48) [14]

{
  Модуль: HSNtDef

  Описание: Определения стандартных типов, используемых в Native API

  Автор: Игорь Шевченко

  Дата создания: 29.10.2002

  История изменений:
  14.03.2003 Добавлено описание структуры OBJECT_ATTRIBUTES
  08.07.2003 Добавлено описание структуры IO_STATUS_BLOCK
  05.03.2004 Добавлено описание структуры ANSI_STRING
}
unit HSNtDef;

interface
uses
 Windows;

type
 NTSTATUS = Integer;
 PNTSTATUS = ^NTSTATUS;
 PVOID = Pointer;

{ Структура UNICODE_STRING - Передача строковых параметров для Native API и
 хранение строк во внутренних структурах Windows }
 TUnicodeString = packed record
   Length : WORD;
   MaximumLength : WORD;
   Buffer : PWideChar;
 end;
 PUnicodeString = ^TUnicodeString;
 TUNICODE_STRING = TUnicodeString;
 UNICODE_STRING = TUnicodeString;
 PUNICODE_STRING = PUnicodeString;

{ Структура ANSI_STRING - Передача строковых параметров для Native API и
 хранение строк во внутренних структурах Windows }
 TAnsiString = packed record
   Length : WORD;
   MaximumLength : WORD;
   Buffer : PAnsiChar;
 end;
 PAnsiString = ^TAnsiString;
 TANSI_STRING = TAnsiString;
 ANSI_STRING = TAnsiString;
 PANSI_STRING = ^TAnsiString;

 CLIENT_ID = packed record
   UniqueProcess : THandle;
   UniqueThread : THandle;
 end;
 PCLIENT_ID = ^CLIENT_ID;

{ Структура OBJECT_ATTRIBUTES - Передача имени, атрибутов и местоположения
 объекта для Native API }
{ !!! Внимание !!! Структура OBJECT_ATTRIBUTES должна быть выровнена на границу
 32-х битного слова, иначе вызов NtOpen.... вернет статус
 STATUS_DATATYPE_MISALIGNMENT }
 POBJECT_ATTRIBUTES = ^OBJECT_ATTRIBUTES;
 OBJECT_ATTRIBUTES = packed record
   Length : ULONG;
   RootDirectory : THandle;
   ObjectName : PUNICODE_STRING;
   Attributes : ULONG;
   SecurityDescriptor : PVOID;        // Points to type SECURITY_DESCRIPTOR
   SecurityQualityOfService : PVOID;  // Points to type SECURITY_QUALITY_OF_SERVICE
 end;
 
 TIoStatusBlock = packed record
  Status : NTSTATUS;
  Information : ULONG;
 end;
 IO_STATUS_BLOCK = TIoStatusBlock;
 PIoStatusBlock = ^TIoStatusBlock;

 TIoApcRoutine = procedure (ApcContext: Pointer; IoStatusBlock: PIoStatusBlock;
   Reserved: ULONG ); stdcall;

const
{ Расшифровка поля Information структуры IO_STATUS_BLOCK }
 FILE_SUPERSEDED     = $00000000;
 FILE_OPENED         = $00000001;
 FILE_CREATED        = $00000002;
 FILE_OVERWRITTEN    = $00000003;
 FILE_EXISTS         = $00000004;
 FILE_DOES_NOT_EXIST = $00000005;

{ Атрибуты объекта (поле Attributes структуры OBJECT_ATTRIBUTES) }
 OBJ_INHERIT = $00000002;
 OBJ_PERMANENT = $00000010;
 OBJ_EXCLUSIVE = $00000020;
 OBJ_CASE_INSENSITIVE = $00000040;
 OBJ_OPENIF = 00000080;
 OBJ_OPENLINK = $00000100;
 OBJ_KERNEL_HANDLE = $00000200;
 OBJ_FORCE_ACCESS_CHECK = $00000400;

function NT_SUCCESS (rc: NTSTATUS): Boolean;

implementation

function NT_SUCCESS (rc: NTSTATUS): Boolean;
begin
 Result := rc >= 0;
end;

end.



 
tradakad   (2004-11-18 12:59) [15]

ДЛя Игоря Шевченко - просто супер. спасибо! буду пробовать Ж)


 
tradakad   (2004-11-18 14:13) [16]

в принципе если подойти к этой задаче с другой стороны. смысл в том чтобы программа не давала доступа к опр. директории например d:\111\222 . Т.е. если пользователь пытается зайти в эту папку то программа автоматом сменяет текущую директорию текущего приложения на d:\111. Нноо, даже если это будет хук или сервис - в сейфмоде можно будет как то отрубить прогу (я так думаю), но если сделать защиту для папки по приципу виндовой SystemVolumeInformation ? ТОгда никаких хуков не нужно вовсе со всеми вытекающими, да и сейфмоде не поможет. что думает уважаемый All по эотму поводу?


 
panov ©   (2004-11-18 14:29) [17]

>tradakad   (18.11.04 14:13) [16]
Доступ к каталогам запрещается на уровне системы, остальное от лукавого.


 
tradakad   (2004-11-18 14:39) [18]

>Доступ к каталогам запрещается на уровне системы, остальное от >лукавого.

но FolderGuard как то это делает?


 
tradakad   (2004-11-18 14:41) [19]

Удалено модератором


 
DVM ©   (2004-11-18 15:10) [20]


> но FolderGuard как то это делает?

драйвером (под NT другого способа нет)



Страницы: 1 вся ветка

Текущий архив: 2005.01.02;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.047 c
14-1102884178
Юрий Зотов
2004-12-12 23:42
2005.01.02
Загадка


14-1102575072
Чеширский_Кот
2004-12-09 09:51
2005.01.02
Байер (Германия) - Динамо (Киев) 3:0


3-1102339108
mouse_web
2004-12-06 16:18
2005.01.02
Двойные кавычки в запросе


1-1103194660
Socol
2004-12-16 13:57
2005.01.02
работа с текстовыми файлами


1-1103477260
Nata
2004-12-19 20:27
2005.01.02
dbedit