Last active
June 21, 2021 23:42
-
-
Save tinwritescode/cd69277cc975d04f45204aba3c724bac to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include <windows.h> | |
| #include <stdio.h> | |
| #include <string> | |
| #include <typeinfo> | |
| #include <iostream> | |
| using namespace std; | |
| int ReadSector(LPCWSTR drive, int readPoint, BYTE sector[512]) | |
| { | |
| int retCode = 0; | |
| DWORD bytesRead; | |
| HANDLE device = NULL; | |
| device = CreateFile(drive, // Drive to open | |
| GENERIC_READ, // Access mode | |
| FILE_SHARE_READ | FILE_SHARE_WRITE, // Share Mode | |
| NULL, // Security Descriptor | |
| OPEN_EXISTING, // How to create | |
| 0, // File attributes | |
| NULL); // Handle to template | |
| if (device == INVALID_HANDLE_VALUE) // Open Error | |
| { | |
| printf("CreateFile: %u\n", GetLastError()); | |
| return 1; | |
| } | |
| SetFilePointer(device, readPoint, NULL, FILE_BEGIN);//Set a Point to Read | |
| if (!ReadFile(device, sector, 512, &bytesRead, NULL)) | |
| { | |
| printf("ReadFile: %u\n", GetLastError()); | |
| } | |
| else | |
| { | |
| printf("Success! Byte read: %d\n", bytesRead); | |
| } | |
| } | |
| void setOutput(BYTE sector[512], LONGLONG *OEM_Id, WORD* bytesPerSector, BYTE* sectorsPerCluster, WORD* reservedSectors, | |
| BYTE* mediaDescriptor, WORD* sectorsPerTrack, WORD* numberOfHeads, DWORD* hiddenSectors, LONGLONG* TotalSectors, LONGLONG* LogicalClusterNumberMFT, | |
| LONGLONG* LogicalClusterNumberMFTMirr, DWORD* clustersPerFileRecordSegment, BYTE* clustersPerIndexBuffer, LONGLONG* volumeSerialNumber, DWORD* Checksum) { | |
| // OEM | |
| BYTE* k = (BYTE*) OEM_Id; | |
| for (int i = 0; i < 8; i++) { | |
| k[i] = sector[3 + i]; | |
| } | |
| // BYTESPERSECTOR | |
| k = (BYTE*)bytesPerSector; | |
| for (int i = 0; i < 2; i++) { | |
| k[i] = sector[0x0B + i]; | |
| } | |
| // SECTORSPERCLUSTER | |
| k = (BYTE*)sectorsPerCluster; | |
| for (int i = 0; i < 1; i++) { | |
| k[i] = sector[0x0D + i]; | |
| } | |
| // Reserved Sectors | |
| k = (BYTE*)reservedSectors; | |
| for (int i = 0; i < 2; i++) { | |
| k[i] = sector[0x0E + i]; | |
| } | |
| // Media Descriptor | |
| k = (BYTE*)mediaDescriptor; | |
| for (int i = 0; i < 1; i++) { | |
| k[i] = sector[0x15 + i]; | |
| } | |
| // Sectors Per Track | |
| k = (BYTE*)sectorsPerTrack; | |
| for (int i = 0; i < 2; i++) { | |
| k[i] = sector[0x18 + 1 - i]; | |
| } | |
| // numberOfHeads | |
| k = (BYTE*)numberOfHeads; | |
| for (int i = 0; i < 2; i++) { | |
| k[i] = sector[0x1A + 1 - i]; | |
| } | |
| // Hidden Sectors | |
| k = (BYTE*)hiddenSectors; | |
| for (int i = 0; i < 4; i++) { | |
| k[i] = sector[0x1C + 3 - i]; | |
| } | |
| // Total sectors | |
| k = (BYTE*)TotalSectors; | |
| for (int i = 0; i < 8; i++) { | |
| k[i] = sector[0x28 + 7 - i]; | |
| } | |
| // Logical Cluster Number for the file $MFT | |
| k = (BYTE*)LogicalClusterNumberMFT; | |
| for (int i = 0; i < 8; i++) { | |
| k[i] = sector[0x30 + 7 - i]; | |
| } | |
| // Logical Cluster Number for the file $MFTMirr | |
| k = (BYTE*)LogicalClusterNumberMFTMirr; | |
| for (int i = 0; i < 8; i++) { | |
| k[i] = sector[0x38 + 7 - i]; | |
| } | |
| // Clusters Per File Record Segment | |
| k = (BYTE*)clustersPerFileRecordSegment; | |
| for (int i = 0; i < 4; i++) { | |
| k[i] = sector[0x40 - i + 3]; | |
| } | |
| // Clusters Per Index Buffer | |
| k = (BYTE*)clustersPerIndexBuffer; | |
| for (int i = 0; i < 1; i++) { | |
| k[i] = sector[0x44 + i]; | |
| } | |
| // Volume Serial Number | |
| k = (BYTE*)volumeSerialNumber; | |
| for (int i = 0; i < 8; i++) { | |
| k[i] = sector[0x48 + 7 - i]; | |
| } | |
| // Checksum | |
| k = (BYTE*)Checksum; | |
| for (int i = 0; i < 4; i++) { | |
| k[i] = sector[0x50 + 3 - i]; | |
| } | |
| } | |
| int main(int argc, char** argv) | |
| { | |
| BYTE sector[512]; | |
| ReadSector(L"\\\\.\\E:", 0, sector); | |
| LONGLONG* OEM_Id = new LONGLONG; | |
| //BYTE BPB[25]; | |
| //BYTE E_BPB[48]; | |
| //BYTE bootstrapCode[426]; | |
| //BYTE endofSectorMarker[2]; | |
| WORD* bytesPerSector = new WORD; | |
| BYTE* sectorsPerCluster = new BYTE; | |
| WORD* reservedSectors = new WORD; | |
| BYTE* mediaDescriptor = new BYTE; | |
| WORD* sectorsPerTrack = new WORD; | |
| WORD* numberOfHeads = new WORD; | |
| DWORD* hiddenSectors = new DWORD; | |
| LONGLONG* TotalSectors = new LONGLONG; | |
| LONGLONG* LogicalClusterNumberMFT = new LONGLONG; | |
| LONGLONG* LogicalClusterNumberMFTMirr = new LONGLONG; | |
| DWORD* clustersPerFileRecordSegment = new DWORD; | |
| BYTE* clustersPerIndexBuffer = new BYTE; | |
| LONGLONG* volumeSerialNumber = new LONGLONG; | |
| DWORD* Checksum = new DWORD; | |
| setOutput(sector, OEM_Id, bytesPerSector, sectorsPerCluster, reservedSectors, mediaDescriptor, sectorsPerTrack, numberOfHeads, hiddenSectors, TotalSectors, LogicalClusterNumberMFT | |
| , LogicalClusterNumberMFTMirr, clustersPerFileRecordSegment, clustersPerIndexBuffer, volumeSerialNumber, Checksum); | |
| char subbuff[5]; | |
| memcpy(subbuff, OEM_Id, 4); | |
| subbuff[4] = '\0'; | |
| cout << "OEM ID: " << subbuff << endl; | |
| cout << "Bytes Per Sector: " << *bytesPerSector << endl; | |
| cout << "sectorsPerCluster: " << static_cast<unsigned>(*sectorsPerCluster) << endl; | |
| cout << "reservedSectors: " << *reservedSectors << endl; | |
| cout << "mediaDescriptor: " << static_cast<unsigned>(*mediaDescriptor) << endl; | |
| cout << "sectorsPerTrack: " << *sectorsPerTrack << endl; | |
| cout << "numberOfHeads: " << *numberOfHeads << endl; | |
| cout << "hiddenSectors: " << *hiddenSectors << endl; | |
| //cout << "TotalSectors: " << *TotalSectors << endl << std::dec; | |
| printf("Total sectors: %llu\n", *TotalSectors); | |
| printf("LogicalClusterNumberMFT: %llu\n", *LogicalClusterNumberMFT); | |
| printf("LogicalClusterNumberMFTMirr: %llu\n", *LogicalClusterNumberMFTMirr); | |
| cout << "clustersPerFileRecordSegment: " << *clustersPerFileRecordSegment << endl; | |
| cout << "clustersPerIndexBuffer: " << static_cast<unsigned>(*clustersPerIndexBuffer) << endl; | |
| printf("Volume Serial Number: %llu\n", *volumeSerialNumber); | |
| cout << "Checksum: " << *Checksum << endl; | |
| // Clean up | |
| delete OEM_Id; | |
| delete bytesPerSector; | |
| delete sectorsPerCluster; | |
| delete reservedSectors; | |
| delete mediaDescriptor; | |
| delete sectorsPerTrack; | |
| delete numberOfHeads; | |
| delete hiddenSectors; | |
| delete TotalSectors; | |
| delete LogicalClusterNumberMFT; | |
| delete LogicalClusterNumberMFTMirr; | |
| delete clustersPerFileRecordSegment; | |
| delete clustersPerIndexBuffer; | |
| delete volumeSerialNumber; | |
| delete Checksum; | |
| system("pause"); | |
| return 0; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment