-
еще дополнение - ниже указанные функции не повлияли на вышеуказанный результат procedure EnableAllPrivileges;
var c1, c2 : dword;
ptp : PTokenPrivileges;
i1 : integer;
begin
if OpenProcessToken(windows.GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, c1) then
try
c2 := 0;
GetTokenInformation(c1, TokenPrivileges, nil, 0, c2);
if c2 <> 0 then begin
ptp := AllocMem(c2);
if GetTokenInformation(c1, TokenPrivileges, ptp, c2, c2) then begin
for i1 := 0 to integer(ptp^.PrivilegeCount) - 1 do
ptp^.Privileges[i1].Attributes := ptp^.Privileges[i1].Attributes or SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(c1, false, ptp^, c2, PTokenPrivileges(nil)^, cardinal(pointer(nil)^));
end;
FreeMem(ptp);
end;
finally CloseHandle(c1) end;
end;
function ChangeFSRedirection(bDisable: Boolean): Boolean;
type
TWow64DisableWow64FsRedirection = Function(Var Wow64FsEnableRedirection: LongBool): LongBool; StdCall;
TWow64EnableWow64FsRedirection = Function(var Wow64FsEnableRedirection: LongBool): LongBool; StdCall;
var
hHandle: THandle;
Wow64DisableWow64FsRedirection: TWow64DisableWow64FsRedirection;
Wow64EnableWow64FsRedirection: TWow64EnableWow64FsRedirection;
Wow64FsEnableRedirection: LongBool;
begin
Result := false;
try
hHandle := GetModuleHandle('kernel32.dll');
@Wow64EnableWow64FsRedirection := GetProcAddress(hHandle, 'Wow64EnableWow64FsRedirection');
@Wow64DisableWow64FsRedirection := GetProcAddress(hHandle, 'Wow64DisableWow64FsRedirection');
if bDisable then
begin
if (hHandle <> 0) and (@Wow64DisableWow64FsRedirection <> nil) then
begin
Wow64DisableWow64FsRedirection(Wow64FsEnableRedirection);
Result := True;
end;
end else
begin
if (hHandle <> 0) and (@Wow64EnableWow64FsRedirection <> nil) then
begin
Wow64EnableWow64FsRedirection(Wow64FsEnableRedirection);
Result := True;
end;
end;
Except
end;
end;
-
ну и последнее забыл - результаты идентичны для пользователей с правами: администратора; домашних пользователей; пользователя.
-
> из проводника win7x64 - C:\Windows\ediskVolume1\Windows\explorer. > exe > > родитель ie64 - C:\Program Files\InterneProgram Files\Internet > Explorer\iexplore.exe > > ie32 - C:\Program Files (x86)\Integram Files (x86)\Internet > Explorer\iexplore.exe
забавные пути...
-
KilkennyCat © (17.06.10 17:10) [18] Ну, вот это и требовалось.
Хотя тут вроде неправильно... > из проводника win7x64 - C:\Windows\ediskVolume1\Windows\explorer.exe Похоже DevicePathToWin32Path криво отработал (опять юникод?). Какой у тебя тут исходный путь? От GetProcessImageFileName.
> еще дополнение - ниже указанные функции не повлияли на вышеуказанный результат Судя по всему единственное проблемное это 64 vs нормального в 32.
-
> забавные пути... У тебя с юникодом нужно размер char на 2 умножать... ну и все сдвинулось из-за этого.
-
исходный путь D:\ тупо сделал так: Move(sRes [1], lpFilename [0], result + 1000); получилось - C:\Windows\explorer.exe
-
да, юникод постоянно преподносит сюрпрайзы... хорошо еще, что тут очевидно.
-
Еще один, наверное окончательный вариант... ;) обработка одного из проверенных здесь (отличие от того - дает полный путь, что и требуется в одном из случаев). uses ... TlHelp32;
function GetModuleFileName(pID: DWORD): string;
var
hSnapshot: THandle;
mEntr: tagMODULEENTRY32;
begin
result:= 'noname';
hSnapshot:= CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pID);
if hSnapshot <> INVALID_HANDLE_VALUE then
try
mEntr.dwSize:= SizeOf(mEntr);
if Module32First(hSnapshot, mEntr) then
result:= mEntr.szExePath;
finally
CloseHandle(hSnapshot)
end;
end;
function ParentProcName: string;
var
pID: DWORD;
hSnapshot: THandle;
ProcessEntry: TProcessEntry32;
begin
result:= 'noname';
hSnapshot:= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if hSnapshot <> INVALID_HANDLE_VALUE then
try
ProcessEntry.dwSize:= SizeOf(ProcessEntry);
if Process32First(hSnapshot, ProcessEntry) then begin
pID:= GetCurrentProcessID;
repeat
if ProcessEntry.th32ProcessID = pID then begin
result:= GetModuleFileName(ProcessEntry.th32ParentProcessID);
Break;
end;
until not Process32Next(hSnapshot, ProcessEntry);
end;
finally
CloseHandle(hSnapshot)
end;
end; На нем и остановлюсь.
-
Ага, я пробовал через снапшот, но где-то ошибался, у меня не заработало... Появится еще время - оформлю все это в какой-нить PsApi2
-
> у меня не заработало... Блин, проверил, у меня тоже ;(. Можно посмотреть ошибку от Module32First (валится тут похоже на ней), "завернуть" ее в Win32Check, но это после, на работу пора. ;)
|