亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? gethdserial.cpp

?? 用vc獲取硬盤序列號,564016getHDSerial
?? CPP
字號:
// GetHDSerial.cpp: implementation of the CGetHDSerial class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "GetHDSerial.h"

	
char  m_buffer[256];
WORD  m_serial[256];
DWORD m_OldInterruptAddress;
DWORDLONG m_IDTR;

// 等待硬盤空閑
static unsigned int WaitHardDiskIdle() 
{ 
	BYTE byTemp;

Waiting:
	_asm
	{
		mov dx, 0x1f7
		in al, dx
		cmp al, 0x80
		jb Endwaiting
		jmp Waiting
	}
Endwaiting:
	_asm
	{
		mov byTemp, al
	}
	return byTemp; 
} 

//中斷服務程序
void  _declspec( naked )InterruptProcess(void)
{
	 int   byTemp;
     int   i;
	 WORD temp;
	 //保存寄存器值
     _asm
     {
         push eax
         push ebx
         push ecx
         push edx
         push esi
     }
      
     WaitHardDiskIdle();//等待硬盤空閑狀態
     _asm
	 {
	     mov dx, 0x1f6
		 mov al, 0xa0
		 out dx, al
	 }
	 byTemp = WaitHardDiskIdle(); //若直接在Ring3級執行等待命令,會進入死循環
	 if ((byTemp&0x50)!=0x50) 
	 {
		_asm  // 恢復中斷現場并退出中斷服務程序
		{
            pop esi
            pop edx
			pop ecx
			pop ebx
			pop eax
			iretd
		}
	 }
		
	 _asm
	 {
		 mov dx, 0x1f6 //命令端口1f6,選擇驅動器0
		 mov al, 0xa0
	 	 out dx, al
		 inc dx
		 mov al, 0xec
		 out dx, al //發送讀驅動器參數命令
	 }	
	 byTemp = WaitHardDiskIdle(); 
	 if ((byTemp&0x58)!=0x58) 
     {
		_asm  // 恢復中斷現場并退出中斷服務程序
		{
			 pop esi
			 pop edx
			 pop ecx
			 pop ebx
			 pop eax
			 iretd
		}
	 }
     //讀取硬盤控制器的全部信息
	 for (i=0;i<256;i++) 
	 {
		 _asm
		 {
			 mov dx, 0x1f0
			 in ax, dx
	 		 mov temp, ax
		 }
		 m_serial[i] = temp; 
	 }                                
 	 _asm
	 {
         pop esi
	     pop edx
         pop ecx
         pop ebx
         pop eax
		 iretd
     }	
}
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CGetHDSerial::CGetHDSerial()
{

}

CGetHDSerial::~CGetHDSerial()
{

}
// 讀取硬盤序列號函數
char* CGetHDSerial::GetHDSerial()
{	
  m_buffer[0]='\n';
  // 得到當前操作系統版本
  OSVERSIONINFO OSVersionInfo;
  OSVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  GetVersionEx( &OSVersionInfo);
  if (OSVersionInfo.dwPlatformId != VER_PLATFORM_WIN32_NT)
  {   
	  // Windows 9x/ME下讀取硬盤序列號
	  WORD m_wWin9xHDSerial[256];
	  Win9xReadHDSerial(m_wWin9xHDSerial);  
      strcpy (m_buffer, WORDToChar (m_wWin9xHDSerial, 10, 19));
  }
  else
  {
      // Windows NT/2000/XP下讀取硬盤序列號
	  DWORD m_wWinNTHDSerial[256];  
	  // 判斷是否有SCSI硬盤
      if ( ! WinNTReadIDEHDSerial(m_wWinNTHDSerial)) 
	       WinNTReadSCSIHDSerial(m_wWinNTHDSerial);  
      strcpy (m_buffer, DWORDToChar (m_wWinNTHDSerial, 10, 19));
  }	
  return m_buffer;
}

// Windows9X/ME系統下讀取硬盤序列號
void _stdcall CGetHDSerial::Win9xReadHDSerial(WORD * buffer)
{	
	int i;		
	for(i=0;i<256;i++) 
		buffer[i]=0;
    _asm
    {
      	push eax        
        //獲取修改的中斷的中斷描述符(中斷門)地址
        sidt m_IDTR	
        mov eax,dword ptr [m_IDTR+02h]        
        add eax,3*08h+04h
        cli
        //保存原先的中斷入口地址
        push ecx
        mov ecx,dword ptr [eax]
        mov cx,word ptr [eax-04h]
        mov dword ptr m_OldInterruptAddress,ecx
        pop ecx
        //設置修改的中斷入口地址為新的中斷處理程序入口地址
        push ebx
        lea ebx,InterruptProcess	
        mov word ptr [eax-04h],bx
        shr ebx,10h
        mov word ptr [eax+02h],bx
        pop ebx
        //執行中斷,轉到Ring 0(類似CIH病毒原理)
		int 3h
        //恢復原先的中斷入口地址
        push ecx
        mov ecx,dword ptr m_OldInterruptAddress
        mov word ptr [eax-04h],cx
        shr ecx,10h
        mov word ptr [eax+02h],cx
        pop ecx
        sti
        pop eax
    } 
	for(i=0;i<256;i++)		
		buffer[i]=m_serial[i];
}

// Windows 9x/ME系統下,將字類型(WORD)的硬盤信息轉換為字符類型(char)
char * CGetHDSerial::WORDToChar (WORD diskdata [256], int firstIndex, int lastIndex)
{
   static char string [1024];
   int index = 0;
   int position = 0;

   // 按照高字節在前,低字節在后的順序將字數組diskdata 中內容存入到字符串string中 
   for (index = firstIndex; index <= lastIndex; index++)
   {
      // 存入字中的高字節
      string [position] = (char) (diskdata [index] / 256);
      position++;
      // 存入字中的低字節
      string [position] = (char) (diskdata [index] % 256);
      position++;
   }
   //  添加字符串結束標志
   string [position] = '\0';

   //  刪除字符串中空格
   for (index = position - 1; index > 0 && ' ' == string [index]; index--)
      string [index] = '\0';

   return string;
}

// Windows NT/2000/XP系統下,將雙字類型(DWORD)的硬盤信息轉換為字符類型(char)
char* CGetHDSerial::DWORDToChar (DWORD diskdata [256], int firstIndex, int lastIndex)
{
   static char string [1024];
   int index = 0;
   int position = 0;

   // 按照高字節在前,低字節在后的順序將雙字中的低字存入到字符串string中 
   for (index = firstIndex; index <= lastIndex; index++)
   {
      // 存入低字中的高字節
      string [position] = (char) (diskdata [index] / 256);
      position++;
      // 存入低字中的低字節
      string [position] = (char) (diskdata [index] % 256);
      position++;
   }
   //  添加字符串結束標志
   string [position] = '\0';

   //  刪除字符串中空格
   for (index = position - 1; index > 0 && ' ' == string [index]; index--)
      string [index] = '\0';

   return string;
}

