⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 biosdisk.cpp

📁 使用的是API编程,可格式化、校验和读写特殊扇区。可用作Windows下的磁盘加密。本函数还有以下两个缺点以待改进: 1.本函数还只能读能读 A: 和 B:,即只能对软盘操作 2.不能改变磁盘扇区大小
💻 CPP
📖 第 1 页 / 共 2 页
字号:
TEXTMETRIC tm;
PAINTSTRUCT ps;
char ctemp[100];
unsigned char num[]="0123456789ABCDEF";
unsigned char c;
static int i,j,cKeyX,cKeyY,is_set=0,is_asc,cHexEdit=0;
CREATESTRUCT *ct;
switch(iMsg)
{
case WM_CREATE:
	 ct=(CREATESTRUCT *)lParam;
	 pHexEdit[cHexEdit]=(HEXEDIT *)GlobalAlloc(GPTR,sizeof HEXEDIT);
	 pNow=pHexEdit[cHexEdit];
	 pNow->buffer=buffer[cHexEdit];
     cHexEdit++;
	 pNow->is_readonly=0;
	 pNow->start=0;
	 pNow->line=5;
	 pNow->totle=32;
	 pNow->hwnd=hwnd;
	 pNow->is_show=0;
	 return 0;
case WM_MOUSEMOVE:
	 SetCursor(LoadCursor(NULL,IDC_IBEAM));
	 break;
case WM_LBUTTONDOWN:
	 for(i=0;i<cHexEdit;i++)
	 {
	  if(pHexEdit[i]->hwnd==hwnd)
	  {pNow=pHexEdit[i];
	   break;
	  }
	 }
     cKeyX=LOWORD(lParam)/cxChar;
	 cKeyY=HIWORD(lParam)/cyChar;
	 if(cKeyX<absX||cKeyY>pNow->line-1||cKeyX>=absX+15*3+2&&cKeyX<ascX+absX)break;
	 cKeyX-=absX;
     SetFocus(hwnd);
	 CreateCaret(hwnd,NULL,0,cyChar); 
     ShowCaret(hwnd); 
	 if(cKeyX>=ascX)
	      is_asc=1;
	 else 
	 {
	  if(cKeyX%3==2)
	  {if(cKeyX>0)cKeyX--;
	   else cKeyX++;
	  }
	  is_asc=0;
	 }
     SetCaretPos((cKeyX+absX)*cxChar,cKeyY*cyChar);
	 pNow->is_show=1;
	 break;
case WM_SETFOCUS:
	 CreateCaret(hwnd,NULL,0,cyChar); 
	 SetCaretPos((cKeyX+absX)*cxChar,cKeyY*cyChar);
     ShowCaret(hwnd); 
     break;
case WM_KILLFOCUS:
	 HideCaret(hwnd);
	 break;
case WM_CHAR:
	 for(i=0;i<cHexEdit;i++)
	 {
	  if(pHexEdit[i]->hwnd==hwnd)
	  {pNow=pHexEdit[i];
	   break;
	  }
	 }
	 if(pNow->is_readonly)break;
	 if(is_asc)
	 {
	  c=(TCHAR)wParam;
	  if(c==9)break;
	  pNow->buffer[cKeyX-ascX+(cKeyY+pNow->start)*16]=c;
	  outxy(hwnd,cKeyX-ascX,cKeyY,c);
	  //SendMessage(hwnd,WM_KEYDOWN,VK_RIGHT,0);
      if(cKeyX<ascX+15)cKeyX++;
		  else 
		  {
		  if(cKeyY==pNow->line-1&&pNow->start+pNow->line-1==pNow->totle)break;
		  if(cKeyY==pNow->line-1)
		  {pNow->start++;
		   //InvalidateRect(hwnd,NULL,TRUE);
		  ScrollWindow(hwnd,0,-cyChar,NULL,NULL);
		  }
		  else cKeyY++;
          cKeyX=ascX;
		  }
	  SetCaretPos((cKeyX+absX)*cxChar,cKeyY*cyChar);	   
	 }
	 else
	 {
	  c=(TCHAR)wParam;
      CharUpperBuff((char *)&c,1);
	  for(i=0;i<16;i++)
	   if(c==num[i])
	   {j=cKeyX/3;
		if(cKeyX%3==0)
		pNow->buffer[j+(cKeyY+pNow->start)*16]=(pNow->buffer[j+(cKeyY+pNow->start)*16]&0x0f)|(i*0x10);
        else
		pNow->buffer[j+(cKeyY+pNow->start)*16]=(pNow->buffer[j+(cKeyY+pNow->start)*16]&0xf0)|i;
		//InvalidateRect(hwnd,NULL,TRUE);
		outxy(hwnd,j,cKeyY,pNow->buffer[j+(cKeyY+pNow->start)*16]);
		//SendMessage(hwnd,WM_KEYDOWN,VK_RIGHT,0);
        if(cKeyX==16*3-2)
		 {
          if(cKeyY==pNow->line-1&&pNow->start+pNow->line-1==pNow->totle)break;
		  if(cKeyY==pNow->line-1)
		  {pNow->start++;
		   //InvalidateRect(hwnd,NULL,TRUE);
		   ScrollWindow(hwnd,0,-cyChar,NULL,NULL);
		  }
		  else cKeyY++;
		  cKeyX=0;
		 }
		 else
		 {if(cKeyX%3==1)cKeyX+=2;
		  else cKeyX++;
		 }
        SetCaretPos((cKeyX+absX)*cxChar,cKeyY*cyChar); 
		break;
	   }
	 }
	 break;
case WM_KEYDOWN:
	 switch(wParam)
	 {
     case VK_TAB:
		 is_asc=!is_asc;
		 if(is_asc)cKeyX=cKeyX/3+ascX;
		 else cKeyX=(cKeyX-ascX)*3;
		 SetCaretPos((cKeyX+absX)*cxChar,cKeyY*cyChar);
		 break;
	 case VK_LEFT:
		 if(!is_asc)
		 {
		  if(cKeyX==0)
		  {if(cKeyY==0&&pNow->start==0)break;
		   if(cKeyY==0)
		   {pNow->start--;
		   //InvalidateRect(hwnd,NULL,TRUE);
		   ScrollWindow(hwnd,0,cyChar,NULL,NULL);
		   }
		   else cKeyY--;
		   cKeyX=15*3+1;
		  }
		  else if(cKeyX%3==0)cKeyX-=2;
		  else cKeyX--;
		 }
		 else
		 {
		  if(cKeyX>ascX)cKeyX--;
		  else 
		  {if(cKeyY==0&&pNow->start==0)break;
		   if(cKeyY==0)
		   {pNow->start--;
		    //InvalidateRect(hwnd,NULL,TRUE);
			ScrollWindow(hwnd,0,cyChar,NULL,NULL);
		   }
		   else cKeyY--;
		   cKeyX=ascX+15;
		  }
		 }
		 is_set=1;
		 break;
     case VK_HOME:
		 pNow->start=0;
		 cKeyY=0;
		 cKeyX=is_asc*ascX;
         InvalidateRect(hwnd,NULL,TRUE); 
         SetCaretPos((cKeyX+absX)*cxChar,cKeyY*cyChar);
		 break;
	case VK_END:
		 pNow->start=pNow->totle-pNow->line;
		 cKeyY=pNow->line-1;
		 cKeyX=is_asc?ascX+15:15*3;
         InvalidateRect(hwnd,NULL,TRUE); 
         SetCaretPos((cKeyX+absX)*cxChar,cKeyY*cyChar);
		 break;
     case 33:
		 if(pNow->start==0)break;
		 if(pNow->start<pNow->line)
		 {pNow->start=0;
		  cKeyY=0;
		  SetCaretPos((cKeyX+absX)*cxChar,cKeyY*cyChar);
		 }
          else pNow->start-=pNow->line;
		  //InvalidateRect(hwnd,NULL,TRUE);
		  ScrollWindow(hwnd,0,cyChar*pNow->line,NULL,NULL);
		  break;
     case 34: //PAGEDOWN
		 if(pNow->start==pNow->totle-pNow->line)break;
		 if(pNow->start+pNow->line*2>pNow->totle)
		 {pNow->start=pNow->totle-pNow->line;
		  cKeyY=pNow->line-1;
		  SetCaretPos((cKeyX+absX)*cxChar,cKeyY*cyChar);
		 }
		 else pNow->start+=pNow->line;
		 //InvalidateRect(hwnd,NULL,TRUE);
		 ScrollWindow(hwnd,0,-cyChar*pNow->line,NULL,NULL);
		 break;
	 case VK_RIGHT:
		 if(!is_asc)
		 {
		 if(cKeyX==16*3-2)
		 {
          if(cKeyY==pNow->line-1&&pNow->start+pNow->line-1==pNow->totle)break;
		  if(cKeyY==pNow->line-1)
		  {pNow->start++;
		   //InvalidateRect(hwnd,NULL,TRUE);
		   ScrollWindow(hwnd,0,-cyChar,NULL,NULL);
		  }
		  else cKeyY++;
		  cKeyX=0;
		 }
		 else
		 {if(cKeyX%3==1)cKeyX+=2;
		  else cKeyX++;
		 }
		 }
		 else
		 {if(cKeyX<ascX+15)cKeyX++;
		  else 
		  {
		  if(cKeyY==pNow->line-1&&pNow->start+pNow->line-1==pNow->totle)break;
		  if(cKeyY==pNow->line-1)
		  {pNow->start++;
		   //InvalidateRect(hwnd,NULL,TRUE);
		  ScrollWindow(hwnd,0,-cyChar,NULL,NULL);
		  }
		  else cKeyY++;
          cKeyX=ascX;
		  }
		 }
		 is_set=1;
		 break; 
     case VK_UP:
		 if(cKeyY==0)
		 {
          if(pNow->start)
		  {pNow->start--;
		   //InvalidateRect(hwnd,NULL,TRUE);
		   ScrollWindow(hwnd,0,cyChar,NULL,NULL);
		  }
		 }
		 else 
		 {
		  cKeyY--;
		  is_set=1;
         }
		 break;
     case VK_DOWN:
		 if(cKeyY==pNow->line-1)
		 {if(pNow->start+pNow->line==pNow->totle)break;
		   pNow->start++;
		   InvalidateRect(hwnd,NULL,TRUE);
		   ScrollWindow(hwnd,0,-cyChar,NULL,NULL);
		   break;
		 }
		 cKeyY++;
		 is_set=1;
         break;
	 }
	 if(is_set)
	 {
	  SetCaretPos((cKeyX+absX)*cxChar,cKeyY*cyChar);
	  is_set=0;
	 }
	 return 0;
case WM_PAINT:
	for(i=0;i<cHexEdit;i++)
	 {
	  if(pHexEdit[i]->hwnd==hwnd)
	  {pNow=pHexEdit[i];
	   break;
	  }
	 }
     if(pNow->is_show)HideCaret(hwnd); 
	 hdc=BeginPaint(hwnd,&ps);
	 SelectObject(hdc,GetStockObject(DEFAULT_GUI_FONT));
	 GetTextMetrics(hdc,&tm);
	 cxChar=tm.tmAveCharWidth;
	 cyChar=tm.tmHeight+tm.tmExternalLeading;
	 for(j=pNow->start;j<pNow->totle;j++)
	 {
     wsprintf(ctemp,"%03d(%03X)",j*16,j*16);
	 TextOut(hdc,cxChar,cyChar*(j-pNow->start),ctemp,8);
	 for(i=0;i<16;i++)
	 {
	  wsprintf(ctemp,"%02X ",pNow->buffer[i+j*16]);
      TextOut(hdc,cxChar*(i*3+11),cyChar*(j-pNow->start),ctemp,2);
	  if(isprint(pNow->buffer[i+j*16]))TextOut(hdc,cxChar*(i+ascX+absX),cyChar*(j-pNow->start),(char *)(pNow->buffer+i+j*16),1);
	  else TextOut(hdc,cxChar*(i+ascX+absX),cyChar*(j-pNow->start),".",1);
	 }
	 }
	 EndPaint(hwnd,&ps);
	 if(pNow->is_show)
	 {CreateCaret(hwnd,NULL,0,cyChar); 
	  SetCaretPos((cKeyX+absX)*cxChar,cKeyY*cyChar);
	  ShowCaret(hwnd);
	 }
     break;
}
return DefWindowProc (hwnd, iMsg, wParam, lParam);
}

