Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2011.12.11;
Скачать: [xml.tar.bz2];

Вниз

Функция IsProcessInJob в Windows 2000   Найти похожие ветки 

 
Игорь ©   (2009-05-15 14:17) [0]

Не подскажите альтернативу фунции IsProcessInJob в Windows 2000, мне нужно только определить "under job" процесс или нет?


 
Игорь Шевченко ©   (2009-05-15 15:52) [1]

QueryInformationJobObject с JobObjectBasicProcessIdList ?

И та и та функция требует HANDLE от Job


 
Игорь ©   (2009-05-15 20:33) [2]


> Игорь Шевченко ©   (15.05.09 15:52) [1]


Спасибо

Не подскажите как определить, использует ли процесс NET Framework, является ли он сервисным, короче как это делает Process Explorer, в какую сторону копать?


 
Игорь Шевченко ©   (2009-05-15 21:11) [3]


> Не подскажите как определить, использует ли процесс NET
> Framework


Я анализом EXE-файла определял - довольно просто, кстати.


> является ли он сервисным


По Parent-процессу. Есть функция RegisterServicesProcess (уже не помню, в какой DLL, но функция пользовательская) - как-то с ее помощью можно попытаться найти истинный Services.exe, хотя, если все внутри одного сеанса - то без особой разницы, можно и по имени.

Ну и я не уверен, что эта механика будет работать под Vista и Windows 7


 
Игорь ©   (2009-05-15 21:27) [4]


> Я анализом EXE-файла определял - довольно просто, кстати.


Просто это как?


 
Игорь Шевченко ©   (2009-05-15 22:22) [5]

with NtHeaders.OptionalHeader.DataDirectory[
     IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR] do
   if (VirtualAddress <> 0) and (Size <> 0) then
     isDotNet := true

как в статье из RSDN про исследование внутренностей исполняемого файла .Net


 
Игорь Шевченко ©   (2009-05-15 22:23) [6]

Соотвественно, NtHeaders проще всего взять функцией RtlImageNtHeaders из Ntdll


 
Игорь ©   (2009-09-14 10:46) [7]

Разобрался по поводу


> Не подскажите альтернативу фунции IsProcessInJob в Windows
> 2000, мне нужно только определить "under job" процесс или
> нет?


Спасибо


> Игорь Шевченко ©   (15.05.09 15:52) [1]


Если кому интересно

type
 TJobObjectInfoClass = Cardinal;

type
 TNtQuerySystemInformation = function(SystemInformationClass : LongInt;
                                      SystemInformation : Pointer;
                                      SystemInformationLength : ULONG;
                                      ReturnLength : PDWORD) : Integer; stdcall;

 TQueryInformationJobObject = function(hJob : THandle;
                                       JobObjectInformationClass : TJobObjectInfoClass;
                                       lpJobObjectInformation : Pointer;
                                       cbJobObjectInformationLength : DWORD;
                                       lpReturnLength : PDWORD) : BOOL; stdcall;

var
 _NtQuerySystemInformation: TNtQuerySystemInformation;
 _QueryInformationJobObject: TQueryInformationJobObject;

type
 SYSTEM_HANDLE_INFORMATION = packed record
   ProcessId: DWORD;
   ObjectTypeNumber: Byte;
   Flags: Byte;
   Handle: Word;
   pObject: Pointer;
   GrantedAccess: DWORD;
 end;
 TSYSTEM_HANDLE_INFORMATION = ^SYSTEM_HANDLE_INFORMATION;
 PSYSTEM_HANDLE_INFORMATION = ^TSYSTEM_HANDLE_INFORMATION;

 SYSTEM_HANDLE_INFORMATION_EX = packed record
   NumberOfHandles: DWORD;
   Information: Array [0..0] of SYSTEM_HANDLE_INFORMATION;
 end;
 PSYSTEM_HANDLE_INFORMATION_EX = ^SYSTEM_HANDLE_INFORMATION_EX;

 PJOBOBJECT_BASIC_PROCESS_ID_LIST = ^JOBOBJECT_BASIC_PROCESS_ID_LIST;
 JOBOBJECT_BASIC_PROCESS_ID_LIST = Record
   NumberOfAssignedProcesses : DWORD;
   NumberOfProcessIdsInList  : DWORD;
   ProcessIdList             : Array[0..0] of ULONG;
 end;

