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

Delphi & Native API

مغلق
بدأه tmaaa في 13 مايو 2002 · 12 رد · 5,840 مشاهدة · في أرشيف منتدى الدلفي
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

كما يتضح من العنوان سيكون الموضوع متعلقا بالدوال المسماه Native API . ربما لا يخفى على الجميع ما هي الــ Native API لكن لا بأس من ذكر فكرة مختصره عن ماهية الــ Native API .

هي مجموعة من الدوال - الروتينات - او لنقل خدمات (services ) يقدمها النظام لكلا نمطي النظام User & Kernel Mode . هذه الدوال مساويه او مكافئه لـ" استدعاءات النظام Unix او خدمات النظام VMS ".

هذه الدوال هامة جدا و باستخدامها احيانا يمكن لنا الاستغناء عن كم كبير من الكود للحصول على معلومات معينه ...

اغلب هذه الدوال غير مصرح بها - undocumented function - و من النادر الحصول على معلومات عنها وعن كيفية التعامل معها ( DDK يحتوي شرح لـ 10% تقريبا من هذه الدوال ) , لذا فاني اطرح فكرة عمل مرجع لهذه الدوال وكيفية استعمالها في هذا المنتدى , فمن له خبرة و اهتمام بهكذا موضوع اتمنى المشاركة .

من المراجع المتوفرة عن هذه الدوال Windows NT/2000 Native API Reference By Gary Nebbett

لنبدأ :

1) ZwQuerySystemInformation :

كما يتضح من الاسم هذه الدالة تعطي معلومات تتعلق بالنظام .

* تعريف الدالة :

- التعريف كما جاء في المرجع السابق :

NTSYSAPI
NTSTATUS
NTAPI
NtQuerySystemInformation 
(
  IN UINT SystemInformationClass, 
    // information type
  OUT PVOID SystemInformation, 
    // pointer to buffer
  IN ULONG SystemInformationLength, 
    // buffer size in bytes
  OUT PULONG ReturnLength OPTIONAL 
    // number of bytes written to the buffer
);

- التعريف المقابل في Delphi :

Type TPDword=^DWORD;
   function NtQuerySystemInformation: 
( 
SystemInformationClass : DWORD;
SystemInformation : Pointer;
SystemInformationLength : DWORD;
ReturnLength : TPDword 
):
DWORD; stdcall;

وليكون تعريف الدلفي قريبا الى تعريف المرجع يمكن استخدام ULONG بدلا عن DWORD فهما سيان , ولا ضير في استخدام PULONG بدلا عن TPWORD

Type PULONG = ^ULONG;

* متغيرات الدالة :

- SystemInformationClass :

نوع المعلومات المراد الحصول عليها . وهي احدى قيم SYSTEM_INFORMATION_CLASS وهناك 54 نوعا (0-53) . سيتم ذكرها لاحقا .

- SystemInformation :

مؤشر الى مساحة من الذاكرة (buffer) يخصص لمستدعي الدالة او الى متغير يستقبل معلومات النظام المطلوبه .

- SystemInformationLength :

حجم الـ SystemInformation هنا تستعمل الـ byte كوحدة .على مستخدم الدالة ( المستدعي ) عمل الاعدادات اللازمه لـ SystemInformation .

- ReturnLength :

بالامكان جعله يشير الى متغير , هذا المتغير يستقبل عدد الـ bytes الحقيقي لـ SystemInformation .

اذا كان SystemInformationLength صغير جدا فلن يحتوي هذا المتغير على معلومة يمكن الاستفاده منها ,عادة ما يعد هذا المتغير بقيمه مساويه لصفر .

اذا كنا لا نريد مثل هذه المعلومة ( حجم الـ SystemInformation ), نجعل المتغير على شكل NULL Pointer .

- القيمة التي ترجعها الدالة :

ترجع الدالة STATUS_SUCCESS او حالة خطأ مثل : STATUS_INVALID_INFO_CLASS ,STATUS_NOT_IMPLEMENTED او STATUS_INFO_LENGTH_MISMATCH .

* SYSTEM_INFOMATION_CLASS :

كما ذكرت مسبقا هناك 54 Class سأقوم بسردهم هنا و سيتم لاحقا عمل شرح لكل واحد منهم .

استخدم الـ enum لتعريف هذه الانواع في لغة c , حيث تعطى قيم طبيعية لكل نوع ابتداء من 0 حتى 53 , بالنسبة لدلفي فسوف استخدم const لتعريفها .

const
//------------------------------------------------- Query Set
SystemBasicInformation                  = 0    ; //  Y    N
SystemProcessorInformation              = 1    ; //  Y    N
SystemPerformanceInformation            = 2    ; //  Y    N
SystemTimeInformation                   = 3    ; //  Y    N
SystemNotImplemented1                   = 4    ; //  Y    N
SystemProcessesAndThreadsInformation    = 5    ; //  Y    N
SystemCallCounts                        = 6    ; //  Y    N
SystemConfigurationInformation          = 7    ; //  Y    N
SystemProcessorTimes                    = 8    ; //  Y    N
SystemGlobalFlag                        = 9    ; //  Y    Y
SystemNotImplemented2                   = 10   ; //  Y    N
SystemModuleInformation                 = 11   ; //  Y    N
SystemLockInformation                   = 12   ; //  Y    N
SystemNotImplemented3                   = 13   ; //  Y    N
SystemNotImplemented4                   = 14   ; //  Y    N
SystemNotImplemented5                   = 15   ; //  Y    N
SystemHandleInformation                 = 16   ; //  Y    N
SystemObjectInformation                 = 17   ; //  Y    N
SystemPageFileInformation               = 18   ; //  Y    N
SystemInstructionEmulationCounts        = 19   ; //  Y    N
SystemInvalidInfoClass1                 = 20   ;
SystemCacheInformation                  = 21   ; //  Y    Y
SystemPoolTagInforamtion                = 22   ; //  Y    N
SystemProcessorStatistics               = 23   ; //  Y    N
SystemDpcInformation                    = 24   ; //  Y    Y
SystemNotImplemented6                   = 25   ; //  Y    N
SystemLoadImage                         = 26   ; //  Y    N
SystemUnloadImage                       = 27   ; //  Y    N
SystemTimeAdjustment                    = 28   ; //  Y    Y
SystemNotImplemented7                   = 29   ; //  Y    N
SystemNotImplemented8                   = 30   ; //  Y    N
SystemNotImplemented9                   = 31   ; //  Y    N
SystemCrashDumpInformation              = 32   ; //  Y    N
SystemExceptionInformation              = 33   ; //  Y    N
SystemCrashDumpStateInformation         = 34   ; //  Y    Y/N
SystemKernelDebuggerInformation         = 35   ; //  Y    N
SystemContextSwitchInformation          = 36   ; //  Y    N
SystemRegistryQuoaInformation           = 37   ; //  Y    Y
SystemLoadAndCallImage                  = 38   ; //  Y    N
SystemPrioritySeparation                = 39   ; //  N    Y
SystemNotImplemented10                  = 40   ; //  Y    N
SystemNotImplemented11                  = 41   ; //  Y    N
SystemInvalidInfoClass2                 = 42   ;
SystemInvalidInfoClass3                 = 43   ;
SystemTimeZoneInformation               = 44   ; //  Y    N
SystemLookasideInformation              = 45   ; //  Y    N
SystemSetTimeSlipEvent                  = 46   ; //  N    Y
SystemCreateSession                     = 47   ; //  N    Y
SystemDeleteSession                     = 48   ; //  N    Y
SystemInvalidInfoClass4                 = 49   ;
SystemRangeStartInformation             = 50   ; //  Y    N
SystemVerifierInformation               = 51   ; //  Y    Y
SystemAddVerifier                       = 52   ; //  N    Y
SystemSessionProcessInformation         = 53   ; //  Y    N

سياتي شرح هذه الانواع واحدا واحدا ان شاء الله .

قد نلاحظ وجود Y,N اسفل الكلمتين Query,Set وهي تدل اذا ما كان هذا النوع من المعلومات يمكن استعمال الدالة NtQuerySystemInformation لعمل Query والحصول على معلومات

, او استعمال الدالة NtSetSystemInformation للقيام بتغيير معلومات النظام .

هذه المرة سنتعرف على اول نوع من معلومات النظام :

SystemBasicInformation :

* التعريف :

type
  TSystem_Basic_Information = packed record
        dwUnknown1 : DWORD;
        MaximumIncrement : ULONG;
        PhysicalPageSize : ULONG;
        NumberOfPhysicalPages : ULONG;
        LowestPhysicalPage : ULONG;
        HighestPhysicalPage : ULONG;
        AllocationGranularity : ULONG;
        LowestUserAddress : ULONG;
        HighestUserAddress : ULONG;
        ActiveProcessors : ULONG;
        NumberProcessors : byte;
        bUnknown2 : byte;
        wUnknown3 : word;
   end;

* عناصر الـ record :

- dwUnknown1 :

دائما يحوي القيمة 0 (صفر) غير معروف تفسير لهذه القيمة .

- MaximumIncrement :

( المعذرة لم تعجبني ترجمتي سواء من الانجليزيه او الصينيه الى العربيه ,لذا فضلت ذكر النص الانجليزي )

The maximum number of 100-nanosecond units between clock ticks. Also the number of

100-nanosecond units per clock tick for kernel intervals measured in clock ticks.

- PhysicalPageSize :

حجم صفحة فيزيائيه . ( الوحده Byte ).

- NumberOfPhysicalPages :

عدد الصفحات الفيزيائيه التي يديرها نظام التشغيل .

- LowestPhysicalPage :

اقل عدد من الصفحات الفيزيائيه يديرها نظام التشغيل . ( ترقيمها يبدأ من 0 ) .

- HighestPhysicalPage :

اكبر عدد من الصفحات الفيزيائيه يديرها نظام التشغيل . ( ترقيمها يبدأ من 0 ) .

- AllocationGranularity :

العنوان الاساسي -base address- للــ Virtual Memory , وهو reserved address .

- LowestUserAddress :

Low virtual address الموجودة فيه برامج الـ user mode .

- HighestUserAddress :

High virtual address الموجودة فيه برامج الـ user mode .

- ActiveProcessors :

تمثل رقم الـ Processor النشط . 0 تعني Processor 0 و بالمثل الى 31 التي تعني Processor 31.

- NumberProcessors :

عدد الـ Processors الموجودة في النظام .

- bUnknown2 :

غير معروف .

- wUnknown3 :

غير معروف .

جاء الان الوقت لكتابة مثال يظهر كيفيه الحصول على System Basic Informaion .

Example 1 :

علينا اضافة TMemo و TButton .

// System Basic Informaion
// يكتب بعد تعريف الـ TForm class 
 type
  PSystem_Basic_Information=^TSystem_Basic_Information;
  TSystem_Basic_Information = packed record
        dwUnknown1 : DWORD;
        MaximumIncrement : ULONG;
        PhysicalPageSize : ULONG;
        NumberOfPhysicalPages : ULONG;
        LowestPhysicalPage : ULONG;
        HighestPhysicalPage : ULONG;
        AllocationGranularity : ULONG;
        LowestUserAddress : ULONG;
        HighestUserAddress : ULONG;
        ActiveProcessors : ULONG;
        NumberProcessors : byte;
        bUnknown2 : byte;
        wUnknown3 : word;
   end;
  TPDword=^DWORD;
var
  NtQuerySystemInformation: function(infoClass: DWORD;
                buffer: Pointer;
                bufSize: DWORD;
                returnSize: TPDword):
                DWORD; stdcall =nil;
...

function MyNativeApi:bool;
var
hLib : DWORD;
begin
result:=True;
hLib := LoadLibrary('NTDLL.DLL');
if hLib>0 then
 NtQuerySystemInformation := GetProcAddress(hLib,
                'NtQuerySystemInformation')
else
 result:=false;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
