karbon2010
دوشنبه 11 بهمن 1389, 09:23 صبح
با سلام خدمت همه دوستان عزیز 
یه سوال ذهنم را مشغول کزده که مجبورم کرذ که همه شما دوستان بپرسم 
آیا راهی هست که برنامه نوشت و این قابلیت داشته باشد که تحت بوت اجرا شود  برنامه ها در این زمینه بسیارند  از جمله معروفترین Partition Magic است 
فکر می کنید با زبان vb می شود برنامه تحت بوت ساخت؟
ممنونم
AlgorithmX
دوشنبه 11 بهمن 1389, 22:47 عصر
درسته دوست عزیز برای شدن که میشه و فقط کافیه نحوه برنامه نویسی فایل Bootmgr رو که در کنار ستاپ های سیستم عامل هاست یا بگیریم و برنامه مون رو روی یک وسیله که سیستم بتونه اونو به عنوان یک دستگاه بوتیبل بشناسه بریزیم! مثل CD یا Floppy ویا حتی Flash
امیدوارم که اساتید به این تایپیک یه سری بزنند!!!
pcdownload.bloghaa.com
سه شنبه 12 بهمن 1389, 02:03 صبح
سلام 
به قول دوستمون نشد که نداره میشه اما راهش رو با وی بی من تا حالا دنبالش نرفتم.
برای ساخت چنین برنامه هایی به یک برنامه کوچک به نام bootloader نیازمندیم که معمولا با زبان
اسمبلی ساخته میشود.برای مثال کد زیر یک نمونه bootloader هست که با اسمبلر FASM میتوان آن را اسمبل  کرد و فایل بوت لودر را تحویل گرفت.
partition_start_cluster  equ  data_area+0 
fat_start_cluster	 equ  data_area+4 
root_start_block	 equ  data_area+8 
number_of_fats		 equ  data_area+12
fat_size		 equ  data_area+16
block_start_cluster	 equ  data_area+20
sectors_per_cluster	 equ  data_area+24
in_cache		 equ  data_area+28
Debug			 equ  0
Fat12			 equ  1
Fat32			 equ  2
; SETUP
			 ; Load image from:
			 ;
hdbase	 equ  0x1f0	 ; 0x1f0 for primary device
			 ; 0x170 for secondary device
			 ;
hdid	 equ  0x00	 ; 0x00 for master hd
			 ; 0x10 for slave hd
			 ; Install bootsector to: 
			 ;
Header	 equ  Fat12	 ; Fat12:
			 ; Floppy installation can be used as such.
			 ;
			 ; Fat32:
			 ; Harddisk installation requires modification
			 ; of the Fat32 header, or you'll lose everything
			 ; on the target partition.
			 ;
			 ; Debug:
			 ; No Header. Use for debugging with floppy only !!
			 ; Messages at low left corner during boot:
			 ; 1 : bootsector loaded
			 ; 2 : file not found
			 ; 3 : file found - load starts
			 ; 4 : jump to kernel
		   jmp start_program
		   nop
if Header = Fat12
   
oemname 	   db 'MENUETOS'
bytespersector	   dw 512
sectorspercluster  db 1
ressectors	   dw 1
numcopiesfat	   db 2
maxallocrootdir    dw 224
maxsectors	   dw 2880 ;for 1.44 mbytes disk
mediadescriptor    db 0f0h ;fd = 2 sides 18 sectors
sectorsperfat	   dw 9
sectorspertrack    dw 18
heads		   dw 2
hiddensectors	   dd 0
hugesectors	   dd 0 ;if sectors > 65536
drivenumber	   db 0
		   db 0
