1 #include <windows.h>
2 #include <winioctl.h>
3 #include <stdio.h>
4
5 int main(int argc,char *argv[]){
6 BOOL result;
7 HANDLE rawDevice;
8 LPCTSTR deviceName;
9 char buffer[512];
10 int driveNumber;
11 union{
12 unsigned long long ull;
13 unsigned long ul[2];
14 }sectorNumber;
15 int numberOfBytesRead;
16 int i,j;
17
18
19
20
21 /*
22 * Everything inside this do while...to have a single exit point!
23 */
24 do{
25
26
27 /*
28 * Allocate 256 bytes for the device name
29 */
30 deviceName=(LPCTSTR)malloc(256);
31
32 driveNumber=atoi(argv[1]);
33 sprintf(deviceName,"\\\\.\\PhysicalDrive%d",driveNumber);
34 sectorNumber.ull=atoll(argv[2]);
35
36
37 rawDevice = CreateFile(deviceName, // drive to open
38 FILE_SHARE_READ | FILE_SHARE_WRITE, // no access to the drive
39 0,
40 NULL, // default security attributes
41 OPEN_EXISTING, // disposition
42 0, // file attributes
43 NULL); // do not copy file attributes
44
45
46
47 if (rawDevice == INVALID_HANDLE_VALUE){
48 printf("Could not open the device\n");
49 break;
50 }
51
52 printf("%s has been opened successfully\n",deviceName);
53
54 sectorNumber.ull*=512;
55 SetFilePointer(rawDevice, sectorNumber.ul[0], §orNumber.ul[1], FILE_BEGIN);
56
57 result=ReadFile(rawDevice, (LPVOID)buffer, 512, &numberOfBytesRead,(LPOVERLAPPED)NULL);
58 if(!result){
59 printf("Error while reading\n");
60 break;
61 }
62
63 for(i=0;i<512;i++){
64 printf("%02X ",buffer[i]&0xff);
65 if(i&&!((i+1)%16)){
66 for(j=(i-15);j<=i;j++){
67 if(buffer[j]>=32)printf("%c",buffer[j]);
68 else printf(".");
69 }
70 printf("\n");
71 }
72 }
73
74
75 }while(0);
76
77
78 return 0;
79
80
81 }
82
|