الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Processes and Threads

بدأه الاخير زمانه في 22 أغسطس 2010 · 34 رد · 4,652 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم و رحمة الله ،،

شفت نفسي لدي وقت فاضي ممكن استغله ،، سأضع مجموعة من الدروس ان شاء الله عن ال Processes and Threads سأحتاجها انا شخصيا في المستقبل ، قلت اكتبها من هسه و اضعها هنا ، حسب وقت فراغي.

سنتكلم اليوم قليلا عن ال Process

أولا المقصود ب Processes هي البرامج التي تعمل ألان في النظام.

A process represents a single instance of a program. If another copy of the program is running at the same time, each instance of the program creates a new process.(1)

لمعرفة و مشاهدة البرامج (processes) التي تعمل ألان في الحاسبة ، هنالك عدة برامج ربما من أشهرها ال Task Manager الذي يأتي مع نظام التشغيل ويندوز.

اضغط على Ctrl + Alt + Del و سيظهر لك البرنامج

post-47438-016172200 1282489682_thumb.jp

ال Tab الخاص بالProcess يظهر أسماء الProcess مع معلومات عن كل Process أهمها هو ال PID ، وهو عبارة عن رقم unique يقوم نظام التشغيل بإعطاء كل Process رقم معين يتم تميزها من خلاله.

أيضا من خلال البرنامج ، من قائمة View-->Select Columns

post-47438-063482000 1282489687_thumb.jp

يمكن التحكم بالمعلومات التي تظهر ، مثلا يمكن أظهار الأسبقية الخاصة بكل Process

post-47438-098669300 1282489692_thumb.jp

و غيرها.

Working with Processes in C#

ألان بالعودة إلى ال C# وكيفية التعامل مع الProcess من خلالها.

أولا سنتعلم كيفية أظهار الProcess لتي تعمل في النظام ، أي عمل شيء مشابه لواجهة ال Task Manager الخاصة بإظهار الProcess لكن بصورة مبسطة سنقوم بإظهار بعض المعلومات.

ال C# وفرت class يمكن من خلاله التعامل مع الProcess هو Process class.

The .NET Process Class

The System.Diagnostics namespace includes the Process class, which is used within a C# program to retrieve and set information for individual processes running on the system. The Process class can start, stop, control, and monitor processes, all from within your program(1).

سنكون تطبيق بسيط لإظهار أسماء الProcess و الرقم الخاص بكل Process.

كالأتي:

post-47438-045242100 1282489697_thumb.jp

عبارة عن ListView control يحوي على عمودين

والبرمجة ستكون كالأتي في الحدث Load

ListViewItem obj;
        private void Form1_Load(object sender, EventArgs e)
        {

            foreach (Process thisproc in Process.GetProcesses())
            {                
                obj = new ListViewItem(thisproc.Id.ToString());
                obj.SubItems.Add(thisproc.ProcessName);              
                listView1.Items.Add(obj);
            }
            label2.Text += listView1.Items.Count;
        }

استخدمنا الدالة GetProcesses للحصول على البرامج التي تعمل الان في النظام ثم قمنا بأضافة اسم الProcess و رقمها الى ال ListView.

ممكن إضافة أعمدة أخرى إلى ال ListView وإظهار معلومات أخرى من ال Process class .

يتبع...

المرفقات
1.JPG2.JPG3.JPG4.JPG

تم تعديل هذه المشاركة بواسطة الاخير زمانه في 22 أغسطس 2010 في 18:13

2

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#2

السلام عليكم ،

الان لو اردنا تكوين process جديدة ، أي تشغيل برنامج من داخل السي شارب، نستخدم

Process.Start("program path/name");

مثلا لتشغيل برنامج المفكرة الذي ياتي مع الويندوز

Process.Start("notepad.exe");

و ممكن ايضا تمرير اسم فايل معين ليتم فتحه مباشرة في البرنامج ،

Process.Start("notepad.exe","c:\\1.txt");

و لتشغيل برنامج معين موجود في مسار ما نكتب المسار كاملا

Process.Start("d:\\MyApp.exe");

((طبعا ممكن استخدام ProcessStartInfo و الذي يعطي تحكم في process المشغلة ))

