purebasic.info

PureBasic forum
Текущее время: Ср апр 25, 2018 11:03 pm

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




Начать новую тему Ответить на тему  [ Сообщений: 129 ]  На страницу 1, 2, 3, 4, 5 ... 9  След.
Автор Сообщение
 Заголовок сообщения: Process Viewer
СообщениеДобавлено: Пн июн 20, 2011 11:29 am 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Слепил гляделку процессов. Сам ничего не придумывал. Часть портировал с делфей, часть с буржуйского форума. Список получаем через native api ZwQuerySystemInformation()
Имеется возможность килять процессы
Код:
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
Enumeration
  #Window_0
EndEnumeration
Enumeration
  #ListIcon_0
  #ListIcon_1
  #Button_1
  #Button_2
  #Button_3
  #Font_ListIcon_0
  #Font_ListIcon_1
  #StatusBar
  #Splitter_2
  #Hyper
EndEnumeration
Define.l Event, EventWindow, EventGadget, EventType, EventMenu
Global popup.b
  #STATUS_INFO_LENGTH_MISMATCH = $C0000004
  #SystemProcessesAndThreadsInformation = 5
  #STATUS_SUCCESS = 0
 
 Structure VM_COUNTERS
   PeakVirtualSize.l
   VirtualSize.l
   PageFaultCount.l
   PeakWorkingSetSize.l
   WorkingSetSize.l
   QuotaPeakPagedPoolUsage.l
   QuotaPagedPoolUsage.l
   QuotaPeakNonPagedPoolUsage.l
   QuotaNonPagedPoolUsage.l
   PagefileUsage.l
   PeakPagefileUsage.l
EndStructure
 
Structure IO_COUNTERS
   ReadOperationCount.LARGE_INTEGER
   WriteOperationCount.LARGE_INTEGER
   OtherOperationCount.LARGE_INTEGER
   ReadTransferCount.LARGE_INTEGER
   WriteTransferCount.LARGE_INTEGER
   OtherTransferCount.LARGE_INTEGER
EndStructure
 
Structure TClientID
  UniqueProcess.l
  UniqueThread.l
EndStructure
 
Structure TUnicodeString
  Length.w                     ; Длина строки без терминального нуля
  MaximumLength.w              ; Полная длина буфера
  *Buffer.l                    ; Указатель на буфер для UNICODE-строки
EndStructure
 
Structure SYSTEM_THREADS
  KernelTime.LARGE_INTEGER
  UserTime.LARGE_INTEGER
  CreateTime.LARGE_INTEGER
  WaitTime.l
  StartAddress.l
  ClientId.TClientId
  Priority.l
  BasePriority.l
  ContextSwitchCount.l
  State.l
  WaitReason.l
EndStructure
 
Structure SYSTEM_PROCESSES
   NextEntryDelta.l             ; Смещение следующей структуры от начала этой
   ThreadCount.l                ; Количество потоков процесса
   Reserved1.l[6]
   CreateTime.LARGE_INTEGER     ; Временные характеристики процесса
   UserTime.LARGE_INTEGER
   KernelTime.LARGE_INTEGER
   ProcessName.TUnicodeString   ; Имя процесса
   BasePriority.l               ; Базовый приоритет
   ProcessId.l                  ; Идентификатор процесса – PID
   InheritedFromProcessId.l     ; PID родителя
   HandleCount.l                ; Открытые дестрипторы
   Reserved2.l[1]
   ;  Счетчики с инфой об использовании памяти и системы ввода-вывода.
   VmCounters.VM_COUNTERS
   IoCounters.IO_COUNTERS       ; Windows 2000 only
   ;  Массив структур с инфой о потоках процесса
   Threads.SYSTEM_THREADS[0]
 EndStructure
 
Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 150, 30, 691, 755, "Process Viewer", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
    ListIconGadget(#ListIcon_0, 15, 15, 660, 400, "Name", 268, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect|#PB_ListIcon_GridLines)
    SetGadgetFont(#ListIcon_0, LoadFont(#Font_ListIcon_0, "Courier New", 8, #PB_Font_HighQuality))
    AddGadgetColumn(#ListIcon_0, 1, "PID", 90)
    AddGadgetColumn(#ListIcon_0, 2, "Priority", 90)
    AddGadgetColumn(#ListIcon_0, 3, "Threads", 90)
    AddGadgetColumn(#ListIcon_0, 4, "Descriptor", 100)
    ListIconGadget(#ListIcon_1, 15, 415, 660, 270, "Module name", 150, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect|#PB_ListIcon_GridLines)
    SetGadgetFont(#ListIcon_1, LoadFont(#Font_ListIcon_1, "Courier New", 8, #PB_Font_HighQuality))
    AddGadgetColumn(#ListIcon_1, 1, "FileName", 400)
    AddGadgetColumn(#ListIcon_1, 2, "Image Base", 85)
    SplitterGadget(#Splitter_2, 15, 15, 660, 670, #ListIcon_0, #ListIcon_1, #PB_Splitter_Separator)
    SetGadgetState(#Splitter_2, 400)
    ButtonGadget(#Button_1, 505, 695, 165, 25, "Get Process List")
    ButtonGadget(#Button_2, 400, 695, 70, 25, "PowerOFF")
    ButtonGadget(#Button_3, 300, 695, 70, 25, "Reboot")
    If CreateStatusBar(#StatusBar, WindowID(#Window_0))
       AddStatusBarField(100)
       AddStatusBarField(1000)
    EndIf  
    If CreatePopupMenu(0)
       MenuItem(1, "Kill Process")
       MenuItem(2, "Open Folder")
    EndIf
    HyperLinkGadget(#Hyper, 30, 705, 10, 15, "?", $0000FF)
  EndIf
EndProcedure
 
Procedure ModuleEntry(pid)
me32.MODULEENTRY32
me32\dwSize = SizeOf(MODULEENTRY32)
hSnapShot = CreateToolhelp32Snapshot_(#TH32CS_SNAPMODULE, pid)
If hSnapShot
  ClearGadgetItems(#ListIcon_1)
  If Module32First_(hSnapShot, me32)
    Repeat
      result = Module32Next_(hSnapShot, me32)
      If result
        AddGadgetItem(#ListIcon_1, -1, UCase(PeekS(@me32\szModule))+Chr(10)+PeekS(@me32\szExePath)+Chr(10)+RSet(Hex(me32\modBaseAddr, #PB_Integer), 8, "0"))
      EndIf
    Until result = #False
  EndIf
  CloseHandle_(hSnapShot)
Else
  MessageRequester("Error", "CreateToolhelp32Snapshot_() failed!")
EndIf
EndProcedure
 
Procedure EnableDebugPrivNT(aPrivilegeName.s)
   DebugValue.LUID
   tkp.TOKEN_PRIVILEGES
   ; Retrieve a handle of the access token
   If Not OpenProcessToken_(GetCurrentProcess_(),#TOKEN_ADJUST_PRIVILEGES|#TOKEN_QUERY,@hToken)
      ProcedureReturn #False;
   EndIf
   ; Enable the SE_DEBUG_NAME privilege  
   If Not LookupPrivilegeValue_("", aPrivilegeName, @DebugValue)
      CloseHandle_(hToken)
      ProcedureReturn #False;
   EndIf
   NewState.TOKEN_PRIVILEGES
   With NewState
     \PrivilegeCount=1
     \Privileges[0]\Luid\HighPart=DebugValue\HighPart
     \Privileges[0]\Luid\LowPart=DebugValue\LowPart
     \Privileges[0]\Attributes=#SE_PRIVILEGE_ENABLED
   EndWith
   AdjustTokenPrivileges_(hToken,#False,@NewState,SizeOf(TOKEN_PRIVILEGES),@PreviousState.TOKEN_PRIVILEGES,@ReturnLength)
   If hToken : CloseHandle_(hToken) : EndIf
EndProcedure
 
Procedure.s FilePath(pid)
 processname$ = ""
 hprocess = OpenProcess_(#PROCESS_ALL_ACCESS,#Null,pid)
 If hprocess
   psapilib=OpenLibrary(#PB_Any,"psapi.dll")
   If psapilib
      GetModuleFileNameEx=GetFunction(psapilib,"GetModuleFileNameExA")
      If GetModuleFileNameEx
        processname$=Space(#MAX_PATH)
        CallFunctionFast(GetModuleFileNameEx, hprocess, #Null, @processname$, #MAX_PATH)
      EndIf  
    EndIf
 EndIf
 ProcedureReturn processname$
EndProcedure
 
Procedure  KillProcByPid(pid.l)
ExitCode.l
hp.l
RetVal.b = #True;
If pid
        hp = OpenProcess_(#PROCESS_ALL_ACCESS, #True, pid)
        If hp
            GetExitCodeProcess_(hp, @ExitCode);
            RetVal = TerminateProcess_(hp, ExitCode)
            CloseHandle_(hp)
        Else
            RetVal = #False
        EndIf  
Else
            RetVal =  #False;
EndIf
   ProcedureReturn RetVal
EndProcedure
 
Procedure GetProcessesList()
  RetVal.l
  *pBuffer.SYSTEM_PROCESSES
  *pCur.SYSTEM_PROCESSES
  ReturnLength.l
  i.w
  ProcessName.s
  ReturnLength = 0
   ; Запрашиваем размер требуемого буфера
  RetVal = ZwQuerySystemInformation_(#SystemProcessesAndThreadsInformation, #Null, 0, @ReturnLength)
;  RetVal = NtQuerySystemInformation_(#SystemProcessesAndThreadsInformation, #Null, 0, @ReturnLength)
   ; Резервируем буфер
   *pBuffer = AllocateMemory(ReturnLength)
   ; Получаем информацию о процессах в буфер            ;
  RetVal = ZwQuerySystemInformation_(#SystemProcessesAndThreadsInformation, *pBuffer, ReturnLength, @ReturnLength)
;  RetVal = NtQuerySystemInformation_(#SystemProcessesAndThreadsInformation, *pBuffer, ReturnLength, @ReturnLength)
  If RetVal = #STATUS_SUCCESS
    ClearGadgetItems(#ListIcon_0)
    *pCur = *pBuffer            ; Инициируем указатель на текущую структуру
    i = 0                       ; Инициируем счетчик процессов. Его можно и не использовать.
    ; Проходим в цикле по всей цепочке структур
    Repeat
      i+1                       ; Увеличиваем счетчик процессов.
      ; Смотрим длину имени процесса и если оно не равно 0,
      ; то читаем строку из буфера, иначе – имя = [System Idle Process]      
      If *pCur\ProcessName\Length = 0
        ProcessName = "[System Idle Process]"  
      Else
        ProcessName = PeekS(*pCur\ProcessName\Buffer  , -1, #PB_Unicode)
      EndIf
      ; Добавляем инфу о процессе в ListIconGadget
        ico = ExtractIcon_(0,FilePath(*pCur\ProcessId),0)
      If  Not ico
         ico = ExtractIcon_(0,GetSystemDirectory()+ "\shell32.dll",2)
      EndIf
        AddGadgetItem(#ListIcon_0, -1, ProcessName+Chr(10)+RSet(Hex(*pCur\ProcessId),8,"0")+Chr(10)+Str(*pCur\BasePriority)+Chr(10)+Str(*pCur\ThreadCount)+Chr(10)+Str(*pCur\HandleCount), ico)
      ; Если структур нет, тогда на выход
      If *pCur\NextEntryDelta = 0 : Break : EndIf
      ; Вычисляем указатель на следующую структуру SYSTEM_PROCESSES
      ; Для этого к адресу этой структуру прибавляем смещение следующей
      ; из поля NextEntryDelta
        *pCur = *pCur + *pCur\NextEntryDelta
      ; Крутим цикл, пока есть следующая структура  
    ForEver
   
    StatusBarText(#StatusBar, 0, "Process Loaded: "+Str(i))
     SendMessage_(GadgetID(#ListIcon_0),#WM_VSCROLL,#SB_BOTTOM,0)
     SetGadgetState(#ListIcon_0, i-1)
     SetFocus_(GadgetID(#ListIcon_0))
      pid = Hex2Dec(GetGadgetItemText(#ListIcon_0, GetGadgetState(#ListIcon_0) , 1))
      StatusBarText(#StatusBar, 1, FilePath(pid))
      Sleep_(100)
      ModuleEntry(pid)
    popup = 1
    FreeMemory(*pBuffer)
  EndIf  
EndProcedure  
 
OpenWindow_Window_0()
GetProcessesList()
EnableDebugPrivNT("SeDebugPrivilege")                   ; Даем нашему процессу крутые привелегии
Repeat
 If popup = 1
    If GetAsyncKeyState_(#VK_UP)=-32767
         pid = Hex2Dec(GetGadgetItemText(#ListIcon_0, GetGadgetState(#ListIcon_0) , 1))
         StatusBarText(#StatusBar, 1, FilePath(pid))
         ModuleEntry(pid)
    ElseIf GetAsyncKeyState_(#VK_DOWN)=-32767
         pid = Hex2Dec(GetGadgetItemText(#ListIcon_0, GetGadgetState(#ListIcon_0) , 1))
         StatusBarText(#StatusBar, 1, FilePath(pid))
         ModuleEntry(pid)
    EndIf    
 EndIf
 
  Event = WaitWindowEvent()
  Select Event
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
      If EventGadget = #ListIcon_0
        If EventType() = #PB_EventType_RightClick
           If popup = 1 : DisplayPopupMenu(0, WindowID(#Window_0)) : EndIf
        ElseIf EventType() = #PB_EventType_LeftClick
           pid = Hex2Dec(GetGadgetItemText(#ListIcon_0, GetGadgetState(#ListIcon_0) , 1))
           StatusBarText(#StatusBar, 1, FilePath(pid))
           ModuleEntry(pid)
        EndIf
      ElseIf EventGadget = #Hyper
             MessageRequester("About", "           Created by crc1              "+ Chr(10)+"          Copyright © 2011", 0)  
      ElseIf EventGadget = #Button_1
        GetProcessesList()
      ElseIf EventGadget = #Button_2
        EnableDebugPrivNT("SeShutdownPrivilege")       ; Даем нашему процессу привелегию на перезагрузку\выключение
        ExitWindowsEx_(#EWX_POWEROFF, 0)               ; выключение
      ElseIf EventGadget = #Button_3
        EnableDebugPrivNT("SeShutdownPrivilege")       ; Даем нашему процессу привелегию на перезагрузку\выключение
        ExitWindowsEx_(#EWX_REBOOT, 0)                 ; перезагрузка
      EndIf
    Case #PB_Event_Menu
      If EventGadget() = 1
         pid = Hex2Dec(GetGadgetItemText(#ListIcon_0, GetGadgetState(#ListIcon_0) , 1))
         If KillProcByPid(pid)
            Sleep_(100)
            GetProcessesList()
         Else
            MessageRequester("Error", "Can not terminate process!", #MB_OK|#MB_ICONERROR)
         EndIf
      ElseIf EventGadget() = 2
         pid = Hex2Dec(GetGadgetItemText(#ListIcon_0, GetGadgetState(#ListIcon_0) , 1))
         Folder$ = GetPathPart(FilePath(pid))
         If Folder$
             ShellExecute_(WindowID(#Window_0), @"explore", 0, 0, Folder$, #SW_SHOWNORMAL)
         EndIf
;         StatusBarText(#StatusBar, 0, FilePath(pid))
      EndIf
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window_0
        CloseWindow(#Window_0)
        Break
      EndIf
  EndSelect
ForEver


_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн июн 20, 2011 5:01 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Сб июл 18, 2009 8:25 am
Сообщений: 810
Откуда: Нерезиновая
Благодарил (а): 21 раз.
Поблагодарили: 4 раз.
Пункты репутации: 0
Пётр писал(а):
Volkoff писал(а):
ZwQuerySystemInformation
Может плохо искал, но примера на пурике с использование этой API'шки не встречал. :(

Вот и пример :)
pablov
Спасибо за код.
Если есть желание усовершенствовать - см. текст ниже, если нет, не читай :)

Так вот, простое получение списка процессов через ZwQuerySystemInformation это конечно хорошо, однако можно сделать еще лучше!
Многие программы скрывающие процесс, не скрывают открытые им хэндлы, следовательно перечислив открытые хэндлы через ZwQuerySystemInformation мы можем построить список процессов.
Это будет чуть более эффективно, но еще не совсем :)
Получив список окон зарегистрированных в системе и вызвав для каждого GetWindowThreadProcessId можно построить список процессов имеющих окна.
Окна не скрывает почти никто, поэтому эта проверка чуть более эффективнее предыдущей, но недостаточно.

Цитата:
Для скрытия процессов в User Mode обычно используется технология внедрения своего кода в чужие процессы и перехвата функции ZwQuerySystemInformation из ntdll.dll. Функции ntdll на самом деле являются переходниками к соответствующим функциям ядра системы, и представляют из себя обращение к интерфейсу системных вызовов (Int 2Eh в Windows 2000 или sysenter в XP), поэтому самым простым и эффективным способом обнаружения процессов скрытых Usermode API перехватчиками будет прямое обращение к интерфейсу системных вызовов минуя API.


Получение списка процессов с помощью прямого системного вызова практически 100% обнаруживает юзермодные руткиты.
Это уже что-то.

Цитата:
Также, можно применить еще один метод основанный на перечислении хэндлов. Его суть состоит в том, чтобы найти не хэндлы открытые искомым процессом, а хэндлы других процессов связанные с ним. Это могут быть хэндлы самого процесса либо его потоков. При получении хэндла процесса, можно определить его PID с ZwQueryInformationProcess. Для потока можно вызвать ZwQueryInformationThread и получить Id его процесса. Все процессы существующие в системе были кем-то запущены, следовательно родительские процессы будут иметь их хэндлы (если только не успели их закрыть), также хэндлы всех работающих процессов имеются в сервере подсистемы Win32 (csrss.exe). Также в Windows NT активно используются Job объекты, которые позволяют обьединять процессы (например все процессы определенного прользователя, или какие-либо службы), следовательно при нахождении хэндла Job объекта, не стоит принебрегать возможностью получить Id всех обьединенных им процессов. Делается это с помощью функции QueryInformationJobObject с классом информации - JobObjectBasicProcessIdList.

Еще действенные варианты:
  • Получение списка процессов через ZwQuerySystemInformation в ядре
  • Получение списка процессов из двусвязного списка структур EPROCESS
  • Получение списка процессов перехватом системных вызовов
  • Получение списка процессов просмотром списка таблиц хэндлов
  • Получение списка процессов путем сканирования PspCidTable
  • Получение списка процессов перехватом SwapContext


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн июн 20, 2011 8:27 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Volkoff
Это все я читал, но вообще то я не ставил задачу обнаружения руткитов
Если нужно обнаружить руткит, есть отличная тулза от Mr-Rem'а Называется Phunter. Кстати с исходниками на делфях. В ней обнаружение процессов выполняется 14 способами, в том числе и в кернел моде.
А теперь вопрос, может кто подскажет. Почему не могу открыть процесс AVP.exe (антиврус кашперыча) Т.е. OpenProcess() возвращает 0. Вроде привелегии дадены
GetLastError() возвращает - 5 (Старая версия клиентского терминала) :shock:

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн июн 20, 2011 8:35 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Сб июл 18, 2009 8:25 am
Сообщений: 810
Откуда: Нерезиновая
Благодарил (а): 21 раз.
Поблагодарили: 4 раз.
Пункты репутации: 0
pablov писал(а):
VolkoffПочему не могу открыть процесс AVP.exe :shock:

Самозащита.
Касперский устанавливает несколько хуков в SSDT (т.е. NtOpenProcess, NtOpenThread, NtTerminateProcess и т.д) и несколько хуков в Теневой SSDT (NtUserFindWindowEx, NtUserBuildHwndList и т.д.) чтобы дополнительно защитить себя от атак.
Ты не можешь обращаться к процессам Касперского напрямую, потому что владельцем SSDT является PDM.
По крайней мере так было раньше, я уже давно не юзаю антивирусы.

Phunter я знаю и его нужно перекомпилять для Вин7, иначе он не стартует, т.к. эта ОС ему не знакома и он пишет что якобы не поддерживается ;)
Дельфей у меня нет.
Если кто перекомпильнет, скажу большое человеческое :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн июн 20, 2011 9:50 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Volkoff писал(а):
Самозащита.

Ну я догадывался, тогда другой вопрос. Каким еще способом зная PID, получить список модулей (dll) и полный путь к файлу (PETools как-то умеет)
Volkoff писал(а):
Если кто перекомпильне

Не компилиться, не хватает каких-то модулей

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн июн 20, 2011 10:17 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Сб июл 18, 2009 8:25 am
Сообщений: 810
Откуда: Нерезиновая
Благодарил (а): 21 раз.
Поблагодарили: 4 раз.
Пункты репутации: 0
pablov писал(а):
PETools как-то умеет

Для перечисления загруженных в процесс модулей, PE Tools использует функции GetModuleFirst/GetModuleNext из Procs32.dll.
pablov писал(а):
Не компилиться, не хватает каких-то модулей

Спасибо, что попробовал.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн июн 20, 2011 11:45 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Нашел в инете описание структур для GetModuleFirst/GetModuleNext, как бы их на пурик перевести
Код:
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
class CEnumProcess  
{
public:
 
    struct CProcessEntry
    {
     LPTSTR lpFilename;
     DWORD  dwPID;
     WORD   hTask16;
     // Constructors/Destructors
     CProcessEntry() : dwPID(0), hTask16(0)
     {lpFilename = new TCHAR[MAX_FILENAME];}
     CProcessEntry(CProcessEntry &e) : dwPID(e.dwPID), hTask16(e.hTask16)
     {strcpy(lpFilename, e.lpFilename);}
     virtual ~CProcessEntry()
     {delete[] lpFilename;}
    };
 
    struct CModuleEntry
    {
     LPTSTR lpFilename;
     PVOID pLoadBase;
     PVOID pPreferredBase;
     // Constructors/Destructors
     CModuleEntry() : pLoadBase(NULL), pPreferredBase(NULL)
     {lpFilename = new TCHAR[MAX_FILENAME];}
     CModuleEntry(CModuleEntry &e) : pLoadBase(e.pLoadBase), pPreferredBase(e.pPreferredBase)
     {strcpy(lpFilename, e.lpFilename);}
     virtual ~CModuleEntry()
     {delete[] lpFilename;}
    };
 
    CEnumProcess();
        virtual ~CEnumProcess();
 
    BOOL GetModuleNext(DWORD dwPID, CModuleEntry* pEntry);
        BOOL GetModuleFirst(DWORD dwPID, CModuleEntry* pEntry);
        BOOL GetProcessNext(CProcessEntry *pEntry);    
    BOOL GetProcessFirst(CProcessEntry* pEntry);


_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт июн 21, 2011 9:14 pm 
Не в сети
профессор

Зарегистрирован: Вт май 04, 2010 12:19 pm
Сообщений: 352
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
Код:
1
2
3
4
5
6
7
8
9
10
Structure ProcessEntry
        a.l
        FileName.s
        dwPID.l
        hTask16.w
        bSystemProcess.w
EndStructure
 
ProcE.ProcessEntry
ProcE\FileName=Space(256)




Код:
1
2
3
4
5
6
7
Structure ModuleEntry
        a.l
        FileName.s
        LoadBase.l
        ImageSize.l
        bSystemProcess.w
EndStructure



Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт июн 21, 2011 9:30 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11108
Благодарил (а): 4 раз.
Поблагодарили: 395 раз.
puremaster писал(а):
Structure ProcessEntry

   a.l

   FileName.s

   dwPID.l

   hTask16.w

   bSystemProcess.w

EndStructure



ProcE.ProcessEntry

ProcE\FileName=Space(256)
Разве так не будет работать?
Код:
1
2
3
4
5
6
7
8
9
Structure ProcessEntry 
    a.l
    FileName.s{256} ; Это в место функции Space
    dwPID.l
    hTask16.w
    bSystemProcess.w
 EndStructure
 
 ProcE.ProcessEntry


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт июн 21, 2011 10:50 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Немного переделал код. Теперь Есть доступ ко всем процессам, в тч и к AVP. Построение списка модулей можно выполнить двумя способами через toolhelp.dll, или PSAPI.DLL
Код:
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
Enumeration 
   #Window_0
 EndEnumeration
 Enumeration
   #ListIcon_0
   #ListIcon_1
   #Button_1
   #Button_2
   #Button_3
   #Font_ListIcon_0
   #Font_ListIcon_1
   #StatusBar
   #Splitter_2
   #Hyper
 EndEnumeration
 Define.l Event, EventWindow, EventGadget, EventType, EventMenu
 Global popup.b
   #SystemProcessesAndThreadsInformation = 5
   #STATUS_SUCCESS = 0
   
  Structure VM_COUNTERS
    PeakVirtualSize.l
    VirtualSize.l
    PageFaultCount.l
    PeakWorkingSetSize.l
    WorkingSetSize.l
    QuotaPeakPagedPoolUsage.l
    QuotaPagedPoolUsage.l
    QuotaPeakNonPagedPoolUsage.l
    QuotaNonPagedPoolUsage.l
    PagefileUsage.l
    PeakPagefileUsage.l
 EndStructure
 
 Structure IO_COUNTERS
    ReadOperationCount.LARGE_INTEGER
    WriteOperationCount.LARGE_INTEGER
    OtherOperationCount.LARGE_INTEGER
    ReadTransferCount.LARGE_INTEGER
    WriteTransferCount.LARGE_INTEGER
    OtherTransferCount.LARGE_INTEGER
 EndStructure
   
 Structure TClientID
   UniqueProcess.l
   UniqueThread.l
 EndStructure
 
 Structure TUnicodeString
   Length.w                     ; Длина строки без терминального нуля
   MaximumLength.w              ; Полная длина буфера
   *Buffer.l                    ; Указатель на буфер для UNICODE-строки
 EndStructure
 
 Structure SYSTEM_THREADS
   KernelTime.LARGE_INTEGER
   UserTime.LARGE_INTEGER
   CreateTime.LARGE_INTEGER
   WaitTime.l
   StartAddress.l
   ClientId.TClientId
   Priority.l
   BasePriority.l
   ContextSwitchCount.l
   State.l
   WaitReason.l
 EndStructure
 
 Structure SYSTEM_PROCESSES
    NextEntryDelta.l             ; Смещение следующей структуры от начала этой
    ThreadCount.l                ; Количество потоков процесса
    Reserved1.l[6]
    CreateTime.LARGE_INTEGER     ; Временные характеристики процесса
    UserTime.LARGE_INTEGER
    KernelTime.LARGE_INTEGER
    ProcessName.TUnicodeString   ; Имя процесса
    BasePriority.l               ; Базовый приоритет
    ProcessId.l                  ; Идентификатор процесса – PID
    InheritedFromProcessId.l     ; PID родителя
    HandleCount.l                ; Открытые дестрипторы
    Reserved2.l[1]
    ;  Счетчики с инфой об использовании памяти и системы ввода-вывода.
    VmCounters.VM_COUNTERS
    IoCounters.IO_COUNTERS       ; Windows 2000 only
    ;  Массив структур с инфой о потоках процесса
    Threads.SYSTEM_THREADS[0]
  EndStructure
 
Prototype.l PFNENUMPROCESSMODULES(hProcess.l, *lphModule.l, cb.l, lpcbNeeded.l)
Prototype.l PFNGETMODULEFILENAMEEXA(hProcess.l,  hModule.l, lpFilename.l, nSize.l)
 
Procedure OpenWindow_Window_0()
   If OpenWindow(#Window_0, 150, 30, 691, 755, "Process Viewer", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
     ListIconGadget(#ListIcon_0, 15, 15, 660, 400, "Name", 268, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect|#PB_ListIcon_GridLines)
     SetGadgetFont(#ListIcon_0, LoadFont(#Font_ListIcon_0, "Courier New", 8, #PB_Font_HighQuality))
     AddGadgetColumn(#ListIcon_0, 1, "PID", 90)
     AddGadgetColumn(#ListIcon_0, 2, "Priority", 90)
     AddGadgetColumn(#ListIcon_0, 3, "Threads", 90)
     AddGadgetColumn(#ListIcon_0, 4, "Descriptor", 100)
     ListIconGadget(#ListIcon_1, 15, 415, 660, 270, "Module name", 150, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect|#PB_ListIcon_GridLines)
     SetGadgetFont(#ListIcon_1, LoadFont(#Font_ListIcon_1, "Courier New", 8, #PB_Font_HighQuality))
     AddGadgetColumn(#ListIcon_1, 1, "FileName", 400)
     AddGadgetColumn(#ListIcon_1, 2, "Image Base", 85)
     SplitterGadget(#Splitter_2, 15, 15, 660, 670, #ListIcon_0, #ListIcon_1, #PB_Splitter_Separator)
     SetGadgetState(#Splitter_2, 400)
     ButtonGadget(#Button_1, 505, 695, 165, 25, "Get Process List")
     ButtonGadget(#Button_2, 400, 695, 70, 25, "PowerOFF")
     ButtonGadget(#Button_3, 300, 695, 70, 25, "Reboot")
     If CreateStatusBar(#StatusBar, WindowID(#Window_0))
        AddStatusBarField(100)
        AddStatusBarField(510)
        AddStatusBarField(200)
     EndIf    
     If CreatePopupMenu(0)
        MenuItem(1, "Kill Process")
        MenuItem(2, "Open Folder")
     EndIf
     HyperLinkGadget(#Hyper, 30, 705, 10, 15, "?", $0000FF)
   EndIf
EndProcedure
 
Procedure GetModules(processID.l)                   ; Еще вариант получения списка модулей через PSAPI.DLL
   Protected Dim hMods.l(1024), hProcess.l, cbNeeded.l, i.i
   Protected EnumProcessModules.PFNENUMPROCESSMODULES, GetModuleFileName.PFNGETMODULEFILENAMEEXA
    ; Получаем список всех модулей в этом процессе.
    hProcess = OpenProcess_(#PROCESS_QUERY_INFORMATION|#PROCESS_VM_READ, #False, processID)
    If hProcess
           PSAPI = OpenLibrary(#PB_Any,"PSAPI.DLL")
      If PSAPI
           EnumProcessModules   = GetFunction(PSAPI, "EnumProcessModules")
           GetModuleFileName    = GetFunction(PSAPI, "GetModuleFileNameExA")
       If EnumProcessModules(hProcess, hMods(), 1024*4, @cbNeeded)
          loopcnt =  (cbNeeded / SizeOf(Long)) - 1
          For i = 1 To loopcnt
            Name.s = Space(1024)
            ; Получаем полный путь файла модуля.
            If GetModuleFileName(hProcess, hMods(i), @Name, Len(Name))
               AddGadgetItem(#ListIcon_1, -1, UCase(GetFilePart(Name))+Chr(10)+ Name + Chr(10) + RSet(Hex(hMods(i), #PB_Integer), 8, "0"))
            EndIf    
          Next i    
        EndIf
      EndIf  
     CloseHandle_(hProcess)
    EndIf
EndProcedure
 
Procedure ModuleEntry(pid)                           ; Получение списка модулей через toolhelp.dll
 me32.MODULEENTRY32
 me32\dwSize = SizeOf(MODULEENTRY32)
 hSnapShot = CreateToolhelp32Snapshot_(#TH32CS_SNAPMODULE, pid)
 ClearGadgetItems(#ListIcon_1)
 If hSnapShot > 0
   If Module32First_(hSnapShot, me32)
     Repeat
       result = Module32Next_(hSnapShot, me32)
       If result
         AddGadgetItem(#ListIcon_1, -1, UCase(PeekS(@me32\szModule))+Chr(10)+PeekS(@me32\szExePath)+Chr(10)+RSet(Hex(me32\modBaseAddr, #PB_Integer), 8, "0"))
       EndIf
     Until result = #False
   EndIf
   CloseHandle_(hSnapShot)    
 Else                                                  ; Если не получилось, есть запасной вариант ))
   GetModules(pid)
 EndIf
EndProcedure
 
Procedure EnableDebugPrivNT(aPrivilegeName.s)
    DebugValue.LUID
    tkp.TOKEN_PRIVILEGES
    ; Retrieve a handle of the access token
    If Not OpenProcessToken_(GetCurrentProcess_(),#TOKEN_ADJUST_PRIVILEGES|#TOKEN_QUERY,@hToken)
       ProcedureReturn #False;
    EndIf
    ; Enable the SE_DEBUG_NAME privilege  
    If Not LookupPrivilegeValue_("", aPrivilegeName, @DebugValue)
       CloseHandle_(hToken)
       ProcedureReturn #False;
    EndIf
    NewState.TOKEN_PRIVILEGES
    With NewState
      \PrivilegeCount=1
      \Privileges[0]\Luid\HighPart=DebugValue\HighPart
      \Privileges[0]\Luid\LowPart=DebugValue\LowPart
      \Privileges[0]\Attributes=#SE_PRIVILEGE_ENABLED
    EndWith
    AdjustTokenPrivileges_(hToken,#False,@NewState,SizeOf(TOKEN_PRIVILEGES),@PreviousState.TOKEN_PRIVILEGES,@ReturnLength)
    If hToken : CloseHandle_(hToken) : EndIf
EndProcedure
 
Procedure.s FilePath(pid)
  processname$ = ""
  hprocess = OpenProcess_(#PROCESS_VM_READ|#PROCESS_QUERY_INFORMATION,#Null,pid)
  If hprocess
    psapilib=OpenLibrary(#PB_Any,"psapi.dll")
    If psapilib
       GetModuleFileNameEx=GetFunction(psapilib,"GetModuleFileNameExA")
       If GetModuleFileNameEx
         processname$=Space(#MAX_PATH)
         CallFunctionFast(GetModuleFileNameEx, hprocess, #Null, @processname$, #MAX_PATH)
       EndIf  
     EndIf
  EndIf
  ProcedureReturn processname$
EndProcedure
 
Procedure  KillProcByPid(pid.l)
 ExitCode.l
 hp.l
 RetVal.b = #True;
 If pid
         hp = OpenProcess_(#PROCESS_ALL_ACCESS, #True, pid)
         If hp
             GetExitCodeProcess_(hp, @ExitCode);
             RetVal = TerminateProcess_(hp, ExitCode)
             CloseHandle_(hp)
         Else
             RetVal = #False
         EndIf  
 Else
             RetVal =  #False;
 EndIf
    ProcedureReturn RetVal
EndProcedure
 
Procedure GetProcessesList()
   RetVal.l
   *pBuffer.SYSTEM_PROCESSES
   *pCur.SYSTEM_PROCESSES
   ReturnLength.l
   i.w
   ProcessName.s
   ReturnLength = 0
    ; Запрашиваем размер требуемого буфера
   RetVal = ZwQuerySystemInformation_(#SystemProcessesAndThreadsInformation, #Null, 0, @ReturnLength)
 ;  RetVal = NtQuerySystemInformation_(#SystemProcessesAndThreadsInformation, #Null, 0, @ReturnLength)
    ; Резервируем буфер
    *pBuffer = AllocateMemory(ReturnLength)
    ; Получаем информацию о процессах в буфер            ;
   RetVal = ZwQuerySystemInformation_(#SystemProcessesAndThreadsInformation, *pBuffer, ReturnLength, @ReturnLength)
 ;  RetVal = NtQuerySystemInformation_(#SystemProcessesAndThreadsInformation, *pBuffer, ReturnLength, @ReturnLength)
   If RetVal = #STATUS_SUCCESS
     ClearGadgetItems(#ListIcon_0)
     *pCur = *pBuffer            ; Инициируем указатель на текущую структуру
     i = 0                       ; Инициируем счетчик процессов. Его можно и не использовать.
     ; Проходим в цикле по всей цепочке структур
     Repeat
       i+1                       ; Увеличиваем счетчик процессов.
       ; Смотрим длину имени процесса и если оно не равно 0,
       ; то читаем строку из буфера, иначе – имя = [System Idle Process]        
       If *pCur\ProcessName\Length = 0
         ProcessName = "[System Idle Process]"    
       Else
         ProcessName = PeekS(*pCur\ProcessName\Buffer  , -1, #PB_Unicode)
       EndIf
       ; Добавляем инфу о процессе в ListIconGadget
         ico = ExtractIcon_(0,FilePath(*pCur\ProcessId),0)
       If  Not ico
          systemdir$=Space(255)  
          GetSystemDirectory_(@systemdir$, 255)  
          ico = ExtractIcon_(0,systemdir$ + "\shell32.dll", 2)
       EndIf
         AddGadgetItem(#ListIcon_0, -1, ProcessName+Chr(10)+RSet(Hex(*pCur\ProcessId),8,"0")+Chr(10)+Str(*pCur\BasePriority)+Chr(10)+Str(*pCur\ThreadCount)+Chr(10)+Str(*pCur\HandleCount), ico)
       ; Если структур нет, тогда на выход
       If *pCur\NextEntryDelta = 0 : Break : EndIf
       ; Вычисляем указатель на следующую структуру SYSTEM_PROCESSES
       ; Для этого к адресу этой структуру прибавляем смещение следующей
       ; из поля NextEntryDelta
         *pCur = *pCur + *pCur\NextEntryDelta
       ; Крутим цикл, пока есть следующая структура  
     ForEver
     
      StatusBarText(#StatusBar, 0, "Process Loaded: "+Str(i))
      SendMessage_(GadgetID(#ListIcon_0),#WM_VSCROLL,#SB_BOTTOM,0)
      SetGadgetState(#ListIcon_0, i-1)
      SetFocus_(GadgetID(#ListIcon_0))
       pid = Val("$"+GetGadgetItemText(#ListIcon_0, GetGadgetState(#ListIcon_0) , 1))
       StatusBarText(#StatusBar, 1, FilePath(pid))
       Sleep_(100)
       ModuleEntry(pid)
     popup = 1
     FreeMemory(*pBuffer)
   EndIf  
EndProcedure
 
Procedure updateCPU()    
   StatusBarText(#StatusBar, 2, "  CPU  " + Str(CpuUsage()) + "%")
EndProcedure
 
 OpenWindow_Window_0()
 StartTimer(1,800,@updateCPU())
 GetProcessesList()
 EnableDebugPrivNT("SeDebugPrivilege")                   ; Даем нашему процессу крутые привелегии
 Repeat
  If popup = 1
     If GetAsyncKeyState_(#VK_UP)=-32767
          pid = Val("$"+GetGadgetItemText(#ListIcon_0, GetGadgetState(#ListIcon_0) , 1))
          StatusBarText(#StatusBar, 1, FilePath(pid))
          ModuleEntry(pid)
     ElseIf GetAsyncKeyState_(#VK_DOWN)=-32767
          pid = Val("$"+GetGadgetItemText(#ListIcon_0, GetGadgetState(#ListIcon_0) , 1))
          StatusBarText(#StatusBar, 1, FilePath(pid))
          ModuleEntry(pid)
     EndIf      
  EndIf
 
   Event = WaitWindowEvent()
   Select Event
     Case #PB_Event_Gadget
       EventGadget = EventGadget()
       EventType = EventType()
       If EventGadget = #ListIcon_0
         If EventType() = #PB_EventType_RightClick
            If popup = 1 : DisplayPopupMenu(0, WindowID(#Window_0)) : EndIf
         ElseIf EventType() = #PB_EventType_LeftClick
            pid = Val("$"+GetGadgetItemText(#ListIcon_0, GetGadgetState(#ListIcon_0) , 1))
            StatusBarText(#StatusBar, 1, FilePath(pid))
            ModuleEntry(pid)
         EndIf
       ElseIf EventGadget = #Hyper
              MessageRequester("About", "           Created by crc1              "+ Chr(10)+"          Copyright © 2011", 0)  
       ElseIf EventGadget = #Button_1
         GetProcessesList()
       ElseIf EventGadget = #Button_2
         EnableDebugPrivNT("SeShutdownPrivilege")       ; Даем нашему процессу привелегию на перезагрузку\выключение
         ExitWindowsEx_(#EWX_POWEROFF, 0)               ; выключение
       ElseIf EventGadget = #Button_3
         EnableDebugPrivNT("SeShutdownPrivilege")       ; Даем нашему процессу привелегию на перезагрузку\выключение
         ExitWindowsEx_(#EWX_REBOOT, 0)                 ; перезагрузка
       EndIf
     Case #PB_Event_Menu
       If EventGadget() = 1
          pid = Val("$"+GetGadgetItemText(#ListIcon_0, GetGadgetState(#ListIcon_0) , 1))
          If KillProcByPid(pid)
             Sleep_(100)
             GetProcessesList()
          Else
             MessageRequester("Error", "Can not terminate process!", #MB_OK|#MB_ICONERROR)
          EndIf
       ElseIf EventGadget() = 2
          pid = Val("$"+GetGadgetItemText(#ListIcon_0, GetGadgetState(#ListIcon_0) , 1))
          Folder$ = GetPathPart(FilePath(pid))
          If Folder$ And Mid(Folder$, 2, 1) = ":"
              ShellExecute_(WindowID(#Window_0), @"explore", 0, 0, Folder$, #SW_SHOWNORMAL)
          EndIf
 ;         StatusBarText(#StatusBar, 0, FilePath(pid))
       EndIf
     Case #PB_Event_CloseWindow
       EventWindow = EventWindow()
       If EventWindow = #Window_0
         CloseWindow(#Window_0)
         Break
       EndIf
   EndSelect
 ForEver


_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Последний раз редактировалось pablov Ср июн 22, 2011 1:24 pm, всего редактировалось 3 раз(а).

Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт июн 21, 2011 11:19 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6246
Благодарил (а): 17 раз.
Поблагодарили: 182 раз.
Пункты репутации: 48
pablov писал(а):
Немного переделал код.

Достойно, не хуже Русиновича :D

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср июн 22, 2011 6:08 am 
Не в сети
профессор

Зарегистрирован: Вт май 04, 2010 12:19 pm
Сообщений: 352
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
Пётр писал(а):
puremaster писал(а):
Structure ProcessEntry
   a.l
   FileName.s
   dwPID.l
   hTask16.w
   bSystemProcess.w
EndStructure

ProcE.ProcessEntry

ProcE\FileName=Space(256)
Разве так не будет работать?
Код:
1
2
3
4
5
6
7
8
9
Structure ProcessEntry 
    a.l
    FileName.s{256} ; Это в место функции Space
    dwPID.l
    hTask16.w
    bSystemProcess.w
 EndStructure
 
 ProcE.ProcessEntry

Нет. там должен быть указатель на строку, а не строка.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср июн 22, 2011 9:24 am 
Не в сети
профессор

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср июн 22, 2011 9:53 am 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
cherri123 писал(а):
блин какую либу используете

Ты об чем? Никакой либы. Средства PB + win API + немножко PBOSL (процедура CpuUsage() )

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср июн 22, 2011 10:29 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11108
Благодарил (а): 4 раз.
Поблагодарили: 395 раз.
И еще есть немножко друпии - функция GetSystemDirectory() из нее.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 129 ]  На страницу 1, 2, 3, 4, 5 ... 9  След.

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


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

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


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

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