SysInfo:TSystem_Basic_Information;
status: Longint;
begin
if MyNativeApi then
begin
status:= NtQuerySystemInformation(0, @SysInfo, SizeOf(SysInfo), nil);
if(status<>0) then
 exit;
Memo1.Lines.Clear;
Memo1.Lines.Add(inttostr(sizeof(SysInfo)));
Memo1.Lines.Add(inttostr(SysInfo.dwUnknown1));
Memo1.Lines.Add(inttostr(SysInfo.MaximumIncrement));
Memo1.Lines.Add(inttostr(SysInfo.PhysicalPageSize));
Memo1.Lines.Add(inttostr(SysInfo.NumberOfPhysicalPages));
Memo1.Lines.Add(inttostr(SysInfo.LowestPhysicalPage));
Memo1.Lines.Add(inttostr(SysInfo.HighestPhysicalPage));
Memo1.Lines.Add(inttostr(SysInfo.AllocationGranularity));
Memo1.Lines.Add(inttostr(SysInfo.LowestUserAddress));
Memo1.Lines.Add(inttostr(SysInfo.HighestUserAddress));
Memo1.Lines.Add(inttostr(SysInfo.ActiveProcessors));
Memo1.Lines.Add(inttostr(SysInfo.NumberProcessors));
Memo1.Lines.Add(inttostr(SysInfo.bUnknown2));
Memo1.Lines.Add(inttostr(SysInfo.wUnknown3));
end;
end;

ان كان هناك اهتمام بالموضوع :-

----------

في المرة القادمة ان شاء الله سيتم وضع كل مايتعلق بالـ Native API من دوال او records .. في unit واحدة تضمها جميعا , حتى يسهل استخدامها .

اتمنى ممن له خبرة في الموضوع المشاركة في تجميع اكبر قدر من المعلومات , فمثل هذه الدوال يندر وجود معلومات عنها .

----------

(f)

CIONO1

تم تعديل هذه المشاركة بواسطة ORWA في 20 نوفمبر 2004 في 23:44

هناك حتى الأحلام أصبحت ممنوعة ...

إنه لعار أن ننتمي لهكذا أوطان ... لكن ... ربما العار أن نكون نحن أبناء لتلكم أوطان .. من يدري ؟!!

ليعلم أولئك ... إنّ الشعوب إنْ هي استيقظت تسحق ظُلامََهَا ...

There, even in dreams u r wanted

To be a programmer, how a nice dream it was

Leaving ...

أعيدوا لإسمي لونه المفضل

#2

السلام عليكم أخي tmaaa أحييك على هذه البادرة ,

الصراحة ماني فاهم شي من الدوال اعلاه :D بس أحس انها مهمه

عموماً أنا لي بدايات خجوله لدوال الــ API بس مو جديه إلى الآن

على يدك إن شاء الله بس انا أقترح أنك تضع شرح لدوال اقل تعقيداً

من هذه :) و عموماً إبداء و إن شاء الله نحن معك في التلقي :D

مع تحياتي ...

#3

السلام عليكم

هلا طلال .

بالنسبة لدوال الـapi المعروفه هناك العديد من المواقع في الانترنت تضع شرح لها وامثله عليها , لكن دوال native api من النوع النادر الحصول على معلومات عنها ( اسأل MS عن السبب :D ) , لذا فقد وددت وضع موضوع عنها يتم فيه كتابه كل ما يعرف عن هذه الدوال مع امثله مكتوبه بلغة دلفي , طبعا ليس من الصعب تحويل الكود الى C .

(f)

CIONO1

هناك حتى الأحلام أصبحت ممنوعة ...

إنه لعار أن ننتمي لهكذا أوطان ... لكن ... ربما العار أن نكون نحن أبناء لتلكم أوطان .. من يدري ؟!!

ليعلم أولئك ... إنّ الشعوب إنْ هي استيقظت تسحق ظُلامََهَا ...

There, even in dreams u r wanted

To be a programmer, how a nice dream it was

Leaving ...

أعيدوا لإسمي لونه المفضل

#4

مشكور اخوي tmaaa على طرح مثل هذه المواضيع

والصحيح ان موضوعك شيق وخطير في نفس الوقت ;)

