资源简介
支持 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
- 上一篇:sysbench 0.5
- 下一篇:用FCM与KFCM处理脑部图像
评论
共有 条评论