Что нового

Процессы Как найти процесс, использующий файл (файл используется другим процессом)

musicstashall

Новичок
Сообщения
264
Репутация
4
Пересмотрел уже массу тем, но предлагаемые в них варианты уже устарели и не работают. Хотелось бы написать актуальный скрипт, работающий в Windows 10 x64 и x86. Задача — найти процесс и по возможности освободить файл от использования в данном процессе.

Этот вариант не работает
Код:
#Include <APIConstants.au3>
#Include <WinAPIEx.au3>
#Include <Array.au3>

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

Local $txt=FileOpen(@DesktopDir & '\Test.txt',2)

$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
            FileWrite($txt, 'PID='&DllStructGetData($tHandle, 1)& @CR)
            ;_ArrayDisplay($aData)
            ;$hProcess = DllCall('kernel32.dll', 'ptr', 'OpenProcess', 'dword', $PROCESS_DUP_HANDLE, 'int', 0, 'dword', DllStructGetData($tHandle, 1))
            $hProcess = _WinAPI_OpenProcess($PROCESS_DUP_HANDLE, 0, DllStructGetData($tHandle, 1))
            If (Not @error) And ($hProcess) Then
               MsgBox('','','OpenProcess')
                $hObject = _WinAPI_DuplicateHandle($hProcess[0], DllStructGetData($tHandle, 5), $hAutoIt, Default, False, $DUPLICATE_SAME_ACCESS)
                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

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

Вот, вроде работает хорошо. Взял разработку с буржуйского сайта и заменил функции на новые или иные, предложенные на том же форуме AutoIt Unlocker
 

Вложения

Последнее редактирование:
Верх