type
 NTSTATUS = Integer;

const
 STATUS_SUCCESS              = NTSTATUS($00000000);
 STATUS_INFO_LENGTH_MISMATCH = NTSTATUS($C0000004);

 SystemHandleInformation = 16;
 JobObjectBasicProcessIdList = 3;

function _QuerySystemInformation(SystemInformationClass: Integer; var ReturnStatus: NTSTATUS): Pointer;
var
 SystemInformationLength: Integer;
 ReturnLength: DWORD;
begin
 SystemInformationLength:= $400;
 GetMem(Result, SystemInformationLength);
 ReturnStatus:= _NtQuerySystemInformation(SystemInformationClass, Result, SystemInformationLength, @ReturnLength);
 while (ReturnStatus = STATUS_INFO_LENGTH_MISMATCH) do
 begin
   FreeMem(Result);
   SystemInformationLength:= SystemInformationLength * 2;
   GetMem(Result, SystemInformationLength);
   ReturnStatus:= _NtQuerySystemInformation(SystemInformationClass, Result, SystemInformationLength, @ReturnLength);
 end;
 if (ReturnStatus <> STATUS_SUCCESS) then
 begin
   FreeMem(Result);
   Result:= nil;
 end;
end;

function _IsProcessInJob(PID: DWORD): Boolean;
var
 PSHI: PSYSTEM_HANDLE_INFORMATION_EX;
 ReturnStatus: NTSTATUS;
 hProcess, hTargetProcess: Cardinal;
 i, l: Cardinal;
 Info: PJOBOBJECT_BASIC_PROCESS_ID_LIST;
 Size: DWORD;
begin
 Result:= False;
 PSHI := _QuerySystemInformation(SystemHandleInformation, ReturnStatus);
 if (ReturnStatus = STATUS_SUCCESS) then
 begin
   for i := 0 to PSHI^.NumberOfHandles - 1 do
   begin
     begin
       if PSHI^.Information[i].ObjectTypeNumber = 07 then
       begin
         hProcess:= OpenProcess(MAXIMUM_ALLOWED, False, PSHI^.Information[i].ProcessId);
         if hProcess <> 0 then
         try
           if DuplicateHandle(hProcess, PSHI^.Information[i].Handle, INVALID_HANDLE_VALUE, @hTargetProcess, 0, False, DUPLICATE_SAME_ACCESS) then
           begin
             try
             Size:= SizeOf(JOBOBJECT_BASIC_PROCESS_ID_LIST) + 4 * 1000;
             GetMem(Info, Size);
               try
                 if _QueryInformationJobObject(hTargetProcess, JobObjectBasicProcessIdList, Info, Size, nil) then
                 begin
                   if Info^.NumberOfProcessIdsInList > 0 then
                     for l:= 0 to Info^.NumberOfProcessIdsInList - 1 do
                       if PID = Info^.ProcessIdList[l] then
                       begin
                         Result:= True;
                         Break;
                       end;
                 end;
               finally
                 FreeMem(Info);
               end;
             finally
               CloseHandle(hTargetProcess);
             end;
           end;
         finally
           CloseHandle(hProcess);
         end;
       end;
     end;
   end;
   FreeMem(PSHI);
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 if _IsProcessInJob(2836) then
   Caption:= "ProcessInJob"
 else
   Caption:= "";
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 @_NtQuerySystemInformation:= GetProcAddress(LoadLibrary("ntdll.dll"), "NtQuerySystemInformation");
 @_QueryInformationJobObject:= GetProcAddress(LoadLibrary("kernel32.dll"), "QueryInformationJobObject");
end;



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2011.12.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.005 c
15-1313958600
Юрий
2011-08-22 00:30
2011.12.11
С днем рождения ! 22 августа 2011 понедельник


2-1314252487
Onyx2012
2011-08-25 10:08
2011.12.11
Фильтр по значению в Express Quantum Grid


2-1314473437
Gu
2011-08-27 23:30
2011.12.11
данные в ресурсах


15-1313756695
Медвежонок Пятачок
2011-08-19 16:24
2011.12.11
JavaScript (Sencha ExtJS)


15-1314217798
Юрий
2011-08-25 00:29
2011.12.11
С днем рождения ! 25 августа 2011 четверг





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский