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