وتقبل اطيب تحياتي اخوك SUM (gift)

#5

مشكوووور :) ونحن معاك

تحياتي للجميع :)

#6

السلام عليكم

شكرا للجميع (f) (f) .

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

تكمله للموضوع السابق

كما ذكرت سنقوم بانشاء unit تضم جميع ما يتعلق بالــnative api .

لنبدأ :

نقوم بانشاء unit ولنسمها nativeapi و ستكون كالاتي :

unit nativeapi;

interface

//*** constant declaration ***

//*** types declaration ***

//*** function declaration ***

implementation

end.

وسيتم اضافة الكود الى الـ unit تدريجيا .

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

نضف التصريحات بالثوابت المذكوره سابقا (54 ثابتا )في قسم الثوابت , ونضف ايضا ما يلي الى قسم الثوابت

NTDLL = 'ntdll.dll';

ونضف تصريح TSystem_Basic_Information و TPDWord في قسم الـtypes ,

اما في قسم الدوال علينا باضافة مايلي :

function MyNtQuerySystemInformation (infoClass: DWORD;
                buffer: Pointer;
                bufSize: DWORD;
                returnSize: TPDword):
                DWORD; stdcall; external NTDLL name 'NtQuerySystemInformation';

الان سنقوم باستعمال الـunit السابقة للحصول على المعلومات من النوع System_Basic_Information :

بعد انشاء project جديد نضف button1 و Memo1 , وفي قسم الـ uses نضف nativeapi .

في الكود الخاص بــ onclick event لــ button1 نكتب الاتي :

procedure TForm1.Button1Click(Sender: TObject);
var
SysInfo:TSystem_Basic_Information;
status: Longint;
begin
status:= NtQuerySystemInformation(SystemBasicInformation, @SysInfo, SizeOf(SysInfo), nil);
if(status<>0) then
 exit;
Memo1.Lines.Clear;
Memo1.Lines.Add('dwUnknown1  : '+inttostr(SysInfo.dwUnknown1));
Memo1.Lines.Add('MaximumIncrement  : '+inttostr(SysInfo.MaximumIncrement));
Memo1.Lines.Add('PhysicalPageSize  : '+inttostr(SysInfo.PhysicalPageSize));
Memo1.Lines.Add('NumberOfPhysicalPages  : '+inttostr(SysInfo.NumberOfPhysicalPages));
Memo1.Lines.Add('LowestPhysicalPage  : '+inttostr(SysInfo.LowestPhysicalPage));
Memo1.Lines.Add('HighestPhysicalPage  : '+inttostr(SysInfo.HighestPhysicalPage));
Memo1.Lines.Add('AllocationGranularity  : '+inttostr(SysInfo.AllocationGranularity));
Memo1.Lines.Add('LowestUserAddress  : '+inttostr(SysInfo.LowestUserAddress));
Memo1.Lines.Add('HighestUserAddress  : '+inttostr(SysInfo.HighestUserAddress));
Memo1.Lines.Add('ActiveProcessors  : '+inttostr(SysInfo.ActiveProcessors));
Memo1.Lines.Add('NumberProcessors  : '+inttostr(SysInfo.NumberProcessors));
Memo1.Lines.Add('bUnknown2  : '+inttostr(SysInfo.bUnknown2));
Memo1.Lines.Add('wUnknown3  : '+inttostr(SysInfo.wUnknown3));
end;

هكذا نكون قد اعدنا المثال المذكور سابقا ولكن بطريقة منظمة اكثر ( هذا ما أعتقده :D ) .

تم تعديل هذه المشاركة بواسطة ORWA في 20 نوفمبر 2004 في 23:45

هناك حتى الأحلام أصبحت ممنوعة ...

إنه لعار أن ننتمي لهكذا أوطان ... لكن ... ربما العار أن نكون نحن أبناء لتلكم أوطان .. من يدري ؟!!

ليعلم أولئك ... إنّ الشعوب إنْ هي استيقظت تسحق ظُلامََهَا ...

There, even in dreams u r wanted