و لأنهاء process معينة ،،

لو نعود الى البرنامج في الدرس السابق و نضيف له Context Menu Strip بها خيار Kill

post-47438-097821800 1282561530_thumb.jp

و الان عند الضغط على الزر سيتم انهاء البرنامج المحدد ،،

ممكن استخدام الدالة CloseMainWindow للأنهاء بصورة طبيعية ، حيث تقوم هذه الدالة بأرسال WM_CLOSE و عليه اذا كانت هناك بيانات تتطلب الخزن وما الى ذلك سيقوم البرنامج بسؤالك ،

ايضا ممكن استخدام الدالة Kill() و هذه تقوم بلأنهاء القسري وقد تفقد البيانات التي تتطلب الخزن.

الكود كالتالي:

Process p = Process.GetProcessById( 
      int.Parse(listView1.SelectedItems[0].SubItems[0].Text));
// p.CloseMainWindow();
p.Kill();          
listView1.Items.Remove(listView1.SelectedItems[0]);

اولا حصلنا على مؤشر للprocess المراد انهائها وهي المختارة من ال ListView ثم ممكن استخدام CloseMainWindow او Kill() لأنهاء process.

المرفقات
1.JPG
1

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#3

سنتعلم كيفية تشغيل نسخة واحدة فقط من البرنامج ،،

هناك طريقة بأستخدام ال Mutex ربما سنتطرق لها لاحقا.

لكن اليوم سنستخدم دوال process.

كون برنامج جديد و في ال Load event

قم بكتابة الاتي

            Process proc = Process.GetCurrentProcess();
            string PName = proc.ProcessName;

            int count = 0;
            foreach (Process p in Process.GetProcesses())
            {
                if (p.ProcessName == PName)
                    count++;
            }
            if (count > 1)
            {
                MessageBox.Show("The application '" + PName + "' is allready
                    running ", "Application allready running",
                    MessageBoxButtons.OK, MessageBoxIcon.Stop);
                Close();
            }

الان نفذ البرنامج ،،

اغلق البرنامج و الان اذهب الى مكان خزن البرنامج واضغط دبل كلك على الملف exe لتشغيل البرنامج ، ثم حاول تشغيل البرنامج مرة اخرى بالضغط مرة ثانية دبل كلك.

1

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#4

Thread

كل برنامج يتكون من Thread واحد على الاقل او اكثر،،

يعني لما نكتب أي برنامج بسيط في السي شارب او في غيرها يكون متكون بالاساس من Thread واحد.

Thread ترجمته هو مسلك تنفيذي يسلكه البرنامج ،،

يمكننا برمجيا اضافة ما نريد من Thread.

فائدة Thread تكمن في تحسين اداء البرنامج بشكل اساس ، ناهيك انه في اوقات و حالات معينة انت مضطر لاستخدام Thread وخاصة في برمجة الشبكات.

يمكن ان تعتبر Thread كدالة لكن دالة خاصة ما يميزها انها تنفذ بشكل متوازي.

يعني لو كانت لديك عملية معقدة و تأخذ وقت طويل ممكن تقسيمها الى 2 thread مثلا او اكثر وهذه ال threads ستتنفذ بشكل متوازي و بالتالي سيقل وقت التنفيذ وتزيد كفاءة البرنامج،،

مع الامثلة ستتضح الصورة اكثر.

لكن الان قبل ان نتعلم كيفية تكوين Thread جديدة سنتعلم كيف من الممكن اظهار وعرض ال Threads الموجودة في برنامج معين.

بالعودة الى التطبيق الذ كوناه سنضيف عمود جديد لأظهار عدد Thread ثم فورم جديد لأظهار اسماء هذه Thread.

انظر اولا الى ال Task manager

ممكن اظهار عدد Thread الموجود في Process معينة

اولا تأشير الخيار

post-47438-095476900 1282576593_thumb.jp

post-47438-047225200 1282576611_thumb.jp

لاحظوا عدد Thread الموجود في كل Process.

الان نعود الى برنامجنا سيكون كالاتي:

post-47438-004727500 1282576634_thumb.jp

