Как поместить загрузчик на флешку?

Тема в разделе "WASM.BEGINNERS", создана пользователем Mencey, 3 июн 2011.

  1. Mencey

    Mencey New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2010
    Сообщения:
    1
    Ни как не могу понять как же его поместить на флеху, чтобы он при загрузке начинал работать?
     
  2. noonv

    noonv Member

    Публикаций:
    0
    Регистрация:
    19 июл 2005
    Сообщения:
    209
    Адрес:
    Russia
    первые 512 байт? О_о
     
  3. pashe4ka13

    pashe4ka13 New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2010
    Сообщения:
    263
    http://www.wasm.ru/forum/viewtopic.php?id=39902
    Тут код на с++ пишет загрузчик на флешку. Надеюсь это тебе было нужно :)
     
  4. CHESTER

    CHESTER New Member

    Публикаций:
    0
    Регистрация:
    8 май 2011
    Сообщения:
    7
    Код (Text):
    1. #include "stdio.h"
    2. #include "stdlib.h"
    3. #include "string.h"
    4. #include "windows.h"
    5.  
    6.  
    7. typedef struct __CPARAM{
    8.     char *name;
    9.     int (*f)(int argc,char *argv[],void *);
    10. }CPARAM,*PCPARAM;
    11.  
    12. int WriteToBootImg(int argc,char *argv[],void *);
    13.  
    14. int SetRightAccess(int argc,char *argv[],void *);
    15.  
    16.  
    17.  
    18. CPARAM params [] = {
    19.                         {"-WriteToBootImg",WriteToBootImg},
    20.                         {"-SetRightAccess",SetRightAccess},
    21.                        
    22.                        };
    23.                    
    24. int main(int argc,char * argv[]){
    25.     int i,j,count;
    26.     count = sizeof(params) / sizeof(CPARAM);
    27.  
    28.   for (j=1; j < argc; ++j){
    29.     for (i=0; i<count; ++i){
    30.         if (!strcmp(argv[j],params[i].name)){
    31.             j+=params[i].f(argc - j - 1 ,argv+j+1,0);
    32.         };      
    33.     };
    34.   };
    35.     return 0;
    36. };
    37.  
    38. void print_error(char *str){
    39.     printf("%s\nGetLastError : %d\n",str,GetLastError());
    40. };
    41.  
    42. int WriteToBootImg(int argc,char *argv[],void *){
    43.  // 0   - destenation boot image, \\.\PHYSICALDRIVE1
    44.  // 1   - source boot file           BootImage.bin
    45.     char byte_store[0x200];
    46.     HANDLE  hDest,hSource;
    47.     DWORD s,size;
    48.     PVOID p;
    49.     if (argc < 2 ){
    50.        printf("[ERROR]: argument error\r\n");
    51.        printf("destenation boot image     source boot file\r\n");
    52.      return 0;
    53.    };  
    54.    
    55.     hDest = CreateFile(argv[0],GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
    56.     if(hDest == INVALID_HANDLE_VALUE){
    57.        print_error("[FAIL]: CreateFile");
    58.      return 2;
    59.    };
    60.     hSource = CreateFileA(argv[1],GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
    61.  
    62.    if(hSource ==  INVALID_HANDLE_VALUE){
    63.        print_error("[FAIL]: CreateFile");
    64.      CloseHandle(hDest);
    65.      return 2;
    66.    };
    67.        
    68.     ReadFile(hDest,byte_store,sizeof(byte_store),&s,NULL);
    69.    
    70.     size=GetFileSize(hSource,NULL);
    71.     size = (size%0x200)?(size):((1+(size/0x200))*0x200);
    72.     p = malloc(size);
    73.  
    74.     if (!p){
    75.         printf("[FAIL]: malloc return 0");
    76.         CloseHandle(hDest);
    77.         CloseHandle(hSource);
    78.         return 2;
    79.     };
    80.  
    81.     memset(p,size,0);
    82.  
    83.     ReadFile(hSource,p,size,&s,NULL);
    84.  
    85.     memcpy(0x1be + (char*)p ,&byte_store[0x1be],0x200 - 0x1be);
    86.  
    87.     SetFilePointer(hDest,0,0,FILE_BEGIN);
    88.     WriteFile(hDest,p,size,&s,NULL);
    89.        
    90.     CloseHandle(hDest);
    91.     CloseHandle(hSource);
    92.    
    93.     return 2;
    94. };
    95.  
    96. int SetRightAccess(int argc,char *argv[],void *)
    97. {
    98.     HANDLE hToken;
    99.    if (argc < 2 ){
    100.        printf("[ERROR]: argument error\r\n");
    101.        printf("user     password\r\n");
    102.      return 0;
    103.    };
    104.  
    105.     //LogonUser
    106.     if(!   LogonUser(argv[0],".",argv[1],LOGON32_LOGON_INTERACTIVE,LOGON32_PROVIDER_DEFAULT,&hToken) ){
    107.         print_error("[FAIL]: LogonUser\r\n");
    108.         return 2;
    109.     };
    110.      ZeroMemory(argv[1],strlen(argv[1]));
    111.     //
    112.     if(!ImpersonateLoggedOnUser(hToken)){
    113.         print_error("[FAIL]: ImpersonateLoggedOnUser\r\n");
    114.         return 2;
    115.     };
    116.    
    117.     return 2;
    118. };
     
  5. paralvic

    paralvic Пархоменко Александр Викторович

    Публикаций:
    0
    Регистрация:
    20 ноя 2010
    Сообщения:
    294
    Адрес:
    Нижний Новгород
    Не все компы грузятся с флешки, иногда не со всех портов.
    Нужно пошаманить с настройками БИОСА.
    Флешка должна быть отформатирована под фат.
    Блин, долго это все и нудно. А CD не?
     
  6. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    paralvic
    Да уже все сделано простым: http://greenflash.su. C ntfs проблем тоже меньше.

    Что касается программной записи : нужны административные права и пишем на \\.\PHYSICALDRIVE1 (если один диск у нас)
     
  7. KIV

    KIV Member

    Публикаций:
    0
    Регистрация:
    16 июл 2009
    Сообщения:
    231
    А это ещё зачем? Всё зависит от загрузчика, что мы запишем в первые 512 байт. Запишем один - будет грузиться с FAT, запишем какой-нибудь другой - будет грузиться с ext2, запишем третий - вообще с нашей собственной ФС, которую никто кроме нас не знает.
     
  8. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    KIV
    Ты почти прав. Только вот пока никому не удалось даже в 1024 байта запихнуть загрузчик с ext2 или ntfs. Поэтому самодельные загрузчики обычно работают с FAT - это относительно просто. Но грузят они все большой загрузчик, который уже все разгребает.
     
  9. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Да что там 1024, есть на 512.
    http://demoseen.com/ColorblindBoot.s.txt
     
  10. shm

    shm New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2010
    Сообщения:
    93
    Если вы хотите совместимости с разными БИОСами, то еще и мало того, нужно под FAT12/16 или с некоторой натяжкой под NTFS. Я пытался, но так и не смог написать загрузчик, который совместим со 100% БИОСами, которые поддерживают загрузку с USB HDD. Сразу приведу пример БИОСа, на котором форматирование, скажем под FAT32 приведет к траблу - Award Modular BIOS 6.00PG, версию прошивки не скажу, но системная плата 2004 года выпуска. Я исследовал этот вопрос, тут дело в том, что БИОС автоматчики в загрузочном секторе заполняет DrvNum в заголовке FAT12(16), при этом не проверяя (!!!) то, что на диске вообще может быть не FAT. К примеру в заголовке FAT32 это поле FATz32, в NTFS правда это поле зарезервировано, но это не означает, что в новой версии оно не будет использоваться. Естественно, что смещение всех областей (не забивая их вручную) уже не найти, или подобный код явно не уместится в загрузчике. Для FAT32, пришлось применить кривое решение, рассчитанное на то, что M$ FAT уже "похоронила" - использовать зарезервированную область для хранения FATz32. Сразу скажу, что повторное чтение чтение загрузочного сектора с помощью int 13h проблему не решает.
     
  11. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    может есть смысл посмотреть в батники, которые прописывают загрузчик на флешку?
    Хотя бы те, которые идут в комплекте с magos.