Что нового

Как узнать, какой процесс использует файл

DanSaratov

Новичок
Сообщения
112
Репутация
1
На форуме уже была подобная тема , но пример из неё уже не работает.
http://autoit-script.ru/index.php?topic=7118
 
Автор
DanSaratov

DanSaratov

Новичок
Сообщения
112
Репутация
1
UP


Добавлено:
Сообщение автоматически объединено:

https://www.autoitscript.com/forum/topic/139347-autoit-unlocker/
Тут все работает, но в коде разобраться не могу (
 
Автор
DanSaratov

DanSaratov

Новичок
Сообщения
112
Репутация
1

Prog

Продвинутый
Сообщения
537
Репутация
65
Запускаешь с правами админа?
Компилируешь в x86 или x64?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
DanSaratov [?]
На форуме уже была подобная тема , но пример из неё уже не работает.
конкретно, какой код из указанной темы использовался?
Какие ошибки при запуске?
 
Автор
DanSaratov

DanSaratov

Новичок
Сообщения
112
Репутация
1
конкретно, какой код из указанной темы использовался?
Какие ошибки при запуске?
Использовал этот код:
Код:
#Include <APIConstants.au3>
#Include <WinAPIEx.au3>

Global $aAdjust, $Result = False, $File = @DesktopDir & '\Test.txt'

FileOpen($File)

$Path = _WinAPI_PathSearchAndQualify($File, 1)
If @error Then
    MsgBox(16, '', $File & ' not found.')
    Exit
EndIf

If Not _WinAPI_FileInUse($Path) Then
    MsgBox(64, '', $Path & ' not used.')
    Exit
EndIf

$hToken = _WinAPI_OpenProcessToken(BitOR($TOKEN_ADJUST_PRIVILEGES, $TOKEN_QUERY))
If (@error) Or (Not _WinAPI_AdjustTokenPrivileges($hToken, $SE_DEBUG_NAME, $SE_PRIVILEGE_ENABLED, $aAdjust)) Then
    MsgBox(16, '', 'You do not have administrator rights.')
    Exit
EndIf

$tHandle = DllStructCreate('ushort;ushort;byte;byte;ushort;ptr;ulong')
$Size = DllStructGetSize($tHandle)
$tSHI = DllStructCreate('ulong;ptr[1048576]')
$pSHI = DllStructGetPtr($tSHI)
$Ret = DllCall('ntdll.dll', 'uint', 'ZwQuerySystemInformation', 'uint', 16, 'ptr', DllStructGetPtr($tSHI), 'ulong', DllStructGetSize($tSHI), 'ulong*', 0)
If (@error) Or ($Ret[0]) Then
    Exit
EndIf
$hAutoIt = _WinAPI_GetCurrentProcess()
For $i = DllStructGetData($tSHI, 1) To 1 Step -1
    $tHandle = DllStructCreate('ushort;ushort;byte;byte;ushort;ptr;ulong', $pSHI + 4 + ($i - 1) * $Size)
    Switch DllStructGetData($tHandle, 3)
        Case 28
            Switch DllStructGetData($tHandle, 7)
                Case 0x00100000, 0x00120189, 0x0012019F
                    ContinueLoop
                Case Else

            EndSwitch
            $hProcess = DllCall('kernel32.dll', 'ptr', 'OpenProcess', 'dword', $PROCESS_DUP_HANDLE, 'int', 0, 'dword', DllStructGetData($tHandle, 1))
            If (Not @error) And ($hProcess[0]) Then
                $hObject = _WinAPI_DuplicateHandle($hProcess[0], DllStructGetData($tHandle, 5), $hAutoIt)
                If $hObject Then
                    If StringInStr(_WinAPI_GetFinalPathNameByHandle($hObject), $Path) Then
                        $Result = MsgBox(64, '', 'File: ' & $Path & @CR & 'Handle: ' & Ptr(DllStructGetData($tHandle, 5)) & @CR & 'PID: ' & DllStructGetData($tHandle, 1) & @CR & 'Path: ' & FileGetLongName(_WinAPI_GetProcessFileName(DllStructGetData($tHandle, 1))))
                    EndIf
                    _WinAPI_CloseHandle($hObject)
                EndIf
                _WinAPI_CloseHandle($hProcess[0])
            EndIf
        Case Else

    EndSwitch
Next

_WinAPI_AdjustTokenPrivileges($hToken, $aAdjust, 0, $aAdjust)
_WinAPI_CloseHandle($hToken)

If Not $Result Then
    MsgBox(16, '', 'Process not found.')
EndIf

Столкнулся с ошибкой:
(46,105) : error: _WinAPI_DuplicateHandle() called with wrong number of args.
Добавил недостающие параметры, как в примере из справки.
http://autoit-script.ru/autoit3_docs/libfunctions/_winapi_duplicatehandle.htm
Получилось вот это:
Код:
_WinAPI_DuplicateHandle($hProcess[0], DllStructGetData($tHandle, 5), $hAutoIt, Default, True, $DUPLICATE_SAME_ACCESS)

Но при запуске скрипта, относительно файла, открытого в другом скрипте командой
Код:
_WinAPI_CreateFile('C:\Program Files (x86)\ScreenBlur\Data\Languages\ru-RU.lang',2,2,0)

получаю ответ Process not found.
 
Автор
DanSaratov

DanSaratov

Новичок
Сообщения
112
Репутация
1
UP


Добавлено:
Сообщение автоматически объединено:

up
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Проведи эксперимент, удали через проводник используемый файл. Проводник покажет сообщение типа: Этот файл используется приложением таким то.. ?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Код:
#Include <APIConstants.au3>
#Include <WinAPIEx.au3>

Global $aAdjust, $Result = False, $File = @ScriptFullPath

FileOpen($File)

$Path = _WinAPI_PathSearchAndQualify($File, 1)
If @error Then
    MsgBox(16, '', $File & ' not found.')
    Exit
EndIf

If Not _WinAPI_FileInUse($Path) Then
    MsgBox(64, '', $Path & ' not used.')
    Exit
EndIf

$hToken = _WinAPI_OpenProcessToken(BitOR($TOKEN_ADJUST_PRIVILEGES, $TOKEN_QUERY))
If (@error) Or (Not _WinAPI_AdjustTokenPrivileges($hToken, $SE_DEBUG_NAME, $SE_PRIVILEGE_ENABLED, $aAdjust)) Then
    MsgBox(16, '', 'You do not have administrator rights.')
    Exit
EndIf

$tHandle = DllStructCreate('ushort;ushort;byte;byte;ushort;ptr;ulong')
$Size = DllStructGetSize($tHandle)
$tSHI = DllStructCreate('ulong;ptr[1048576]')
$pSHI = DllStructGetPtr($tSHI)
$Ret = DllCall('ntdll.dll', 'uint', 'ZwQuerySystemInformation', 'uint', 16, 'ptr', DllStructGetPtr($tSHI), 'ulong', DllStructGetSize($tSHI), 'ulong*', 0)
If (@error) Or ($Ret[0]) Then
    Exit
EndIf
$hAutoIt = _WinAPI_GetCurrentProcess()
For $i = DllStructGetData($tSHI, 1) To 1 Step -1
    $tHandle = DllStructCreate('ushort;ushort;byte;byte;ushort;ptr;ulong', $pSHI + 4 + ($i - 1) * $Size)
    Switch DllStructGetData($tHandle, 3)
        Case 28
            Switch DllStructGetData($tHandle, 7)
                Case 0x00100000, 0x00120189, 0x0012019F
                    ContinueLoop
                Case Else

			EndSwitch
            $hProcess = DllCall('kernel32.dll', 'ptr', 'OpenProcess', 'dword', $PROCESS_DUP_HANDLE, 'int', 0, 'dword', DllStructGetData($tHandle, 1))
            If (Not @error) And ($hProcess[0]) Then
                $hObject = _WinAPI_DuplicateHandle($hProcess[0], DllStructGetData($tHandle, 5), $hAutoIt, 0, 0, 2)
                If $hObject Then
                    If StringInStr(_WinAPI_GetFinalPathNameByHandleEx($hObject), $Path) Then
                        $Result = MsgBox(64, '', 'File: ' & $Path & @CR & 'Handle: ' & Ptr(DllStructGetData($tHandle, 5)) & @CR & 'PID: ' & DllStructGetData($tHandle, 1) & @CR & 'Path: ' & FileGetLongName(_WinAPI_GetProcessFileName(DllStructGetData($tHandle, 1))))
                    EndIf
                    _WinAPI_CloseHandle($hObject)
                EndIf
                _WinAPI_CloseHandle($hProcess[0])
            EndIf
        Case Else

    EndSwitch
Next

_WinAPI_AdjustTokenPrivileges($hToken, $aAdjust, 0, $aAdjust)
_WinAPI_CloseHandle($hToken)

If Not $Result Then
    MsgBox(16, '', 'Process not found.')
EndIf


И хватит уже апать тему.
 
Автор
DanSaratov

DanSaratov

Новичок
Сообщения
112
Репутация
1
Проведи эксперимент, удали через проводник используемый файл. Проводник покажет сообщение типа: Этот файл используется приложением таким то.. ?
Показывает
 
Верх