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

شرح : Win32 Api

بدأه GamingMasteR في 28 يناير 2008 · 34 رد · 17,580 مشاهدة · في المواضيع و الدروس القيّمة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

سأقوم بإذن الله في هذا الموضوع بشرح مختصر لبعض دوال Win32 API مع بعض الامثلة الخفيفة .

أي اضافة مرحب بها لكن أرجو تحري الدقة في المعلومة المطروحة + العرض بنفس النظام :

******************

اسم الدالة بالبارامترات :

البارامتر الاول : شرح.

البارامتر الثاني : شرح.

....

******************

وظيفة الدالة : ....

******************

مثال تطبيقي بالكود (أي لغة تريد)

******************

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

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

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

سأبدأ أولا بالدوال الخاصة بالتعامل مع الملفات , بسم الله :

HANDLE WINAPI CreateFile(
  __in	  LPCTSTR lpFileName,
  __in	  DWORD dwDesiredAccess,
  __in	  DWORD dwShareMode,
  __in_opt  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  __in	  DWORD dwCreationDisposition,
  __in	  DWORD dwFlagsAndAttributes,
  __in_opt  HANDLE hTemplateFile
);

lpFileName : اسم الملف(الكائن) المراد فتحه او انشاؤه .

dwDesiredAccess : يحدد العملية المراد اجرائها على الملف :

1-GENERIC_READ : يتم فتح الملف للقراءة منه فقط .

2-GENERIC_WRITE : يتم فتح الملف للكتابة فيه (لإنشاء ملف جديد) .

يمكن الدمج بين هذه الاعلام .

dwShareMode : لتحديد العمليات القابلة للتنفيذ على الملف من قبل البرامج الأخرى :

1-FILE_SHARE_READ : يتم قبول عمليات القراءة من الملف من برامج اخرى.

2-FILE_SHARE_WRITE : يتم قبول عمليات الكتابة الى الملف من برامج اخرى.

3-FILE_SHARE_DELETE : يتم قبول عملية مسح الملف من برامج اخرى.

يمكن الدمج بين هذه الاعلام .

lpSecurityAttributes : مؤشر الى Structure من نوع SECURITY_ATTRIBUTES وهو بارامتر اختياري ولم اتعامل معه من قبل .

dwCreationDisposition : لتحديد كيفية التعامل مع الملف عند وجوده او عدم وجوده :

1-CREATE_NEW : لإنشاء ملف جديد , اذا كان الملف موجود بالفعل سابقا تفشل الدالة .

2-CREATE_ALWAYS : لإنشاء ملف جديد , اذا كان الملف موجود سابقا يتم مسحه والكتابة فوقه بخصائص الملف الجديد مع اعطاء صفة "أرشيف" للملف الجديد .

3-OPEN_EXISTING : لفتح ملف موجود سابقا , اذا لم يكن الملف موجود تفشل الدالة .

4-OPEN_ALWAYS : لفتح ملف موجود سابقا , اذا لم يكن الملف موجود يتم انشاءه من جديد .

5-TRUNCATE_EXISTING : لفتح ملف موجود سابقا مع مسح جميع بياناته , لفعل ذلك يجب تحديد العلم GENERIC_WRITE مسبقا , تفشل الدالة اذا لم يكن الملف موجود مسبقا .

dwFlagsAndAttributes : لتحديد صفات الملف :

1- FILE_ATTRIBUTE_ARCHIVE : ملف أرشيف .

2- FILE_ATTRIBUTE_HIDDEN : ملف مخفي .

3- FILE_ATTRIBUTE_NORMAL : ملف عادي .

4- FILE_ATTRIBUTE_READONLY : ملف للقراءة فقط .

5- FILE_ATTRIBUTE_SYSTEM : ملف نظام .

هناك ايضا : FILE_ATTRIBUTE_OFFLINE - FILE_ATTRIBUTE_COMPRESSED - FILE_ATTRIBUTE_TEMPORARY لم اتعامل معهم .

hTemplateFile : لتحديد قالب يتم اخذ خصائص الملف منه وهو بارامتر اختياري ولم اتعامل معه قط .

القيمة المرجعة من الدالة : اذا تم استدعاء الدالة بالشكل الصحيح ولم تفشل تكون القيمة المرجعة هي مقبض للملف يمكن استخدامه عن طريق دوال القراءة والكتابة مثل ReadFile-WriteFile-CreateFileMapping

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

بإختصار الدالة تقوم بفتح او انشاء ملف جديد او قديم وذلك لغرض القراءة او الكتابة فيه , تستخدم ايضا الدالة للتعامل بين البرنامج و الدرايفر , عند الانتهاء من استخدام الملف يجب ان يتم اغلاقه عن طريق الدالة CloseHandle .

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

مثال اسمبلي :

.

data
lpVictimName db "C:\test.exe",0
hFile dd 0

.code
invoke CreateFile, addr lpVictimName, GENERIC_READ + GENERIC_WRITE, FILE_SHARE_READ + FILE_SHARE_WRITE, NULL, TRUNCATE_EXISTING, FILE_ATTRIBUTE_NORMAL,  NULL
mov hFile,eax

مثال بالسي :

HANDLE hFile = CreateFile("C:\\test.exe", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

تم تعديل هذه المشاركة بواسطة GamingMasteR في 28 يناير 2008 في 05:54

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#2

دوال القراءة والكتابة : ReadFile-WriteFile

BOOL WINAPI WriteFile-ReadFile(
		HANDLE hFile,
		LPCVOID lpBuffer,
		DWORD nNumberOfBytesToWrite-nNumberOfBytesToRead,
		LPDWORD lpNumberOfBytesWritten-lpNumberOfBytesRead,
		LPOVERLAPPED lpOverlapped
);

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

hFile : مقبض الملف الذي تم فتحه سابقا عن طريق الدالة CreateFile , للكتابة يجب ان يكون الملف فتح بالعلم GENERIC_WRITE وللقراءة العلم GENERIC_READ ويمكن دمج العلمين معا لإتاحة القراءة والكتابة من نفس المقبض .

lpBuffer : عنوان المساحة (بفر) التي سيتم كتابة(قراءة) البيانات منها الى(من) الملف , يجب ان تكون اكبر من او تساوي عدد البايتات المراد كتابتها(قراءتها) .

nNumberOfBytesToWrite-nNumberOfBytesToRead : عدد البايتات المراد كتابتها(قراءتها).

lpNumberOfBytesWritten-lpNumberOfBytesRead : بفر (4 بايت) لإرجاء عدد البايتات التي تم كتابتها(قراءتها) بعد تنفيذ الدالة , يمكنك المقارنة بينها وبين عدد البايتات المراد كتابتها(قراءتها) للتأكد من كتابة(قراءة) كل البفر .

lpOverlapped : مؤشر الى structure من نوع OVERLAPPED اذا تم فتح الملف عن طرق العلم FILE_FLAG_OVERLAPPED , لم اتعامل معه ولا اعرف ما هو الـOVERLAP أصلا (ولا اعتقد انك ستحتاجه) .

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

تستخدم هذه الدالة للكتابة(القراءة) في ملف عن طريق تحديد مقبض للملف تم فتحه سابقا عن طريق الدالة CreateFile وعنوان البيانات التي سيتم كتابتها(قراءتها) وعددها كما تم التوضيح في البارامترات , يمكن استخدام الدالة للكتابة(القراءة) في ملف او لتغيير بايتات معينة عند Offset معين بعد تحديد مؤشر الكتابة او القراءة عن طريق الدالة SetFilePointer والتي سيتم شرحها لاحقا , يمكن ايضا استخدام الدالة بين برنامج في مستوى المستخدم user-mode ودرايفر في مستوى النظام kernel-mode بغرض ارسال واستقبال البيانات بينهما , اخر بارامترين في الدالة احدهما اختياري بحيث اذا لم يتم تحديد lpNumberOfBytesWritten-lpNumberOfBytesRead فيجب تحديد lpOverlapped واذا تم تحديد الاخير يمكن الا نحدد ما قبله .

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

مثال اسمبلي :

.data
lpFile		db	"C:\test.uuf",0
lpBuffer	db	1,2,3,4,5,6,7,8,9,10
BRW			dd	0
hFile		dd	0
.code
start:
invoke CreateFile,addr lpFile,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL
.if (eax != -1)
	mov hFile,eax
	invoke WriteFile,hFile,addr lpBuffer,10,addr BRW,NULL
	invoke CloseHandle,hFile
.endif

مثال بالسي :

char lpBuffer[10];
DWORD BRW;
HANDLE hFile = CreateFile("C:\\test.uuf", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
ReadFile(hFile,&lpBuffer,10,&BRW,NULL);	
CloseHandle(hFile);

تم تعديل هذه المشاركة بواسطة GamingMasteR في 28 يناير 2008 في 05:56

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#3

دالة قراءة حجم الملف :

DWORD GetFileSize(

	HANDLE hFile,
	LPDWORD lpFileSizeHigh
   );

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

hFile : مقبض الملف الذي تم فتحه عن طريق الدالة CreateFile

lpFileSizeHigh : بارامتر اختياري , يشير الى DWORD يتم ملأها اذا كان حجم الملف كبير جدا .

تعود الدالة بحجم الملف بالبايت او -1 اذا فشلت .

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

ببساطة كما ترون تقوم الدالة بارجاع حجم الملف , اذا كان حجم الملف كبير يفضل تحديد البارامتر lpFileSizeHigh . عندما يكون حجم الملف اكبر من 0xFFFFFFFF يتم اعادة تفريغه مع زيادة قيمة lpFileSizeHigh بواحد .

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

مثال أسمبلي :

.data
lpFile		db	"C:\test.uuf",0
BRW			dd	0
hFile		dd	0
lpBuffer	dd	100 dup (?)

.code
start:
invoke CreateFile,addr lpFile,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NUL
L
.if (eax != -1)
	mov hFile,eax
	invoke GetFileSize,hFile,NULL
	.if (eax != -1) && (eax <= sizeof lpBuffer)
		invoke ReadFile,hFile,addr lpBuffer,eax,addr BRW,NULL
	.endif
	invoke CloseHandle,hFile
.endif
end start

مثال بالسي :

DWORD lpBuffer[100];
DWORD BRW;
int dwSize;
HANDLE hFile = CreateFile("C:\\test.uuf", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
dwSize = GetFileSize(hFile,NULL);
if ((dwSize != -1) && (dwSize <= sizeof(lpBuffer)))
	ReadFile(hFile,&lpBuffer,dwSize,&BRW,NULL);	
CloseHandle(hFile);

تم تعديل هذه المشاركة بواسطة GamingMasteR في 28 يناير 2008 في 08:50

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#4

حاول اضافة نفس الدوال بدلفي Delphi وVB لاصدقائنا

وعند الانتهاء يمكن دمج الردود مع الموضوع الاأول

Delphi

  function CreateFile(
	PortName: PChar;
	DesiredAccess: Integer;
	ShareMode: Integer;
	lpSecurityAttributes: PSecurityAttributes;
	CreationDisposition: DWORD;
	FlagsAndAttributes: DWORD;
	hTemplateFile: THandle
  ): Thandle; stdcall;

Visual Basic

Public Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" ( _
	ByVal PortName As String, _
	ByVal DesiredAccess As Long, _
	ByVal ShareMode As Long, _
	lpSecurityAttributes As SECURITY_ATTRIBUTES, _
	ByVal CreationDisposition As Long, _
	ByVal FlagsAndAttributes As Long, _
	ByVal hTemplateFile As Long _
  ) As Long

مثال Delphi

handle : THandle;
handle := CreateFile("C:\test.exe", GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

مثال VB

Dim handle As Long
handle = CreateFile('C:\test.exe', GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)

ملاحظة: لافقه شيئ في VB فمن يعرفها يصحح

تم تعديل هذه المشاركة بواسطة B.M.AbdelAziZ في 28 يناير 2008 في 14:10 — السبب: اضافة ملاحظة

d4baa0.gif
#5

أخي Delta ألا يمكن وضع الامثلة فقط بدون التعاريف (ستتسع الصفحة لـ4 دوال فقط بهذه الطريقة :wacko: )

1

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#6

دالة ضبط مؤشر القراءة والكتابة :

DWORD WINAPI SetFilePointer(
  __in		 HANDLE hFile,
  __in		 LONG lDistanceToMove,
  __inout_opt  PLONG lpDistanceToMoveHigh,
  __in		 DWORD dwMoveMethod
);

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

hFile : مقبض الملف المفتوح بالدالة CreateFile .

lDistanceToMove : عنوان نقل مؤشر القراءة والكتابة في الملف .

lpDistanceToMoveHigh : يستخدم كزيادة على البارامتر السابق اذا كان الملف كبير جدا (اكبر من 0xFFFFFFFF ) وهو بارامتر اختياري .

dwMoveMethod : يحدد هذا البرامتر كيفية ازاحة المؤشر ويمكن ان يكون كالتالي :

1- FILE_BEGIN : يتم نقل المؤشر مقدار lDistanceToMove من اول الملف .

2- FILE_CURRENT : يتم نقل المؤشر مقدار lDistanceToMove من عنوان المؤشر الحالي .

3- FILE_END : يتم نقل المؤشر مقدار lDistanceToMove من اخر الملف (لا تنسى وضع اشارة السالب) .

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

دالة مهمة جدا اذا كنت تريد القراءة او الكتابة من مكان معين في الملف , لا حظ ان الدالتان ReadFile-WriteFile يقومان بالقراءة او الكتابة من اول الملف اذا لم يتم تعديل مؤشر القراءة والكتابة .

مثلا اذا كان لديك ملف كبير الحجم 4 ميجا مثلا ... وتريد قراءة اخر 400 بايت من الملف , من غير المنطقي ان تقوم بقراءة الملف كله وتخصيص حجم كبير من الذاكرة بهذا القدر كي تحصل على 400 بايت فقط من اخرة ( او من اوفست معين) , لذلك يتم استعمال هذه الدالة .

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

مثال اسمبلي :

.data
lpFile		db	"Big File.dat",0
BRW			dd	0
hFile		dd	0
lpBuffer	dd	400 dup (?)

.code
start:
invoke CreateFile,addr lpFile,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NUL
L
.if (eax != -1)
	mov hFile,eax
	invoke SetFilePointer,hFile,-400,NULL,FILE_END
	invoke ReadFile,hFile,addr lpBuffer,400,addr BRW,NULL
	invoke CloseHandle,hFile
.endif
end start

مثال بالسي :

DWORD lpBuffer[400];
DWORD BRW;

HANDLE hFile = CreateFile("Big File.dat", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
	SetFilePointer(hFile,-400,NULL,FILE_END);
	ReadFile(hFile,&lpBuffer,400,&BRW,NULL);
	CloseHandle(hFile);
}

مثال دلفي :

var
lpBuffer : array[0..55] of CHAR;
hFile : THandle;
BRW : DWORD;
begin
FillChar(lpBuffer,55,'T');
hFile := CreateFile('Big File.dat',GENERIC_WRITE,FILE_SHARE_WRITE,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if (hFile <> INVALID_HANDLE_VALUE) then
begin
  SetFilePointer(hFile,500,nil,FILE_BEGIN);
  WriteFile(hFile,lpBuffer,55,&BRW,nil);
  CloseHandle(hFile);
end;
end.

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#7

ألن يشارك احد ولو بدالة واحدة ؟؟؟؟؟

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#8
اقتباس
ألن يشارك احد ولو بدالة واحدة ؟؟؟؟؟

ولايهمك Gaming :D

MessageBox

int MessageBox(

	HWND hWnd,	// handle of owner window
	LPCTSTR lpText,	// address of text in message box
	LPCTSTR lpCaption,	// address of title of message box  
	UINT uType 	// style of message box
   );

hWnd وهو من النوع HWND ويعبر عن ال Owner

lpTex وهو عبارة عن const *char وبيعبر عن ال Text اللى هيظهر على ال MessageBox

lpCaption وهو عبارة عن const *char وبيعبر عن ال Caption او ال title الموجود على ال Widget -مش عارف بتسموها widget ولا Control- :D

uType وهو من النوع UINT وبيكون عبارة عن Combination من بعض الFlags اهمهم

ال Buttons اللى هتوجد على ال widget

اقتباس
MB_ABORTRETRYIGNORE The message box contains three push buttons: Abort, Retry, and Ignore.

MB_OK The message box contains one push button: OK. This is the default.

MB_OKCANCEL The message box contains two push buttons: OK and Cancel.

MB_RETRYCANCEL The message box contains two push buttons: Retry and Cancel.

MB_YESNO The message box contains two push buttons: Yes and No.

MB_YESNOCANCEL

وال ايكونز اللى هتظهر

اقتباس
Flag Meaning

MB_ICONEXCLAMATION,

MB_ICONWARNING

An exclamation-point icon appears in the message box.

MB_ICONINFORMATION, MB_ICONASTERISK

An icon consisting of a lowercase letter i in a circle appears in the message box.

MB_ICONQUESTION A question-mark icon appears in the message box.

MB_ICONSTOP,

MB_ICONERROR,

MB_ICONHAND

A stop-sign icon appears in the message box.

واخيرا ال Default button flag

اقتباس
MB_DEFBUTTON1 The first button is the default button. MB_DEFBUTTON1 is the default unless MB_DEFBUTTON2, MB_DEFBUTTON3, or MB_DEFBUTTON4 is specified.

MB_DEFBUTTON2 The second button is the default button.

MB_DEFBUTTON3 The third button is the default button.

MB_DEFBUTTON4 The fourth button is the default button.

وبتدى return مكون من ID+ اسم ال Button اللى تم الضغط عليه

IDOK, IDNO, IDYES, IDCANCEL, ... etc

ويوجد البعض الخاص بال Modality تبع ال MessageBox

MB_APPLMODALوهى الDefault فى حال عدم تحديد غيرها وبتعنى إنها تمنع المستخدم من التعامل مع البرنامج لحد مايجاوب على ال MessageBox اللى ظهرت

MB_SYSTEMMODAL : وهى بتظهر بصورة عاملة على السيستم ويفضل عدم إستخدامها غير فى الإيرورات الجامدة

فى بعض الFlags الأخرى زى

MB_HELP وبيستخدم لنضيف Help Button

مثال ب Lazarus -Delphi-

MessageBox(0, 'Here goes the message', 'Here goes the caption', MB_ICONERROR or MB_OK or MB_HELP or MB_SYSTEMMODAL);

اها ملحوظة انا مش حافظ كل الكلام اللى انا كتبته طبعا! ربنا يخلى Borland Help :D

تم تعديل هذه المشاركة بواسطة ahmed_youssef في 2 فبراير 2008 في 01:59

(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

#9

دالة استرجاع حجم الملف المحسّنة :

BOOL WINAPI GetFileSizeEx(
  __in   HANDLE hFile,
  __out  PLARGE_INTEGER lpFileSize
);

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

hFile: مقبض الملف المفتوح بالدالة CreateFile .

lpFileSize: مؤشر يدل على عنوان في الذاكرة يقوم باستقبال الحجم المعاد .

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

هذه الدالة شبيهة بـ GetFileSize الا ان هذه واقصد (بدون Ex) قد تخطئ عندما يكون حجم الملف 0xffffffff اي 4294967295 بايت اي 4194303.99 كيلو بايت اي 4095.99 ميغا بايت اي 3.99 غيغابايت اي بحدود 4 غيغا بايت وهو أمر ليس بمستبعد لذلك يفضل استخدام الدالة GetFileSizeEx لان المؤشر يسمح بأن يكون قيمة أكبر من DWORD, تمثل بعدد صحيح طويل. (PLARGE_INTEGER)

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

مثال اسمبلي :

.data
lpFile		db	"Big file.dat",0

.data?
hFile		dd	?
nSize		dd	? ; could be "dt" instead

.code
start:
invoke	CreateFile, addr lpFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL
.if		(eax != -1)
	mov		hFile, eax
	invoke	GetFileSizeEx, hFile, addr nSize
	invoke	CloseHandle, hFile
.endif
invoke	ExitProcess, NULL
end	start

مثال بالسي :

DWORD nSize;

HANDLE hFile = CreateFile("Big file.dat", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
	GetFileSizeEx(hFile,&nSize);
	CloseHandle(hFile);
}

مثال دلفي :

var
hFile : THandle;
nSize : DWORD;
begin
hFile := CreateFile('Big file.dat',GENERIC_READ,FILE_SHARE_READ,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if (hFile <> INVALID_HANDLE_VALUE) then
begin
  GetFileSizeEx(hFile,nSize);
  CloseHandle(hFile);
end;
end.

ملاحظة: لا أعرف الكثير عن الـ C - خبرتي معدومة بالدلفي, لكن أرتجل حسب الأمثلة الموجودة فلو أخطأت يرجى التصحيح :)

تم تعديل هذه المشاركة بواسطة GamingMasteR في 8 فبراير 2008 في 22:58 — السبب: GetFileSizeEx was ReadFileEx

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#10

دالة تقوم بتشكيل وحجز خريطة واصفة للملف في الذاكرة:

HANDLE WINAPI CreateFileMapping(
	  __in	  HANDLE hFile,
	  __in_opt  LPSECURITY_ATTRIBUTES lpAttributes,
	  __in	  DWORD flProtect,
	  __in	  DWORD dwMaximumSizeHigh,
	  __in	  DWORD dwMaximumSizeLow,
	  __in_opt  LPCTSTR lpName
	)

hFile: مقبض الملف والذي يتم استعادته من خلال CreateFile.

lpAttributes: غالباً ما يتم استخدام NULL للدلالة على انه لا يمكن توريث مقبض الملف لإجرائية أخرى.

flProtect: نوع الحماية على الكتلة المخصصة للملف, ويمكن أن تكون احدى الاشكال التالية:

PAGE_READONLY هذا يعني ان الفراغ من الذاكرة الذي سيتم قراءة الملف وحفظه بداخله سيكون للقراءة فقط بالتالي لا يمكن التعديل على الملف في الذاكرة.

PAGE_READWRITE الملف في الذاكرة سيكون بالامكان القراءة منه والتعديل عليه, يجب أن تكون السماحيات المستخدمة GENERIC_READ و GENERED_WRITE عند الحصول على المقبض.

PAGE_WRITECOPY تقوم بتشكيل exception في حال محاولة تنفيذ الجزء المحمي من الشفرة. في حال محاولة الكتابة في هذا الجزء المحمي فإن العملية التي تحاول القيام بهذا تحصل على نسخة خاصة بها لهذا الغرض ولا تؤثر على الجزء الأصلي.

PAGE_EXECUTE_READ يعطي سماحية لنقل التنفيذ إلى تلك المنطقة من الذاكرة لكن يجب ان تكون السماحية عند انشاء المقبض GENERIC_EXECUTE

PAGE_EXECUTE_READWRITE سماحيات مدموجة, read, write, execute

PAGE_EXECUTE_WRITECOPY يعطي سماحية لتنفيذ الجزء المحمي لكن محاولة الكتابة فيه يعطي نسخة خاصة كما ورد في PAGE_WRITECOPY

dwMaximumSizeHigh و dwMaxmimumSizeLow لو كانت NULL فسيتم حجز ذاكره بحجم الملف تماماً.

lpName: اسم تقوم بمنحه للـ Map, يمكن ان يكون NULL.

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

عند التنفيذ الصحيح للدالة فإن القيمة المسترجعه ستكون مقبض للخريطة المنشأة للملف وفي حال الفشل فالقيمة المسترجعه تكون صفر.

استفدت من هذه الدالة من قبل في اني لست بحاجة الى استخدام دوال القراءة والكتابة عندما اريد التعديل على الملف, لكنه يجب الانتباه إلى أنه في حال التعديل الخاطئ فعند اغلاق المقبض سيتم حفظ المحتويات التي تم تعديلها على الملف الأصلي لذلك الانتباه جداً عند التعامل مع هذه الدالة.

أمر آخر, محتويات الملف لا يتم عرضها مباشرة من خلال هذه الدالة في الذاكرة فهي تحجز وتضع بعض الخصائص على الكتلة المحجوزة لكن لقراءة ملف ما يجب استخدام دالة اخرى مساعدة هل MapViewOfFile والتي سأشرحها لاحقاً.

لا تنسى أن تقوم باغلاق المقبض الخاص بالملف قبل الشروع في اجراء أي عملية أخرى, مثلا حذف الملف أو ما شابه, فهو يكون مستخدم وبالتالي لا يمكن حذفه بالطريقة التقليدية من خلال DeleteFile مثلا.

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

مثال أسمبلي:

.data?
	hFile	dd	?
	hMap	dd	?

	.data
	lpFile	db	"Big file.dat",0

	.code
	start:
	invoke	CreateFile, addr lpFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL
	.if(eax != -1)
		mov	hFile, eax
		invoke	CreateFileMapping, hFile, NULL, PAGE_READONLY, NULL, NULL, NULL
		.if(eax != 0)
			mov	hMap, eax
	; here goes the MapViewOfFile api
			invoke	CloseHandle, hMap
		.endif
		invoke	CloseHandle, hFile
	.endif
	invoke	ExitProcess, NULL
	end start

مثال بالـسي:

HANDLE hFile = CreateFile("Big file.dat", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	if (hFile != INVALID_HANDLE_VALUE)
	{
		HANDLE hMap = CreateFileMapping(hFile,NULL,PAGE_READONLY,NULL,NULL,NULL)
		if (hMap != INVALID_HANDLE_VALUE)
		{
			// here goes the MapViewOfFile api
			CloseHandle(hMap);
		}
		CloseHandle(hFile);
	}

مثال بالدلفي (يرجى التصحيح لو أخطات فيه):

var
	hFile : THandle;
	hMap  : THandle;
	begin
	hFile := CreateFile('Big file.dat',GENERIC_READ,FILE_SHARE_READ,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
	if (hFile <> INVALID_HANDLE_VALUE) then
	begin
	  hMap := CreateFileMapping(hFile,nil,PAGE_READONLY,nil,nil,nil);
	  if (hMap <> INVALID_HANDLE_VALUE) then
		  // MapViewOfFile goes here
		  CloseHandle(hMap);
	  end;
	  CloseHandle(hFile);
	end;
	end.

تم تعديل هذه المشاركة بواسطة Junkie في 9 فبراير 2008 في 23:39

1

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#11

السلام عليكم

أخي ، جزاك الله خيرا ، وأرجو أن يتسع صدرك لملاحظة من شخص من معسكر اليونكس ، ولكن يريد المصلحة العامة

هذه الجزئية من شرحك أظن أنها غير دقيقة، حسب قراءتي لها من أول مرة و مراجعتي لل msdn

اقتباس
dwShareMode : لتحديد العمليات القابلة للتنفيذ على الملف من قبل البرامج الأخرى :

1-FILE_SHARE_READ : يتم قبول عمليات القراءة من الملف من برامج اخرى.

2-FILE_SHARE_WRITE : يتم قبول عمليات الكتابة الى الملف من برامج اخرى.

3-FILE_SHARE_DELETE : يتم قبول عملية مسح الملف من برامج اخرى.

يمكن الدمج بين هذه الاعلام .

فهذا argument يحدد ما إذا كان هذا الملف أو device يقبل أن يعمل عليه عدة process في نفس الوقت ، حتى يأخذ النظام احتياطياته ، وحتى لا تحدث مشاكل في القراءة أو الكتابة بين هذه processes .

أظن أنك كنت تريد توصيل هذا المعنى ، لكني استغربت جدا طريقة شرحك هذه ، أعذرني لو كنت جاهل

أحب أن أعلم رأيك

System Engineer

Red Hat Certified Engineer

Red Hat Certificate Number

805010381752078

#12

لم افهم ما الذي لم تستسيغه في الكلام ؟؟ هي هي عبارة "برامج اخرى" ؟؟

بالمناسبة لي تحفظ على شرحك لهذه النقطة أيضاً :D

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#13

اخي كان هناك موضوع مماثل للأخ JAAS ،

ياريت لو تكمل افضل مما تعود للبداية ،

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

تم تعديل هذه المشاركة بواسطة الاخير زمانه في 5 أغسطس 2008 في 09:33

/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/

 

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

#14

أين ؟؟

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#15
اقتباس
-

أمثلة وأكواد لتبسيط لغة السي ( دوال API )

/index.php?showtopic=51214

/index.php?showtopic=61468

-

في توقيع الاخ JAAS

/index.php?showtopic=45002

/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/

 

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

#16

MFC

الموضوع يختلف تماماً عما هو هنا !

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#18

صحيح لم اخذ بالي من الرابط الأخير :wacko: ...

عموما انا خلصت هنا :happy:

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#19
اقتباس
عموما انا خلصت هنا

لماذا؟؟ فمازلت في اول الطريق :rolleyes:

عموما رأي الشخصي ان دوال ال API متوفر شرحها الوافي في ال MSDN .

بس ياريت اذا استطعت ان تقدم دروس عن برمجة الكرنل ،، فسيكون هذا انجاز كبير ،،

أعلم انك قد اعتذرت لكن اذا كان لديك الوقت .. فتوكل على الله

تم تعديل هذه المشاركة بواسطة الاخير زمانه في 11 أغسطس 2008 في 08:17

/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/

 

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

#20

جربت من قبل عمل شروحات وتأكدت بأني فاشل الى اقصى حد :D , ليس لدي ملكة في كتابة الدروس !

عمل سؤال وجواب لن اتمكن من متابعته لأني سأفصل خط النت بعد هذا الشهر وسيقل تواجدي جداً .

بالاضافة الى انشغالي باشياء اخرى , لكن اذا وجدت استفسار فلن اتردد بالمساعدة قدر ما استطيع .

اقتباس
عموما رأي الشخصي ان دوال ال API متوفر شرحها الوافي في ال MSDN .

بالضبط هذا ما اقصده , ما افعله هو كالترجمة الى العربية وليس شرح والفائدة أقل من الجهد المبذول !

1

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#21

اخوتى احاول استخدام CreateFile

ولكنها تفشل وترجع-1

 BOOL OpenFiles(LPCTSTR fileToOpen)
	{

	BOOL returnOfFunction;
	HANDLE hFile;
	char writebuff[15]={'d','r','d','o','w','a','s','h','e','r','e'};
	DWORD no;

	 hFile = CreateFile(fileToOpen,GENERIC_WRITE, 
0,NULL,OPEN_EXISTING,FILE_FLAG_WRITE_THROUGH|FILE_FLAG_OPEN_REPARSE_POINT,NULL);

من يعرف يقول ليفيد الجميع

بســم الله الـرحمــن الرحيــم

[يمين]مرة سألتنى نفسى هل نستطيع هزيمة اسرائيل والبلاد المعادية للاسلام؟

فاجبت هذا ممكن ولكن علينا اولا ان نتمسك بعقديتنا

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

ثالثا اذا كنا امة عربية واحدة

[وسط]مواطن مسلم من الجمهورية العربية المتحدة

[/يمين] [/وسط]

#22

تأكد أولا من صحة مسار الملف ثم اخبرني ماذا ترجع GetLastError ؟

hFile = CreateFile(....);
DWORD LastErr = GetLastError();

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#23

المشكلة يا اخى ان مستخدم GetFullPathName

ولكنها ترجع المسار كالتالى c:\test.txt

وان اريده بالصيغة التى تفهمها CreateFile

وهى c:\\test.txt

مشكور اخى للرد

بســم الله الـرحمــن الرحيــم

[يمين]مرة سألتنى نفسى هل نستطيع هزيمة اسرائيل والبلاد المعادية للاسلام؟

فاجبت هذا ممكن ولكن علينا اولا ان نتمسك بعقديتنا

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

ثالثا اذا كنا امة عربية واحدة

[وسط]مواطن مسلم من الجمهورية العربية المتحدة

[/يمين] [/وسط]

#24

لا يا أخي هي صحيحة هكذا , "\\" هذه لكتابتها كنص ثابت في لغة ++C وليس لأن Api تريدها هكذا !!

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#25

اخى الدالة تفشل عندما تاخذ المسار العادى ما هو الحل ؟؟؟؟؟؟؟؟

بســم الله الـرحمــن الرحيــم

[يمين]مرة سألتنى نفسى هل نستطيع هزيمة اسرائيل والبلاد المعادية للاسلام؟

فاجبت هذا ممكن ولكن علينا اولا ان نتمسك بعقديتنا

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

ثالثا اذا كنا امة عربية واحدة

[وسط]مواطن مسلم من الجمهورية العربية المتحدة

[/يمين] [/وسط]

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