سنضيف عمود جديد لأظهار عدد Thread ، وعن الضغط بالزر الايمن ، في القائمة هناك خيار لأظهار هذه Thread في فورم ثاني

هكذا

post-47438-099219200 1282576649_thumb.jp

أي اضف فورم ثاني ورتبه كما في الصورة.

الان اولا لأظهار عدد Thread في العمود الخاص بذلك سنضيف فقط الاتي

obj.SubItems.Add(thisproc.Threads.Count.ToString());

سنضيفها في ال Load event ، أي الكود كاملا سيكون كالتالي:

private void Form1_Load(object sender, EventArgs e)
        {
            listView1.Items.Clear();
            foreach (Process thisproc in Process.GetProcesses())
            {                
                obj = new ListViewItem(thisproc.Id.ToString());
                obj.SubItems.Add(thisproc.ProcessName);
                obj.SubItems.Add(thisproc.Threads.Count.ToString());

                listView1.Items.Add(obj);
            }
            label2.Text += listView1.Items.Count;
        }

ولأظهار Thread في فورم ثاني ،

سنضيف الاتي داخل ال Context MenuStrip

public static Process p;
        private void showThreadsToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                if (listView1.SelectedItems.Count > 0)
                {
                    p = Process.GetProcessById(
                       int.Parse( listView1.SelectedItems[0].SubItems[0].Text));

                    Form2 frm = new Form2();
                    frm.ShowDialog();
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }

قمنا بتعريف متغير Public وخزنا فيه مؤشر للProcess التي نريد اظهار Thread الخاص بها ،، ومن داخل الفورم لثاني سنقوم بأضافة Thread الى ال ListView

