Skip to content

Instantly share code, notes, and snippets.

@tinwritescode
Last active June 21, 2021 23:42
Show Gist options
  • Select an option

  • Save tinwritescode/cd69277cc975d04f45204aba3c724bac to your computer and use it in GitHub Desktop.

Select an option

Save tinwritescode/cd69277cc975d04f45204aba3c724bac to your computer and use it in GitHub Desktop.
#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