📄 leftview.cpp
字号:
NetCall.NumSectors = DrivePacket->NumSectors;
NetCall.NTRelativeSector = DrivePacket->NTRelativeSector;
NetCall.RelativeSector = 0;
NetCall.Flag = DrivePacket->Flag;
send(SocketNum, (char *) &NetCall, sizeof(SECTOR_FUNC), 0);
CallNet();
}
else if(gOSWin95){
if(!(DllThunk32)(DrivePacket->Drive, DrivePacket->Cylinder, DrivePacket->Head,
DrivePacket->Sector, DrivePacket->NumSectors, (LPBYTE)BufferDir, DrivePacket->NTRelativeSector, DrivePacket->Flag)){
AfxMessageBox("Boot Record not accessible!");
return;
}
}
else{
char TmpStr[100];
if(DrivePacket->Drive < 0x80){
wsprintf(TmpStr, "\\\\.\\%c:", DrivePacket->Drive+'A');
if(hDisk[DrivePacket->Drive])
CloseHandle(hDisk[DrivePacket->Drive]);
if((hDisk[DrivePacket->Drive]=CreateFile(TmpStr, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, NULL))==INVALID_HANDLE_VALUE){
AfxMessageBox("Drive not accessible!");
*pResult = -1;
return;
}
}
else
wsprintf(TmpStr, "\\\\.\\PHYSICALDRIVE%u", DrivePacket->Drive - 0x80);
__int64 Tmp64 = ((__int64) DrivePacket->NTRelativeSector) * 512;
long TmpVal = Tmp64 & 0xFFFFFFFF;
long TmpValHi = (Tmp64 >> 32);
SetFilePointer(hDisk[DrivePacket->Drive], TmpVal, &TmpValHi, FILE_BEGIN);
TmpVal = 0;
ReadFile(hDisk[DrivePacket->Drive], BufferDir, DrivePacket->NumSectors * 512, (DWORD *) &TmpVal, NULL);
if(TmpVal != (DrivePacket->NumSectors * 512)){
AfxMessageBox("Boot Record not accessible!");
return;
}
}
BOOT *BootRecord = (BOOT *) BufferDir;
WORD FatType = ((BootRecord->BytesPerSector * (BootRecord->TotalSectors ? BootRecord->TotalSectors:BootRecord->ExtendedTotalSectors)) /
(BootRecord->BytesPerSector * BootRecord->SectorsPerCluster)>=4096) ? FAT16:FAT12;
if(DrivePacket->FatType == FAT32)
FatType = FAT32;
for(i=0;i<BootRecord->NumFATs; i++){
wsprintf(TmpStr, "FAT %u", i+1);
Packets->Cylinder = DrivePacket->Cylinder;
Packets->Drive = DrivePacket->Drive;
Packets->Flag = DrivePacket->Flag;
Packets->Head = DrivePacket->Head;
if(DrivePacket->FatType == FAT32)
Packets->NumSectors = BootRecord->ExtendedSectorsPerFAT;
else
Packets->NumSectors = BootRecord->SectorsPerFAT;
Packets->Sector = DrivePacket->Sector;
Packets->Type = FatType;
Packets->RelativeSector = BootRecord->ReservedSectors + ((DrivePacket->FatType == FAT32) ? BootRecord->ExtendedSectorsPerFAT:BootRecord->SectorsPerFAT)*i;
Packets->TotalHeads = BootRecord->NumHeads;
Packets->SectorsPerTrack = BootRecord->SectorsPerTrack;
Packets->SectorsPerCluster = BootRecord->SectorsPerCluster;
Packets->FatType = FatType;
Packets->TotalSectors = BootRecord->TotalSectors ? BootRecord->TotalSectors:BootRecord->ExtendedTotalSectors;
Packets->NTRelativeSector = DrivePacket->NTRelativeSector;
Packets->Net = DrivePacket->Net;
TvI.mask = TVIF_CHILDREN | TVIF_TEXT | TVIF_PARAM;
TvI.pszText = TmpStr;
TvI.cChildren = 0;
TvI.lParam = (long)Packets++;
TvIns.item = TvI;
TvIns.hParent = (HTREEITEM) pNMTreeView->itemNew.hItem;
TvIns.hInsertAfter = hPrev;
hPrev = DiskTree->InsertItem((LPTVINSERTSTRUCT) &TvIns);
}
strcpy(TmpStr, "Root Directory");
Packets->Cylinder = DrivePacket->Cylinder;
Packets->Drive = DrivePacket->Drive;
Packets->Flag = DrivePacket->Flag;
Packets->Head = DrivePacket->Head;
if(DrivePacket->FatType == FAT32){
Packets->NumSectors = 0;
Packets->Attributes = ATTR_SUBDIR;
}
else
Packets->NumSectors = (BootRecord->NumRoot * 32)/512;
Packets->Sector = DrivePacket->Sector;
Packets->Type = (DrivePacket->FatType == FAT32) ? FILES_FOLDERS:ROOT_DIR;
Packets->TotalHeads = BootRecord->NumHeads;
Packets->SectorsPerTrack = BootRecord->SectorsPerTrack;
Packets->SectorsPerCluster = BootRecord->SectorsPerCluster;
Packets->FatRelativeSector = BootRecord->ReservedSectors;
Packets->RelativeSector = BootRecord->ReservedSectors + ((DrivePacket->FatType == FAT32) ? BootRecord->ExtendedSectorsPerFAT:BootRecord->SectorsPerFAT)*i;
Packets->DataAreaSector = Packets->RelativeSector + ((DrivePacket->FatType == FAT32) ? 0:(BootRecord->NumRoot*32)/512);
if(DrivePacket->FatType == FAT32){
Packets->NumFatSectors = BootRecord->ExtendedSectorsPerFAT;
Packets->StartCluster = BootRecord->RootStartCluster;
}
else{
Packets->NumFatSectors = BootRecord->SectorsPerFAT;
}
Packets->FatType = FatType;
Packets->TotalSectors = BootRecord->TotalSectors ? BootRecord->TotalSectors:BootRecord->ExtendedTotalSectors;
Packets->NTRelativeSector = DrivePacket->NTRelativeSector;
Packets->Net = DrivePacket->Net;
TvI.mask = TVIF_CHILDREN | TVIF_TEXT | TVIF_PARAM;
TvI.pszText = TmpStr;
TvI.cChildren = 1;
TvI.lParam = (long)Packets++;
TvIns.item = TvI;
TvIns.hParent = (HTREEITEM) pNMTreeView->itemNew.hItem;
TvIns.hInsertAfter = hPrev;
hPrev = DiskTree->InsertItem((LPTVINSERTSTRUCT) &TvIns);
LocalUnlock(hMemBufferDir);
LocalFree(hMemBufferDir);
break;
}
case ROOT_DIR:{
hMemBufferDir = LocalAlloc(LMEM_MOVEABLE|LMEM_DISCARDABLE|LMEM_ZEROINIT, DrivePacket->NumSectors * 512);
if(hMemBufferDir == NULL){
AfxMessageBox("Fatal Error! Not able to allocate a Buffer for Root Directory!");
return;
}
BufferDir = (LPBYTE) LocalLock(hMemBufferDir);
if(!LoadSectors(DrivePacket, &CylHeadSect, BufferDir)){
AfxMessageBox("Root Directory not fully accessible!");
}
DIRECTORY *Directory=(DIRECTORY *)BufferDir;
for(i=0; i<(DrivePacket->NumSectors*16); i++){
char *Lfn = (char *) (Packets+1);
if(((Directory->Attributes & 0xF) == 0xF) || ((BYTE)Directory->Name[0] == 0xE5) || (Directory->Name[0] == 5)){
Directory++; //Its a LFN Skip it
continue;
}
if(Directory->Attributes & ATTR_VOLUME){
Directory++; //Its a LFN Skip it
continue;
}
if(Directory->Name[0] == 0)
break;
WORD TmpVal=0;
if(Directory != (DIRECTORY *)BufferDir)
TmpVal=FormLongFileName(Directory, Lfn);
if(TmpVal == 0){
memcpy(Lfn, Directory->Name, 8);
Lfn[8] = '.';
memcpy(&(Lfn[9]), Directory->Extension, 3);
Lfn[12]=0;
TmpVal = 12;
}
*(Lfn+TmpVal) = 0;
Packets->Cylinder = DrivePacket->Cylinder;
Packets->Drive = DrivePacket->Drive;
Packets->Flag = DrivePacket->Flag;
Packets->Head = DrivePacket->Head;
Packets->NumSectors = 0;
Packets->Sector = DrivePacket->Sector;
Packets->Type = FILES_FOLDERS;
Packets->RelativeSector = DrivePacket->RelativeSector + DrivePacket->NumSectors;
Packets->TotalHeads = DrivePacket->TotalHeads;
Packets->SectorsPerTrack = DrivePacket->SectorsPerTrack;
Packets->SectorsPerCluster = DrivePacket->SectorsPerCluster;
Packets->FatRelativeSector = DrivePacket->FatRelativeSector;
Packets->DataAreaSector = DrivePacket->DataAreaSector;
if(DrivePacket->FatType == FAT32)
Packets->StartCluster = ((DWORD) Directory->StartCluster + (((DWORD)Directory->StartClusterHi)<<16));
else
Packets->StartCluster = (DWORD) Directory->StartCluster;
Packets->NumFatSectors = DrivePacket->NumFatSectors;
Packets->Lfn = Lfn;
Packets->FatType = DrivePacket->FatType;
Packets->Attributes = (WORD) Directory->Attributes;
Packets->TotalSectors = DrivePacket->TotalSectors;
Packets->NTRelativeSector = DrivePacket->NTRelativeSector;
Packets->Net = DrivePacket->Net;
TvI.mask = TVIF_CHILDREN | TVIF_TEXT | TVIF_PARAM;
TvI.pszText = LPSTR_TEXTCALLBACK;
TvI.cChildren = (Directory->Attributes & ATTR_SUBDIR) ? 1:0;
TvI.lParam = (long)Packets;
Directory++;
TvIns.item = TvI;
TvIns.hParent = (HTREEITEM) pNMTreeView->itemNew.hItem;
TvIns.hInsertAfter = hPrev;
Lfn += TmpVal+1;
Packets = (DRIVEPACKET *) Lfn;
hPrev = DiskTree->InsertItem((LPTVINSERTSTRUCT) &TvIns);
}
LocalUnlock(hMemBufferDir);
LocalFree(hMemBufferDir);
break;
}
case FILES_FOLDERS:{
hMemBufferDir = LocalAlloc(LMEM_MOVEABLE|LMEM_DISCARDABLE|LMEM_ZEROINIT, DrivePacket->NumFatSectors * 512);
if(hMemBufferDir == NULL){
AfxMessageBox("Fatal Error! Not able to allocate a Buffer For FAT!");
return;
}
BufferDir = (LPBYTE) LocalLock(hMemBufferDir);
DRIVEPACKET FatDrivePacket;
memcpy(&FatDrivePacket, DrivePacket, sizeof(DRIVEPACKET));
FatDrivePacket.RelativeSector = DrivePacket->FatRelativeSector;
FatDrivePacket.NumSectors = DrivePacket->NumFatSectors;
if(!LoadSectors(&FatDrivePacket, &CylHeadSect, BufferDir)){
FatDrivePacket.RelativeSector += DrivePacket->NumFatSectors; //First FAT fails
if(!LoadSectors(&FatDrivePacket, &CylHeadSect, BufferDir)){
AfxMessageBox("FAT not accessible!");
return;
}
}
DWORD NumFatEntries = CountFatEntries(FatDrivePacket.StartCluster, FatDrivePacket.FatType, BufferDir);
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, BufferDir);
LocalUnlock(hMemBufferDir);
LocalFree(hMemBufferDir);
hMemBufferDir = LocalAlloc(LMEM_MOVEABLE|LMEM_DISCARDABLE|LMEM_ZEROINIT, NumFatEntries * DrivePacket->SectorsPerCluster * 512);
if(hMemBufferDir == NULL){
AfxMessageBox("Fatal Error! Not able to allocate a Buffer!");
LocalUnlock(hMemBufferFatEntries);
LocalFree(hMemBufferFatEntries);
return;
}
BufferDir = (LPBYTE) LocalLock(hMemBufferDir);
if(!ReadDirBuffer(BufferFatEntries, DrivePacket, NumFatEntries, BufferDir)){
AfxMessageBox("Not able to load the sub-directory");
LocalUnlock(hMemBufferFatEntries);
LocalFree(hMemBufferFatEntries);
return;
}
LocalUnlock(hMemBufferDir);
BufferDir = (LPBYTE) LocalLock(hMemBufferDir);
DIRECTORY *Directory=(DIRECTORY *)BufferDir;
for(i=0; i<(NumFatEntries*DrivePacket->SectorsPerCluster*16) /*512/32*/; i++){
char *Lfn = (char *) (Packets+1);
if(((Directory->Attributes & 0xF) == 0xF) || ((BYTE)Directory->Name[0] == 0xE5) || (Directory->Name[0] == 5)){
Directory++; //Its a LFN Skip it
continue;
}
if((Directory->Attributes & ATTR_SUBDIR) && (Directory->Name[0]=='.')){
Directory++; //Its a LFN Skip it
continue;
}
if(Directory->Name[0] == 0)
break;
WORD TmpVal=0;
if(Directory != (DIRECTORY *)BufferDir)
TmpVal=FormLongFileName(Directory, Lfn);
if(TmpVal == 0){
memcpy(Lfn, Directory->Name, 8);
Lfn[8] = '.';
memcpy(&(Lfn[9]), Directory->Extension, 3);
Lfn[12]=0;
TmpVal = 12;
}
*(Lfn+TmpVal) = 0;
Packets->Cylinder = DrivePacket->Cylinder;
Packets->Drive = DrivePacket->Drive;
Packets->Flag = DrivePacket->Flag;
Packets->Head = DrivePacket->Head;
Packets->NumSectors = 0;
Packets->Sector = DrivePacket->Sector;
Packets->Type = FILES_FOLDERS;
Packets->RelativeSector = DrivePacket->RelativeSector + DrivePacket->NumSectors;
Packets->TotalHeads = DrivePacket->TotalHeads;
Packets->SectorsPerTrack = DrivePacket->SectorsPerTrack;
Packets->SectorsPerCluster = DrivePacket->SectorsPerCluster;
Packets->FatRelativeSector = DrivePacket->FatRelativeSector;
Packets->DataAreaSector = DrivePacket->DataAreaSector;
if(DrivePacket->FatType == FAT32)
Packets->StartCluster = ((DWORD) Directory->StartCluster + (((DWORD)Directory->StartClusterHi)<<16));
else
Packets->StartCluster = (DWORD) Directory->StartCluster;
Packets->Lfn = Lfn;
Packets->FatType = DrivePacket->FatType;
Packets->NumFatSectors = DrivePacket->NumFatSectors;
Packets->Attributes = (WORD) Directory->Attributes;
Packets->TotalSectors = DrivePacket->TotalSectors;
Packets->NTRelativeSector = DrivePacket->NTRelativeSector;
Packets->Net = DrivePacket->Net;
TvI.mask = TVIF_CHILDREN | TVIF_TEXT | TVIF_PARAM;
TvI.pszText = LPSTR_TEXTCALLBACK;
TvI.cChildren = (Directory->Attributes & ATTR_SUBDIR) ? 1:0;
TvI.lParam = (long)Packets;
Directory++;
TvIns.item = TvI;
TvIns.hParent = (HTREEITEM) pNMTreeView->itemNew.hItem;
TvIns.hInsertAfter = hPrev;
Lfn += TmpVal+1;
Packets = (DRIVEPACKET *) Lfn;
hPrev = DiskTree->InsertItem((LPTVINSERTSTRUCT) &TvIns);
}
LocalUnlock(hMemBufferFatEntries);
LocalFree(hMemBufferFatEntries);
LocalUnlock(hMemBufferDir);
LocalFree(hMemBufferDir);
break;
}
}
m_wndStatusBarCtrl->SetText("", 0, 0);
}
void CLeftView::OnGetdispinfo(NMHDR* pNMHDR, LRESULT* pResult)
{
TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
// TODO: Add your control notification handler code here
pTVDispInfo->item.pszText = (char *)((DRIVEPACKET *)(pTVDispInfo->item.lParam))->Lfn;
*pResult = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -