http://www.wasm.ru/forum/viewtopic.php?id=39902 Тут код на с++ пишет загрузчик на флешку. Надеюсь это тебе было нужно
Код (Text): #include "stdio.h" #include "stdlib.h" #include "string.h" #include "windows.h" typedef struct __CPARAM{ char *name; int (*f)(int argc,char *argv[],void *); }CPARAM,*PCPARAM; int WriteToBootImg(int argc,char *argv[],void *); int SetRightAccess(int argc,char *argv[],void *); CPARAM params [] = { {"-WriteToBootImg",WriteToBootImg}, {"-SetRightAccess",SetRightAccess}, }; int main(int argc,char * argv[]){ int i,j,count; count = sizeof(params) / sizeof(CPARAM); for (j=1; j < argc; ++j){ for (i=0; i<count; ++i){ if (!strcmp(argv[j],params[i].name)){ j+=params[i].f(argc - j - 1 ,argv+j+1,0); }; }; }; return 0; }; void print_error(char *str){ printf("%s\nGetLastError : %d\n",str,GetLastError()); }; int WriteToBootImg(int argc,char *argv[],void *){ // 0 - destenation boot image, \\.\PHYSICALDRIVE1 // 1 - source boot file BootImage.bin char byte_store[0x200]; HANDLE hDest,hSource; DWORD s,size; PVOID p; if (argc < 2 ){ printf("[ERROR]: argument error\r\n"); printf("destenation boot image source boot file\r\n"); return 0; }; hDest = CreateFile(argv[0],GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); if(hDest == INVALID_HANDLE_VALUE){ print_error("[FAIL]: CreateFile"); return 2; }; hSource = CreateFileA(argv[1],GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); if(hSource == INVALID_HANDLE_VALUE){ print_error("[FAIL]: CreateFile"); CloseHandle(hDest); return 2; }; ReadFile(hDest,byte_store,sizeof(byte_store),&s,NULL); size=GetFileSize(hSource,NULL); size = (size%0x200)?(size):((1+(size/0x200))*0x200); p = malloc(size); if (!p){ printf("[FAIL]: malloc return 0"); CloseHandle(hDest); CloseHandle(hSource); return 2; }; memset(p,size,0); ReadFile(hSource,p,size,&s,NULL); memcpy(0x1be + (char*)p ,&byte_store[0x1be],0x200 - 0x1be); SetFilePointer(hDest,0,0,FILE_BEGIN); WriteFile(hDest,p,size,&s,NULL); CloseHandle(hDest); CloseHandle(hSource); return 2; }; int SetRightAccess(int argc,char *argv[],void *) { HANDLE hToken; if (argc < 2 ){ printf("[ERROR]: argument error\r\n"); printf("user password\r\n"); return 0; }; //LogonUser if(! LogonUser(argv[0],".",argv[1],LOGON32_LOGON_INTERACTIVE,LOGON32_PROVIDER_DEFAULT,&hToken) ){ print_error("[FAIL]: LogonUser\r\n"); return 2; }; ZeroMemory(argv[1],strlen(argv[1])); // if(!ImpersonateLoggedOnUser(hToken)){ print_error("[FAIL]: ImpersonateLoggedOnUser\r\n"); return 2; }; return 2; };
Не все компы грузятся с флешки, иногда не со всех портов. Нужно пошаманить с настройками БИОСА. Флешка должна быть отформатирована под фат. Блин, долго это все и нудно. А CD не?
paralvic Да уже все сделано простым: http://greenflash.su. C ntfs проблем тоже меньше. Что касается программной записи : нужны административные права и пишем на \\.\PHYSICALDRIVE1 (если один диск у нас)
А это ещё зачем? Всё зависит от загрузчика, что мы запишем в первые 512 байт. Запишем один - будет грузиться с FAT, запишем какой-нибудь другой - будет грузиться с ext2, запишем третий - вообще с нашей собственной ФС, которую никто кроме нас не знает.
KIV Ты почти прав. Только вот пока никому не удалось даже в 1024 байта запихнуть загрузчик с ext2 или ntfs. Поэтому самодельные загрузчики обычно работают с FAT - это относительно просто. Но грузят они все большой загрузчик, который уже все разгребает.
Если вы хотите совместимости с разными БИОСами, то еще и мало того, нужно под 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 проблему не решает.
может есть смысл посмотреть в батники, которые прописывают загрузчик на флешку? Хотя бы те, которые идут в комплекте с magos.