Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.12.11;
Скачать: CL | DM;

Вниз

Функция 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 вся ветка

Текущий архив: 2011.12.11;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.01 c
2-1314552284
Gu
2011-08-28 21:24
2011.12.11
Dll


2-1314799215
Васюня
2011-08-31 18:00
2011.12.11
Пожлуйста, как нати все файлы в папке!


2-1314167622
6136
2011-08-24 10:33
2011.12.11
как полученные на сервер данные отображать в графике


15-1313675656
Andy BitOff
2011-08-18 17:54
2011.12.11
Протокол обмена с весами CAS AD-25


2-1314109649
Сергей
2011-08-23 18:27
2011.12.11
Как перехватить исключение Ado?