purebasic.info

PureBasic forum
Текущее время: Пн фев 26, 2018 12:52 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: Нахождение процесса...
СообщениеДобавлено: Чт ноя 07, 2013 3:48 pm 
Не в сети
профессор

Зарегистрирован: Вт мар 24, 2009 11:54 am
Сообщений: 356
Благодарил (а): 13 раз.
Поблагодарили: 18 раз.
Пункты репутации: 19
Всем привет.
Встала такая проблема или лучше сказать задача : "определить приложение которое использует определенный файл".
Т.е. есть есть некая папка где куча файлов и к некоторым файлам нет доступа в связи с использованием другим процесс (программой)
Как определить программу (процесс)? :?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Нахождение процесса...
СообщениеДобавлено: Чт ноя 07, 2013 4:41 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Вт сен 11, 2012 11:48 am
Сообщений: 35
Благодарил (а): 2 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
У Руссиновича есть утилита handle.exe.
http://technet.microsoft.com/en-us/sysi ... 96655.aspx
Из командной строки она выдаёт результат, кто использует процесс.
Эту утилиту вомнтировать в свой код и вызывать её по необходимости.
Писать ей название интересующего файла, она выдаёт кто его использует.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Нахождение процесса...
СообщениеДобавлено: Чт ноя 07, 2013 6:36 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1583
Откуда: Алматы
Благодарил (а): 13 раз.
Поблагодарили: 39 раз.
Пункты репутации: 5
похожую задачу я вроде встречал... правда в моем случае проверялся занятый порт, а не файл... и код скорей всего сразу не запустица, так как выдернул из разных частей программы. но в целом представление должен дать.

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
Structure MIB_TCPTABLE_OWNER_PID 
  dwStats.l
  dwLocalAddr.l
  dwLocalPort.l
  dwRemoteAddr.l
  dwRemotePort.l
  dwOwningPid.l
EndStructure
 
Structure MIB_TCPTABLE
  dwNumEntries.l
  table.MIB_TCPTABLE_OWNER_PID[2048]
EndStructure
 
Global PSAPI
 
Prototype.l EnumProcessModules(a,b,c,d)
Prototype.l GetModuleBaseName(a,b,c.p-ascii,d)
 
PSAPI=OpenLibrary(#PB_Any,"psapi.dll")
If PSAPI
   Global EnumProcessModules.EnumProcessModules = GetFunction(PSAPI, "EnumProcessModules")
   Global GetModuleBaseName.GetModuleBaseName  = GetFunction(PSAPI, "GetModuleBaseNameA")
EndIf
 
ProcedureDLL.s GetProcessName2(PID);get the name of the process
  ;MessageRequester("Info",Str(PID),0)
  hProcess = OpenProcess_(#PROCESS_QUERY_INFORMATION | #PROCESS_VM_READ, 0, PID)
  If hProcess
    Result=EnumProcessModules(hProcess, @BaseModule, 4, @cbNeeded)
    LName3$ = Space(255)
    Result=GetModuleBaseName(hProcess, BaseModule, LName3$, Len(LName3$))
    CloseHandle_(hProcess)
    ; MessageRequester("Info " +Str(Result),LNAme3$,0)
    ProcedureReturn LName3$
  Else
    ProcedureReturn "Неизвестная Программа"
  EndIf
EndProcedure
 
 
  nmprgrm$ = ""
  If OpenLibrary(0, "iphlpapi.dll")
     dwSize = $0
     If CallFunction(0,"GetExtendedTcpTable",@tcpTable.MIB_TCPTABLE , @dwSize, #True,2,5,0)  
     If CallFunction(0,"GetExtendedTcpTable",@tcpTable.MIB_TCPTABLE , @dwSize, #True,2,5,0) = #NO_ERROR
        For cnt = 0 To tcpTable\dwNumEntries - 1
            If htons_(tcpTable\table[cnt]\dwLocalPort) = 80 ; port
               nmprgrm$ = GetProcessName2(tcpTable\table[cnt]\dwOwningPid)
               Break
            EndIf
        Next
     EndIf
     EndIf
     CloseLibrary(0)
  EndIf  
 
  MessageRequester("Ошибка!", "80 порт уже занят другой программой " + nmprgrm$)
 
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Нахождение процесса...
СообщениеДобавлено: Чт ноя 07, 2013 9:23 pm 
Не в сети
профессор

Зарегистрирован: Вс июн 10, 2012 8:18 am
Сообщений: 1294
Благодарил (а): 60 раз.
Поблагодарили: 49 раз.
Пункты репутации: 14
cherri123 писал(а):
"определить приложение которое использует определенный файл"

Я тут подобным вопросом задавался. В конце темы есть буржуйский код, правда он работает не так быстро, как хотелось бы.

ЗЫ: Задолбала 502 ошибка. Админ, меняй хостера. :x


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Нахождение процесса...
СообщениеДобавлено: Пт ноя 08, 2013 8:24 am 
Не в сети
профессор

Зарегистрирован: Вт мар 24, 2009 11:54 am
Сообщений: 356
Благодарил (а): 13 раз.
Поблагодарили: 18 раз.
Пункты репутации: 19
Спс буду курить :wink:


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Нахождение процесса...
СообщениеДобавлено: Чт фев 08, 2018 2:15 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Сб сен 05, 2015 11:30 am
Сообщений: 32
Благодарил (а): 2 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
 
#SYSTEM_HANDLE_INFORMATION=16
#OBJECT_NAME_INFORMATION=1
 
iz=SizeOf(Integer)
If iz=8
  ne=$18
Else
  ne=$10
EndIf
size=64
buf=AllocateMemory(size)
buf2=AllocateMemory(768)
p=buf
 
 
Repeat
  result=NtQuerySystemInformation_(#SYSTEM_HANDLE_INFORMATION, buf, size, @all)
  ;Debug "try len "+Str(size)
  If all=0
    Break
  EndIf
  If all>size
    size=all+64
    buf=ReAllocateMemory(buf, size)
    p=buf
  EndIf
 
Until result=0
 
count=PeekI(p):p+iz
c=count
;Debug "Handle count "+Str(c)
 
pid=1348
h1=OpenProcess_(#PROCESS_ALL_ACCESS, 0, pid)
hc=GetCurrentProcess_()
     
Repeat
  c-1
  tid=PeekU(p)
  If tid=pid Or pid=0
    oj=PeekU(p+4)
    ha=PeekU(p+6)
    If oj=28
      rt=NtDuplicateObject_(h1,ha,hc,@out,#GENERIC_ALL,0,#DUPLICATE_SAME_ACCESS)
      ;
      sc=NtQueryObject_(out,#OBJECT_NAME_INFORMATION,buf2,768,@oi)
     
      sz=PeekU(buf2)
      If sz>0
        name$=PeekS(buf2+16,-1,#PB_Unicode)
        Debug Str(oj)+" "+name$
      EndIf
     
     
     
      NtClose_(out)
    EndIf
  EndIf
  p+ne
Until c<=0
 
FreeMemory(buf)
FreeMemory(buf2)



Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB