Что нового

[Процессы] Как отследить не занят ли файл другим процессом

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Yashied
Вариант для Win 7 уже не работает, в _WinAPI_DuplicateHandle есть три опущенных обязательных параметра, я добавил их из справки (Default, True, $DUPLICATE_SAME_ACCESS), но результат всё равно «Process not found». :scratch:
 

DanSaratov

Новичок
Сообщения
112
Репутация
1
CreatoR сказал(а):
Yashied
Вариант для Win 7 уже не работает, в _WinAPI_DuplicateHandle есть три опущенных обязательных параметра, я добавил их из справки (Default, True, $DUPLICATE_SAME_ACCESS), но результат всё равно «Process not found». :scratch:
Та же самая проблема. Как заставить это дело снова работать?


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

UP
 

muskin2029

Новичок
Сообщения
6
Репутация
0
Всем привет.
C AutoIt-ом знаком несколько дней, но пакет очень понравился.
Понадобился пример, приведенный ниже:

Yashied сказал(а):
Ребята, вы, как кодеры, уже давно должны работать в Windows 7... Вот для XP:

Код:
#Include <APIConstants.au3>
#Include <WinAPIEx.au3>

Global $aAdjust, $Result = False, $File = @ScriptDir & '\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)
$tFNI = DllStructCreate('ulong;wchar[4096]')
$tIOSB = DllStructCreate('ptr;ulong_ptr')
$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
					$Ret = DllCall('ntdll.dll', 'uint', 'ZwQueryInformationFile', 'ptr', $hObject, 'ptr', DllStructGetPtr($tIOSB), 'ptr', DllStructGetPtr($tFNI), 'ulong', DllStructGetSize($tFNI), 'uint', 9)
					If (Not @error) And (Not $Ret[0]) And (Not StringCompare(DllStructGetData(DllStructCreate('wchar[' & (DllStructGetData($tFNI, 1) / 2) & ']', DllStructGetPtr($tFNI, 2)), 1), StringTrimLeft($Path, 2))) 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
;					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

Запускаю и получаю следующее:
Код:
"C:\Users\Admin\Desktop\??????? VFP\AutoIt\temp_XP.au3" (49) : ==> Incorrect number of parameters in function call.:
$hObject = _WinAPI_DuplicateHandle($hProcess[0], DllStructGetData($tHandle, 5), $hAutoIt)
$hObject = ^ ERROR

Почитал help и msdn, заменил на следующий вызов:
Код:
$hObject =  _WinAPI_DuplicateHandle($hProcess[0], DllStructGetData($tHandle, 5), $hProcess[0], 0, true,  $DUPLICATE_SAME_ACCESS)


Открываю Test.txt из ScriptDir, запускаю скрипт, но Test.txt не находится.
Помогите разобраться с параметрами _WinAPI_DuplicateHandle.
 
Верх