📄 general.cpp
字号:
}
wsprintf(TmpStr, "Current Sector Number: %lu", DrivePacket->RelativeSector);
m_wndStatusBarCtrl->SetText(TmpStr, 1, 0);
m_wndStatusBarCtrl->SetText("", 0, 0);
return;
}
BOOL CalcCylHeadSect(DRIVEPACKET *DrivePacket, CYLHEADSECT *CylHeadSect)
{
DWORD TmpCyl, TmpSector;
TmpCyl = DrivePacket->Cylinder;
TmpSector = DrivePacket->Sector;
TmpCyl |= ((TmpSector & 0xC0) << 2);
TmpSector &= 0x3f;
DWORD TmpRelSect = (TmpCyl * DrivePacket->TotalHeads +
DrivePacket->Head) * DrivePacket->SectorsPerTrack + TmpSector-1 + DrivePacket->RelativeSector;
CylHeadSect->Sector = TmpRelSect % DrivePacket->SectorsPerTrack + 1;
DWORD CalcSect = TmpRelSect / DrivePacket->SectorsPerTrack;
CylHeadSect->Cylinder = CalcSect/DrivePacket->TotalHeads;
if(CylHeadSect->Cylinder > 1023)
return TRUE;
CylHeadSect->Head = CalcSect % DrivePacket->TotalHeads;
CylHeadSect->Sector |= (CylHeadSect->Cylinder & 0x300) >> 2;
CylHeadSect->Cylinder &= 0xFF;
return FALSE;
}
BOOL LoadSectors(DRIVEPACKET *DrivePacket, CYLHEADSECT *CylHeadSect, LPBYTE Buffer)
{
DRIVEPACKET TmpDP, TmpDrivePacket;
DWORD TmpVal = DrivePacket->NumSectors;
BOOL Int13ExtFlag;
m_wndStatusBarCtrl->SetText("Wait....", 0, 0);
memcpy(&TmpDP, DrivePacket, sizeof(DRIVEPACKET));
if(DrivePacket->Net){
NetEvent = BUFFER_FILL;
BufferNet = Buffer;
BytesToFill = DrivePacket->NumSectors*512;
memcpy(&gDrivePacket, DrivePacket, sizeof(DRIVEPACKET));
NetCalls.Function = LOAD_SECTORS;
memcpy(&NetCalls.DrivePacket, DrivePacket, sizeof(DRIVEPACKET));
send(SocketNum, (char *) &NetCalls, sizeof(SECTORS_FUNC), 0);
CallNet();
}
else if(gOSWin95){
do{
Int13ExtFlag = CalcCylHeadSect(&TmpDP, CylHeadSect);
DWORD TmpNumSectors = TmpDP.SectorsPerTrack - (CylHeadSect->Sector & 0x3F) + 1;
TmpNumSectors = TmpVal > TmpNumSectors ? TmpNumSectors:TmpVal;
if(!(DllThunk32)(DrivePacket->Drive, CylHeadSect->Cylinder, CylHeadSect->Head, CylHeadSect->Sector, TmpNumSectors, Buffer+(DrivePacket->NumSectors - TmpVal) * 512, DrivePacket->NTRelativeSector + TmpDP.RelativeSector, DrivePacket->Flag & Int13ExtFlag)){
if (TmpNumSectors == 1)
return FALSE;
memcpy(&TmpDrivePacket, &TmpDP, sizeof(DRIVEPACKET));
for(int i=0; i<TmpNumSectors; i++){
TmpDrivePacket.NumSectors = 1;
if(!LoadSectors(&TmpDrivePacket, CylHeadSect, (LPBYTE)(Buffer+i*512))){
for(int j=0; j<512; j++){
Buffer[i*512+j] = 0xE5;
}
}
TmpDrivePacket.RelativeSector++;
}
return FALSE;
}
TmpVal -= TmpNumSectors;
TmpDP.RelativeSector += TmpNumSectors;
}while(TmpVal);
}
else{
__int64 Tmp64 = (((__int64) DrivePacket->NTRelativeSector) + ((__int64) DrivePacket->RelativeSector)) * 512;
long TmpVal = Tmp64 & 0xFFFFFFFF;
long TmpValHi = (Tmp64 >> 32);
SetFilePointer(hDisk[DrivePacket->Drive], TmpVal, &TmpValHi, FILE_BEGIN);
TmpVal = 0;
ReadFile(hDisk[DrivePacket->Drive], Buffer, DrivePacket->NumSectors * 512, (DWORD *) &TmpVal, NULL);
if((!TmpVal) && (DrivePacket->Drive < 0x80)){
CloseHandle(hDisk[DrivePacket->Drive]);
char TmpStr[100];
wsprintf(TmpStr, "\\\\.\\%c:", DrivePacket->Drive+'A');
if((hDisk[DrivePacket->Drive]=CreateFile(TmpStr, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, NULL))==INVALID_HANDLE_VALUE){
return FALSE;
}
Tmp64 = (((__int64) DrivePacket->NTRelativeSector) + ((__int64) DrivePacket->RelativeSector)) * 512;
TmpVal = Tmp64 & 0xFFFFFFFF;
TmpValHi = (Tmp64 >> 32);
SetFilePointer(hDisk[DrivePacket->Drive], TmpVal, &TmpValHi, FILE_BEGIN);
TmpVal = 0;
ReadFile(hDisk[DrivePacket->Drive], Buffer, DrivePacket->NumSectors * 512, (DWORD *) &TmpVal, NULL);
}
if(TmpVal != (DrivePacket->NumSectors * 512)){
if (DrivePacket->NumSectors == 1)
return FALSE;
DRIVEPACKET TmpDrivePacket;
memcpy(&TmpDrivePacket, &TmpDP, sizeof(DRIVEPACKET));
for(int i=0; i<DrivePacket->NumSectors; i++){
TmpDrivePacket.NumSectors = 1;
if(!LoadSectors(&TmpDrivePacket, CylHeadSect, (LPBYTE)(Buffer+i*512))){
for(int j=0; j<512; j++){
Buffer[i*512+j] = 0xE5;
}
}
TmpDrivePacket.RelativeSector++;
}
return FALSE;
}
}
return TRUE;
}
BOOL WriteSectors(DRIVEPACKET *DrivePacket, CYLHEADSECT *CylHeadSect, LPBYTE Buffer)
{
DRIVEPACKET TmpDP, TmpDrivePacket;
DWORD TmpVal = DrivePacket->NumSectors;
BOOL Int13ExtFlag;
m_wndStatusBarCtrl->SetText("Wait....", 0, 0);
memcpy(&TmpDP, DrivePacket, sizeof(DRIVEPACKET));
if(DrivePacket->Net){
NetEvent = BUFFER_FILL;
BufferNet = Buffer;
BytesToFill = DrivePacket->NumSectors*512;
memcpy(&gDrivePacket, DrivePacket, sizeof(DRIVEPACKET));
NetCall.Function = WRITE_SECTORS;
memcpy(&NetCalls.DrivePacket, DrivePacket, sizeof(DRIVEPACKET));
send(SocketNum, (char *) &NetCalls, sizeof(SECTORS_FUNC), 0);
CallNet();
}
else if(gOSWin95){
do{
Int13ExtFlag = CalcCylHeadSect(&TmpDP, CylHeadSect);
DWORD TmpNumSectors = TmpDP.SectorsPerTrack - (CylHeadSect->Sector & 0x3F) + 1;
TmpNumSectors = TmpVal > TmpNumSectors ? TmpNumSectors:TmpVal;
if(!(DllThunk32Write)(DrivePacket->Drive, CylHeadSect->Cylinder, CylHeadSect->Head, CylHeadSect->Sector, TmpNumSectors, Buffer+(DrivePacket->NumSectors - TmpVal) * 512, DrivePacket->NTRelativeSector + TmpDP.RelativeSector, DrivePacket->Flag & Int13ExtFlag)){
if (TmpNumSectors == 1)
return FALSE;
memcpy(&TmpDrivePacket, &TmpDP, sizeof(DRIVEPACKET));
for(int i=0; i<TmpNumSectors; i++){
TmpDrivePacket.NumSectors = 1;
WriteSectors(&TmpDrivePacket, CylHeadSect, (LPBYTE)(Buffer+i*512));
TmpDrivePacket.RelativeSector++;
}
return FALSE;
}
TmpVal -= TmpNumSectors;
TmpDP.RelativeSector += TmpNumSectors;
}while(TmpVal);
}
else{
__int64 Tmp64 = (((__int64) DrivePacket->NTRelativeSector) + ((__int64) DrivePacket->RelativeSector)) * 512;
long TmpVal = Tmp64 & 0xFFFFFFFF;
long TmpValHi = (Tmp64 >> 32);
SetFilePointer(hDisk[DrivePacket->Drive], TmpVal, &TmpValHi, FILE_BEGIN);
TmpVal = 0;
WriteFile(hDisk[DrivePacket->Drive], Buffer, DrivePacket->NumSectors * 512, (DWORD *) &TmpVal, NULL);
if((!TmpVal) && (DrivePacket->Drive < 0x80)){
CloseHandle(hDisk[DrivePacket->Drive]);
char TmpStr[100];
wsprintf(TmpStr, "\\\\.\\%c:", DrivePacket->Drive+'A');
if((hDisk[DrivePacket->Drive]=CreateFile(TmpStr, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, NULL))==INVALID_HANDLE_VALUE){
return FALSE;
}
Tmp64 = (((__int64) DrivePacket->NTRelativeSector) + ((__int64) DrivePacket->RelativeSector)) * 512;
TmpVal = Tmp64 & 0xFFFFFFFF;
TmpValHi = (Tmp64 >> 32);
SetFilePointer(hDisk[DrivePacket->Drive], TmpVal, &TmpValHi, FILE_BEGIN);
TmpVal = 0;
WriteFile(hDisk[DrivePacket->Drive], Buffer, DrivePacket->NumSectors * 512, (DWORD *) &TmpVal, NULL);
}
if(TmpVal != (DrivePacket->NumSectors * 512)){
if (DrivePacket->NumSectors == 1)
return FALSE;
DRIVEPACKET TmpDrivePacket;
memcpy(&TmpDrivePacket, &TmpDP, sizeof(DRIVEPACKET));
for(int i=0; i<DrivePacket->NumSectors; i++){
TmpDrivePacket.NumSectors = 1;
WriteSectors(&TmpDrivePacket, CylHeadSect, (LPBYTE)(Buffer+i*512));
TmpDrivePacket.RelativeSector++;
}
return FALSE;
}
}
return TRUE;
}
void DisplayFAT12(DRIVEPACKET *DrivePacket)
{
WORD i;
DeleteColumns();
gListViewType = FAT12;
m_wndStatusBarCtrl->SetText("Wait....", 0, 0);
ListView->InsertColumn(0, "FAT Entry", LVCFMT_LEFT, 100, 0);
for(i=0; i<16; i++){
wsprintf(TmpStr, "%03X", i);
ListView->InsertColumn(i+1, TmpStr, LVCFMT_LEFT, 35, i+1);
}
if(!LoadSectors(DrivePacket, &CylHeadSect, Buffer)){
AfxMessageBox("FAT not accessible!");
return;
}
WORD TmpVal = DrivePacket->NumSectors*64; /*(512/(16*3/2)*/
WORD TmpVal1 = TmpVal % 3;
for(i=0; i<(TmpVal/3 + (TmpVal1 ? 1:0)); i++){
wsprintf(TmpStr, "%08lX", i*16);
ListView->InsertItem(LVIF_TEXT|LVIF_PARAM, i, LPSTR_TEXTCALLBACK, 0, 0, i, (LPARAM) i);
}
wsprintf(TmpStr, "Current Sector Number: %lu", DrivePacket->RelativeSector);
m_wndStatusBarCtrl->SetText(TmpStr, 1, 0);
m_wndStatusBarCtrl->SetText("", 0, 0);
return;
}
void DisplayRootDir(DRIVEPACKET *DrivePacket)
{
WORD i;
DeleteColumns();
gListViewType = ROOT_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);
if(!LoadSectors(DrivePacket, &CylHeadSect, Buffer)){
AfxMessageBox("Root Directory not fully accessible!");
}
if(hMemFilePacket){
LocalUnlock(hMemFilePacket);
LocalFree(hMemFilePacket);
}
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);
DIRECTORY *Directory=(DIRECTORY *)Buffer;
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;
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);
}
wsprintf(TmpStr, "Current Sector Number: %lu", DrivePacket->RelativeSector);
m_wndStatusBarCtrl->SetText(TmpStr, 1, 0);
}
WORD FormLongFileName(DIRECTORY *Directory, char *LfnBuff)
{
WORD TmpLen=0;
char *Lfn = (char *) Directory;
if(((Directory-1)->Attributes & 0xF) != 0xF)
return TmpLen;
do{
Lfn -= 32;
for(int i=0; i<31; i++){
if((i==10) | (i==11) | (i==12) | (i==25) | (i==26))
continue;
LfnBuff[TmpLen++] = Lfn[i+1];
if(Lfn[i+1]==0)
break;
i++; //Skip past the Unicode Hi byte
}
}while(!(Lfn[0] & 0x40));
LfnBuff[TmpLen]=0;
return TmpLen;
}
void EnumTreeRoot(void)
{
char TmpStr1[1000];
LocalUnlock(hMemPackets);
LocalUnlock(hMemDrivePacket);
Packets = (DRIVEPACKET *) LocalLock(hMemPackets);
DrivePacket = (DRIVEPACKET *) LocalLock(hMemDrivePacket);
m_wndStatusBarCtrl->SetText("Wait....", 0, 0);
for(DWORD i=0; i<NumFloppies; i++){
wsprintf(TmpStr, "Floppy Disk %lu", i+1);
TvI.mask = TVIF_CHILDREN | TVIF_TEXT | TVIF_PARAM;
TvI.pszText = TmpStr;
TvI.cChildren = 1;
TvI.lParam = (long)DrivePacket;
DrivePacket->Drive = (WORD) i;
DrivePacket->Cylinder = 0;
DrivePacket->Head = 0;
DrivePacket->Sector = 1;
DrivePacket->NumSectors = 1;
DrivePacket->Type = BOOT_RECORD;
DrivePacket->RelativeSector = 0;
DrivePacket->NTRelativeSector = 0;
DrivePacket->Flag = 0;
TvIns.item = TvI;
TvIns.hParent = TVI_ROOT;
TvIns.hInsertAfter = TVI_LAST;
DiskTree->InsertItem((LPTVINSERTSTRUCT) &TvIns);
DrivePacket++;
}
for(i=0;;i++){
if(gOSWin95){
if(!(DllThunk32)(i+0x80, 0, 0, 1, 1, (LPBYTE) TmpStr1, 0, FALSE))
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -