免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1267 | 回复: 0

OpenBSD源代码阅读/sbin/part.c [复制链接]

论坛徽章:
0
发表于 2007-02-05 23:58 |显示全部楼层

               
               
                /*    $OpenBSD: part.c,v 1.42 2006/06/09 17:01:47 deraadt Exp $    */
/*
* Copyright (c) 1997 Tobias Weingartner
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
*    notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
*    notice, this list of conditions and the following disclaimer in the
*    documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include err.h>
#include util.h>
#include stdio.h>
#include string.h>
#include unistd.h>
#include sys/fcntl.h>
#include sys/types.h>
#include sys/stat.h>
#include sys/disklabel.h>
#include machine/param.h>
#include "disk.h"
#include "misc.h"
#include "mbr.h"
磁盘的分区表结构说明如下:
字节
说明
0
是否是活动分区:0x80表示活动分区,0x00表示普通分区
1
分区起始磁头号
2,3
2字节低6位表示起始扇区号,2字节高两位+3字节表示柱面号
4
分区文件系统标志
5,6,7
分区结束柱面号,磁头号,扇区号,意义同1,2,3相同
8,9,10,11
逻辑起始扇区号,表示在这个分区之前的扇区数
12,13,14,15
表示这个分区占用的扇区个数
void
PRT_parse(disk_t *disk, void *prt, off_t offset, off_t reloff,
    prt_t *partn)
{
    unsigned char *p = prt;
    off_t off;
    partn->flag = *p++;
    partn->shead = *p++;
    partn->ssect = (*p) & 0x3F;
    partn->scyl = ((*p  2) & 0xFF00) | (*(p+1));
    p += 2;
    partn->id = *p++;
    partn->ehead = *p++;
    partn->esect = (*p) & 0x3F;
    partn->ecyl = ((*p  2) & 0xFF00) | (*(p+1));
    p += 2;
    if ((partn->id == DOSPTYP_EXTEND) || (partn->id == DOSPTYP_EXTENDL))
        off = reloff;
    else
        off = offset;
    partn->bs = getlong(p) + off;
    partn->ns = getlong(p+4);
    PRT_fix_CHS(disk, partn);
}


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/31277/showart_243344.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP