Есть код, помогите до ума довести. Нужна функция для чтения сектора диска в LBA режиме с помощью прерываний. Вот наклепал немного, но знаний пока не хватает, чтобы самому доделать... А функция нужна срочно... Код | #include <stdio.h>
#define FP_SEG(fptr) ((unsigned)((unsigned long)(fptr) >> 16)) #define FP_OFF(fptr) ((unsigned)(fptr))
#define BYTE unsigned char #define WORD unsigned short #define DWORD unsigned int
#define SECTOR_SIZE 512
struct disk_packet //needed for int13 42h { BYTE size_pack; //size of packet must be 16 or 16+ BYTE reserved1; //reserved BYTE no_of_blocks; //nof blocks for transfer BYTE reserved2; //reserved WORD offset; //offset address WORD segment; //segment address DWORD lba1; DWORD lba2; } disk_pack;
void LBASectorRead(void *buffer/*, unsigned long lba */) { unsigned char bError = 0; disk_pack.size_pack=16; //set size to 16 disk_pack.no_of_blocks=1; //1 block ie read one sector disk_pack.reserved1=0; //reserved word disk_pack.reserved2=0; //reserved word disk_pack.segment=FP_SEG(buffer); //segment of buffer disk_pack.offset=FP_OFF(buffer); //offset of buffer disk_pack.lba1=0; //lba first 32 bits disk_pack.lba2=0; //last 32 bit address
asm(".intel_syntax noprefix \n\t" "mov dl, 0x80 \n\t" "mov %1, ds \n\t" "mov si, %3 \n\t" "mov ah, 0x42 \n\t" "int 0x13 \n\t" ".att_syntax noprefix \n\t");
/*_asm { mov dl, 80h; mov [disk_pack.segment], ds; mov si, disk_pack; mov ah, 42h; int 13h jc NoError ; //No error, ignore error code mov bError, ah ; // Error, get the error code NoError: }
printf( "%d", bError);*/
}
void PrintSector(char * buffer) { int i; for(i = 0; i < SECTOR_SIZE; i++) { printf("%d ", *(buffer+i)); if((i+1)%12==0) printf("\n"); } printf("\n"); }
int main(void) { static unsigned char currentMBR[SECTOR_SIZE] = {0}; printf("\n\n"); LBASectorRead(¤tMBR ); PrintSector(currentMBR); //function to print buffer in hex }
|
|