wincso ident

Istvan HAVASI havasi at egus.hu
Wed Jul 14 09:20:16 CEST 1999


Hali!

Nekem megvan egy freeware particios manager, aminek a forraskodjaban
megtalaltam a dolgot...
Ha kell az egesz, akkor szolj.
Az erdekes reszt mindenesetre idemasolom, hatha valaki mast is
erdekel............
Lekerdezi a biostol is meg a ide drivetol is, hogy ki fia borja.....

No remelem ez megoldja tudasszomjadat  (  :-)) vagy hi-hi-hi izles szerint
)

Udv
Steve


void print_ide_info(void)
{
 int i, n, hd;
 unsigned long l;
 unsigned *dd=(unsigned*)buf; /* 2048 bytes */
 unsigned port_base, hd_id;
 struct disk_addr daddr;

 fprintf(stderr,"Querying BIOS.  Wait...\n");

 printf("\n");

 hd=0x80;
 i=0;
 do
   {
    printf("Int13 0x%02X  -> ",hd);
    if( (n=get_disk_info(hd,&dinfo,buf))==-1 )
       printf("Error!\n");
    else
      {
       printf("%5d cyl x %3d heads x %2d sects = %4ldM = %10s sectors\n",
              dinfo.num_cyls, dinfo.num_heads, dinfo.num_sects,
              dinfo.total_sects/2048, sprintf_long(tmp,dinfo.total_sects)
);

       daddr.disk=hd;
       daddr.cyl=0;
       daddr.head=0;
       daddr.sect=1;

       disk_read(&daddr,buf,1);  /* Wake up if disk is sleeping */
      }
    hd++;
    i++;
   }
 while( n==-1 && i<4 || i<n );

 if( detected_os==SYS_WIN95 )
   {
    fprintf(stderr,"Please exit from Win95 to query IDE controller.\n");
    return;
   }

 printf("\n");

 fprintf(stderr,"Querying IDE controller.  Wait...\n");

 printf("\n");

 for( hd=0x80 ; hd<=0x83 ; hd++ )
    {
     if( hd==0x80 ) { port_base=0x1F0; hd_id=0xA0; printf("Pri Master  ->
");}
     if( hd==0x81 ) { port_base=0x1F0; hd_id=0xB0; printf("Pri Slave   ->
");}
     if( hd==0x82 ) { port_base=0x170; hd_id=0xA0; printf("Sec Master  ->
");}
     if( hd==0x83 ) { port_base=0x170; hd_id=0xB0; printf("Sec Slave   ->
");}


     /* Wait for controller not busy */
     l=0;
     while( inportb(port_base+7)!=0x50 && l<20000)
        {
         l++;
         if( l%4000==0 ) sleep(1);
        }

     if( l==20000 ) { printf("Time out!\n\n"); continue; }

     /* Get first/second drive */
     outportb(port_base+6, hd_id);

     /* Get drive info data */
     outportb(port_base+7, 0xEC);

     /* Wait for data ready */
     l=0;
     while( inportb(port_base+7)!=0x58 && l<20000)
        {
         l++;
         if( l%4000==0 ) sleep(1);
        }
     if( l==20000 ) { printf("Time out!\n\n"); continue; }


     /* Read "sector" */
     for( i=0 ; i<256 ; i++ ) dd[i] = inport(port_base);

     printf("%5d cyl x %3d heads x %2d sects = %4ldM = %10s sectors\n",
      dd[1], dd[3], dd[6],
      ((long) dd[1] * (long) dd[3] * (long) dd[6])/2048,
      sprintf_long(tmp,((long) dd[1] * (long) dd[3] * (long) dd[6]) ) );

     printf("\n          Hard Disk Model: %s\n\n", getascii(dd, 27, 46));
/*
 printf("Model Number ---------------------> %s\n", getascii(dd, 27, 46));
 printf("Serial Number --------------------> %s\n", getascii(dd, 10, 19));
 printf("Controller Revision Number -------> %s\n", getascii(dd, 23, 26));
 printf("Able to do Double Word Transfer --> %6s\n",
     (dd[48] == 0 ? "No" : "Yes"));
 printf("Controller type ------------------>   %04X\n", dd[20]);
 printf("Controller buffer size (bytes) ---> %6u\n", dd[21] * 512);
 printf("Number of ECC bytes transferred --> %6u\n", dd[22]);
 printf("Number of sectors per interrupt --> %6u\n", dd[47]);
*/
     }
}






More information about the Elektro mailing list