Текущий архив: 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.53 MB
Время: 0.022 c