PDA

View Full Version : سوال: مشاهده همه پروسه های در حال اجرا در سیستم (32 و 64بیتی)



fahimeh1512
چهارشنبه 13 شهریور 1392, 15:27 عصر
سلام دوستان خسته نباشید
من میخوام برنامه ای بنویسم که همه فرایندهای درحال اجرای سیستم رو به همراه مسیر اجرای فایل اجراییشون چاپ کنه
بااستفاده از createtoolhelp32snapshot اسم فرایندا رو درمیارم ولی متاسفانه مسیر اجرایی همه رو چاپ نمیکنه
یعنی به خاطر 32 یا 64 بیتی بودن فراینداست؟ یا شرایط دسترسی به هر فراینده؟
ممنون میشم اگه نجاتم بدین

بهروز عباسی
چهارشنبه 13 شهریور 1392, 16:47 عصر
کدت رو بذار !

اگه نام همه رو داری و فقط نمیتونی آدرسشون رو بدست بیاری تعجبی نداره ! شما نمی تونی به مشخصات برخی پروسس ها مثل "csrss.exe" دسترسی داشته باشی برای برخی پروسس ها هم باید DebugPrivilege داشته باشی .

فعلاً وقت و حوصله نوشتن کد ندارم فکر کنم دیدن همین پروژه برات کافی باشه .
Process viewer (http://www.codeproject.com/Articles/18704/Process-viewer)

موفق باشی

fahimeh1512
چهارشنبه 13 شهریور 1392, 17:59 عصر
HANDLE hProcessSnap,hProcess;
PROCESSENTRY32 pe32;
DWORD dwPriorityClass;
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap==INVALID_HANDLE_VALUE) {
_tprintf(TEXT("CreateToolhelp32Snapshot (of processes)"));
if (GetLastError()==299)
_tprintf(TEXT("\n64bit process\n"));

return (FALSE);
}if (!Process32First(hProcessSnap,&pe32)) {
_tprintf(TEXT("Process32First"));
CloseHandle(hProcessSnap);
return (FALSE);
}
do {
hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pe32 .th32ProcessID);
if (hProcess==NULL)
_tprintf(TEXT("\nerror in: OpenProcess"));
ListProcessModules(pe32.th32ProcessID); //prints the directory of exe file
} while(Process32Next(hProcessSnap,&pe32));

BOOL ListProcessModules(DWORD dwPID) {
HANDLE hModuleSnap=INVALID_HANDLE_VALUE;
MODULEENTRY32 me32;
// Take a snapshot of all modules in the specified process.
hModuleSnap=CreateToolhelp32Snapshot(TH32CS_SNAPMO DULE,dwPID);
if(hModuleSnap == INVALID_HANDLE_VALUE) {
_tprintf(TEXT("\nCreateToolhelp32Snapshot (of modules)"));

return (FALSE);
}
me32.dwSize=sizeof(MODULEENTRY32);
if (!Module32First(hModuleSnap,&me32)) {
_tprintf(TEXT("\nModule32First"));
CloseHandle(hModuleSnap);
return (FALSE);
}
_tprintf(TEXT("\n\n MODULE NAME: %s"),me32.szModule);
_tprintf(TEXT("\n Executable = %s"),me32.szExePath);


فکر کنم نام همه پروسس ها رو ندارم با فرایندای تسک منیجر که مقایسه میکنم یه سری از فرایندها رو چاپ نمیکنه
درمورد DebugPrivilege هم میشه توضیح بدین چجوری میشه این امتیازو به دست اورد؟
من میخوام نام همه فرایندها رو ببینم با مسیر اجراشون:متفکر:

بهروز عباسی
چهارشنبه 13 شهریور 1392, 18:08 عصر
اون لینکی که توی پست اولم دادم رو ببین

درمورد DebugPrivilege هم میشه توضیح بدین چجوری میشه این امتیازو به دست اورد؟Enabling and Disabling Privileges in C++ (http://msdn.microsoft.com/en-us/library/windows/desktop/aa446619%28v=vs.85%29.aspx)

Felony
چهارشنبه 13 شهریور 1392, 18:25 عصر
برا به دست آوردن لیست پروسه ها به صورت کامل و بدون نیاز به دسترسی خاص میشه از توابع Process32First و Process32Next استفاده کرد ، این رو چند روز قبل با دلفی نوشتم :


function GetprocessList(ProcessList: TStrings): Boolean;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
ProcessList.Clear;
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
try
FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);

while Integer(ContinueLoop) <> 0 do
begin
ProcessList.Add(ExtractFileName(FProcessEntry32.sz ExeFile));
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
end;
finally
CloseHandle(FSnapshotHandle);
end;
end;

بهروز عباسی
پنج شنبه 14 شهریور 1392, 10:00 صبح
اینم کد !
فقط خواهشاً به جای Copy/Paste کمی هم بهش دقت کن .

اگه سیستم عامل شما 32بیت باشه مسیر پروسه ها رو هم بر می گردونه ولی اگه 64بیت باشه برای بدست آوردن لیست پروسه های 64بیتی باید برنامه خودتون هم در حالت 64بیتی کامپایل بشه .
نتیجه هم در حالت 64 و هم 32 بیت در تصویر زیر نشون داده شده.
#include <Windows.h>
#include<TlHelp32.h>
#include <psapi.h>
#include <iostream>

using namespace std;



int main() {
HANDLE hProcessSnap, hProcess;

HANDLE hProcessHandle = NULL;
LPTSTR filename = new CHAR[MAX_PATH];
PROCESSENTRY32 pe32;

hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap != INVALID_HANDLE_VALUE) {

pe32.dwSize = sizeof(PROCESSENTRY32);

printf("Count of processes %i : \n\n ", pe32.dwSize);

if (Process32First(hProcessSnap, &pe32)) {
do {
printf("PName: %s \n", pe32.szExeFile);

hProcessHandle =
OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
FALSE, pe32.th32ProcessID);

if (hProcessHandle != INVALID_HANDLE_VALUE) {
if (GetModuleFileNameEx(hProcessHandle, NULL, filename,
MAX_PATH) != 0) {
cout << "PPath: " << filename << endl;
}
CloseHandle(hProcessHandle);
}

}
while (Process32Next(hProcessSnap, &pe32));

}

}

system("pause");
return 0;
}

نتیجه



موفق باشی.

fahimeh1512
پنج شنبه 14 شهریور 1392, 16:12 عصر
کدتون رو خوندم تصویرشم که گذاشتین خیلی در فهمش کمکم کرد ولی میخوام اجراش کنم ارور لینکی میده fatal error1120,2019
دنبال این شماره ارورها میگردم بیشتر مشکلش با mainبرنامه ست ولی به نظرم درسته!
چجوری باید رفعش کنم؟

UfnCod3r
پنج شنبه 14 شهریور 1392, 18:46 عصر
اینو

int main()

بکن این

int main(int argc, char** argv)

درصمن بهتر بود خطا رو بنویسی کامپایلرت هم بگی . اه :عصبانی++:

.

1485159
پنج شنبه 14 شهریور 1392, 19:02 عصر
[QUOTE=UfnCod3r;1868453]اینو

int main()

بکن این

int main(int argc, char** argv)

درصمن بهتر بود خطا رو بنویسی کامپایلرت هم بگی . اه :عصبانی++:
چه دلیل داره اینکار؟

omidshaman
پنج شنبه 14 شهریور 1392, 20:06 عصر
کدو منم نتونستم اجرا کنم ارورش مال لینک نشدن dll ای چیزیه :متفکر:

UfnCod3r
پنج شنبه 14 شهریور 1392, 20:34 عصر
اینو باید لینک کنی psapi.lib
:لبخندساده:
اینو به اول فایل اضافه کن

#pragma comment(lib, "psapi.lib")

بهروز عباسی
جمعه 15 شهریور 1392, 19:06 عصر
من خودم با VC 2012 همین کد رو کامپایل کردم مشکلی هم نبود !!

fahimeh1512
یک شنبه 17 شهریور 1392, 19:05 عصر
اگه سیستم عامل شما 32بیت باشه مسیر پروسه ها رو هم بر می گردونه ولی اگه 64بیت باشه برای بدست آوردن لیست پروسه های 64بیتی باید برنامه خودتون هم در حالت 64بیتی کامپایل بشه .

میشه بگید چجوری میشه برنامه رو در حالت 64بیتی کامپایل کرد؟ همونطور که تو عکس مشخصه برنامه 64بیتی تو یه مسیر با اسم x64 قرارمیگیره ولی چطوری؟؟:متفکر:

UfnCod3r
یک شنبه 17 شهریور 1392, 19:56 عصر
اگه VS داری ::
اون بالا نوشته Win32 .کنارDebug. یکم یاهاش ور برو خودت می فهمی .:لبخندساده: