• 大小: 5KB
    文件类型: .rar
    金币: 2
    下载: 1 次
    发布日期: 2021-10-09
  • 语言: 其他
  • 标签:

资源简介

支持 Windows 9x/ME/Windows NT/2000/XP/WIN7 下读取硬盘序列号,支持IDE/SCSI硬盘,在WIN7下需要管理员身份运行

资源截图

代码片段和文件信息

// 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_s(m_buffer _countof(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_s(m_buffer _countof(m_b

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件        132  2010-04-22 15:18  如何调用.txt

     文件      11274  2009-12-28 14:12  GetHDSerial.cpp

     文件       4801  2009-10-23 08:33  GetHDSerial.h

----------- ---------  ---------- -----  ----

                16207                    3


评论

共有 条评论