testdisk/src/lvm.h
2020-08-08 12:26:37 +02:00

149 lines
4.1 KiB
C

/*
File: lvm.h, TestDisk
Copyright (C) 2003-2008 Christophe GRENIER <grenier@cgsecurity.org>
Same wunderfull license.
*/
/* gm_hmlvm.h -- gpart Linux LVM physical volume guessing module header
*
* gpart (c) 1999-2001 Michail Brzitwa <mb@ichabod.han.de>
* Guess PC-type hard disk partitions.
*
* gpart is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published
* by the Free Software Foundation; either version 2, or (at your
* option) any later version.
*
* Created: 29.08.1999 <mb@ichabod.han.de>
* Modified:
*
*/
#ifndef _LVM_H
#define _LVM_H
#ifdef __cplusplus
extern "C" {
#endif
/*
* structs & defines gathered from LVM 0.7/0.9 lvm.h and liblvm.h
*/
/*
* Status flags
*/
/* physical volume */
#define PV_ACTIVE 0x01 /* pv_status */
#define PV_ALLOCATABLE 0x02 /* pv_allocatable */
#define LVM_PV_DISK_BASE 0L
/* real size is 464 */
#define LVM_PV_DISK_SIZE 1024L
#define NAME_LEN 128 /* don't change!!! */
#define UUID_LEN 16 /* don't change!!! */
#define LVM_MAX_SIZE ( 1024LU * 1024 * 1024 * 2) /* 1TB[sectors] */
#define LVM_ID "HM"
#define LVM_DIR_PREFIX "/dev/"
#define MAX_LV 256
#define LVM_MIN_PE_SIZE ( 8L * 2) /* 8 KB in sectors */
#define LVM_MAX_PE_SIZE ( 16L * 1024L * 1024L * 2) /* 16GB in sectors */
/* disk stored pe information */
typedef struct {
uint16_t lv_num;
uint16_t le_num;
} disk_pe_t;
/* disk stored PV, VG, LV and PE size and offset information */
typedef struct {
uint32_t base;
uint32_t size;
} lvm_disk_data_t;
/*
* Structure Physical Volume (PV) Version 2
*/
/* disk */
typedef struct {
uint8_t id[2]; /* Identifier */
uint16_t version; /* HM lvm version */
lvm_disk_data_t pv_on_disk;
lvm_disk_data_t vg_on_disk;
lvm_disk_data_t pv_uuidlist_on_disk;
lvm_disk_data_t lv_on_disk;
lvm_disk_data_t pe_on_disk;
uint8_t pv_uuid[NAME_LEN];
uint8_t vg_name[NAME_LEN];
uint8_t system_id[NAME_LEN]; /* for vgexport/vgimport */
uint32_t pv_major;
uint32_t pv_number;
uint32_t pv_status;
uint32_t pv_allocatable;
uint32_t pv_size; /* HM */
uint32_t lv_cur;
uint32_t pe_size;
uint32_t pe_total;
uint32_t pe_allocated;
} pv_disk_v2_t;
#define pv_disk_t pv_disk_v2_t
/*@
@ requires \valid(disk_car);
@ requires \valid(partition);
@*/
int check_LVM(disk_t *disk_car, partition_t *partition, const int verbose);
/*@
@ requires \valid_read(disk_car);
@ requires \valid_read(pv);
@ requires \valid(partition);
@*/
int recover_LVM(const disk_t *disk_car, const pv_disk_t *pv, partition_t *partition, const int verbose, const int dump_ind);
#define LVM2_LABEL "LVM2 001"
#define LABEL_ID "LABELONE"
struct lvm2_label_header {
uint8_t id[8]; /* 0x00 LABELONE */
uint64_t sector_xl; /* 0x08 Sector number of this label */
uint32_t crc_xl; /* 0x10 From next field to end of sector */
uint32_t offset_xl; /* 0x14 Offset from start of struct to contents */
uint8_t type[8]; /* 0x18 LVM2 001 */
} __attribute__ ((packed));
struct lvm2_disk_locn {
uint64_t offset; /* Offset in bytes to start sector */
uint64_t size; /* Bytes */
} __attribute__ ((packed));
struct lvm2_pv_header {
uint8_t pv_uuid[32];
uint64_t device_size_xl; /* Bytes */
/* NULL-terminated list of data areas followed by */
/* NULL-terminated list of metadata area headers */
struct lvm2_disk_locn disk_areas_xl[0]; /* Two lists */
} __attribute__ ((packed));
/*@
@ requires \valid(disk_car);
@ requires \valid(partition);
@ requires separation: \separated(disk_car, partition);
@*/
int check_LVM2(disk_t *disk_car, partition_t *partition, const int verbose);
/*@
@ requires \valid_read(disk_car);
@ requires \valid_read(buf);
@ requires \valid(partition);
@ requires separation: \separated(disk_car, buf, partition);
@*/
int recover_LVM2(const disk_t *disk_car, const unsigned char *buf, partition_t *partition, const int verbose, const int dump_ind);
#ifdef __cplusplus
} /* closing brace for extern "C" */
#endif
#endif /* _LVM_H */