الان انتقل الى الفورم الثاني وفي الحدث Load قم بأضافة الكود

        private void Form2_Load(object sender, EventArgs e)
        {
            try
            {

                foreach (ProcessThread pt in Form1.p.Threads)
                {
                    DateTime startTime = pt.StartTime;                   
                    ThreadState ts = pt.ThreadState;

                    ListViewItem file = new ListViewItem(pt.Id.ToString());
                    file.SubItems.Add(startTime.ToString());                  
                    file.SubItems.Add(ts.ToString());
                    listView1.Items.Add(file);

                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }

التطبيق في المرفق

Mini Task Manager0.rar

المرفقات
1.JPG2.JPG3.JPG4.JPG
1

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#5

السلام عليكم ،،

الان لتكوين Thread في البرنامج ،،

قبل ان نتعلم طريقة استخدام الكود، هناك control ممكن ان نستخدمه ونستفاد منه لأضافة Thread جديد للبرنامج.

اولا كون فورم جديد بهذا الشكل

post-47438-019639500 1282588860_thumb.jp

و الكود داخل الزر كالأتي:

long startingNum;
listBox1.Items.Clear();
startingNum = long.Parse(startingNumber.Text);

 for (long currentNum = startingNum;
            currentNum < startingNum + 100000;
            currentNum++)
            {

long factorial = 0;
for (long i = 1; i < currentNum; i++)
{
      factorial += i;
}
  listBox1.Items.Add(
      string.Format("The factorial of {0} is {1}",
      currentNum, factorial));
}

نفذ البرنامج ، ادخل رقم مثلا 1000 في ال textbox ثم نفذ البرنامج ومباشرة حاول تصغير او تكبير الفورم مثلا ، ستلاحظ ان الفورم لا يستجيب لك لأنه مشغول بعملية الحساب.

هنا تاتي فائدة ال thread لو كانت لديك عملية معقدة او تستغرق وقت ممكن وضعها في thread منفصل،،

Using BackgroundWorker Control

قم بأضافة الاداة BackgroundWorker الى الفورم

و البرمجة ستكون كالأتي

داخل الزر قم بتشغيل الاداة

private  long startingNum;
private void button1_Click(object sender, EventArgs e)    
{          
          listBox1.Items.Clear();
          startingNum =
              long.Parse(startingNumber.Text);
           backgroundWorker1.RunWorkerAsync();

}

وداخل الاداة قم بكتابة الكود الذي تريد ، في مثالنا هذا سنضع كود حساب المفكوك

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            for (long currentNum = startingNum;
            currentNum < startingNum + 100000;
            currentNum++)
            {
                long factorial = 0;
                for (long i = 1; i < currentNum; i++)
                {
                    factorial += i;
                }
                listBox1.Items.Add(
                string.Format("The factorial of {0} is {1}",
                currentNum, factorial));
             }
      }

الان نفذ البرنامج ولاحظ الفرق ،،

المرفقات
1.JPG
1

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#6

قبل ان اذكر كيفية تكوين Thread برمجيا ، اود ان اضع هذا الشرح عن ال thread مأخوذ من احد الكتب ،،

وبما اني ضد الترجمة سأضعها كما هي و هي واضحة ان شاء الله.

post-47438-039309700 1282645487_thumb.jp

post-47438-014147300 1282645503_thumb.jp

المصدر

C# 3.0:
The Complete Reference

صراحة كلام جميل حبيت اشارككم به لحين ان اكتب الدرس القادم.

المرفقات
1.JPG2.JPG
1

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#7

نسيت في البرنامج الخاص ب BackgroundWorker Control ، عند تنفيذه سيظهر exception حيث لايمكن التعامل مع control من thread ثاني ،

لحل هذه المشكلة اضف في بداية البرنامج

 Control.CheckForIllegalCrossThreadCalls = false;
1

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#8

السلام عليكم ،،

نبدء مع مثال بسيط في تكوين Thread

البرنامج كالآتي:

 static void Main(string[] args)
        {
            Thread t = new Thread(WriteY); 
            t.Start();             
            for (int i = 0; i < 100; i++) Console.Write("x");
        }
        static void WriteY()
        {
            for (int i = 0; i < 100; i++) Console.Write("y");
        }

طبعا من المفترض ان تضيف فوق

using System.Threading;

اسم ال thread في مثالنا هو WriteY ، يعني اعتبروها كدالة ، يتم استدعائها بطريقة معينة ، عن طريق Thread class ،،

ما يميز هذه الدالة انها ستتنفذ بصورة متوازية مع ال Main ،، يعني ال thread سيقوم بطباعة حرف y بنفس الوقت الذي فيه ال Main يطبع حرف x

هذه صورة توضيحية

post-47438-024795700 1282649011_thumb.jp

و هذه هي صورة ال output

post-47438-072504500 1282649077_thumb.jp

طبعا ممكن تكوين أكثر من thread كما في المثال التالي

      static void Main(string[] args)
        {
            Thread t1 = new Thread(One);
            Thread t2 = new Thread(Two);
            t1.Start();
            t2.Start();
            for (int i = 0; i < 100; ++i)
            {
                Console.WriteLine("Main: " + i);
            }
        }
        static void One()
        {
            for (int i = 0; i < 100; ++i)
            {
                Console.WriteLine("One: " + i);
            }
        }
        static void Two()
        {
            for (int i = 0; i < 100; ++i)
            {
                Console.WriteLine("Two: " + i);
            }
        }

ايضا ممكن تغير الاسبقية ل thread معينة بحيث تكون لها الاولوية في التنفيذ ،، ممكن ذلك بسهولة ، مثلا لو اردنا زيادة الاسبقية لل thread الاولى للبرنامج في الاعلى فقط سنكتب قبل تنفيذ ال thread

Thread t1 = new Thread(One);
            Thread t2 = new Thread(Two);
            t1.Priority = ThreadPriority.Highest;
            t1.Start();
            t2.Start();
المرفقات
2.JPG1.JPG
1

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#9

شكرا على الشرح الرائع سؤالين الان كيف اشغل برنامج مثلا عند تشغيل الويندوز مثلا فتح الالة الحاسبة عندما يتم تشغيل الجهاز تحياتي

وَعَبْدٌ قَدْ يَنامُ عَلَى حَرِيرٍ ××× وَذُو نَسَبٍ مَفَارِشُهُ التُّرَابُ

#10
EMNALI كتب:

شكرا على الشرح الرائع سؤالين الان كيف اشغل برنامج مثلا عند تشغيل الويندوز مثلا فتح الالة الحاسبة عندما يتم تشغيل الجهاز تحياتي

لتشغيل برنامج في بداية تشغيل الحاسبة تحتاج لوضع المسار الخاص به في الرجستري.

مثلا لو كتبت برنامج بالسي شارب وتريد البرنامج يعمل مع بداية تشغل الحاسبة ،،

ممكن تضيف الكود التالي في الحدث Load مثلا

        private void Form1_Load(object sender, EventArgs e)
        {
            RegistryKey key = Registry.CurrentUser.OpenSubKey(
                "Software\\Microsoft\\Windows\\CurrentVersion\\Run",true);
            key.SetValue("app", Application.ExecutablePath);

        }

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#12

شكرا اخي شرح اكثر من رائع

جزاك الله كل خير

#13

موضوع قيم جدا ورائع ،، كنت ابحث عن معلومات كي اقوم بانشاء موضوع مشابه ،، بارك الله فيك

تم تعديل هذه المشاركة بواسطة يمانية في 9 سبتمبر 2010 في 01:24

#14

صراحة اخي شرح اكثر من رائع

وجزاك الله حيرا

وان شاء الله مزيد من الدروس الجميلة

تم تعديل هذه المشاركة بواسطة ayash في 8 سبتمبر 2010 في 17:42

291964_260506123967115_206850989332629_1001538_45132_n.jpg

اللهم إني أعوذ بك من علم لا ينفع ، ومن قلب لا يخشع ، ومن نفس لا تشبع ، ومن دعوة لا يستجاب لها

#15

كان طلب توضيح أمر ولم أكن قد رأيت ملف التطبيق المرفق ،،

تم تعديل هذه المشاركة بواسطة يمانية في 9 سبتمبر 2010 في 02:00

#16

ان شاء الله سأقوم بوضع بقية الدروس عندما يفضى لي بعض الوقت

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#17

السلام عليكم اذا ممكن سؤال عن كيفية معرفة مسار البروسيس على القرص

وشكرا

291964_260506123967115_206850989332629_1001538_45132_n.jpg

اللهم إني أعوذ بك من علم لا ينفع ، ومن قلب لا يخشع ، ومن نفس لا تشبع ، ومن دعوة لا يستجاب لها

#19

مشكور احي

بس لما استعملتها اجالي خطا

access denied

ايش الحل وبارك الله فيك

تم تعديل هذه المشاركة بواسطة ayash في 15 سبتمبر 2010 في 14:54

291964_260506123967115_206850989332629_1001538_45132_n.jpg

اللهم إني أعوذ بك من علم لا ينفع ، ومن قلب لا يخشع ، ومن نفس لا تشبع ، ومن دعوة لا يستجاب لها

#20
اقتباس

بس لما استعملتها اجالي خطا

access denied

ايش الحل وبارك الله فيك

تمام اخي انا ايضا حصل لي خطأ ،،

بعد تتبع البرنامج -- المشكلة في هذه البروسيس

post-47438-030481800 1284608333_thumb.jp

انا تحايلت على الامر - يعني وضعت شرط اذا وصل الى هذه البروسيس لا يقرء مسارها --

ايضا ستظهر مشكلة في البروسيس الخاصة بالنظام -- المشكلة في هذه البروسيس انها ليس لها ملف .exe

وهذه البروسيس هي System Idle Process --- and --- System

these processes aren't running a real user-mode image(in that there is no "System Idle Process.exe") in the Windows directory)

ال ID الخاص بهذه البروسيسس هو 0 و 4

post-47438-076874900 1284608763_thumb.jp

لذا ايضا قمت يدويا بتجاز هذه الارقام --

يعني عالجت الامر يدويا ولا ادري هل توجد طريقة افضل من هذا

foreach (Process thisproc in Process.GetProcesses())
            {
                obj = new ListViewItem(thisproc.Id.ToString());
                obj.SubItems.Add(thisproc.ProcessName);                

                if(thisproc.ProcessName == "alg" )
                    obj.SubItems.Add("C:\\Windows\\system32\\alg.exe");
                else
                    if(thisproc.Id == 0 || thisproc .Id == 4)
                        obj.SubItems.Add("");
                    else
                        obj.SubItems.Add(thisproc.MainModule.FileName.ToString());

                listView1.Items.Add(obj);
            }
المرفقات
3.JPG4.JPG

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#21

مشكور اخي على الاجابة بس هذا الحل ما بنفع لما تعملو على جهاز ثاني

ليجي حطا

هل في دول تانية بتتعامل مع kernel mod لانو هذه الدول بتتعامل مع الuser mod

وانا صراحة بحاجة الها لاني بعمل في مشروع ANTIVIRUS وبدي افحص جميع البروسيس الشغالة افهمت علي اخي

وبارك الله فيك وان شاء الله في ميزان الحسنات

تم تعديل هذه المشاركة بواسطة ayash في 16 سبتمبر 2010 في 15:16

291964_260506123967115_206850989332629_1001538_45132_n.jpg

اللهم إني أعوذ بك من علم لا ينفع ، ومن قلب لا يخشع ، ومن نفس لا تشبع ، ومن دعوة لا يستجاب لها

#22

اولا ما هو الخطأ الذي يظهر؟

بالنسبة لدوال الكرنل-- هل سبق وان تعاملت مع ال kernel mode ؟

فالتعامل مع الكرنل لن يكون من خلال السي#.

هناك دوال api تقوم بنفس الامر ،،

CreateToolhelp32Snapshot  , Process32First , Process32Next

لكن دوال ال api لا يمكن استدعائها بصورة مباشرة -- يتم الامر بطريقة معينة.

عموما اظن ان الامر لا يتطلب الكرنل في اسوء الاحوال -- الذي يحدث انه هناك بعض البروسيس ليس لدينا الصلاحيات للتعامل معها -- ربما علينا اعطاء صلاحيات لأنفسنا او الاصح تغيير الصلاحيات على البروسيس نفسها ثم بعد ذلك يمكننا التعامل معها.

لست متأكد من الامر -- اذا كانت السي# لا توفر الامر فبكل تأكيد ال api تفي بالغرض.

ربما احد الاعضاء يفيدك اكثر -- GM مثلا :wink:

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#23

مش عارف ايش بدى احكيلك للمتابعة معاي غلبتك اكثير

-----------------------------------------------------------------------

اقتباس
الذي يحدث انه هناك بعض البروسيس ليس لدينا الصلاحيات للتعامل معها -- ربما علينا اعطاء صلاحيات لأنفسنا او الاصح تغيير الصلاحيات على البروسيس نفسها ثم بعد ذلك يمكننا التعامل معها.

يعني كيف

اقتباس
فبكل تأكيد ال api تفي بالغرض

ممكن مثال

وشكرا الك اخي

تم تعديل هذه المشاركة بواسطة ayash في 16 سبتمبر 2010 في 20:31

291964_260506123967115_206850989332629_1001538_45132_n.jpg

اللهم إني أعوذ بك من علم لا ينفع ، ومن قلب لا يخشع ، ومن نفس لا تشبع ، ومن دعوة لا يستجاب لها

#24

عادي اخي لم تغلبني ولا اشي -- اذا هناك مشكلة معينة واستطيع احلها فهذا يسعدني --

لكن صراحة معلوماتي لا تسعفني كثيرا --

اولا انت ماذا تريد ان تعمل بالضبط؟

ثانيا هل تعاملت مسبقا مع دوال ال api ؟ من خلال السي# او الفيجوال سي مثلا.

فهذه الدوال بها امكانيات اكبر

عملية تغيير الصلاحيات كان مجرد استنتاج مني لست متأكد منه.

تم تعديل هذه المشاركة بواسطة الاخير زمانه في 16 سبتمبر 2010 في 21:58

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#25
اقتباس
ولا انت ماذا تريد ان تعمل بالضبط؟

انا عندي مشروع antivirus وبدي اصل لجميع البروسيس الشغالين وعمل الهم فحص

اقتباس
هل تعاملت مسبقا مع دوال ال api ؟

تعاملت معها في الvb6

----------------------

بس صراحة ما استعملتها في c#

طيب احي ايش api الي بتساعدني في هلمشروع

وشكرا الك  

291964_260506123967115_206850989332629_1001538_45132_n.jpg

اللهم إني أعوذ بك من علم لا ينفع ، ومن قلب لا يخشع ، ومن نفس لا تشبع ، ومن دعوة لا يستجاب لها

مواضيع مشابهة