Вверх ↑
Этот топик читают: Гость
Ответов: 355
Рейтинг: 2
#1: 2012-05-04 23:03:47 ЛС | профиль | цитата
Доброго времени суток.
У меня такая проблема: у меня ВНЕЗАПНО перестал работать компонент EnumProcess. Т.е. список процессов вывести никак. При чём, ранее скомпилированный (когда-то давно) EXEшник работает. Пример по работе с процессами - тоже не работает, и тот который в папке примеров - тоже. В чём может быть проблема?
карма: 1

0
Ответов: 3889
Рейтинг: 362
#2: 2012-05-04 23:09:45 ЛС | профиль | цитата
nickware, последнюю сборку со всеми обновлениями пробовали?
карма: 1

0
Ответов: 355
Рейтинг: 2
#3: 2012-05-04 23:09:58 ЛС | профиль | цитата
1nd1g0, конечно, она и стоит.
карма: 1

0
Ответов: 1731
Рейтинг: 68
#4: 2012-05-04 23:12:57 ЛС | профиль | цитата
[flood]Чего-то вы в Окошках крутите с Кубоном [/flood]
карма: 1

0
Ответов: 1841
Рейтинг: 369
#5: 2012-05-04 23:18:07 ЛС | профиль | цитата
Кажется на форуме поднимали подобную тему, но решения так и не нашли...
карма: 1
0
Разработчик
Ответов: 26163
Рейтинг: 2127
#6: 2012-05-05 00:53:20 ЛС | профиль | цитата
CriDos писал(а):
Кажется на форуме поднимали подобную тему, но решения так и не нашли...

Я так полагаю, что кто-то, или что-то, поменяло системные файлы. Или система заблокировала доступ к системным файлам из-за измененных свойств безопасности

Надо проверить следующие файлы psapi.dll и ntdll.dll. К тому же, может быть установлена чем-то ловушка на некоторые функции, тем же антивирем.

Раньше эти системные dll не использовались, они были введены для совместимости с x64 версиями ОС
карма: 22

0
Ответов: 1376
Рейтинг: 197
#7: 2012-05-05 01:42:07 ЛС | профиль | цитата
nesco, из Актуальной сборки HiAsm 4.04b185.20-01-11 у меня не работает, пробовал заменять
nesco писал(а):
файлы psapi.dll и ntdll.dll
- не помогло, успокоился на том, что
nesco писал(а):
может быть установлена чем-то ловушка на некоторые функции, тем же антивирем.
у меня Avast, а вот EnumProcess_3.10 (для nickware) с дампом работает, штатный пример работает, но без показа версии ОС (не столь важно)

XP SP3
карма: 1

0
файлы: 1enumprocess_3_10.zip [5.8KB] [203]
Ответов: 3889
Рейтинг: 362
#8: 2012-05-05 01:56:25 ЛС | профиль | цитата
А мой пример на VBJScript работает?
карма: 1

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#9: 2012-05-05 02:01:18 ЛС | профиль | цитата
foksov писал(а):
не помогло

Попробуй вот этот код вместо существующего, я заменил некторые функции, которые могут вызывать подозрения у антивирей, на альтернативные -- hienumprocess_111.zip
------------ Дoбавленo в 02.00:
1nd1g0 писал(а):
А мой пример на VBJScript работает?

А почему он не должен работать, там же не используются нативные функции доступа к процессам
карма: 22

0
файлы: 1hienumprocess_111.zip [9KB] [143]
Ответов: 1376
Рейтинг: 197
#10: 2012-05-05 02:06:37 ЛС | профиль | цитата
1nd1g0 писал(а):
А мой пример на VBJScript работает?
не помню и примера у себя не нашел
nesco писал(а):
Попробуй вот этот код вместо существующего
doEnum и дальше глухо

nesco, да и ладно, я отписался-то только из-за того, чтоб nickware как-то помочь, а сам в этих процессах не нуждаюсь, если понадобится, то версией 3.10 воспользуюсь, она перечисляет и убивает - мне большего и ненадо
карма: 1

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#11: 2012-05-05 02:19:10 ЛС | профиль | цитата
foksov писал(а):
то версией 3.10 воспользуюсь

Млин, как я не хотел ее переделывать, самая устойчивая версия была Теперь жди, когда этот баг у меня проявится
карма: 22

0
Ответов: 355
Рейтинг: 2
#12: 2012-05-05 04:40:44 ЛС | профиль | цитата
foksov, версия 3.10 у меня работает, но с глюками. Неверно определяет буквы дисков в пути к процессу, иногда ставит знак вопроса вместо неё, иногда дублирует процессы.
карма: 1

0
Ответов: 5227
Рейтинг: 587
#13: 2012-05-05 12:22:19 ЛС | профиль | цитата
Ещё пара способов получения списка процессов, через реестр у меня не работает xp sp3 примеры здесьhttp://www.vr-online.ru/content/poluchenie-spiska-processov-glava-2-381
схема
code_27820.txt
------------ Дoбавленo в 12.21:
вот этот код работает с реестром
Add(Memo,3167362,294,266)
{
Left=90
Top=240
Width=440
Height=215
ScrollBars=3
}
Add(Button,12287583,175,287)
{
Left=15
Top=240
link(onClick,8779930:doEnum,[])
}
Add(InlineCode,8779930,231,287)
{
WorkPoints=#6:doEnum|
EventPoints=#9:onProcess|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|30:uses Kol, Windows,Share,Debug;|0:|5:type |36: PPerfDataBlock = ^TPerfDataBlock; |26: TPerfDataBlock = record |37: Signature: array[0..3] of WCHAR; |25: LittleEndian: DWORD; |20: Version: DWORD; |21: Revision: DWORD; |28: TotalByteLength: DWORD; |25: HeaderLength: DWORD; |27: NumObjectTypes: DWORD; |28: DefaultObject: Longint; |29: SystemTime: TSystemTime; |29: PerfTime: TLargeInteger; |29: PerfFreq: TLargeInteger; |36: PerfTime100nSec: TLargeInteger; |29: SystemNameLength: DWORD; |29: SystemNameOffset: DWORD; |7: end; |0:|38: PPerfObjectType = ^TPerfObjectType; |27: TPerfObjectType = record |28: TotalByteLength: DWORD; |29: DefinitionLength: DWORD; |25: HeaderLength: DWORD; |33: ObjectNameTitleIndex: DWORD; |29: ObjectNameTitle: LPWSTR; |33: ObjectHelpTitleIndex: DWORD; |29: ObjectHelpTitle: LPWSTR; |24: DetailLevel: DWORD; |24: NumCounters: DWORD; |29: DefaultCounter: Longint; |27: NumInstances: Longint; |21: CodePage: DWORD; |29: PerfTime: TLargeInteger; |29: PerfFreq: TLargeInteger; |7: end; |0:|52: PPerfCounterDefinition = ^TPerfCounterDefinition; |34: TPerfCounterDefinition = record |23: ByteLength: DWORD; |34: CounterNameTitleIndex: DWORD; |30: CounterNameTitle: LPWSTR; |34: CounterHelpTitleIndex: DWORD; |30: CounterHelpTitle: LPWSTR; |27: DefaultScale: Longint; |24: DetailLevel: DWORD; |24: CounterType: DWORD; |24: CounterSize: DWORD; |26: CounterOffset: DWORD; |7: end; |0:|54: PPerfInstanceDefinition = ^TPerfInstanceDefinition; |35: TPerfInstanceDefinition = record |23: ByteLength: DWORD; |35: ParentObjectTitleIndex: DWORD; |33: ParentObjectInstance: DWORD; |23: UniqueID: Longint; |23: NameOffset: DWORD; |23: NameLength: DWORD; |7: end; |0:|42: PPerfCounterBlock = ^TPerfCounterBlock; |29: TPerfCounterBlock = record |23: ByteLength: DWORD; |6: end;|0:|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|23: onProcess:THI_Event;|49: procedure doEnum(var _Data:TData; Index:word);|0:|5: end;|0:|14:implementation|0:|63:function FillProcessesList(var slProcesses: PStrList): Boolean;|5:const|56: INCREMENTAL_SIZE = 32768; // Шаг увеличения буфера|58: INITIAL_BUFFER_SIZE = 65536; // Начальный размер буфера|57: PROCESS_OBJECT_INDEX = 230; // Индекс объекта Process|67: PID_OBJECT_INDEX = 784; // Индекс счетчика ID Process (PID)|3:var|41: buflen: DWORD; // текущий размер буфера|46: PerfData: PPerfDataBlock; // PERF_DATA_BLOCK|47: PerfObj: PPerfObjectType; // PERF_OBJECT_TYPE|72: PerfCntr, CurCntr: PPerfCounterDefinition; // PERF_COUNTER_DEFINITION|65: PerfInst: PPerfInstanceDefinition; // PERF_INSTANCE_DEFINITION|68: PerfCntrBlk, PtrToCntr: PPerfCounterBlock; // PERF_COUNTER_BLOCK|38: i,k,j: Integer; // счетчики в циклах|42: process_name: String; // выходная строка|55: pData: PLargeInteger; // Указатель на данные счетчика|5:begin|18: Result := False;|32: buflen := INITIAL_BUFFER_SIZE;|55: GetMem(PerfData, buflen); // Выделяем начальный буфер|5: try|39: // Пытаемся заполнить буфер данными|48: while RegQueryValueEx(HKEY_PERFORMANCE_DATA,|63: PChar(Int2Str(PROCESS_OBJECT_INDEX)),|61: nil,nil,Pointer(PerfData), @buflen)|46: = ERROR_MORE_DATA do|71: begin // Если буфер маленький, то увеличиваем его и снова пытаемся|35: inc(buflen,INCREMENTAL_SIZE);|35: ReallocMem(PerfData, buflen);|8: end;|75: RegCloseKey(HKEY_PERFORMANCE_DATA); // Обязательно закрываем этот ключ.|80: // Получаем указатель на первую структуру PERF_OBJECT_TYPE (первый инфоблок)|72: PerfObj := PPerfObjectType(DWORD(PerfData) + PerfData.HeaderLength);|46: // Перебираем все полученные типы объектов|48: for i := 0 to PerfData.NumObjectTypes - 1 do|9: begin|41: // Ищем объект Process (индекс 230)|65: if PerfObj.ObjectNameTitleIndex = PROCESS_OBJECT_INDEX then|11: begin|77: // Запоминаем расположение описаний счетчиков PERF_COUNTER_DEFINITION|59: PerfCntr := PPerfCounterDefinition(DWORD(PerfObj) +|42: PerfObj.HeaderLength);|61: // Получаем экземпляры объекта Process, если они есть|40: if PerfObj.NumInstances > 0 then|13: begin|76: // Получаем указатель на первую структуру PERF_INSTANCE_DEFINITION|62: PerfInst := PPerfInstanceDefinition(DWORD(PerfObj) +|72: PerfObj.DefinitionLength);|46: // Перебираем все экземпляры объекта|51: for k := 0 to PerfObj.NumInstances - 1 do|15: begin|62: // Получаем имя текущего экземпляра (имя процесса)|72: process_name := WideCharToString(PWideChar(DWORD(PerfInst) +|67: PerfInst.NameOffset));|68: // Если имя равно '_Total', то пропускаем этот экземпляр|59: // т.к. это суммарные данные для всех процессов|53: if process_name = '_Total' then Continue;|75: // Получаем указатель на первый счетчик PERF_COUNTER_DEFINITION|32: CurCntr := PerfCntr;|73: // Получаем указатель на данные счетчиков текущего экземпляра|33: // PERF_COUNTER_BLOCK|60: PtrToCntr := PPerfCounterBlock(DWORD(PerfInst) +|46: PerfInst.ByteLength);|57: //Перебираем все счетчики для каждого объекта|52: for j := 0 to PerfObj.NumCounters - 1 do|17: begin|54: // Получаем указатель на данные счетчика|73: pData := Pointer(DWORD(PtrToCntr) + CurCntr.CounterOffset);|63: // Если счетчик - это ID Process, то читаем его и|44: // добавляем в выходную строку|70: if CurCntr.CounterNameTitleIndex = PID_OBJECT_INDEX then|44: process_name := process_name +|68: '; PID = ' + Int2Str(Integer(pData^));|56: // Получаем указатель на следующий счетчик|64: CurCntr := PPerfCounterDefinition(DWORD(CurCntr) +|46: CurCntr.ByteLength); |18: end; |54: // Добавляем выходную строку в TStringList|42: slProcesses.Add(process_name);|40: // Функция сработала успешно|27: Result := True;|64: // Получаем указатель на следующий экземпляр объекта|64: // Он находится сразу за данными текущего экземпляра|62: PerfCntrBlk := PPerfCounterBlock(DWORD(PerfInst) +|66: PerfInst.ByteLength);|68: PerfInst := PPerfInstanceDefinition(DWORD(PerfCntrBlk) +|72: PerfCntrBlk.ByteLength);|14: end;|12: end;|10: end;|52: // Получаем указатель на следующий тип объекта|75: PerfObj := PPerfObjectType(DWORD(PerfObj) + PerfObj.TotalByteLength);|8: end;|9: finally|57: // В любом случае освобождаем память, занятую буфером|22: FreeMem(PerfData);|6: end;|4:end;|0:|29:procedure THiAsmClass.doEnum;|26:var slProcesses: PStrList;|20: bRes: Boolean; |5:begin|28: slProcesses := NewStrList;|41: bRes := FillProcessesList(slProcesses);|43: _hi_onEvent(onProcess, slProcesses.Text);|18: if not bRes then|83: _hi_onEvent(onProcess, 'к сожелению не получилось получить процессы из реестра');|19: slProcesses.Free;|4:end;|0:|0:|4:end.|
link(onProcess,3167362:doText,[])
}


статья с примерами http://tripsin.narod.ru/articles/virtreg/virtregistry.htm

интерес представляет авторская утилита PerfLook - обозреватель ключа HKEY_PERFORMANCE_DATA
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
файлы: 1code_27820.txt [10.5KB] [287]
Разработчик
Ответов: 26163
Рейтинг: 2127
#14: 2012-05-05 12:42:15 ЛС | профиль | цитата
andrestudio писал(а):
вот этот код работает с реестром

У нас тоже такая версия была, которая читала этот ключ реестра, и она отвратительно показала себя в работе под x64, почему от нее и отказались
карма: 22

0
Ответов: 5227
Рейтинг: 587
#15: 2012-05-05 13:13:07 ЛС | профиль | цитата
nesco, а через Native API не пробовал?

карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)