----------------------------------------
/* by hugang at 6/8 9:40 */
/* read some disk a sector */
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/fs.h>
int
get_disk_sector(int fd){
int sectorsize;
ioctl(fd, BLKSSZGET, §orsize) ;
return sectorsize;
}
/**
* read_disk_sector:
* @dev: raw disk FILE *
* @sector:
* return is the disk sectorsize
extern int errno;
int
read_disk_sector(int fd, unsigned long sector, char **p){
int sectorsize;
FILE *fp;
/* get disk sector size */
sectorsize = get_disk_sector(fd);
if (sectorsize == 0){
fprintf(stderr, "get disk sector size failed\n");
return (-1);
}
/* seek it */
lseek(fd, 0 ,SEEK_SET);
if (lseek(fd, (sectorsize * sector), SEEK_CUR) == -1 ){
fprintf(stderr, "seek to %d failed\n"
, sectorsize * sector);
return (-1);
}
/* read it */
*p = (char *)malloc(sectorsize);
if (*p == NULL){
fprintf(stderr, "malloc memory failed\n");
return (-1);
}
return read(fd, *p, sectorsize);
}
/* dump data for display */
void
dump_disk_sector(char *p, int size){
int i;
for (i = 0; i< size; i++){
if (i % 8 == 0 && i != 0)
printf("\n");
printf("0x%x,", (unsigned int )p & 0xff);
}
printf("\n");
return ;
}
int
main(){
char *d;
int size;
int fd;
char *dev = "/dev/hda";
/* open it */
fd = open(dev, O_RDONLY);
if (fd == -1){
fprintf(stderr, "open %s failed %s\n", dev, strerror(errno));
return (-1);
}
size = read_disk_sector(fd, 0, &d);
close(fd);
if (size <= 0) return (0);
dump_disk_sector(d, size);
free(d);
return (0);
}
/* use mmap by hugang 6/8 10:03 */
/* $Id$ */
/* read some disk a sector */
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <linux/fs.h>
int
get_disk_sector(int fd){
int sectorsize;
ioctl(fd, BLKSSZGET, §orsize) ;
return sectorsize;
}
long
get_disk_size(int fd){
long size;
ioctl (fd, BLKGETSIZE, &size);
return size;
}
long blk_size;
char *m;
/**
* read_disk_sector:
* @dev: raw disk FILE *
* @sector:
* return is the disk sectorsize
* */
extern int errno;
int
read_disk_sector(int fd, unsigned long sector, char **p){
int sectorsize;
struct stat buf;
/* get disk sector size */
sectorsize = get_disk_sector(fd);
if (sectorsize == 0){
fprintf(stderr, "get disk sector size failed\n");
return (-1);
}
/* map it to memory */
m = mmap(NULL, blk_size, PROT_READ, MAP_SHARED, fd, 0);
if ( m == NULL ){
fprintf(stderr, "mmap failed\n");
return (-1);
}
printf("map @0x%p length 0x%x\n",m , blk_size);
if ( sector * sectorsize > blk_size ) {
fprintf(stderr, "too large\n");
return -1;
}
*p = m + sector * sectorsize;
return sectorsize;
}
/* dump data for display */
void
dump_disk_sector(char *p, int size){
int i;
for (i = 0; i< size; i++){
if (i % 8 == 0 && i != 0)
printf("\n");
printf("0x%x,", (unsigned int )p & 0xff);
}
printf("\n");
return ;
}
int
main(){
char *d;
int size;
int fd;
char *dev = "/dev/hda";
/* open it */
fd = open(dev, O_RDONLY);
if (fd == -1){
fprintf(stderr, "open %s failed %s\n", dev, strerror(errno));
return (-1);
}
size = read_disk_sector(fd, 0, &d);
close(fd);
if (size <= 0) return (0);
dump_disk_sector(d, size);
munmap(m, blk_size);
return (0);
}