home *** CD-ROM | disk | FTP | other *** search
/ Freelog Special Edition 1: Linux / CD1.iso / dosutils / fips20 / source / logdr_st.cpp < prev    next >
C/C++ Source or Header  |  1998-02-03  |  7KB  |  183 lines

  1. /*
  2.     FIPS - the First nondestructive Interactive Partition Splitting program
  3.  
  4.     Module logdr_st.cpp
  5.  
  6.     RCS - Header:
  7.     $Header: c:/daten/fips/source/main/RCS/logdr_str.cpp 1.4 1995/01/19 00:00:54 schaefer Exp schaefer $
  8.  
  9.     Copyright (C) 1993 Arno Schaefer
  10.  
  11.     This program is free software; you can redistribute it and/or modify
  12.     it under the terms of the GNU General Public License as published by
  13.     the Free Software Foundation; either version 2 of the License, or
  14.     (at your option) any later version.
  15.  
  16.     This program is distributed in the hope that it will be useful,
  17.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19.     GNU General Public License for more details.
  20.  
  21.     You should have received a copy of the GNU General Public License
  22.     along with this program; if not, write to the Free Software
  23.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  24.  
  25.  
  26.     Report problems and direct all questions to:
  27.  
  28.     schaefer@rbg.informatik.th-darmstadt.de
  29. */
  30.  
  31. #include <string.h>
  32. #include "types.h"
  33. #include "logdr_st.h"
  34.  
  35. /* ----------------------------------------------------------------------- */
  36. /* Extract Bios Parameter Block from boot sector                           */
  37. /* ----------------------------------------------------------------------- */
  38.  
  39. void bios_parameter_block::get (boot_sector *boot_sector)
  40. {
  41.     byte *bp = boot_sector->data;
  42.  
  43.     memcpy (jump_instruction,bp,3);
  44.     memcpy (oem_name,bp+3,8);
  45.     oem_name[8]=0;
  46.     bytes_per_sector = *(bp+0xb) | (*(bp+0xc) << 8);
  47.     sectors_per_cluster = *(bp+0xd);
  48.     reserved_sectors = *(bp+0xe) | (*(bp+0xf) << 8);
  49.     no_of_fats = *(bp+0x10);
  50.     no_of_rootdir_entries = *(bp+0x11) | (*(bp+0x12) << 8);
  51.     no_of_sectors = *(bp+0x13) | (*(bp+0x14) << 8);
  52.     media_descriptor = *(bp+0x15);
  53.     sectors_per_fat16 = *(bp+0x16) | (*(bp+0x17) << 8);
  54.     sectors_per_track = *(bp+0x18) | (*(bp+0x19) << 8);
  55.     drive_heads = *(bp+0x1a) | (*(bp+0x1b) << 8);
  56.     hidden_sectors = (dword) *(bp+0x1c) | ((dword) *(bp+0x1d) << 8) | ((dword) *(bp+0x1e) << 16) | ((dword) *(bp+0x1f) << 24);
  57.     no_of_sectors_long = (dword) *(bp+0x20) | ((dword) *(bp+0x21) << 8) | ((dword) *(bp+0x22) << 16) | ((dword) *(bp+0x23) << 24);
  58.     bp += 0x24;
  59.     if (sectors_per_fat16 == 0) {
  60.         /* Might be a FAT32 partition */
  61.         sectors_per_fat = (dword)
  62.             (((dword) bp[3] << 24) | ((dword) bp[2] << 16) | (bp[1] << 8) | bp[0]);
  63.         bp += 4;
  64.         flags = (bp[1] << 8) | bp[0]; bp += 2;
  65.         version[0] = *bp++;
  66.         version[1] = *bp++;
  67.         root_cluster = (dword)
  68.             (((dword) bp[3] << 24) | ((dword) bp[2] << 16) | (bp[1] << 8) | bp[0]);
  69.         bp += 4;
  70.         info_sector = ((bp[1] << 8) | bp[0]); bp += 2;
  71.         backup_boot = ((bp[1] << 8) | bp[0]); bp += 2;
  72.         bp += 12; /* Skip over reserved bytes */
  73.     } else {
  74.         sectors_per_fat = sectors_per_fat16;
  75.         root_cluster = 0;
  76.     }
  77.     phys_drive_no = *bp; bp += 2;
  78.     signature = *bp++;
  79.     serial_number = (dword)
  80.         (bp[0] | (bp[1] << 16) | ((dword) bp[2] << 16) | ((dword) bp[3] << 24));
  81.         bp += 4;
  82.     memcpy (volume_label,bp,11); bp += 11;
  83.     volume_label[11] = 0;
  84.     memcpy (file_system_id,bp,8); bp += 8;
  85.     file_system_id[8] = 0;
  86.  
  87. }
  88.  
  89. /* ----------------------------------------------------------------------- */
  90. /* Write Bios Parameter Block back into boot sector                        */
  91. /* ----------------------------------------------------------------------- */
  92.  
  93. void bios_parameter_block::put (boot_sector *boot_sector)
  94. {
  95.     byte *bp = boot_sector->data;
  96.  
  97.     memcpy (bp,jump_instruction,3);
  98.     memcpy (bp+3,oem_name,8);
  99.     *(bp+0xb) = bytes_per_sector & 0xff;
  100.     *(bp+0xc) = (bytes_per_sector >> 8) & 0xff;
  101.     *(bp+0xd) = sectors_per_cluster;
  102.     *(bp+0xe) = reserved_sectors & 0xff;
  103.     *(bp+0xf) = (reserved_sectors >> 8) & 0xff;
  104.     *(bp+0x10) = no_of_fats;
  105.     *(bp+0x11) = no_of_rootdir_entries & 0xff;
  106.     *(bp+0x12) = (no_of_rootdir_entries >> 8) & 0xff;
  107.     *(bp+0x13) = no_of_sectors & 0xff;
  108.     *(bp+0x14) = (no_of_sectors >> 8) & 0xff;
  109.     *(bp+0x15) = media_descriptor;
  110.     if (sectors_per_fat16 == 0) {
  111.         *(bp+0x16) = 0;
  112.         *(bp+0x17) = 0;
  113.     } else {
  114.         *(bp+0x16) = sectors_per_fat & 0xff;
  115.         *(bp+0x17) = (sectors_per_fat >> 8) & 0xff;
  116.     }
  117.     *(bp+0x18) = sectors_per_track & 0xff;
  118.     *(bp+0x19) = (sectors_per_track >> 8) & 0xff;
  119.     *(bp+0x1a) = drive_heads & 0xff;
  120.     *(bp+0x1b) = (drive_heads >> 8) & 0xff;
  121.     *(bp+0x1c) = hidden_sectors & 0xff;
  122.     *(bp+0x1d) = (hidden_sectors >> 8) & 0xff;
  123.     *(bp+0x1e) = (hidden_sectors >> 16) & 0xff;
  124.     *(bp+0x1f) = (hidden_sectors >> 24) & 0xff;
  125.     *(bp+0x20) = no_of_sectors_long & 0xff;
  126.     *(bp+0x21) = (no_of_sectors_long >> 8) & 0xff;
  127.     *(bp+0x22) = (no_of_sectors_long >> 16) & 0xff;
  128.     *(bp+0x23) = (no_of_sectors_long >> 24) & 0xff;
  129.     bp += 0x24;
  130.     if (sectors_per_fat16 == 0) {
  131.         *bp++ = sectors_per_fat & 0xff;
  132.         *bp++ = (sectors_per_fat >> 8) & 0xff;
  133.         *bp++ = (sectors_per_fat >> 16) & 0xff;
  134.         *bp++ = (sectors_per_fat >> 24) & 0xff;
  135.  
  136.         *bp++ = flags & 0xff;
  137.         *bp++ = (flags >> 8) & 0xff;
  138.         
  139.         *bp++ = version[0];
  140.         *bp++ = version[1];
  141.  
  142.         *bp++ = root_cluster & 0xff;
  143.         *bp++ = (root_cluster >> 8) & 0xff;
  144.         *bp++ = (root_cluster >> 16) & 0xff;
  145.         *bp++ = (root_cluster >> 24) & 0xff;
  146.  
  147.         *bp++ = info_sector & 0xff;
  148.         *bp++ = (info_sector >> 8) & 0xff;
  149.         
  150.         *bp++ = backup_boot & 0xff;
  151.         *bp++ = (backup_boot >> 8) & 0xff;
  152.         
  153.         bp += 12; /* Skip over reserved bytes */
  154.     }
  155.     *bp   = phys_drive_no; bp += 2;
  156.     *bp++ = signature;
  157.     *bp++ = serial_number & 0xff;
  158.     *bp++ = (serial_number >> 8) & 0xff;
  159.     *bp++ = (serial_number >> 16) & 0xff;
  160.     *bp++ = (serial_number >> 24) & 0xff;
  161.     memcpy (bp,volume_label,11); bp += 11;
  162.     memcpy (bp,file_system_id,8); bp += 8;
  163. }
  164.  
  165. /* ----------------------------------------------------------------------- */
  166. /* Extract some misc. drive parameters from BPB                            */
  167. /* ----------------------------------------------------------------------- */
  168.  
  169. void logical_drive_info::get (const bios_parameter_block &bpb)
  170. {
  171.     start_fat1 = bpb.reserved_sectors;
  172.     start_fat2 = start_fat1 + bpb.sectors_per_fat;
  173.     start_rootdir = start_fat2 + bpb.sectors_per_fat;
  174.     if (bpb.no_of_rootdir_entries == 0) start_data = start_rootdir;
  175.     else start_data = start_rootdir + (bpb.no_of_rootdir_entries - 1) / 16 + 1;
  176.     if (bpb.sectors_per_cluster == 0) no_of_clusters = 0;
  177.     else {
  178.         no_of_clusters = ((bpb.no_of_sectors ? bpb.no_of_sectors : bpb.no_of_sectors_long) - start_data) / bpb.sectors_per_cluster;
  179.         if (bpb.sectors_per_fat16 == 0) no_of_clusters -= 2;
  180.     }
  181. };
  182.  
  183.