#include #include #include #define KERNLDR_START_SECTOR 1 #define HD_SECTOR_SIZE 512 int main(int argc, char* argv[]) { if(argc == 3) { char *input = argv[1]; char *output = argv[2]; printf("Copy kernLdr from <%s> to <%s> :\n", input, output); int inputFile = open(input, O_RDONLY , 0664); if(inputFile == -1) { fprintf(stderr, "Error when openning file <%s>\n", input); return 1; } int outputFile = open(output, O_WRONLY | O_CREAT, 0664); if(outputFile == -1) { fprintf(stderr, "Error when openning file <%s>\n", output); return 1; } lseek(inputFile, 0, SEEK_SET); lseek(outputFile, HD_SECTOR_SIZE * KERNLDR_START_SECTOR, SEEK_SET); struct stat info; fstat(inputFile, &info); unsigned int kernLdrCodeSize = info.st_size; if(kernLdrCodeSize >= 32256) { perror("Error kernLdr is too large\n"); close(inputFile); close(outputFile); return 2; } unsigned char *kernLdrCode = malloc(kernLdrCodeSize); int bytesRead = read(inputFile, kernLdrCode, kernLdrCodeSize); if(bytesRead == -1) { perror("Reading error\n"); free(kernLdrCode); close(inputFile); close(outputFile); return 3; } int bytesWrite = write(outputFile, kernLdrCode, kernLdrCodeSize); if(bytesWrite == -1) { perror("Writing error\n"); free(kernLdrCode); close(inputFile); close(outputFile); return 3; } free(kernLdrCode); close(inputFile); close(outputFile); printf("done\n"); } else { perror("[help] : w_kernLdr \n"); return 4; } return 0; }