📄 general.cpp
字号:
}
else{
if(hDisk[i+0x80])
CloseHandle(hDisk[i+0x80]);
char TmpStr[26] = "\\\\.\\PHYSICALDRIVE0";
TmpStr[17] = i+'0';
if((hDisk[i+0x80]=CreateFile(TmpStr, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, NULL))==INVALID_HANDLE_VALUE)
break;
}
wsprintf(TmpStr, "Hard Disk %lu", i+1);
TvI.mask = TVIF_CHILDREN | TVIF_TEXT | TVIF_PARAM;
TvI.pszText = TmpStr;
TvI.cChildren = 1;
TvI.lParam = (long)DrivePacket;
DrivePacket->Drive = 0x80+i;
DrivePacket->Cylinder = 0;
DrivePacket->Head = 0;
DrivePacket->Sector = 1;
DrivePacket->NumSectors = 1;
DrivePacket->Type = PART_TABLE;
DrivePacket->RelativeSector = 0;
DrivePacket->NTRelativeSector = 0;
if(gOSWin95)
DrivePacket->Flag = (DllCheckInt13Extension)(0x80+i);
else
DrivePacket->Flag = 0;
NumHards++;
TvIns.item = TvI;
TvIns.hParent = TVI_ROOT;
TvIns.hInsertAfter = TVI_LAST;
hPrevHD = DiskTree->InsertItem((LPTVINSERTSTRUCT) &TvIns);
DrivePacket++;
}
m_wndStatusBarCtrl->SetText("", 0, 0);
}
void DisplaySubDir(DRIVEPACKET *DrivePacket)
{
WORD i;
m_wndStatusBarCtrl->SetText("Wait....", 0, 0);
DeleteColumns();
gListViewType = SUB_DIR;
ListView->InsertColumn(MS_DOS, "MS-DOS Name", LVCFMT_LEFT, 100, 0);
ListView->InsertColumn(LFN, "Long File Name", LVCFMT_LEFT, 200, 0);
ListView->InsertColumn(START_CLUS, "Starting Cluster", LVCFMT_LEFT, 100, 0);
ListView->InsertColumn(ATTR, "Attributes", LVCFMT_LEFT, 75, 0);
ListView->InsertColumn(SIZE, "Size", LVCFMT_LEFT, 75, 0);
ListView->InsertColumn(DATETIME, "Modified Date", LVCFMT_LEFT, 125, 0);
ListView->InsertColumn(CREATEDATE, "Created Date", LVCFMT_LEFT, 125, 0);
ListView->InsertColumn(ACCESSDATE, "Accessed Date", LVCFMT_LEFT, 125, 0);
DIRECTORY *Directory=(DIRECTORY *)Buffer;
hMemFilePacket = LocalAlloc(LMEM_MOVEABLE | LMEM_DISCARDABLE, DrivePacket->NumSectors * 512 + DrivePacket->NumSectors * 8 /*For LFN & .*/);
if(hMemFilePacket == NULL){
AfxMessageBox("Unable to allocate memory");
return;
}
FILEPACKET *FilePacket = (FILEPACKET *) LocalLock(hMemFilePacket);
for(i=0; i<(DrivePacket->NumSectors*16); i++){
if((Directory->Attributes & 0xF) == 0xF){
Directory++; //Its a LFN Skip it
continue;
}
if(Directory->Name[0] == 0)
break;
if((Directory->Attributes & ATTR_SUBDIR) && (Directory->Name[0]=='.')){
Directory++; //Its a . or .. Skip it
continue;
}
// if(((BYTE)Directory->Name[0] != 0xE5) && (Directory->Name[0] != 0x05)){
// Directory++;
// continue;
// }
memmove(FilePacket->Name, Directory->Name, 8);
FilePacket->Name[8] = '.';
memmove(&(FilePacket->Name[9]), Directory->Extension, 3);
FilePacket->Name[12]=0;
FilePacket->Attributes = Directory->Attributes;
FilePacket->Date = Directory->Date;
FilePacket->CreateDate = Directory->CreateDate;
FilePacket->AccessDate = Directory->AccessDate;
FilePacket->Size = Directory->Size;
FilePacket->StartCluster = (DWORD) Directory->StartCluster + (((DrivePacket->FatType == FAT32) ? (DWORD) Directory->StartClusterHi:0)<<16);
FilePacket->Time = Directory->Time;
FilePacket->Lfn = (char *) (FilePacket+1);
WORD TmpVal=0;
if(Directory != (DIRECTORY *)Buffer)
TmpVal=FormLongFileName(Directory, (char *)(FilePacket+1));
FilePacket++;
*((char *) FilePacket+TmpVal)=0;
Directory++;
ListView->InsertItem(LVIF_TEXT|LVIF_PARAM, i, LPSTR_TEXTCALLBACK, 0, 0, i, (LPARAM) (FilePacket-1));
FilePacket = (FILEPACKET *)((char *) FilePacket+TmpVal+1);
}
m_wndStatusBarCtrl->SetText("", 0, 0);
}
DWORD CountFatEntries(DWORD StartCluster, WORD FatType, LPBYTE Buffer)
{
if(!(StartCluster & 0xFFFFFFF))
return 0;
switch(FatType)
{
case FAT16:
if(StartCluster == 0xFFFF)
return 0;
break;
case FAT12:
if(StartCluster == 0xFFF)
return 0;
break;
case FAT32:
if((StartCluster & 0xFFFFFFF) == 0xFFFFFFF)
return 0;
break;
}
DWORD NumFatEntries = 1, NextCluster = StartCluster;
while(TRUE){
switch(FatType)
{
case FAT16:
NextCluster = (WORD)Buffer[NextCluster*2]+(WORD)Buffer[NextCluster*2+1]*256;
if(!NextCluster)
return NumFatEntries;
if(NextCluster == 0xFFFF)
return NumFatEntries;
break;
case FAT12:{
DWORD TmpVal = (WORD)Buffer[(NextCluster*3)/2]+(WORD)Buffer[(NextCluster*3)/2+1]*256;
NextCluster = (NextCluster % 2) ? (TmpVal >> 4):(TmpVal & 0xFFF);
if(!NextCluster)
return NumFatEntries;
if(NextCluster == 0xFFF)
return NumFatEntries;
break;
}
case FAT32:
NextCluster &= 0xFFFFFFF;
NextCluster = (DWORD)Buffer[NextCluster*4]+(((DWORD)Buffer[NextCluster*4+1])<<8) +
(((DWORD)Buffer[NextCluster*4+2])<<16) + (((DWORD)Buffer[NextCluster*4+3])<<24);
NextCluster &= 0xFFFFFFF;
if(!NextCluster)
return NumFatEntries;
if(NextCluster == 0xFFFFFFF)
return NumFatEntries;
break;
}
NumFatEntries++;
}
}
void StoreFatEntries(DWORD StartCluster, WORD FatType, LPDWORD FatEntries, DWORD NumFatEntries, LPBYTE Buffer)
{
DWORD NextCluster = StartCluster;
for(DWORD i=0; i<NumFatEntries; i++){
switch(FatType)
{
case FAT16:
FatEntries[i] = NextCluster;
NextCluster = (WORD)Buffer[NextCluster*2]+(WORD)Buffer[NextCluster*2+1]*256;
break;
case FAT12:{
FatEntries[i] = NextCluster;
DWORD TmpVal = (WORD)Buffer[(NextCluster*3)/2]+(WORD)Buffer[(NextCluster*3)/2+1]*256;
NextCluster = (NextCluster % 2) ? (TmpVal >> 4):(TmpVal & 0xFFF);
break;
}
case FAT32:
NextCluster &= 0xFFFFFFF;
FatEntries[i] = NextCluster;
NextCluster = (DWORD)Buffer[NextCluster*4]+(((DWORD)Buffer[NextCluster*4+1])<<8) +
(((DWORD)Buffer[NextCluster*4+2])<<16) + (((DWORD)Buffer[NextCluster*4+3])<<24);
NextCluster &= 0xFFFFFFF;
break;
}
}
}
BOOL ReadDirBuffer(LPDWORD FatBuffer, DRIVEPACKET *DrivePacket, DWORD NumFatEntries, LPBYTE Buffer)
{
DRIVEPACKET TmpDrivePacket;
DWORD TmpVal=0;
for(DWORD i=0; i<NumFatEntries; i++){
memcpy(&TmpDrivePacket, DrivePacket, sizeof(DRIVEPACKET));
TmpDrivePacket.RelativeSector += DrivePacket->SectorsPerCluster * (FatBuffer[TmpVal++]-2);
TmpDrivePacket.NumSectors = DrivePacket->SectorsPerCluster;
if(!LoadSectors(&TmpDrivePacket, &CylHeadSect, Buffer))
return FALSE;
Buffer += DrivePacket->SectorsPerCluster * 512;
}
return TRUE;
}
BOOL WriteDirBuffer(LPDWORD FatBuffer, DRIVEPACKET *DrivePacket, DWORD NumFatEntries, LPBYTE Buffer)
{
DRIVEPACKET TmpDrivePacket;
DWORD TmpVal=0;
for(DWORD i=0; i<NumFatEntries; i++){
memcpy(&TmpDrivePacket, DrivePacket, sizeof(DRIVEPACKET));
TmpDrivePacket.RelativeSector += DrivePacket->SectorsPerCluster * (FatBuffer[TmpVal++]-2);
TmpDrivePacket.NumSectors = DrivePacket->SectorsPerCluster;
if(!WriteSectors(&TmpDrivePacket, &CylHeadSect, Buffer))
return FALSE;
Buffer += DrivePacket->SectorsPerCluster * 512;
}
return TRUE;
}
void DisplayFilesFolders(DRIVEPACKET *TmpDrivePacket)
{
DRIVEPACKET DrivePacket;
memcpy(&DrivePacket, TmpDrivePacket, sizeof(DRIVEPACKET));
DRIVEPACKET FatDrivePacket;
// gListViewType = 0;
memcpy(&FatDrivePacket, TmpDrivePacket, sizeof(DRIVEPACKET));
FatDrivePacket.RelativeSector = DrivePacket.FatRelativeSector;
FatDrivePacket.NumSectors = DrivePacket.NumFatSectors;
if(!LoadSectors(&FatDrivePacket, &CylHeadSect, Buffer)){
FatDrivePacket.RelativeSector += DrivePacket.NumFatSectors;
if(!LoadSectors(&FatDrivePacket, &CylHeadSect, Buffer)){
AfxMessageBox("FAT not accessible!");
return;
}
}
DWORD NumFatEntries = CountFatEntries(FatDrivePacket.StartCluster, FatDrivePacket.FatType, Buffer);
if(!NumFatEntries)
return;
HLOCAL hMemBufferFatEntries = LocalAlloc(LMEM_MOVEABLE|LMEM_DISCARDABLE|LMEM_ZEROINIT, NumFatEntries*4);
if(hMemBufferFatEntries == NULL){
AfxMessageBox("Fatal Error! Not able to allocate a buffer for FAT Entries!");
return;
}
LPDWORD BufferFatEntries = (LPDWORD) LocalLock(hMemBufferFatEntries);
StoreFatEntries(FatDrivePacket.StartCluster, FatDrivePacket.FatType, BufferFatEntries, NumFatEntries, Buffer);
LocalUnlock(hMemBuffer);
LocalFree(hMemBuffer);
hMemBuffer = LocalAlloc(LMEM_MOVEABLE|LMEM_DISCARDABLE|LMEM_ZEROINIT, NumFatEntries * DrivePacket.SectorsPerCluster * 512);
if(hMemBuffer == NULL){
AfxMessageBox("Fatal Error! Not able to allocate a buffer!");
LocalUnlock(hMemBufferFatEntries);
LocalFree(hMemBufferFatEntries);
return;
}
Buffer = (LPBYTE) LocalLock(hMemBuffer);
if(!ReadDirBuffer(BufferFatEntries, &DrivePacket, NumFatEntries, Buffer)){
AfxMessageBox("Not able to fully load the sub-directory");
}
LocalUnlock(hMemBuffer);
Buffer = (LPBYTE) LocalLock(hMemBuffer);
DrivePacket.NumSectors = NumFatEntries * DrivePacket.SectorsPerCluster;
DisplaySubDir(&DrivePacket);
wsprintf(TmpStr, "Current Cluster Number: 0x%08X, Current Sector Number: %lu", BufferFatEntries[gCurrentIndex], DrivePacket.RelativeSector+(BufferFatEntries[gCurrentIndex]-2)*DrivePacket.SectorsPerCluster);
m_wndStatusBarCtrl->SetText(TmpStr, 1, 0);
LocalUnlock(hMemBufferFatEntries);
LocalFree(hMemBufferFatEntries);
}
void DisplayFile(DRIVEPACKET *DrivePacket)
{
WORD i;
m_wndStatusBarCtrl->SetText("Wait....", 0, 0);
DeleteColumns();
gListViewType = FILES_FOLDERS;
ItsFile = true;
ListView->InsertColumn(0, "Offset", LVCFMT_LEFT, 85, 0);
for(i=0; i<16; i++){
wsprintf(TmpStr, "%02X", i);
ListView->InsertColumn(i+1, TmpStr, LVCFMT_LEFT, 30, i+1);
}
ListView->InsertColumn(i+1, "", LVCFMT_LEFT, 15, i+1);
i++;
for(int j=0; (i-17) < 16; i++, j++){
wsprintf(TmpStr, "%01X", j);
ListView->InsertColumn(i+1, TmpStr, LVCFMT_LEFT, 20, i+1);
}
DRIVEPACKET FatDrivePacket;
memcpy(&FatDrivePacket, DrivePacket, sizeof(DRIVEPACKET));
memcpy(&gDrivePacket, DrivePacket, sizeof(DRIVEPACKET));
FatDrivePacket.RelativeSector = DrivePacket->FatRelativeSector;
FatDrivePacket.NumSectors = DrivePacket->NumFatSectors;
if(!LoadSectors(&FatDrivePacket, &CylHeadSect, Buffer)){
FatDrivePacket.RelativeSector += DrivePacket->NumFatSectors;
if(!LoadSectors(&FatDrivePacket, &CylHeadSect, Buffer)){
AfxMessageBox("FAT not accessible!");
return;
}
}
gNumFatEntries = CountFatEntries(FatDrivePacket.StartCluster, FatDrivePacket.FatType, Buffer);
if(!gNumFatEntries)
return;
if(hMemBufferFatEntries){
LocalUnlock(hMemBufferFatEntries);
LocalFree(hMemBufferFatEntries);
}
hMemBufferFatEntries = LocalAlloc(LMEM_MOVEABLE|LMEM_DISCARDABLE|LMEM_ZEROINIT, gNumFatEntries*4);
if(hMemBufferFatEntries == NULL){
AfxMessageBox("Fatal Error! Not able to allocate a buffer for FAT Entries!");
return;
}
BufferFatEntries = (LPDWORD) LocalLock(hMemBufferFatEntries);
StoreFatEntries(FatDrivePacket.StartCluster, FatDrivePacket.FatType, BufferFatEntries, gNumFatEntries, Buffer);
gSectorsPerCluster = DrivePacket->SectorsPerCluster;
gCurrentIndex = 0;
if(hMemBuffer){
LocalUnlock(hMemBuffer);
LocalFree(hMemBuffer);
}
hMemBuffer = LocalAlloc(LMEM_MOVEABLE|LMEM_DISCARDABLE|LMEM_ZEROINIT, gSectorsPerCluster * 512);
if(hMemBuffer == NULL){
AfxMessageBox("Fatal Error! Not able to allocate a Buffer!");
LocalUnlock(hMemBufferFatEntries);
LocalFree(hMemBufferFatEntries);
return;
}
Buffer = (LPBYTE) LocalLock(hMemBuffer);
memcpy(&FatDrivePacket, DrivePacket, sizeof(DRIVEPACKET));
FatDrivePacket.RelativeSector += (BufferFatEntries[gCurrentIndex]-2) * gSectorsPerCluster; //Now load the first cluster of file
FatDrivePacket.NumSectors = DrivePacket->SectorsPerCluster;
if(!LoadSectors(&FatDrivePacket, &CylHeadSect, Buffer)){
AfxMessageBox("Cluster not accessible!");
}
for(i=0; i<gSectorsPerCluster * 32; i++){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -