Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [ASM/C] Problema con l'int 13h

    Sto provando a leggere il Master Boot Record, nel primo settore dell'HD.
    Sia Win che Linux, si proteggono non lasciandomi leggere il disco con l'int 13:
    Win: "Accesso negato"
    Linux: "Segmentation Fault (core dumped)"

    Il codice è:
    codice:
    #include <stdio.h>
    
    unsigned char *MBR[512];
    
    int main() {
    	*MBR = (unsigned char *) 0x6000;
    	asm ("PUSHA\n");
    	asm ("PUSH %ES");
    	asm ("MOV %CS, %AX\n");
    	asm ("MOV %AX, %ES\n");
    	asm ("MOV %AX, 2\n");
    	asm ("MOV %CX, 1\n");
    	asm ("MOV %DH, 0\n");
    	asm ("MOV %DL, 0x80\n");
    	asm ("MOV %BX, 0x6000\n");
    	asm ("INT $0x13\n");
    	asm ("POP %ES");
    	asm ("POPA\n");
    
    	unsigned int i;
    
    	for (i = 0; i < 512; i++) {
    		printf("%x ", MBR[i]);
    	}
    
    	return 0;
    }
    Cosa ho sbagliato? E come posso risolvere?

    Grazie

  2. #2
    Cosa ho sbagliato? E come posso risolvere?
    I sistemi operativi moderni non consentono l'accesso diretto all'hardware. Per risolvere il tuo problema dovresti creare un programma a 16 bit, funzionerà poi in modalità "emulazione" grazie al sottosistema NTVDM.

    Anche se spero che Windows blocchi gli accessi mediante INT13h!

  3. #3
    Windows NT (e successori) non ti lascia accedere direttamente a risorse critiche; devi usare la API CreateFile per aprire "\\.\PHYSICALDRIVE0" e leggere con la API ReadFile.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    devi usare la API CreateFile per aprire "\\.\PHYSICALDRIVE0" e leggere con la API ReadFile
    Beh allora è facile

    Potresti inviarmi un esempio, please?

    Grazie

  5. #5
    codice:
    #include <windows.h>
    /*...*/
    HANDLE hDisk=CreateFile("\\.\PHYSICALDRIVE0",GENERIC_READ,FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    BOOL bRet;
    DWORD dwBytesRead;
    byte MBR[512];
    if(hDisk==INVALID_HANDLE_VALUE)
    {
        printf("Impossibile aprire il disco\n");
        exit(1);
    }
    bRet=ReadFile(hDisk,MBR,512,&dwBytesRead,NULL);
    CloseHandle(hDisk);
    if(!bRet || dwBytesRead!=512)
    {
        printf("Impossibile leggere l'MBR.\n");
        exit(2);
    }
    printf("MBR letto con successo.\n");
    /* fa quello che deve fare con l'MBR letto */
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Perdonami MItaly, ma credo dovrebbe essere scritto così :
    codice:
    	HANDLE hDisk=CreateFile( "\\\\.\\PhysicalDrive0", // Con i doppi backslash
    	                         GENERIC_READ,
    	                         FILE_SHARE_WRITE,
    	                         NULL,
    	                         OPEN_EXISTING,
    	                         FILE_ATTRIBUTE_NORMAL,
    	                         NULL);
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  7. #7
    Grazie mille!!!
    funziona!!!
    Samuele_70 aveva ragione, servono i doppi backslash.

    Ma ora toglietemi una curiosità... come avete fatto ad imparare tutta sta roba? Mica vi sarete imparati a memoria la MSDN?!?!?!


  8. #8
    Originariamente inviato da AlfaOmega08
    Grazie mille!!!
    funziona!!!
    Samuele_70 aveva ragione, servono i doppi backslash.
    Giusto, me ne ero dimenticato.
    Ma ora toglietemi una curiosità... come avete fatto ad imparare tutta sta roba? Mica vi sarete imparati a memoria la MSDN?!?!?!
    Più o meno...
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.