📄 diskutilview.cpp
字号:
// DiskUtilView.cpp : implementation of the CDiskUtilView class
//
#include "stdafx.h"
#include "DiskUtil.h"
#include "DiskUtilDoc.h"
#include "DiskUtilView.h"
#include "General.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CListCtrl *ListView;
extern char TmpStr[];
extern LPBYTE Buffer;
extern int gCurrentIndex, gSectorsPerCluster;
BYTE gListViewType;
char *Months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
BYTE gHexaBytes[50];
extern HMENU Menu;
/////////////////////////////////////////////////////////////////////////////
// CDiskUtilView
IMPLEMENT_DYNCREATE(CDiskUtilView, CListView)
BEGIN_MESSAGE_MAP(CDiskUtilView, CListView)
//{{AFX_MSG_MAP(CDiskUtilView)
ON_NOTIFY_REFLECT(LVN_GETDISPINFO, OnGetdispinfo)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDiskUtilView construction/destruction
CDiskUtilView::CDiskUtilView()
{
// TODO: add construction code here
}
CDiskUtilView::~CDiskUtilView()
{
}
BOOL CDiskUtilView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
cs.style |= LVS_REPORT | LVS_SHOWSELALWAYS;
cs.style &= ~LVS_ICON;
return CListView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CDiskUtilView drawing
void CDiskUtilView::OnDraw(CDC* pDC)
{
CDiskUtilDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
void CDiskUtilView::OnInitialUpdate()
{
CListView::OnInitialUpdate();
CListCtrl &ab = GetListCtrl();
ListView = &ab;
ab.SetExtendedStyle(LVS_EX_FULLROWSELECT);
// TODO: You may populate your ListView with items by directly accessing
// its list control through a call to GetListCtrl().
}
/////////////////////////////////////////////////////////////////////////////
// CDiskUtilView diagnostics
#ifdef _DEBUG
void CDiskUtilView::AssertValid() const
{
CListView::AssertValid();
}
void CDiskUtilView::Dump(CDumpContext& dc) const
{
CListView::Dump(dc);
}
CDiskUtilDoc* CDiskUtilView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDiskUtilDoc)));
return (CDiskUtilDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CDiskUtilView message handlers
void CDiskUtilView::OnStyleChanged(int nStyleType, LPSTYLESTRUCT lpStyleStruct)
{
//TODO: add code to react to the user changing the view style of your window
}
void CDiskUtilView::OnGetdispinfo(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
// TODO: Add your control notification handler code here
DWORD TmpVal;
TmpStr[0]=0;
switch(gListViewType)
{
case FAT16:
if(!pDispInfo->item.iSubItem)
wsprintf(TmpStr, "%08lX", pDispInfo->item.lParam/2);
else
wsprintf(TmpStr, "%04X", (WORD) (Buffer[pDispInfo->item.lParam+(pDispInfo->item.iSubItem-1)*2]+
Buffer[pDispInfo->item.lParam+(pDispInfo->item.iSubItem-1)*2+1]*256));
break;
case FAT12:
if(!pDispInfo->item.iSubItem)
wsprintf(TmpStr, "%08lX", pDispInfo->item.lParam*16);
else{
if(((pDispInfo->item.iSubItem-1)+(pDispInfo->item.lParam*16))%2){ //If it is odd number
if(pDispInfo->item.iSubItem==16)
TmpVal=0;
TmpVal = pDispInfo->item.lParam*24+((pDispInfo->item.iSubItem-1)*3)/2;
TmpVal = ((WORD)Buffer[TmpVal] + ((WORD)Buffer[TmpVal+1])*256) >> 4;
}
else{
TmpVal = pDispInfo->item.lParam*24+((pDispInfo->item.iSubItem-1)*3)/2;
TmpVal = ((WORD)Buffer[TmpVal] + (WORD)Buffer[TmpVal+1]*256) & 0xFFF;
}
wsprintf(TmpStr, "%03X", TmpVal);
}
break;
case FAT32:
if(!pDispInfo->item.iSubItem)
wsprintf(TmpStr, "%08lX", pDispInfo->item.lParam/4);
else
wsprintf(TmpStr, "%08X", (DWORD) (((DWORD) Buffer[(DWORD)pDispInfo->item.lParam+(pDispInfo->item.iSubItem-1)*4])+
((DWORD) Buffer[pDispInfo->item.lParam+((DWORD)pDispInfo->item.iSubItem-1)*4+1]<<8) + ((DWORD) Buffer[pDispInfo->item.lParam+((DWORD)pDispInfo->item.iSubItem-1)*4+2]<<16)
+ ((DWORD) Buffer[pDispInfo->item.lParam+((DWORD)pDispInfo->item.iSubItem-1)*4+3]<<24)) & 0xFFFFFFF );
break;
case SUB_DIR:
case ROOT_DIR:{
FILEPACKET *FilePacket = (FILEPACKET *) pDispInfo->item.lParam;
switch(pDispInfo->item.iSubItem)
{
case MS_DOS:
strcpy(TmpStr, FilePacket->Name);
break;
case LFN:
strcpy(TmpStr, FilePacket->Lfn);
break;
case START_CLUS:
wsprintf(TmpStr, "%08X", FilePacket->StartCluster);
break;
case ATTR:
strcpy(TmpStr, FilePacket->Attributes & ATTR_READ ? "R":"");
strcat(TmpStr, FilePacket->Attributes & ATTR_HIDDEN ? "H":"");
strcat(TmpStr, FilePacket->Attributes & ATTR_SYSTEM ? "S":"");
strcat(TmpStr, FilePacket->Attributes & ATTR_ARCHIVE ? "A":"");
strcat(TmpStr, FilePacket->Attributes & ATTR_VOLUME ? "V":"");
strcat(TmpStr, FilePacket->Attributes & ATTR_SUBDIR ? "D":"");
// if(FilePacket->Name[0] == 0xE5)
// TmpStr[0]=0;
strcat(TmpStr, (((BYTE)FilePacket->Name[0] == 0xE5) | (FilePacket->Name[0] == 0x05)) ? "-Deleted":"");
break;
case SIZE:
wsprintf(TmpStr, "%lu", FilePacket->Size);
break;
case DATETIME:{
if(!FilePacket->Date)
break;
WORD Year = FilePacket->Date >> 9;
WORD Month = (FilePacket->Date & 0x1E0) >> 5;
WORD Day = FilePacket->Date & 0x1F;
WORD Hour = FilePacket->Time >> 11;
WORD Minute = (FilePacket->Time & 0x7E0) >> 5;
WORD Second = (FilePacket->Time & 0x1F) << 1;
wsprintf(TmpStr, "%u %s %u %u:%02u:%02u", Day, Months[Month-1], Year+1980, Hour, Minute, Second);
break;
}
case CREATEDATE:{
if(!FilePacket->CreateDate)
break;
WORD Year = FilePacket->CreateDate >> 9;
WORD Month = (FilePacket->CreateDate & 0x1E0) >> 5;
WORD Day = FilePacket->CreateDate & 0x1F;
// WORD Hour = FilePacket->Time >> 11;
// WORD Minute = (FilePacket->Time & 0x7E0) >> 5;
// WORD Second = (FilePacket->Time & 0x1F) << 1;
wsprintf(TmpStr, "%u %s %u", Day, Months[Month-1], Year+1980);
break;
}
case ACCESSDATE:{
if(!FilePacket->AccessDate)
break;
WORD Year = FilePacket->AccessDate >> 9;
WORD Month = (FilePacket->AccessDate & 0x1E0) >> 5;
WORD Day = FilePacket->AccessDate & 0x1F;
// WORD Hour = FilePacket->Time >> 11;
// WORD Minute = (FilePacket->Time & 0x7E0) >> 5;
// WORD Second = (FilePacket->Time & 0x1F) << 1;
wsprintf(TmpStr, "%u %s %u", Day, Months[Month-1], Year+1980);
break;
}
}
break;
}
case FILES_FOLDERS:
case RAW_DUMP:
case UNKNOWN:
case SECTORS_DUMP:
if(!pDispInfo->item.iSubItem)
wsprintf(TmpStr, "%08X", pDispInfo->item.lParam*16 + gCurrentIndex * gSectorsPerCluster * 512);
else{
if(pDispInfo->item.iSubItem==17)
break;
else if(pDispInfo->item.iSubItem>17){
wsprintf(TmpStr, "%c", Buffer[pDispInfo->item.lParam*16 + pDispInfo->item.iSubItem - 18]);
}
else
wsprintf(TmpStr, "%02X", Buffer[pDispInfo->item.lParam*16 + pDispInfo->item.iSubItem - 1]);
}
break;
}
pDispInfo->item.pszText = TmpStr;
*pResult = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -