1e3ee733ff8690af7568dac665bc20ecf869dea1dRoderick W. Smith/* This program is copyright (c) 2009-2013 by Roderick W. Smith. It is distributed
2221e08768de7fe42ba533ca22baf671420569c07srs  under the terms of the GNU GPL version 2, as detailed in the COPYING file. */
3221e08768de7fe42ba533ca22baf671420569c07srs
4e7b4ff9317fc4e551cf974684eaa88697de5a28srs#include <stdint.h>
5e7b4ff9317fc4e551cf974684eaa88697de5a28srs#include <stdlib.h>
6fed16d043a14e8b86c97a6413aec7281fefcbcb5srs#include <string>
7978041ca613dcb881763b36cf53639d924e52a56srs
8978041ca613dcb881763b36cf53639d924e52a56srs#ifndef __GPTSUPPORT
9978041ca613dcb881763b36cf53639d924e52a56srs#define __GPTSUPPORT
10e7b4ff9317fc4e551cf974684eaa88697de5a28srs
111f7822eb54337766002431f01e5934c7d4703628Roderick W. Smith#define GPTFDISK_VERSION "0.8.10.2"
12bf8950cad0285ee6ab8a896e8d0a30c5fb62c7afsrs
1308bb0da07953af605b4918e268272de15ac151aasrs#if defined (__FreeBSD__) || defined (__FreeBSD_kernel__) || defined (__APPLE__)
1400b6d7a4604e759eb3c92b3ecea608d6fe024b81srs// Darwin (Mac OS) & FreeBSD: disk IOCTLs are different, and there is no lseek64
15e7b4ff9317fc4e551cf974684eaa88697de5a28srs#include <sys/disk.h>
16e7b4ff9317fc4e551cf974684eaa88697de5a28srs#define lseek64 lseek
17546a9c7c369df465021feecb20f6a8f81b6df6bcsrs#endif
18e7b4ff9317fc4e551cf974684eaa88697de5a28srs
1900b6d7a4604e759eb3c92b3ecea608d6fe024b81srs#if defined (__FreeBSD__) || defined (__FreeBSD_kernel__)
200741fa21ac6cb477891ef15f269c8c8f36cac7c6srs#define DEFAULT_GPT_TYPE 0xA503
2100b6d7a4604e759eb3c92b3ecea608d6fe024b81srs#endif
2200b6d7a4604e759eb3c92b3ecea608d6fe024b81srs
2300b6d7a4604e759eb3c92b3ecea608d6fe024b81srs#ifdef __APPLE__
240741fa21ac6cb477891ef15f269c8c8f36cac7c6srs#define DEFAULT_GPT_TYPE 0xAF00
2500b6d7a4604e759eb3c92b3ecea608d6fe024b81srs#endif
2600b6d7a4604e759eb3c92b3ecea608d6fe024b81srs
2700b6d7a4604e759eb3c92b3ecea608d6fe024b81srs#ifdef _WIN32
280741fa21ac6cb477891ef15f269c8c8f36cac7c6srs#define DEFAULT_GPT_TYPE 0x0700
290741fa21ac6cb477891ef15f269c8c8f36cac7c6srs#endif
300741fa21ac6cb477891ef15f269c8c8f36cac7c6srs
310741fa21ac6cb477891ef15f269c8c8f36cac7c6srs#ifdef __sun__
320741fa21ac6cb477891ef15f269c8c8f36cac7c6srs#define DEFAULT_GPT_TYPE 0xbf01
33e7b4ff9317fc4e551cf974684eaa88697de5a28srs#endif
34e7b4ff9317fc4e551cf974684eaa88697de5a28srs
35bf8950cad0285ee6ab8a896e8d0a30c5fb62c7afsrs// Microsoft Visual C++ only
36bf8950cad0285ee6ab8a896e8d0a30c5fb62c7afsrs#if defined (_MSC_VER)
37bf8950cad0285ee6ab8a896e8d0a30c5fb62c7afsrs#define sscanf sscanf_s
38bf8950cad0285ee6ab8a896e8d0a30c5fb62c7afsrs#define strcpy strcpy_s
39bf8950cad0285ee6ab8a896e8d0a30c5fb62c7afsrs#define sprintf sprintf_s
40bf8950cad0285ee6ab8a896e8d0a30c5fb62c7afsrs#endif
41bf8950cad0285ee6ab8a896e8d0a30c5fb62c7afsrs
4200b6d7a4604e759eb3c92b3ecea608d6fe024b81srs// Linux only....
4300b6d7a4604e759eb3c92b3ecea608d6fe024b81srs#ifdef __linux__
4400b6d7a4604e759eb3c92b3ecea608d6fe024b81srs#include <linux/fs.h>
450741fa21ac6cb477891ef15f269c8c8f36cac7c6srs#define DEFAULT_GPT_TYPE 0x8300
4600b6d7a4604e759eb3c92b3ecea608d6fe024b81srs#endif
4700b6d7a4604e759eb3c92b3ecea608d6fe024b81srs
480741fa21ac6cb477891ef15f269c8c8f36cac7c6srs#ifndef DEFAULT_GPT_TYPE
490741fa21ac6cb477891ef15f269c8c8f36cac7c6srs#define DEFAULT_GPT_TYPE 0x8300
5000b6d7a4604e759eb3c92b3ecea608d6fe024b81srs#endif
5100b6d7a4604e759eb3c92b3ecea608d6fe024b81srs
52e7b4ff9317fc4e551cf974684eaa88697de5a28srs// Set this as a default
53e7b4ff9317fc4e551cf974684eaa88697de5a28srs#define SECTOR_SIZE UINT32_C(512)
54e7b4ff9317fc4e551cf974684eaa88697de5a28srs
55221e08768de7fe42ba533ca22baf671420569c07srs// Signatures for Apple (APM) disks, multiplied by 0x100000000
56221e08768de7fe42ba533ca22baf671420569c07srs#define APM_SIGNATURE1 UINT64_C(0x00004D5000000000)
57221e08768de7fe42ba533ca22baf671420569c07srs#define APM_SIGNATURE2 UINT64_C(0x0000535400000000)
58221e08768de7fe42ba533ca22baf671420569c07srs
59221e08768de7fe42ba533ca22baf671420569c07srs/**************************
60221e08768de7fe42ba533ca22baf671420569c07srs * Some GPT constants.... *
61221e08768de7fe42ba533ca22baf671420569c07srs **************************/
62221e08768de7fe42ba533ca22baf671420569c07srs
63221e08768de7fe42ba533ca22baf671420569c07srs#define GPT_SIGNATURE UINT64_C(0x5452415020494645)
64221e08768de7fe42ba533ca22baf671420569c07srs
65221e08768de7fe42ba533ca22baf671420569c07srs// Number and size of GPT entries...
66221e08768de7fe42ba533ca22baf671420569c07srs#define NUM_GPT_ENTRIES 128
67221e08768de7fe42ba533ca22baf671420569c07srs#define GPT_SIZE 128
68978041ca613dcb881763b36cf53639d924e52a56srs#define HEADER_SIZE UINT32_C(92)
69221e08768de7fe42ba533ca22baf671420569c07srs#define GPT_RESERVED 420
7084aaff6b9cf3b802c621781cf9acd006aa5a3e66Roderick W. Smith#define NAME_SIZE 36 // GPT allows 36 UTF-16LE code units for a name in a 128 byte partition entry
71221e08768de7fe42ba533ca22baf671420569c07srs
72e7b4ff9317fc4e551cf974684eaa88697de5a28srsusing namespace std;
73e7b4ff9317fc4e551cf974684eaa88697de5a28srs
745a6085310b7f8fe1c35e56bcab7de161808b488dsrsstring ReadString(void);
75fed16d043a14e8b86c97a6413aec7281fefcbcb5srsint GetNumber(int low, int high, int def, const string & prompt);
76e7b4ff9317fc4e551cf974684eaa88697de5a28srschar GetYN(void);
770873e9d0e9345a2c4418b4718db525c9f1111c83srsuint64_t GetSectorNum(uint64_t low, uint64_t high, uint64_t def, uint64_t sSize, const std::string& prompt);
7801f7f08624f0c942001977415214a578621f6495srsuint64_t IeeeToInt(string IeeeValue, uint64_t sSize, uint64_t low, uint64_t high, uint64_t def = 0);
79a17fe69ec07c93a24894e4c4243f05af2bfc5bd7srsstring BytesToIeee(uint64_t size, uint32_t sectorSize);
806699b01eda84d24bfaf80ad725304fef2b0e1b2asrsunsigned char StrToHex(const string & input, unsigned int position);
816aae2a9b70e9f88926baad94c1eea40e0b534f01srsint IsHex(string input); // Returns 1 if input can be hexadecimal number....
822a9f5da3c3c4ccccd291462bda9d2aefcd485ff8srsint IsLittleEndian(void); // Returns 1 if CPU is little-endian, 0 if it's big-endian
83221e08768de7fe42ba533ca22baf671420569c07srsvoid ReverseBytes(void* theValue, int numBytes); // Reverses byte-order of theValue
84a17fe69ec07c93a24894e4c4243f05af2bfc5bd7srsvoid WinWarning(void);
859ddc14bb9b154518e2b8384d3f4571cf657c7920srs
86e7b4ff9317fc4e551cf974684eaa88697de5a28srs#endif
87