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

كيف احصل على اسماء جميع السواقات

مغلق
بدأه احمد السيد في 24 فبراير 2005 · 7 رد · 672 مشاهدة · في لغة Assembly لأنظمة 16, 32, 64 بت
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

كيف احصل على جميع اسماء الدريفات اريد الفكرة لو سمحتم حيث اننى وصلت الى هذا الكود وتوقفت حيث انة لايعطنى جميع الدريفات ولكن يعطنى اسم سواقة الفلوبى ديسك فقط

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

    .486                      ; create 32 bit code
    .model flat, stdcall      ; 32 bit memory model
    option casemap :none      ; case sensitive

    include \masm32\include\windows.inc
    include \masm32\include\masm32.inc
    include \masm32\include\gdi32.inc
    include \masm32\include\user32.inc
    include \masm32\include\kernel32.inc
    include \masm32\include\Comctl32.inc
    include \masm32\include\comdlg32.inc
    include \masm32\include\shell32.inc
    include \masm32\include\oleaut32.inc

    includelib \masm32\lib\masm32.lib
    includelib \masm32\lib\gdi32.lib
    includelib \masm32\lib\user32.lib
    includelib \masm32\lib\kernel32.lib
    includelib \masm32\lib\Comctl32.lib
    includelib \masm32\lib\comdlg32.lib
    includelib \masm32\lib\shell32.lib
    includelib \masm32\lib\oleaut32.lib

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

    .data
      Res     db  200 DUP(0) ; Buffer will take drive strings
      drive   db 20 dup(0)
     .code

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

start:
        
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
invoke GetLogicalDriveStrings,200,addr Res;get all the disks on computer

invoke MessageBox,0, addr Res,addr Res,MB_OK

invoke ExitProcess,0 


; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

end start

لى سؤال اخر وهو بخصوص كيفية عدم تشغيل اكثر من نسخة من البرنامج؟؟؟

#2

السلام عليكم

بالنسبه لسؤالك الثانى هناك طرق كثيره مثل وضع مؤشر فى registery او البحث عن النافذه الخ

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

واليك الكود الخاص بهذا الحل:

.data
isRunning db "Program is Running",0
Running db "Running",0
.code

start:
invoke CreateMutex,NULL,TRUE,ADDR MutexString
	invoke GetLastError
	.IF eax != 0
  invoke MessageBox, NULL,addr IsRunning, addr Running, MB_OK
  invoke ExitProcess,0
	.endif
,وهنا ياتى باقى البرنامج

اما بالنسبه للسؤال الاول فاعود إليك إن شاء الله عندما اتاكد من الاجابه.

والسلام

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#3

السلام عليكم,

اخي بالنسبة للسؤال الاول, الكود صحيح 100% هو يظهر جميع الدريفرات للتأكد حمل البرنامج في اي دبققر وبتلاحظ ذلك, المشكلة هي 00 بعد اي درايف فيظهر لك درايف واحد في المسج, لتخطي ذلك غير 00 الى مثلا "-"= 2D وستظهر لك الدرايفرات او هذه طريقة اخرى :s طريقة مبتدأ مثلي :

.486                     ; create 32 bit code
   .model flat, stdcall     ; 32 bit memory model
   option casemap :none     ; case sensitive

   include \masm32\include\windows.inc
   include \masm32\include\masm32.inc
   include \masm32\include\gdi32.inc
   include \masm32\include\user32.inc
   include \masm32\include\kernel32.inc
   include \masm32\include\Comctl32.inc
   include \masm32\include\comdlg32.inc
   include \masm32\include\shell32.inc
   include \masm32\include\oleaut32.inc

   includelib \masm32\lib\masm32.lib
   includelib \masm32\lib\gdi32.lib
   includelib \masm32\lib\user32.lib
   includelib \masm32\lib\kernel32.lib
   includelib \masm32\lib\Comctl32.lib
   includelib \masm32\lib\comdlg32.lib
   includelib \masm32\lib\shell32.lib
   includelib \masm32\lib\oleaut32.lib

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

   .data
     Res     dd ?

    .code

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

start:
       
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
invoke GetLogicalDriveStrings, 200,addr Res
invoke MessageBox,0, addr Res,addr Res,MB_OK
invoke MessageBox,0, addr Res+4,addr Res+4,MB_OK
invoke MessageBox,0, addr Res+8,addr Res+8,MB_OK
invoke MessageBox,0, addr Res+12,addr Res+12,MB_OK
invoke MessageBox,0, addr Res+16,addr Res+16,MB_OK
invoke ExitProcess,0 


; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

end start

post-79-1109256229_thumb.jpg

hackerman5.jpg
#4

شكرا على اهتمامك بالموضوع من الملاحظ ان كودك الخاص باسماء السواقات يزيد بمقدار اربعة فى كل مرة تريد الحصول على الدريف التالى لدى اقتراح

ماذا لو وضعنا هذا الكود داخل loopونزيد فى كل مرة 4 على الناتج السابق للحصول على باقى الدريفات ساجرب واعود لنتناقش سويا

#5

السلام عليكم

الاخ احمد غريب

شكرا لك على الكود ممكن توضيح لهذة النقطة

اقتباس
هناك طرق كثيره مثل وضع مؤشر فى registery

الاخ HackeRMaN

شكرا لك على الكود وهويعمل بكفاءة ارجوا المشاركة من الجميع لكى نصل الى الكود الكامل :rolleyes:

#6

السلام عليكم

بوضع مؤشر فى registery اقصد انك تضع قيمه معينه مثل ture و false بحيث عند تشغيل البرنامج تقوم بتغير القيمه فى ال registery إلى true وعند إنهاء البرناج تغيرها إلى false وبذالك تعرف إذا كان البرنامج فى الذاكره ام لا.

والسلام

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#7

هذا ماتوصلت الية ولكنى غير مقتنع بهذة النتيجة

  
   .486                     ; create 32 bit code
   .model flat, stdcall     ; 32 bit memory model
   option casemap :none     ; case sensitive

   include \masm32\include\windows.inc
   include \masm32\include\masm32.inc
   include \masm32\include\gdi32.inc
   include \masm32\include\user32.inc
   include \masm32\include\kernel32.inc
   include \masm32\include\Comctl32.inc
   include \masm32\include\comdlg32.inc
   include \masm32\include\shell32.inc
   include \masm32\include\oleaut32.inc

   includelib \masm32\lib\masm32.lib
   includelib \masm32\lib\gdi32.lib
   includelib \masm32\lib\user32.lib
   includelib \masm32\lib\kernel32.lib
   includelib \masm32\lib\Comctl32.lib
   includelib \masm32\lib\comdlg32.lib
   includelib \masm32\lib\shell32.lib
   includelib \masm32\lib\oleaut32.lib

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

   .data
     Res     db  200 DUP(0); Buffer will take drive strings
     drive   dd 0
         .code

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

start:
       
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
invoke GetLogicalDriveStrings,200,addr Res ;get all the disks on computer
t1:

invoke MessageBox,0, addr Res,addr Res,MB_OK

add [Res],1
 jmp t1
exit:
invoke ExitProcess,0 


; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

end start
#8

هذه طريقة:

invoke GetLogicalDriveStrings,200,addr Res;get all the disks on computer

mov [Res+3],2Dh
mov [Res+7],2Dh
mov [Res+9],2Dh
mov [Res+11],2Dh
mov [Res+13],2Dh
mov [Res+15],2Dh
invoke MessageBox,0, addr Res,addr Res,MB_OK

invoke ExitProcess,0

:rolleyes:

تم تعديل هذه المشاركة بواسطة HackeRMaN في 1 مارس 2005 في 05:53

hackerman5.jpg

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

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