Главная страница
    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.49 MB
Время: 0.004 c
1-1276603042
AIV2104
2010-06-15 15:57
2011.12.11
DCPcrypt для Delphi 7 и 2009 не ставиться из-за rtl.bcp


2-1314256325
lewka
2011-08-25 11:12
2011.12.11
Пароли пользователей


2-1314597578
petvv
2011-08-29 09:59
2011.12.11
Вызвать функцию exe из dll


15-1314004716
pointerman
2011-08-22 13:18
2011.12.11
Графический интерфейс программы


1-1276512538
Дмитрий Белькевич
2010-06-14 14:48
2011.12.11
Ищу реализацию таймера в треде.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский