home *** CD-ROM | disk | FTP | other *** search
/ For Beginners & Professional Hackers / cd.iso / docum / soft.doc / partc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-06-22  |  8.5 KB  |  196 lines

  1. #line -a-
  2.  
  3. /*┌──────────────────────────────────────────────────────────────────────┐*/
  4. /*│ ìạáτÑ¡¿Ñ          : ÄΓ«ípáªÑ¡¿Ñ páºí¿Ñ¡¿∩ ªÑßΓ¬«ú« ñ¿ß¬á           │*/
  5. /*├──────────────────────────────────────────────────────────────────────┤*/
  6. /*│ éδº«ó               : FIXPARTC [¡«¼Ñp ñ¿ß¬á] (»« π¼«½τá¡¿ε 0)        │*/
  7. /*└──────────────────────────────────────────────────────────────────────┘*/
  8.  
  9. #include <dos.h>
  10. #include <string.h>
  11. #include <stdlib.h>
  12.  
  13. #define TRUE   ( 1 == 1 )                       
  14. #define FALSE  ( 1 == 0 )
  15.  
  16. #define HI(x)  ( *((BYTE *) (&x) + 1) )      /* é«ºópáΘáÑΓ ßΓápΦ¿⌐ íá⌐Γ   */
  17. #define LO(x)  ( *((BYTE *) &x) )            /* é«ºópáΘáÑΓ ¼½áñΦ¿⌐ íá⌐Γ   */
  18.  
  19. typedef unsigned char BYTE;
  20. typedef unsigned int WORD;
  21.  
  22.  
  23. typedef struct {                              /* îÑßΓ«»«½«ªÑ¡¿Ñ ßÑ¬Γ«pá   */
  24.                 BYTE Head;                    /* â«½«ó¬á τΓÑ¡¿∩/ºá»¿ß¿    */ 
  25.                 WORD SecCyl;                  /* ì«¼Ñp ßÑ¬Γ«pá ¿ µ¿½¿¡ñpá */
  26.                 } SECPOS;
  27.  
  28. typedef struct {                              /* éσ«ñ ó Γáí½¿µπ páºñѽ«ó  */
  29.         BYTE          Status;         /* æ«ßΓ«∩¡¿Ñ páºñѽᠠ      */
  30.         SECPOS        StartSec;       /* ìáτá½∞¡δ⌐ ßÑ¬Γ«p         */
  31.         BYTE          PartTyp;        /* Æ¿» páºñѽᠠ            */
  32.         SECPOS        EndSec;         /* è«¡Ñτ¡δ⌐ ßÑ¬Γ«p          */
  33.         unsigned long SecOfs;         /* æ¼ÑΘÑ¡¿Ñ ßÑ¬Γ«pá ºáúpπº¬¿*/
  34.         unsigned long SecNum;         /* è«½¿τÑßΓó« ßÑ¬Γ«p«ó      */
  35.         } PARTENTRY;
  36.  
  37. typedef struct {                               /* æÑ¬Γ«p páºí¿Ñ¡¿∩        */
  38.         BYTE          BootCode[ 0x1BE ];
  39.         PARTENTRY     PartTable[ 4 ];
  40.         WORD          IdCode;
  41.         } PARTSEC;                      /* OxAA55                 */
  42.  
  43. typedef PARTSEC far *PARSPTR;   /* ô¬áºáΓѽ∞ > ßÑ¬Γ«pá páºñѽá ó »á¼∩Γ¿   */
  44.  
  45. /*┌──────────────────────────────────────────────────────────────────────┐*/
  46. /*│ ReadPartSec : ù¿ΓáÑΓ ßÑ¬Γ«p páºí¿Ñ¡¿∩ ß ñ¿ß¬á ¿ »«¼ÑΘáÑΓ ó íπΣÑp     │*/
  47. /*├──────────────────────────────────────────────────────────────────────┤*/
  48. /*│ éσ«ñ¡δÑ »ápá¼ÑΓpδ : HrdDrive - BIOS-¬«ñ ñ¿ß¬á(Äσ80 ¿½¿ Äσ81 )        │*/
  49. /*│                   : Head     - ì«¼Ñp ú«½«ó¬¿ τΓÑ¡¿∩/ºá»¿ß¿           │*/
  50. /*│                   : SecCyl   - ì«¼Ñp ßѬΓ. ¿ µ¿½¿¡ñpá ó Σ«p¼áΓÑ BIOS │*/
  51. /*│                   : Buf      - üπΣÑp, ó ¬«Γ«pδ⌐ »«¼ÑΘáÑΓß∩ ßÑ¬Γ«p    │*/
  52. /*│ éδσ«ñ¡δÑ »ápá¼ÑΓpδ : TRUE     - Ñß½¿ ßÑ¬Γ«p τ¿ΓáÑΓß∩ íѺ «Φ¿í¬¿      │*/
  53. /*│                    : FALSE    - ¿¡áτÑ                                │*/
  54. /*└──────────────────────────────────────────────────────────────────────┘*/
  55.  
  56. BYTE ReadPartSec( BYTE HrdDrive, BYTE Head, WORD SecCyl, PARSPTR Buf )
  57. {
  58.     union REGS   Regs;           /* ÉÑú¿ßΓpδ »p«µÑßß«pá ñ½∩ ó맮óá    */
  59.     struct SREGS SRegs;          /*   »pÑpδóá¡¿∩                      */
  60.  
  61.         Regs.x.ax = 0x0201;          /* ì«¼Ñp Σπ¡¬µ¿¿ "τΓÑ¡¿Ñ", 1 ßÑ¬Γ«p  */
  62.         Regs.h.dl = HrdDrive;        /* çáúpπº¬á »ápá¼ÑΓp«ó ó pÑú¿ßΓpδ    */ 
  63.         Regs.h.dh = Head;            
  64.         Regs.x.cx = SecCyl;
  65.         Regs.x.bx = FP_OFF( Buf );
  66.     SRegs.es  = FP_SEG( Buf );
  67.  
  68.     int86x ( 0x13, &Regs, &Regs, &SRegs); /* é맮ó »pÑpδóá¡¿∩        */
  69.                           /* ªÑßΓ¬«ú« ñ¿ß¬á          */
  70.         return !Regs.x.cflag;
  71. }
  72.  
  73. /*┌──────────────────────────────────────────────────────────────────────┐*/
  74. /*│ GetSecCyl   : Ä»pÑñѽ∩ÑΓ ¡«¼Ñp ßÑ¬Γ«pá ¿ µ¿½¿¡ñpá ó Σ«p¼áΓÑ BIOS     │*/
  75. /*├──────────────────────────────────────────────────────────────────────┤*/
  76. /*│ éσ«ñ¡δÑ »ápá¼ÑΓpδ : SecCyl  - ì«¼Ñp ßÑ¬Γ«pá ¿ µ¿½¿¡ñpá ó Σ«p¼áΓÑ BIOS│*/
  77. /*│                   : Sector  - ê¼∩ »ÑpѼѡ¡«⌐ "ßÑ¬Γ«p"                │*/
  78. /*│                   : Cylinder - ê¼∩ »ÑpѼѡ¡«⌐ "µ¿½¿¡ñp"              │*/
  79. /*│ éδσ«ñ¡δÑ »ápá¼ÑΓpδ: ¡ÑΓ                                              │*/
  80. /*└──────────────────────────────────────────────────────────────────────┘*/
  81.  
  82. void GetSecCyl( WORD SecCyl, int *Sector, int *Cylinder )
  83. {
  84.         *Sector    = SecCyl & 63;              /* êºó½ÑτÑ¡¿Ñ í¿Γ«ó 6 ¿ 7  */
  85.         *Cylinder  = HI( SecCyl ) + ( ( (WORD) LO( SecCyl ) & 192 ) << 2 );
  86.  
  87. }
  88. /*┌──────────────────────────────────────────────────────────────────────┐*/
  89. /*│ ShowPartition  :  ÄΓ«ípáªáÑΓ páºí¿Ñ¡¿Ñ ªÑßΓ¬«ú« ñ¿ß¬á ¡á φ¬pá¡Ñ      │*/
  90. /*├──────────────────────────────────────────────────────────────────────┤*/
  91. /*│ éσ«ñ¡«⌐ »ápá¼ÑΓp  : DR    - ì«¼Ñp ñ¿ß¬á                              │*/
  92. /*│ éδσ«ñ¡δÑ »ápá¼ÑΓpδ: ¡ÑΓ                                              │*/
  93. /*└──────────────────────────────────────────────────────────────────────┘*/
  94.  
  95. void ShowPartition( BYTE LW )
  96. {
  97.  
  98. #define AP ParSec.PartTable[ Entry ]
  99.  
  100.     BYTE       Head,                  /* â«½«ó¬á ñ½∩ ΓѬπΘÑú« páºñѽá */
  101.            Entry,                 /* æτÑΓτ¿¬ µ¿¬½á                */
  102.            SecCyl;                /* æÑ¬Γ«p ¿ µ¿½¿¡ñp             */
  103.     PARTSEC    ParSec;                /* ÆÑ¬πΘ¿⌐ ßÑ¬Γ«p páºí¿Ñ¡¿∩     */
  104.     int        Sector,                /* Å«½πτÑ¡¿Ñ ßÑ¬Γ«pá ¿ µ¿½¿¡ñpá */
  105.            Cylinder;              /* ì«¼Ñp                        */
  106.     union REGS Regs;                  /* ÉÑú¿ßΓpδ »p«µÑßß«pá          */
  107.                       /* ñ½∩ ó맮óá »pÑpδóá¡¿∩        */
  108.     printf( "\n" );
  109.     LW |= 0x80;                   /* Å«ñú«Γ«ó¬á ¡«¼Ñpá ñ¿ß¬á ñ½∩ BIOS */
  110.     if ( ReadPartSec( LW, 0, 1, &ParSec ) ) /* ùΓÑ¡¿Ñ ΓѬπΘÑú« ΓѬßΓá */
  111.       {                                    /* æÑ¬Γ«p πß»ÑΦ¡« »p«τ¿Γá¡ */
  112.         Regs.h.ah = 8;                     /* ùΓÑ¡¿Ñ ñá¡¡δσ ñ¿ß¬á     */
  113.         Regs.h.dl = LW;
  114.         int86( 0x13, &Regs, &Regs );/* é맮ó »pÑpδóá¡¿∩ ªÑßΓ¬«ú« ñ¿ß¬á*/
  115.         GetSecCyl( Regs.x.cx, &Sector, &Cylinder );
  116.         printf("┌──────────────────────────────────────────────────────"
  117.            "────────────────────────┐");
  118.         printf("│ ä¿ß¬       %2d:    %2d ú«½«ó«¬   ß %4d "
  119.            " µ¿½¿¡ñpἿ %3d  ßÑ¬Γ«pἿ             │",
  120.              LW-0x80, Regs.h.dh+1, Cylinder, Sector );
  121.         printf("│ Æáí½¿µá páºñѽ«ó ó ßÑ¬Γ«pÑ páºí¿Ñ¡¿∩     "
  122.            "                                    │");
  123.         printf("├──┬────┬───────────────────────┬─────────────┬───"
  124.            "──────────┬───────────┬──────┤");
  125.         printf("│  │    │                       │ ìáτὫ      │ è«¡Ñµ"
  126.            "       │ÉáßßΓ«∩¡¿Ñ │諽-ó«│");
  127.  
  128.         printf("│#.│çáúp│Æ¿»                    │ â«½ û¿½ æÑ¬ │"
  129.            " â«½ û¿½ æÑ¬ │«Γ ßѬ.ºáú.│ßѬΓ. │");
  130.  
  131.         printf("├──┼────┼───────────────────────┼─────────────┼─────"
  132.            "────────┼───────────┼──────┤");
  133.  
  134.         for(Entry = 0; Entry < 4; ++Entry)
  135.          {
  136.           printf( "│ %d│", Entry );
  137.           if (AP.Status == 0x80 )
  138.         printf("äá  ");
  139.           else
  140.            printf("ìÑΓ ");
  141.           printf("│");
  142.           switch( AP.PartTyp )           /* ÄΓ«ípáªÑ¡¿Ñ Γ¿»á páºñѽᠠ*/
  143.            {
  144.         case 0x00 : printf("ìÑ ºá¡∩Γ«              ");
  145.                 break;
  146.         case 0x01 : printf("DOS, 12-í¿Γ«óá∩  FAT   ");
  147.                 break;
  148.         case 0x02 : printf("XENIX                  ");
  149.                 break;
  150.         case 0x03 : printf("XENIX                  ");
  151.                 break;
  152.         case 0x04 : printf("DOS, 16-í¿Γ«óá∩  FAT   ");
  153.                 break;
  154.         case 0x05 : printf("DOS, ä«»«½¡¿Γ. páºñѽ  ");
  155.                 break;
  156.         case 0xDB : printf("Åápώѽ∞¡á∩ DOS       ");
  157.                 break;
  158.         default   : printf("ìÑ¿ºóÑßΓ¡á∩  (%3d)     ",
  159.                    ParSec.PartTable[Entry].PartTyp);
  160.            }
  161.  
  162.           GetSecCyl ( AP.StartSec.SecCyl, &Sector, &Cylinder );
  163.           printf ( "│%2d %5d %3d ",AP.StartSec.Head,Cylinder, Sector );
  164.           GetSecCyl ( AP.EndSec.SecCyl, &Sector, &Cylinder );
  165.           printf ( "│%2d %5d %3d ",AP.EndSec.Head,Cylinder, Sector );
  166.           printf ( "│ %6lu    │%6lu│",AP.SecOfs, AP.SecNum );
  167.          }
  168.         printf("└──┴────┴───────────────────────┴─────────────┴───"
  169.            "──────────┴───────────┴──────┘");
  170.       }
  171.       else
  172.         printf(" ÄΦ¿í¬á ó« ópѼ∩ ñ«ßΓπ»á ¬ ßÑ¬Γ«pπ ºáúpπº¬¿!\n");
  173.   }
  174.  
  175. /**************************************************************************/
  176. /*                              âÄïÄéìǃ ÅÉÄâÉÇîîÇ                        */
  177. /**************************************************************************/
  178. int main( int argc, char *argv[] )
  179. {
  180.         int HrdDrive;
  181.  
  182.     HrdDrive = 0;                    /* Å« π¼«½τá¡¿ε                  */
  183.     if ( argc == 2 )                 /* àß½¿ ñ¿ß¬ ºáñá¡ »ápá¼ÑΓp«¼    */
  184.           {                              /* äá                            */
  185.         HrdDrive = atoi ( argv[ 1 ]);
  186.         if ( HrdDrive == 0 && *argv[ 1 ] != '0' )
  187.               {
  188.                 printf( "\n ìÑóÑp¡« π¬áºá¡ ñ¿ß¬!" );
  189.                 return( 1 );             /* è«¡Ñµ »p«úpá¼¼δ               */
  190.                 }
  191.         }
  192.       ShowPartition( HrdDrive );     /* ÄΓ«ípáªÑ¡¿Ñ ßÑ¬Γ«pá páºí¿Ñ¡¿∩ */
  193.           return( 0 );
  194. }
  195.  
  196.