잠토의 잠망경

File System 본문

카테고리 없음

File System

잠수함토끼 2013. 2. 11. 22:40

 

 

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <windows.h>  
  4.   
  5. unsigned int HDD_read (int drv, unsigned int SecAddr, unsigned int blocks, char* buf)  
  6. {  
  7.     unsigned int ret = 0;  
  8.       
  9.     char cur_drv[100]="";  
  10.   
  11.     //wsprintf(cur_drv,"\\\\.\\PhysicalDrive%d",drv);  
  12.   
  13.     wsprintf(cur_drv,"\\\\.\\C:",drv);  
  14.   
  15.     HANDLE g_hDevice = CreateFile(  cur_drv,  
  16.                             GENERIC_READ,  
  17.                             FILE_SHARE_READ|FILE_SHARE_WRITE,  
  18.                             NULL,  
  19.                             OPEN_EXISTING,  
  20.                             FILE_ATTRIBUTE_NORMAL,  
  21.                             0);  
  22.   
  23.   
  24.     if(INVALID_HANDLE_VALUE == g_hDevice)   return 1;  
  25.   
  26.     unsigned int Low = SecAddr*512;  
  27.     unsigned int High= 0;  
  28.       
  29.   
  30.     if(0xFFFFFFFF == SetFilePointer(g_hDevice,Low,(long*)&High,FILE_BEGIN)) return 2;  
  31.       
  32.   
  33.     ULONG readNum = 0;  
  34.   
  35.     ret = ReadFile(g_hDevice,buf,blocks*512,&readNum,NULL);  
  36.       
  37.       
  38.     CloseHandle(g_hDevice);  
  39.   
  40.   
  41.     return ret;  
  42. }  
  43.   
  44.   
  45.   
  46. unsigned int HDD_write(unsigned char drv, unsigned int SecAddr, unsigned int blocks, unsigned char* buf);  
  47. void HexDump(unsigned char* addr, unsigned int len)  
  48. {  
  49.     unsigned char       *s=addr, *endPtr=(unsigned char*)((unsigned int)addr+len);  
  50.     unsigned int        i, remainder=len%16;  
  51.       
  52.     printf("\n Offset        Hex Value         Ascii value\n");  
  53.       
  54.     // print out 16 byte blocks.  
  55.     while (s+16<=endPtr){  
  56.           
  57.         // offset 출력.  
  58.         printf("0x%08lx  ", (long)(s-addr));  
  59.           
  60.         // 16 bytes 단위로 내용 출력.  
  61.         for (i=0; i<16; i++){  
  62.             printf("%02x ", s[i]);  
  63.         }  
  64.         printf(" ");  
  65.           
  66.         for (i=0; i<16; i++){  
  67.             if (s[i]>=32 && s[i]<=125)printf("%c", s[i]);  
  68.             else printf(".");  
  69.         }  
  70.         s += 16;  
  71.         printf("\n");  
  72.     }  
  73.       
  74.     // Print out remainder.  
  75.     if (remainder){  
  76.           
  77.         // offset 출력.  
  78.         printf("0x%08lx  ", (long)(s-addr));  
  79.           
  80.         // 16 bytes 단위로 출력하고 남은 것 출력.  
  81.         for (i=0; i<remainder; i++){  
  82.             printf("%02x ", s[i]);  
  83.         }  
  84.         for (i=0; i<(16-remainder); i++){  
  85.             printf("   ");  
  86.         }  
  87.           
  88.         printf(" ");  
  89.         for (i=0; i<remainder; i++){  
  90.             if (s[i]>=32 && s[i]<=125) printf("%c", s[i]);  
  91.             else    printf(".");  
  92.         }  
  93.         for (i=0; i<(16-remainder); i++){  
  94.             printf(" ");  
  95.         }  
  96.         printf("\n");  
  97.     }  
  98.     return;  
  99.  }  // HexDump.  
  100.   
  101.   
  102. int main(void)  
  103. {  
  104.     char dumpData[512]="";  
  105.   
  106.     HDD_read(0,0,1,dumpData);  
  107.     HexDump((unsigned char*)dumpData,512);  
  108.   
  109.     return 0;  
  110. }  
Comments