// Practic1Lab1.cpp : Defines the entry point for the console application. // #include "stdafx.h" // ossp01.cpp : This file contains the 'main' function. Program execution begins and ends there. // #include "pch.h" struct BPB { WORD sectorSize; BYTE clusterSize; WORD reservedSectors; BYTE fatCount; WORD rootSize; WORD totalSectors; BYTE media; WORD fatSize; WORD sectors; WORD heads; WORD hiddenLow; WORD hiddenHigh; BYTE largeTotalSectors[4]; }; struct bootRecord { BYTE jmpCommand[3]; BYTE vendorName[8]; BPB extendedBlock; BYTE drivePhysicalNumber; BYTE rezerved; BYTE symbolBrackets; BYTE volumeSerialNumber[4]; BYTE volumeLabel[11]; BYTE identifierFAT[8]; BYTE bootCode[450]; } boot; typedef struct root_Entries { BYTE short_FileName[11]; BYTE fileAttributes; BYTE reserved; BYTE createTime_ms; WORD createTime; WORD createDate; WORD accessedDate; WORD clusterNumber_High; WORD modifiedTime; WORD modifiedDate; WORD firstClusterAddress_FAT12; DWORD sizeofFile; } root; void ScanBootSector(); void ScanRoot(); void ScanFat(); WORD FAT[2880]; BYTE Buffer[512 * 9]; WORD* Val; HANDLE hDisk; int main() { hDisk = CreateFile(TEXT("C:\\Tmp\\Dos6.22.img"), // drive to open GENERIC_READ, // Access mode FILE_SHARE_READ, // Share Mode NULL, // Security Descriptor OPEN_EXISTING, // How to create 0, // File attributes NULL); // Handle to template if (hDisk != NULL) { ScanBootSector(); ScanRoot(); ScanFat(); int cluster = 2619; int count = 1; while (FAT[cluster] != 0xfff) { printf("%6x\t", FAT[cluster]); cluster = FAT[cluster]; count++; } printf("\n%d", count); } CloseHandle(hDisk); return 0; } void ScanFat() { DWORD dwBytesRead; WORD fatElement; int j = 0; SetFilePointer(hDisk, 512, NULL, FILE_BEGIN); ReadFile(hDisk, Buffer, 512 * 9, &dwBytesRead, NULL); if (Buffer[0] != boot.extendedBlock.media) { printf("Error 1 \n"); return; } //FAT table entries are packed so that two cluster entries occupy three bytes with the following general format : //yz Zx XY // where // xyz is the one pointer entry and // XYZ is the second pointer entry. // E.g., bytes : // 2d e0 02 // refer to clusters 0x02d (45) and 0x02e (46) for (int i = 0, j = 0; i < 512 * 9; i += 3, j += 2) { FAT[j] = (Buffer[i] + (Buffer[i + 1] << 8)) & 0x0FFF; FAT[j+1] = (Buffer[i + 1] + (Buffer[i + 2] << 8)) >> 4; } } void ScanRoot() { DWORD dwFilePointer; DWORD dwBytesRead; root stRoot; BYTE byteRoot[512]; memset(&byteRoot, 0, 512); dwFilePointer = SetFilePointer(hDisk, (512 * 19), NULL, FILE_BEGIN); if (dwFilePointer == INVALID_SET_FILE_POINTER && GetLastError() != NO_ERROR) { // Deal with failure // . . . } // End of error handler int iSector = 19; BOOL bNoEntry = FALSE; // Iterate through root directory sectors do { if (!ReadFile(hDisk, byteRoot, 512, &dwBytesRead, NULL)) { printf("Error in Reading Root Entry.\n"); } else { BYTE *pByteRoot = byteRoot; // Iterate through 32 byte entries for (int i = 0; i < (512 / 32); i++) { ZeroMemory(&stRoot, 32); memcpy(&stRoot, pByteRoot, 32); // No entry beyond this used. if (stRoot.short_FileName[0] == 0x00) { // Stop iteration bNoEntry = TRUE; break; } else { // This if loops checks for file deletion // status if (stRoot.short_FileName[0] == 0xE5) { printf("First character of file after deletion :0x%x\n", stRoot.short_FileName[0]); printf("File status: Deleted.\n"); } puts("File Name :"); for (size_t idx = 0; idx < 8; idx++) { putchar(stRoot.short_FileName[idx]); } putchar('\n'); if (stRoot.fileAttributes & 0x01) printf("File Attribute : Read Only File\n"); if (stRoot.fileAttributes & 0x02) printf("File Attribute : Hidden File\n"); if (stRoot.fileAttributes & 0x04) printf("File Attribute : System File\n"); if (stRoot.fileAttributes & 0x08) printf("File Attribute : Volume Label\n"); if (stRoot.fileAttributes & 0x0f) printf("File Attribute : Long File Name\n"); if (stRoot.fileAttributes & 0x10) printf("File Attribute : Directory\n"); if (stRoot.fileAttributes & 0x20) printf("File Attribute : Archive\n"); WORD nYear = (stRoot.createDate >> 9); WORD nMonth = (stRoot.createDate << 7); nMonth = nMonth >> 12; WORD nDay = (stRoot.createDate << 11); nDay = nDay >> 11; //printf("Create Date : %d/%d/%d\n", nDay, nMonth, (nYear + 1980)); nYear = (stRoot.modifiedDate >> 9); nMonth = (stRoot.modifiedDate << 7); nMonth = nMonth >> 12; nDay = (stRoot.modifiedDate << 11); nDay = nDay >> 11; printf("Modification Date : %d/%d/%d\n", nDay, nMonth, (nYear + 1980)); nYear = (stRoot.accessedDate >> 9); nMonth = (stRoot.accessedDate << 7); nMonth = nMonth >> 12; nDay = (stRoot.accessedDate << 11); nDay = nDay >> 11; //printf("Accessed Date : %d/%d/%d\n", nDay, nMonth, (nYear + 1980)); printf("Start Cluster Address: %d\n", stRoot.firstClusterAddress_FAT12); printf("File Size : %d bytes\n", stRoot.sizeofFile); pByteRoot += 32; } // End of else } if (bNoEntry) break; else { iSector += 1; } } } while (iSector <= 33); } void ScanBootSector() { DWORD dwBytesRead; char str[128]; unsigned short num1, num2; bool check; check = ReadFile(hDisk, (void *)&boot, sizeof(bootRecord), &dwBytesRead, NULL); if (!check) { printf("Error %d", GetLastError()); } strncpy_s(str, (char *)boot.vendorName, 8); str[8] = '\0'; printf("Vendor Name: %s\n", str); if (boot.drivePhysicalNumber >= 0x80) puts("Hard disk"); else puts("Floppy disk"); if (boot.symbolBrackets == '(') puts("Extended block present."); else puts("Extended block absent."); memcpy(&num1, boot.volumeSerialNumber, 2); memcpy(&num2, boot.volumeSerialNumber + 2, 2); printf("Serial num=%X-%X\n", num1, num2); strncpy_s(str, (char *)boot.volumeLabel, 11); str[11] = '\0'; printf("Label: %s\n", str); strncpy_s(str, (char *)boot.identifierFAT, 8); str[8] = '\0'; printf("Ident FAT: %s\n", str); //printf("%d", sizeof(struct param_bios)); /*printf("Byte in sector = %d\n", boot.extendedBlock.sectorSize); printf("Sector in cluster = %d\n", boot.extendedBlock.clusterSize); printf("Reserved sector = %d\n", boot.extendedBlock.reservedSectors); printf("FAT Count = %d\n", boot.extendedBlock.fatCount); printf("root size = %d\n", boot.extendedBlock.rootSize); printf("Total sector = %d\n", boot.extendedBlock.totalSectors); printf("Media = %d\n", boot.extendedBlock.media); printf("Fat size = %d\n", boot.extendedBlock.fatSize); printf("Sectors = %d\n", boot.extendedBlock.sectors); printf("Heads = %d\n", boot.extendedBlock.heads); printf("hidden Low = %d\n", boot.extendedBlock.hiddenLow); printf("hidden High = %d\n", boot.extendedBlock.hiddenHigh); printf("largeTotal Sectors = %d\n", boot.extendedBlock.largeTotalSectors[4]);*/ }