Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.01.02;
Скачать: [xml.tar.bz2];

Вниз

получение активной директории приложения в 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.01.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.042 c
14-1102886138
i-s-v
2004-12-13 00:15
2005.01.02
КЛИЧКО - ЧЕМПИОН!!!


1-1103139136
Kot
2004-12-15 22:32
2005.01.02
Создание теста


1-1103147632
HrenovijMaster
2004-12-16 00:53
2005.01.02
Ctrl+C >> *(%*^(*&amp;^&amp;^(*%5


14-1102934065
alex145
2004-12-13 13:34
2005.01.02
Стать админом


1-1103224643
Torin
2004-12-16 22:17
2005.01.02
Видимость компонента





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский