1 /* This program is copyright (c) 2009-2018 by Roderick W. Smith. It is distributed 2 under the terms of the GNU GPL version 2, as detailed in the COPYING file. */ 3 4 #include <stdint.h> 5 #include <stdlib.h> 6 #include <string> 7 8 #ifndef __GPTSUPPORT 9 #define __GPTSUPPORT 10 11 #define GPTFDISK_VERSION "1.0.4" 12 13 #if defined (__FreeBSD__) || defined (__FreeBSD_kernel__) || defined (__APPLE__) 14 // Darwin (Mac OS) & FreeBSD: disk IOCTLs are different, and there is no lseek64 15 #include <sys/disk.h> 16 #define lseek64 lseek 17 #endif 18 19 #if defined (__FreeBSD__) || defined (__FreeBSD_kernel__) 20 #define DEFAULT_GPT_TYPE 0xA503 21 #endif 22 23 #ifdef __APPLE__ 24 #define DEFAULT_GPT_TYPE 0xAF00 25 #endif 26 27 #ifdef _WIN32 28 #define DEFAULT_GPT_TYPE 0x0700 29 #endif 30 31 #ifdef __sun__ 32 #define DEFAULT_GPT_TYPE 0xbf01 33 #endif 34 35 // Microsoft Visual C++ only 36 #if defined (_MSC_VER) 37 #define sscanf sscanf_s 38 #define strcpy strcpy_s 39 #define sprintf sprintf_s 40 #endif 41 42 // Linux only.... 43 #ifdef __linux__ 44 #include <linux/fs.h> 45 #define DEFAULT_GPT_TYPE 0x8300 46 #endif 47 48 #ifndef DEFAULT_GPT_TYPE 49 #define DEFAULT_GPT_TYPE 0x8300 50 #endif 51 52 // Set this as a default 53 #define SECTOR_SIZE UINT32_C(512) 54 55 // Signatures for Apple (APM) disks, multiplied by 0x100000000 56 #define APM_SIGNATURE1 UINT64_C(0x00004D5000000000) 57 #define APM_SIGNATURE2 UINT64_C(0x0000535400000000) 58 59 /************************** 60 * Some GPT constants.... * 61 **************************/ 62 63 #define GPT_SIGNATURE UINT64_C(0x5452415020494645) 64 65 // Number and size of GPT entries... 66 #define NUM_GPT_ENTRIES 128 67 #define GPT_SIZE 128 68 #define HEADER_SIZE UINT32_C(92) 69 #define GPT_RESERVED 420 70 #define NAME_SIZE 36 // GPT allows 36 UTF-16LE code units for a name in a 128 byte partition entry 71 72 using namespace std; 73 74 string ReadString(void); 75 uint64_t GetNumber(uint64_t low, uint64_t high, uint64_t def, const string & prompt); 76 char GetYN(void); 77 uint64_t GetSectorNum(uint64_t low, uint64_t high, uint64_t def, uint64_t sSize, const std::string& prompt); 78 uint64_t IeeeToInt(string IeeeValue, uint64_t sSize, uint64_t low, uint64_t high, uint64_t def = 0); 79 string BytesToIeee(uint64_t size, uint32_t sectorSize); 80 unsigned char StrToHex(const string & input, unsigned int position); 81 int IsHex(string input); // Returns 1 if input can be hexadecimal number.... 82 int IsLittleEndian(void); // Returns 1 if CPU is little-endian, 0 if it's big-endian 83 void ReverseBytes(void* theValue, int numBytes); // Reverses byte-order of theValue 84 void WinWarning(void); 85 86 #endif 87