bootsignature	   db 029h ;extended boot signature
volumeid	   dd 0
volumelabel	   db 'TEST       '
filesystemtype	   db 'FAT12   '
end if
if Header = Fat32
Id		   db  'MSWIN4.1'
BytesPerSector	   dw  200h
SectorsPerCluster  db  8
ReservedSector	   dw  20h
NumberOfFATs	   db  2
RootEntries	   dw  0
TotalSectors	   dw  0
MediaDescriptor    db  0F8h ; hd
SectorsPerFAT	   dw  0   
SectorsPerTrack    dw  63
Heads		   dw  255
HiddenSectors	   dd  63
BigTotalSectors    db  0xbf,0x64,0x9c,0x00  
BigSectorsPerFat   db  0x10,0x27,0x00,0x00
ExtFlags	   dw  0
FS_Version	   dw  0
RootDirStrtClus    dd  2
FSInfoSec	   dw  0x01	    ; at 0x30
BkUpBootSec	   dw  0x06
Reserved	   dw  0,0,0,0,0,0
Drive		   db  80h	    ; at 0x40
HeadTemp	   db  0
Signature	   db  29h
SerialNumber	   db  0x07,0x16,0x1a,0x39
VolumeLabel	   db  'TEST       '
FileSystemID	   db  'FAT32   '
end if
; 0x2000:0xfff0   - stack set at start
; es(0x1000+):0   - data read from hd
start_program:
  cli
  cld
  mov  ax,0x1000
  mov  es,ax
  mov  ax,0x2000
  mov  ss,ax
  mov  sp,0xfff0
  push cs
  pop  ds
if Header = Debug
  mov  ax,0xb800
  mov  gs,ax
  mov  [gs:80*24*2],byte '1'
end if
  xor  eax,eax
  call hd_read
  mov  eax,[es:0x1c6]		      
  mov  [partition_start_cluster],eax
  call hd_read
  mov  [in_cache],dword 0	   ; clear fat cache
  movzx ecx,word [es:0xe]	   ; fat start cluster
  mov  [fat_start_cluster],ecx
  movzx ecx,byte [es:0x10]	   ; number of fats
  mov  [number_of_fats],ecx
  mov  ecx,[es:0x24]		   ; fat size
  mov  [fat_size],ecx
  mov  eax,[number_of_fats]	    ; block start cluster =
  imul eax,[fat_size]		    ; number_of_fats*fat_size
  add  eax,[fat_start_cluster]	    ; +fat_start_cluster
  mov  [block_start_cluster],eax
  movzx ecx,byte [es:0xd]	    ; sectors per cluster
  mov  [sectors_per_cluster],ecx
  mov  eax,[block_start_cluster]      ; assumes that root starts at
  add  eax,[partition_start_cluster]  ; block number 2
new_file_cluster_search:
  mov  edi,[sectors_per_cluster]
new_file_search:
  call hd_read
  mov  esi,0
 .newn:
  cmp  [es:esi],dword 'KERN'
  jne  .not_found
  cmp  [es:esi+8],word 'MN'
  jne  .not_found
  jmp  .found
 .not_found:
  add  esi,32
  cmp  esi,512
  jne  .newn
  inc  eax
  dec  edi
  jnz  new_file_search
  if Header = Debug
     mov  [gs:80*24*2],byte '2'
  end if
  jmp  $
 .found:
  if Header = Debug
   mov	[gs:80*24*2],byte '3'
  end if
  mov  ax,[es:esi+20]		   ; first cluster of file data
  shl  eax,16
  mov  ax,[es:esi+26]
  sub  eax,2			   ; eax has the first cluster of file 
new_cluster_of_file:
  push eax
  imul eax,[sectors_per_cluster]
  add  eax,[block_start_cluster]
  add  eax,[partition_start_cluster]
  mov  ecx,[sectors_per_cluster]
 newbr:
  call hd_read
  mov  dx,es
  add  dx,512 / 16
  mov  es,dx
  inc  eax
  dec  ecx
  jnz  newbr
  pop  eax
  call find_next_cluster_from_fat
  cmp  eax,0xf000000
  jb   new_cluster_of_file
  mov  ax,0x1000
  mov  es,ax
  sti
if Header = Debug
   mov	[gs:80*24*2],byte '4'
end if
if Header = Fat12
  mov  dx,0x3f2 		 ; turn floppy motor off
  mov  al,0
  out  dx,al
end if
  jmp  0x1000:0000 
   
find_next_cluster_from_fat:
  push es
  mov  bx,0x1000-512/16
  mov  es,bx
  add  eax,2
  shl  eax,2
   
  mov  ecx,eax
  shr  eax,9		 ; cluster no
  add  eax,[fat_start_cluster]
  add  eax,[partition_start_cluster]
  cmp  eax,[in_cache]	 ; check cache
  je   no_read
  call hd_read
  mov  [in_cache],eax
 no_read:
   
  and  ecx,511		 ; in cluster
  mov  eax,[es:ecx]
  sub  eax,2
  pop  es
   
  ret
hd_read:      ; eax block to read
    pushad 
    push  eax
  newhdread:
   
    mov   edx,hdbase
    inc   edx
    mov   al,0
    out   dx,al
    inc   edx
    mov   al,1
    out   dx,al
    inc   edx
    pop   ax
    out   dx,al
    inc   edx
    shr   ax,8
    out   dx,al
    inc   edx
    pop   ax
    out   dx,al
    inc   edx
    shr   ax,8
    and   al,1+2+4+8
    add   al,hdid
    add   al,128+64+32
    out   dx,al
    inc   edx
    mov   al,20h
    out   dx,al
   
  .hdwait:
   
    in	  al,dx
    test  al,128
    jnz   .hdwait
    mov   edi,0x0 
    mov   ecx,256
    mov   edx,hdbase
    cld
    rep   insw
    popad
    ret
   
times ((0x1fe-$) and 0xff) db 00h
  db 55h,0aah ;boot signature
data_area:
فایل بوت لودر به دست آمده را باید به وسیله برخی برنامه های خاص (معمولا در بعضی برنامه های رایت سی دی این امکان وجود دارد)  به قسمت بوت یک سی دی یا فلاپی منتقل کرد.
نکته:این فایل بوت لودر به BIOS  سیستم میفهماند که باید فلان فایل از فلان آدرس از سی دی اجرا شود.
پس برنامه بوت لودر برنامه اصلی ما نیست بلکه یک معرفی کننده یا ارجاع دهنده به برنامه اصلی است.
و اما برنامه اصلی:برنامه اصلی را معمولا با C++ می نویسند و جالب آنجاست که حق استفاده از هیچ یک از توابع C++ و API و... را ندارید تنها چیزی که در اختیار دارید برای نوشتن برنامه وقفه های BIOS می باشد.
البته روش های دیگری هم وجود دارد.
سورسی که در بالا قرار دادم مثلا سیستم را در هنگام روشن کردن کامپیوتر ملزم به اجرای فایل Kernel.mnt میکند. حالا فایل Kernel.mnt چیست؟این فایل یک فایل لیست میباشد و این لیست هنگام بوت شدن نشان داده خواهد شد.و اینکه این فایل کجا باید قرار گیرد در داخل اولین درایو هارد دیسک و فقط داخل درایو باشد و نه پوشه.فایل Kernel.mnt قابل ایجاد و ویرایش توسط برنامه foxpro میباشد.
پس کل کار این شد سورس رو کامپایل میکنید و میریزید تو قسمت بوت یک فلاپی با فرمت fat12 و سپس یک فایل لیست به نام Kernel.mnt با foxpro  میسازین و در داخل اولین درایو هارد و در اولین شاخه قرار میدین.
همین.
این آموزش میتونه برای اونایی که برای اولین بار میخوان لذت برنامه bootable ساختن رو تجربه کنن میتونه جالب باشه.
درسته اینجا تالار وی بی هست اما خوب گفتم شاید دوستان علاقه داشته باشن به این کار.
karbon2010
سه شنبه 12 بهمن 1389, 09:17 صبح
با سلام 
مشکر از ششما دوست عزیز و بزگوارم 
من راستش چند روز پیش به سرم زد یک برنامه که تحت بوت یکسری اعمال انجام دهد را بنویسم بعد یکسری جستجو ها در این مورد انجام دادم به هرحال می خواستم این بحث را ادامه بدهم البته به قول شما درسته اینجا تالار ویبی هست اما این موضوع بی ربط به وی بی  نیست در غیر اینصورت در تالار c تایپیک می زدم  جایی جستجو کردم گفته بود می توانید یه boot loader بنویسید و بعد برنامه ای که با وی بی نوشته اید را با ان اجرا نمایید  البته به شرطی که از Apl و یکسری ابزارهایی که زیر نظر سیستم عامل است استفاده نشود و یا اینکه برنامه ای که نوشته اید را با یک برنامه PE Builder  تحت بوت اجرا نمایید 
به نظر شم چنین کاری ممکن است  من که هنوز تست نکردم البته امروز تست میکنم .
ممنون
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.