HDD 부트섹터 0번지 읽어오기 질문
GPT Partition 구성을 보기 위하여 HDD 0번지를 읽어와 보려고하는데요.
IT EXPERT 임베디드 개발자를 위한 파일시스템의 원리와 실습 예제1에 나온것은 윈도우용이더라구요.
이것을 리눅스에서도 동작할 수 있게 수정하는 방법을 가르쳐 주세요.
혹 windows.h 파일만 가져다 놓으면 되는건가요? 무뇌한 질문이온줄 알지만 이렇게 질문 올립니다.
아래는 원본소스입니다. HDD 0번지 읽기
include <> 하면 안보여서 <>를 지웠습니다.
------------------------------------------------------
#include stdio.h
#include windows.h
#include stdlib.h
#define U8		unsigned char
#define S8		char
#define U16		unsigned short
#define U32		unsigned int
#define U64		unsigned __int64
U32  HDD_read (U8 drv, U32 SecAddr, U32 blocks, U8* buf);
U32  HDD_write(U8 drv, U32 SecAddr, U32 blocks, U8* buf);
void HexDump  (U8 *addr, U32 len);
int main(void) {
	U8 dumpData[512];
	HDD_read(0, 0, 1, dumpData);
	HexDump( dumpData, 512);
	return 0;
}
U32  HDD_write(U8 drv, U32 SecAddr, U32 blocks, U8* buf) {
 	U32 ret = 0;
	U32 ldistanceLow, ldistanceHigh, dwpointer, bytestoread, numread;
 	char cur_drv[100];
	HANDLE g_hDevice;
	sprintf(cur_drv,"\\\\.\\PhysicalDrive%d",(U32)drv);
	g_hDevice=CreateFile(cur_drv, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
 	if(g_hDevice==INVALID_HANDLE_VALUE)	return 0; 
 	ldistanceLow  = SecAddr << 9;
 	ldistanceHigh = SecAddr >> (32 - 9);
 	dwpointer = SetFilePointer(g_hDevice, ldistanceLow, (long *)&ldistanceHigh, FILE_BEGIN);
 	if(dwpointer != 0xFFFFFFFF)	{
 		bytestoread = blocks * 512;
 		ret = WriteFile(g_hDevice, buf, bytestoread, (unsigned long*)&numread, NULL);
 		if(ret)	ret = 1;	
 		else    	ret = 0;	
 	}
 	CloseHandle(g_hDevice);
 	return ret;
}
U32  HDD_read (U8 drv, U32 SecAddr, U32 blocks, U8* buf){
 	U32 ret;
 	U32 ldistanceLow, ldistanceHigh, dwpointer, bytestoread, numread;
 	char cur_drv[100];
 	HANDLE g_hDevice;
 	sprintf(cur_drv,"\\\\.\\PhysicalDrive%d",(U32)drv);
 	g_hDevice=CreateFile(cur_drv, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,      NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
 	if(g_hDevice==INVALID_HANDLE_VALUE)	return 0; 
 	ldistanceLow  = SecAddr << 9;
 	ldistanceHigh = SecAddr >> (32 - 9);
 	dwpointer = SetFilePointer(g_hDevice, ldistanceLow, (long *)&ldistanceHigh, FILE_BEGIN);
 	if(dwpointer != 0xFFFFFFFF)	{
 		bytestoread = blocks * 512;
 		ret = ReadFile(g_hDevice, buf, bytestoread, (unsigned long*)&numread, NULL);
 		if(ret)	ret = 1;		
 		else		ret = 0;		
 	}
 	CloseHandle(g_hDevice);
 	return ret;
 }
 void HexDump  (U8 *addr, U32 len){
 	U8		*s=addr, *endPtr=(U8*)((U32)addr+len);
 	U32		i, remainder=len%16;
 	printf("\n Offset        Hex Value         Ascii value\n");
 	// print out 16 byte blocks.
 	while (s+16<=endPtr){
 		// offset 출력.
 		printf("0x%08lx  ", (long)(s-addr));
 		// 16 bytes 단위로 내용 출력.
 		for (i=0; i<16; i++){
 			printf("%02x ", s[i]);
 		}
 		printf(" ");
 		for (i=0; i<16; i++){
 			if (s[i]>=32 && s[i]<=125)printf("%c", s[i]);
 			else printf(".");
 		}
 		s += 16;
 		printf("\n");
 	}
 	// Print out remainder.
 	if (remainder){
 		// offset 출력.
 		printf("0x%08lx  ", (long)(s-addr));
 		// 16 bytes 단위로 출력하고 남은 것 출력.
 		for (i=0; i
 			printf("%02x ", s[i]);
 		}
 		for (i=0; i<(16-remainder); i++){
 			printf("   ");
 		}
 		printf(" ");
 		for (i=0; i
 			if (s[i]>=32 && s[i]<=125) printf("%c", s[i]);
 			else	printf(".");
 		}
 		for (i=0; i<(16-remainder); i++){
 			printf(" ");
 		}
 		printf("\n");
 	}
 	return;
 }	// HexDump.
------------------------------------------------------------
답변해주신 모든 분들, 글 읽어주신 분들 모두 갑사드립니다.


딴거 필요없이
딴거 필요없이 /dev/hda나 /dev/sda를 open(), read() 하면 됩니다. 루트권한 필요하고요.
하드디스크 파라미터 정보를 읽는 것은 ioctl()을 이용해냐 하는데 이것은 util-linux에 포함된
fdisk 소스를 보시면 있습니다.
소스를 보니 HDD_read, HDD_write 부분만 재작성하면 될 것 같습니다.
U8같은 변수형들은 해당 typedef를 추가해주셔야 하고요.
Written By the Black Knight of Destruction
Written By the Black Knight of Destruction
답변 감사드립니다.
답변 감사드립니다.
댓글 달기