To be a programmer, how a nice dream it was

Leaving ...

أعيدوا لإسمي لونه المفضل

#7

السلام عليكم

ياتي الان الدور على النوع الثاني من معلومات النظام وهو System_Processor_Information ,لنبدأ :

اولا اضافة التصريحات الى nativeapi :

في قسم التصريحات بالانواع (Types declaration )نضف مايلي :

   PSystem_Processor_Information =^TSystem_Processor_Information;
   TSystem_Processor_Information=Record
        ProcessorArchitecture:WORD;
        ProcessorLevel:WORD;
        ProcessorRevision:WORD;
        Unknown:WORD;
        FeatureBits:ULONG;
   end;

ثانيا المثال على النوع المذكور :

نضف Button اخر الى الـ Form و سيكون الكود الخاص بـ onclick event كالاتي :

procedure TForm1.Button2Click(Sender: TObject);
var
SysProcessorInfo:TSystem_Processor_Information;
status: Longint;
begin
status:= NtQuerySystemInformation(SystemProcessorInformation, @SysProcessorInfo, SizeOf(SysProcessorInfo), nil);
if(status<>0) then
 exit;
Memo1.Lines.Clear;
Memo1.Lines.Add('ProcessorArchitecture  : '+IntToStr(SysProcessorInfo.ProcessorArchitecture));
Memo1.Lines.Add('ProcessorLevel  : '+IntToStr(SysProcessorInfo.ProcessorLevel));
Memo1.Lines.Add('ProcessorRevision  : '+IntToStr(SysProcessorInfo.ProcessorRevision));
Memo1.Lines.Add('Unknown  : '+IntToStr(SysProcessorInfo.Unknown));
Memo1.Lines.Add('FeatureBits  : '+IntToStr(SysProcessorInfo.FeatureBits));
end;

* بالنسبه للعناصر المكونه لـ TSystem_Processor_Information فهي كما يلي :

- ProcessorArchitecture :

بنية المعالج , القيم التي يمكن ان نحصل عليها هي كالاتي ( هذه القيم معرفه في winnt.h ) :

PROCESSOR_ARCHITECTURE_INTEL 0
PROCESSOR_ARCHITECTURE_MIPS  1
PROCESSOR_ARCHITECTURE_ALPHA 2
PROCESSOR_ARCHITECTURE_PPC   3
PROCESSOR_ARCHITECTURE_SHX   4
PROCESSOR_ARCHITECTURE_ARM   5
PROCESSOR_ARCHITECTURE_IA64  6
PROCESSOR_ARCHITECTURE_ALPHA64 7
PROCESSOR_ARCHITECTURE_UNKNOWN 0xFFFF

- ProcessorLevel :

لمعلومات عن هذا العنصر يرجى مراجعة SDK Help في الشرح الخاص بـ SYSTEM_INFO هناك عنصر من عناصر الـstructure باسم wProcessorLevel .

- ProcessorRevision :

معلومات اكثر يمكن الحصول عليها من SDK Help .

- UnKnown :

دائما يحوي القيمه صفر , لا يوجد تفسير لهذه القيمه .

- FeatureBits :

عبارة عن bit mask تمثل اي سمة خاصة بالمعالج ( مثلا : هل بالامكان استعمال مجموعة التعليمات Intel MMX ) .

Intel Platform Flags :

Intel  Mnemonic  Value Description
VME  0x0001 	 Virtual-8086 Mode Enhancements
TCS  0x0002 	 Time Stamp Counter
	0x0004 	 CR4 Register
CMOV  0x0008 	 Conditional Mov/Cmp Instruction
PGE  0x0010 	 PTE Global Bit
PSE  0x0020 	 Page Size Extensions
MTRR  0x0040 	 Memory Type Range Registers
CXS  0x0080 	 CMPXCHGB8 Instruction
MMX  0x0100 	 MMX Technology
PAT  0x0400 	 Page Attribute Table
FXSR  0x0800 	 Fast Floating Point Save and Restore
SIMD  0x2000 	 Streaming SIMD Extension

في المرة القادمة سيتم ذكر ما يتعلق بـ TSystem_Performance_Information .

(f)

CIONO1

تم تعديل هذه المشاركة بواسطة ORWA في 20 نوفمبر 2004 في 23:46

هناك حتى الأحلام أصبحت ممنوعة ...

إنه لعار أن ننتمي لهكذا أوطان ... لكن ... ربما العار أن نكون نحن أبناء لتلكم أوطان .. من يدري ؟!!

ليعلم أولئك ... إنّ الشعوب إنْ هي استيقظت تسحق ظُلامََهَا ...

There, even in dreams u r wanted

To be a programmer, how a nice dream it was

Leaving ...

أعيدوا لإسمي لونه المفضل

#8

مشكور اخوي tmaaa

بس وينك ماشفنا مشاركاتك من يومين :D

والحمدلله على السلامة

(f) (f) (f)

وتقبل اطيب تحياتي اخوك SUM

#9

السلام عليكم

هلا اخ SUM .

بس كان في شويه مشاكل اليومين السابقين .

ان شاء الله اكتب عن System_Performance_Information قريبا .

كنت افكر في اليومين الماضيين في طرح موضوع Hook Api , لكن لا أعلم ان كان هناك مهتميين بالموضوع , كما انني احتاج الى تنظيم المعلومات التي لدي ...

(f)

CIONO1

هناك حتى الأحلام أصبحت ممنوعة ...

إنه لعار أن ننتمي لهكذا أوطان ... لكن ... ربما العار أن نكون نحن أبناء لتلكم أوطان .. من يدري ؟!!

ليعلم أولئك ... إنّ الشعوب إنْ هي استيقظت تسحق ظُلامََهَا ...

There, even in dreams u r wanted

To be a programmer, how a nice dream it was

Leaving ...

أعيدوا لإسمي لونه المفضل

#10

فعلا لا يأتي التميز الا من متميز :)

Hook Api سيكون واحد من المواضيع الرائعة في هذا المنتدى

واتمنى الا اخذ حبة اسبرين بعد كل درس في Hook Api :D :D :D

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

(f) (f) (f)

#11

مرحباً اخي tmaaa

في الحقيقة انا اصبحنا نفتقد مشاركاتك معنا في المنتدى !!

ارجوا ان تكون بخير :(

على العموم بالنسبة لموضوع Native AP

فلقد حصلت كتاب يتكلم عن هذا الموضوع وهي باللغة الصينية

يمكنك تحميل الكتاب من هذه الوصلة :

http://www.developres.com/downfile.asp?ID=291

ارجوا ان تجد فيه النفع والفائدة

وتقبل اطيب تحياتي اخوك SUM

#12

السلام عليكم

مشكور عزيزي

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

http://www.arabteam2000.com/vb/showthread....?threadid=12554

بالنسبه لمشاركاتي فقد قررت تقليلها لاني وجدت انها سخيفه نوعا ما .

على فكره امس انا وضعت رد في الموقع الذي ذكرته -انت - . وصلت للموقع قبلك :P

http://www.developres.com/dispdoc.asp?id=291

CIONO1

هناك حتى الأحلام أصبحت ممنوعة ...

إنه لعار أن ننتمي لهكذا أوطان ... لكن ... ربما العار أن نكون نحن أبناء لتلكم أوطان .. من يدري ؟!!

ليعلم أولئك ... إنّ الشعوب إنْ هي استيقظت تسحق ظُلامََهَا ...

There, even in dreams u r wanted

To be a programmer, how a nice dream it was

Leaving ...

أعيدوا لإسمي لونه المفضل

#13

ايش الكلام هذا ؟؟؟ يااخ tmaaa

كيف تقول ان مشاركاتك سخيفه :( بالعكس مشاركاتك رائعه ومفيده للجميع وانا لااقصد بها في الموضوع هذا فقط بل في جميع المواضيع :D

وبالنسبة للكاتب فأنا مااستغرب انك وصلت اليه قبلي لأنه هذا من عادتك ;)

وتقبل اطيب تحياتي اخوك SUM

هذا الموضوع مغلق.

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