// Windows NT/2000/XP下讀取IDE硬盤序列號
BOOL CGetHDSerial::WinNTReadIDEHDSerial(DWORD * buffer)
{
   BYTE IdOutCmd [sizeof (SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1];
   BOOL bFlag = FALSE;
   int  drive = 0;
   char driveName [256];
   HANDLE hPhysicalDriveIOCTL = 0;    
      
   sprintf (driveName, "\\\\.\\PhysicalDrive%d", drive);
   //  Windows NT/2000/XP下創建文件需要管理員權限
   hPhysicalDriveIOCTL = CreateFile (driveName,
                            GENERIC_READ | GENERIC_WRITE, 
                            FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
                            OPEN_EXISTING, 0, NULL);

   if (hPhysicalDriveIOCTL != INVALID_HANDLE_VALUE)
   {
       GETVERSIONOUTPARAMS VersionParams;
       DWORD               cbBytesReturned = 0;

       // 得到驅動器的IO控制器版本
       memset ((void*) &VersionParams, 0, sizeof(VersionParams));
       if(DeviceIoControl (hPhysicalDriveIOCTL, IOCTL_GET_VERSION,
                               NULL, 0, &VersionParams,
                               sizeof(VersionParams),
                               &cbBytesReturned, NULL) )
	   {        
          if (VersionParams.bIDEDeviceMap > 0)
		  {
              BYTE             bIDCmd = 0;   // IDE或者ATAPI識別命令
              SENDCMDINPARAMS  scip;
 
              // 如果驅動器是光驅,采用命令IDE_ATAPI_IDENTIFY, command,
              // 否則采用命令IDE_ATA_IDENTIFY讀取驅動器信息
              bIDCmd = (VersionParams.bIDEDeviceMap >> drive & 0x10)?
                      IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY;

              memset (&scip, 0, sizeof(scip));
              memset (IdOutCmd, 0, sizeof(IdOutCmd));
              // 獲取驅動器信息
              if (WinNTGetIDEHDInfo (hPhysicalDriveIOCTL, 
                                      &scip, 
                                      (PSENDCMDOUTPARAMS)&IdOutCmd, 
                                      (BYTE) bIDCmd,
                                      (BYTE) drive,
                                      &cbBytesReturned))
			  {
                  int m = 0;
                  USHORT *pIdSector = (USHORT *)
                             ((PSENDCMDOUTPARAMS) IdOutCmd) -> bBuffer;

                  for (m = 0; m < 256; m++)
                       buffer[m] = pIdSector [m];
                  bFlag = TRUE;  // 讀取硬盤信息成功
			  }
		  }
	   }
       CloseHandle (hPhysicalDriveIOCTL);  // 關閉句柄
   }
   return bFlag;
}

// WindowsNT/2000/XP系統下讀取SCSI硬盤序列號
BOOL CGetHDSerial::WinNTReadSCSIHDSerial (DWORD * buffer)
{	
      buffer[0]='\n';
      int controller = 0;
      HANDLE hScsiDriveIOCTL = 0;
      char   driveName [256];
      sprintf (driveName, "\\\\.\\Scsi%d:", controller);
     //  Windows NT/2000/XP下任何權限都可以進行
      hScsiDriveIOCTL = CreateFile (driveName,
                               GENERIC_READ | GENERIC_WRITE, 
                               FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
                               OPEN_EXISTING, 0, NULL);
 
      if (hScsiDriveIOCTL != INVALID_HANDLE_VALUE)
      {
         int drive = 0;
         DWORD dummy;
         for (drive = 0; drive < 2; drive++)
         {
            char buffer [sizeof (SRB_IO_CONTROL) + SENDIDLENGTH];
            SRB_IO_CONTROL *p = (SRB_IO_CONTROL *) buffer;
            SENDCMDINPARAMS *pin =
                   (SENDCMDINPARAMS *) (buffer + sizeof (SRB_IO_CONTROL));           
            // 準備參數
            memset (buffer, 0, sizeof (buffer));
            p -> HeaderLength = sizeof (SRB_IO_CONTROL);
            p -> Timeout = 10000;
            p -> Length = SENDIDLENGTH;
            p -> ControlCode = IOCTL_SCSI_MINIPORT_IDENTIFY;
            strncpy ((char *) p -> Signature, "SCSIDISK", 8);  
            pin -> irDriveRegs.bCommandReg = IDE_ATA_IDENTIFY;
            pin -> bDriveNumber = drive;
            // 得到SCSI硬盤信息
            if (DeviceIoControl (hScsiDriveIOCTL, IOCTL_SCSI_MINIPORT, 
                                 buffer,
                                 sizeof (SRB_IO_CONTROL) +
                                         sizeof (SENDCMDINPARAMS) - 1,
                                 buffer,
                                 sizeof (SRB_IO_CONTROL) + SENDIDLENGTH,
                                 &dummy, NULL))
            {
               SENDCMDOUTPARAMS *pOut =
                    (SENDCMDOUTPARAMS *) (buffer + sizeof (SRB_IO_CONTROL));
               IDSECTOR *pId = (IDSECTOR *) (pOut -> bBuffer);
               if (pId -> sModelNumber [0])
               {
                  int n = 0;
                  USHORT *pIdSector = (USHORT *) pId;
          
                  for (n = 0; n < 256; n++)
                      buffer[n] =pIdSector [n];
                  return TRUE;  // 讀取成功                               
			   }
            }
		 }
         CloseHandle (hScsiDriveIOCTL);  // 關閉句柄
	  }
   return FALSE;   // 讀取失敗
}

// Windows NT/2000/XP下讀取IDE設備信息
BOOL CGetHDSerial::WinNTGetIDEHDInfo (HANDLE hPhysicalDriveIOCTL, PSENDCMDINPARAMS pSCIP,
                 PSENDCMDOUTPARAMS pSCOP, BYTE bIDCmd, BYTE bDriveNum,
                 PDWORD lpcbBytesReturned)
{
   // 為讀取設備信息準備參數
   pSCIP -> cBufferSize = IDENTIFY_BUFFER_SIZE;
   pSCIP -> irDriveRegs.bFeaturesReg = 0;
   pSCIP -> irDriveRegs.bSectorCountReg = 1;
   pSCIP -> irDriveRegs.bSectorNumberReg = 1;
   pSCIP -> irDriveRegs.bCylLowReg = 0;
   pSCIP -> irDriveRegs.bCylHighReg = 0;

   // 計算驅動器位置
   pSCIP -> irDriveRegs.bDriveHeadReg = 0xA0 | ((bDriveNum & 1) << 4);

   // 設置讀取命令
   pSCIP -> irDriveRegs.bCommandReg = bIDCmd;
   pSCIP -> bDriveNumber = bDriveNum;
   pSCIP -> cBufferSize = IDENTIFY_BUFFER_SIZE;
   
   // 讀取驅動器信息
   return ( DeviceIoControl (hPhysicalDriveIOCTL, IOCTL_GET_DRIVE_INFO,
               (LPVOID) pSCIP,
               sizeof(SENDCMDINPARAMS) - 1,
               (LPVOID) pSCOP,
               sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1,
               lpcbBytesReturned, NULL) );
}




?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人午夜视频在线观看| 欧美va天堂va视频va在线| 成人免费va视频| 国产传媒日韩欧美成人| 国产乱妇无码大片在线观看| 日韩精品一级二级 | 欧美国产日韩精品免费观看| 2021中文字幕一区亚洲| 精品国产一区二区三区av性色 | 亚洲影视资源网| 亚洲成国产人片在线观看| 午夜精品久久久久久久久久久 | 日韩电影一区二区三区| 麻豆成人免费电影| 成人小视频在线| 欧美视频在线观看一区二区| 正在播放一区二区| 久久丝袜美腿综合| 亚洲欧美乱综合| 视频一区二区国产| 国产91色综合久久免费分享| 91视频国产资源| 日韩视频免费直播| 综合激情成人伊人| 日韩1区2区日韩1区2区| 成年人国产精品| 91精品久久久久久久久99蜜臂| 精品国产一区二区三区av性色| 亚洲少妇30p| 麻豆一区二区三| 99久久久免费精品国产一区二区| 欧美人牲a欧美精品| 国产人成亚洲第一网站在线播放 | 免费欧美在线视频| 99国产精品国产精品久久| 在线成人av影院| 最近日韩中文字幕| 久久精品久久精品| 欧美性猛交xxxxxx富婆| 国产精品午夜免费| 久久成人精品无人区| 91精品办公室少妇高潮对白| 精品国产1区二区| 天堂va蜜桃一区二区三区漫画版| 成人免费视频视频| 精品国精品国产| 五月天视频一区| 91久久奴性调教| 国产精品国产自产拍高清av王其 | 欧美亚洲综合另类| 亚洲国产高清在线| 国产一区二区三区高清播放| 欧美亚洲动漫制服丝袜| 日韩一区在线播放| 国产成人h网站| 久久天天做天天爱综合色| 亚洲国产一区二区在线播放| av激情综合网| 国产精品久久久久桃色tv| 韩国v欧美v亚洲v日本v| 欧美一级艳片视频免费观看| 亚洲国产中文字幕在线视频综合| 91伊人久久大香线蕉| 国产精品丝袜一区| 成人亚洲一区二区一| 国产日韩欧美精品一区| 国产成人在线视频免费播放| 精品奇米国产一区二区三区| 日本vs亚洲vs韩国一区三区 | 精品精品欲导航| 精品一区二区三区视频| 欧美r级在线观看| 久久综合综合久久综合| 日韩精品一区二区三区在线观看| 美腿丝袜亚洲三区| 亚洲精品在线电影| 国产尤物一区二区在线| 久久久99免费| av在线这里只有精品| 国产精品二区一区二区aⅴ污介绍| 成人激情文学综合网| 最好看的中文字幕久久| 欧美艳星brazzers| 日韩黄色小视频| 精品国产乱子伦一区| 粉嫩欧美一区二区三区高清影视| 国产精品女主播在线观看| 99久久99久久免费精品蜜臀| 一区二区三区精品久久久| 欧美日韩国产精选| 久草在线在线精品观看| 欧美v日韩v国产v| 国产精品88888| 亚洲伦理在线免费看| 91精品国产综合久久久久久久| 麻豆精品一区二区| 中文字幕五月欧美| 欧美老人xxxx18| 国产精品综合久久| 亚洲欧美日韩中文播放| 日韩一区二区精品| 国产精品中文字幕一区二区三区| 亚洲三级小视频| 日韩午夜激情av| 色综合久久久久综合体桃花网| 亚洲h精品动漫在线观看| 久久婷婷久久一区二区三区| caoporn国产一区二区| 三级在线观看一区二区| 国产欧美一区二区精品性| 欧美在线啊v一区| 国产精品一区二区在线播放| 一区二区三区在线观看网站| 精品88久久久久88久久久| 一本色道久久综合狠狠躁的推荐| 免费观看一级特黄欧美大片| 国产精品国产三级国产三级人妇| 91精品国产综合久久福利 | 88在线观看91蜜桃国自产| 国产99久久久国产精品免费看| 午夜精品在线看| 亚洲三级在线免费| 国产欧美日韩综合| 日韩一级片在线播放| 一本久久a久久精品亚洲| 丁香激情综合国产| 国产自产v一区二区三区c| 亚洲bdsm女犯bdsm网站| 亚洲欧美怡红院| 国产午夜精品一区二区三区视频| 717成人午夜免费福利电影| 91福利视频久久久久| 国产成人精品一区二区三区四区 | 国产一区二区网址| 日本亚洲天堂网| 亚洲高清免费观看 | 一区二区三区在线免费播放| 亚洲国产激情av| 国产清纯美女被跳蛋高潮一区二区久久w| 天涯成人国产亚洲精品一区av| 中文在线一区二区| 26uuu久久天堂性欧美| 欧美日韩国产另类不卡| 9l国产精品久久久久麻豆| 丁香婷婷深情五月亚洲| 成人免费高清视频在线观看| 国产成人精品www牛牛影视| 国产一区二区0| 国产福利一区二区三区在线视频| 激情综合色综合久久综合| 蜜桃视频在线观看一区二区| 免费观看在线色综合| 国产专区综合网| 国精产品一区一区三区mba视频 | 91国在线观看| 欧美亚洲综合网| 欧美福利视频导航| 日韩一级片在线观看| 欧美精品一区二区三区四区| 久久久午夜精品| 国产精品久久久久毛片软件| 亚洲欧洲日韩综合一区二区| 亚洲三级电影网站| 亚洲成人资源网| 久久精品国产亚洲a| 国产激情91久久精品导航| 波多野结衣中文字幕一区| 日本韩国视频一区二区| 精品视频一区三区九区| 日韩美女视频在线| 国产亚洲精品中文字幕| 亚洲色图清纯唯美| 五月婷婷综合激情| 国产精品一区2区| 91麻豆蜜桃一区二区三区| 91精品中文字幕一区二区三区| 精品国产乱码久久久久久夜甘婷婷 | 国产在线视频不卡二| 精品一区中文字幕| 福利电影一区二区三区| 色偷偷一区二区三区| 91精品国产欧美一区二区成人| 欧美精品一区二区高清在线观看| 欧美国产一区在线| 亚洲综合一区二区精品导航| 九九精品视频在线看| 99久久国产综合精品色伊| 欧美一区二区视频网站| 日本一二三不卡| 日韩影院在线观看| 99精品视频在线观看免费| 日韩欧美国产午夜精品| 亚洲欧洲www| 国内偷窥港台综合视频在线播放| 97精品视频在线观看自产线路二| 3d成人动漫网站| 亚洲品质自拍视频网站| 国产乱码字幕精品高清av| 宅男在线国产精品| 亚洲欧洲综合另类在线|