void RegisterEdit(void)
{
     WNDCLASSEX  wndclass;
     wndclass.cbSize        = sizeof (wndclass) ;
     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
     wndclass.lpfnWndProc   = EditProc ;
     wndclass.cbClsExtra    = 0 ;
     wndclass.cbWndExtra    = 0 ;
     wndclass.hInstance     = hInst;
     wndclass.hIcon         = NULL ;
     wndclass.hCursor       = NULL;
     wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
     wndclass.lpszMenuName  = NULL ;
     wndclass.lpszClassName = szEditName ;
     wndclass.hIconSm       = NULL;
     RegisterClassEx (&wndclass);
}

char tempbuffer[8196];
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
LPSTR lpszButtonText[]={"格式扇区","写入扇区","读取扇区","退出程序","磁盘A","磁盘B","原函数","动态库"};
LPSTR lpszMsgText[5]={"磁头号","磁道号","扇区号","写入数据:","读出数据:"};
LPSTR lpszEditText[]={"0","81","100"},lpszCh[]={"↑","↓","↑↓","比较"};

PAINTSTRUCT ps;
HDC hdc;
int i,j,k;
switch(iMsg)
{
   case WM_CREATE:
	   wsprintf((char *)buffer[0],"Encrypt DATA");
	   hwndSt=CreateWindowEx(WS_EX_TRANSPARENT,"STATIC",
					NULL,WS_CHILD|WS_VISIBLE|SS_ETCHEDFRAME|WS_GROUP|WS_TABSTOP,
                    20,text_y-7,win_x-45,28,hwnd,(HMENU)50,hInst,NULL);
	   hwndSt2=CreateWindowEx(WS_EX_TRANSPARENT,"STATIC",
					NULL,WS_CHILD|WS_VISIBLE|SS_ETCHEDFRAME|WS_GROUP|WS_TABSTOP,
                    win_x-220,text_y-40,195,26,hwnd,(HMENU)52,hInst,NULL);
	    for(i=0;i<3;i++)
		{
		 hwndEdit[i]=CreateWindowEx(WS_EX_STATICEDGE,"Edit",lpszEditText[i],WS_CHILD|ES_NUMBER|ES_RIGHT|WS_TABSTOP|WS_VISIBLE,
			 text_x+20+i*85,5,(i>1?5:0)+25,18,hwndSt,(HMENU)(i+11),hInst,0);
		 hwndtemp=CreateWindow("STATIC",lpszMsgText[i],WS_CHILD|SS_LEFT|WS_VISIBLE,
			 text_x+85*i,text_y,40,22,hwnd,(HMENU)(200+i),hInst,0);
		 SendMessage(hwndtemp,WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT),MAKELPARAM(TRUE,0));
		}
		for(i=0;i<4;i++)
		{hwndCh[i]=CreateWindow("Button",lpszCh[i],WS_CHILD|BS_PUSHBUTTON|WS_VISIBLE,
		win_x-160+i*30+(i==3?10:0),text_y+125,25+(i>=2?10:0),20,hwnd,(HMENU)(i+400),hInst,0);
		 SendMessage(hwndCh[i],WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT),MAKELPARAM(TRUE,0));
		 hwndButton[i]=CreateWindow("Button",lpszButtonText[i],WS_CHILD|BS_PUSHBUTTON|WS_VISIBLE|WS_TABSTOP,
			 (win_x-85*4)/2+i*85,win_y-55,75,22,hwnd,(HMENU)(i+100),hInst,0);
		 SendMessage(hwndButton[i],WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT),MAKELPARAM(TRUE,0));
		}
		RegisterEdit();
        hwndEdit[3]=CreateWindowEx(WS_EX_STATICEDGE,szEditName,NULL,WS_CHILD|WS_VISIBLE,
			 10,text_y+45,win_x-27,73,hwnd,(HMENU)(10),hInst,0);
        hwndEdit[4]=CreateWindowEx(WS_EX_STATICEDGE,szEditName,NULL,WS_CHILD|WS_VISIBLE|ES_READONLY,
			 10,text_y+150,win_x-27,73,hwnd,(HMENU)(11),hInst,0);
		for(i=0;i<2;i++)
		{
		 hwndButton[i+4]=CreateWindow("Button",lpszButtonText[4+i],WS_CHILD|BS_AUTORADIOBUTTON|WS_VISIBLE|WS_GROUP*(1-i),
			 20+i*65,4,60,20,hwndSt,(HMENU)(i+104),hInst,0);
		 SendMessage(hwndButton[i+4],WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT),MAKELPARAM(TRUE,0));
		 //SendMessage(hwndEdit[3+i],WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT),MAKELPARAM(TRUE,0));
		 hwndtemp=CreateWindow("STATIC",lpszMsgText[i+3],WS_CHILD|SS_LEFT|WS_VISIBLE,
			 20,text_y+30+i*105,80,15,hwnd,(HMENU)(300+i),hInst,0);
		 SendMessage(hwndtemp,WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT),MAKELPARAM(TRUE,0));
		}
		for(i=0;i<2;i++)
		{
         hwndButton[6+i]=CreateWindow("Button",lpszButtonText[6+i],WS_CHILD|BS_AUTORADIOBUTTON|WS_VISIBLE|WS_GROUP*(1-i),
			 35+i*75,4,60,20,hwndSt2,(HMENU)i+105,hInst,0);
		 SendMessage(hwndButton[6+i],WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT),MAKELPARAM(TRUE,0));
		}
		SendMessage(hwndButton[4],BM_SETCHECK,BST_CHECKED,0);
		SendMessage(hwndButton[6],BM_SETCHECK,BST_CHECKED,0);
		//SetWindowText(hwndEdit[3],"Encrypt DATA");
		
	    break;
   case WM_PAINT:
	    hdc=BeginPaint(hwnd,&ps);
		SetBkMode(hdc,TRANSPARENT);
		SetTextColor(hdc,0xfFFFFF);
		TextOut(hdc,33,text_y-36,"磁盘编辑程序 Ver1.0    周化",27);
		SetTextColor(hdc,0xff0000);
		TextOut(hdc,32,text_y-37,"磁盘编辑程序 Ver1.0    周化",27);
        EndPaint(hwnd,&ps);
	    break;
   case WM_COMMAND:
	    switch(LOWORD(wParam))
		{
        case 100: 
        case 101:
		case 102:	
			SubProc(hwnd,LOWORD(wParam)-100);
            break;
		case 103:
			PostQuitMessage(0);
			break;
        case 400:
			memcpy(buffer[0],buffer[1],512);
			InvalidateRect(hwndEdit[3],NULL,TRUE);
			break;
        case 401:
			memcpy(buffer[1],buffer[0],512);
			InvalidateRect(hwndEdit[4],NULL,TRUE);
			break;
        case 402:
			 memcpy(tempbuffer,buffer[0],512);
			 memcpy(buffer[0],buffer[1],512);
			 memcpy(buffer[1],tempbuffer,512);
             InvalidateRect(hwndEdit[3],NULL,TRUE);
			 InvalidateRect(hwndEdit[4],NULL,TRUE);
			 break;
		case 403:
			k=0;
			j=0;
			for(i=0;i<512;i++)
			 if(buffer[0][i]!=buffer[1][i])
			 {k++;
              wsprintf(tempbuffer,"发现不同次数:%d\n\n%03d(%03X):  %02d(%02X) <=> %02d(%02X)",k,i,i,buffer[0][i],buffer[0][i],buffer[1][i],buffer[1][i]);
			  j=MessageBoxEx(hwnd,tempbuffer,"比较数据",MB_OKCANCEL,0x804);
			  if(j==IDCANCEL)break;
			 }
		  	 if(j!=IDCANCEL)MessageBoxEx(hwnd,"比较结束!"," ",MB_OK|MB_ICONINFORMATION,0x804);
        }
		break;
   case WM_DESTROY:
	     PostQuitMessage(0);
		 break;
}
return DefWindowProc (hwnd, iMsg, wParam, lParam);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -