static int WaitIde() { int al; while ((al=inp(0x1F7)) >=0x80) ; return al; } static void ReadIDE() { int al; int i; WORD pw[256]; WaitIde(); outp(0x1F6,0xA0); al = WaitIde(); if ((al&0x50)!=0x50) return; outp(0x1F6,0xA0); outp(0x1F7,0xEC); al = WaitIde(); if ((al&0x58)!=0x58) return; for (i=0;i< 256;i++) pw[i] = inpw(0x1F0); }
以下是vb代码一样的自己读吧. ------------------------------------------------------------------------------ VERSION 1.0 CLASS BEGIN MultiUse = -1 'True Persistable = 0 'NotPersistable DataBindingBehavior = 0 'vbNone DataSourceBehavior = 0 'vbNone MTSTransactionMode = 0 'NotAnMTSObject END Attribute VB_Name = "CDiskInfo" Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = True Attribute VB_PredeclaredId = False Attribute VB_Exposed = False Option Explicit'--------------------------------------------------------------------------' 模 块: 取磁盘硬件信息处理类' 版 本: 1.0' 文件名: CDiskInfo.cls' 作者: 林天炮' 修改日期:2003-03-13'' 功能说明:获取硬盘序列号、型号、磁道扇区信息等' 版权说明:此为共享代码,根据微软提供的例程改编,可以任意修改及使用,' 作者对此模块运行所引起的错误不承担任何责任。'' 引用此模块时须保留作者署名,有意见或错误请发送至[email protected]'' 注意事项:支持Windows 95 OSR2, Windows 98, Windows NT, Windows 2000' XP没有测试,估计没问题,在Win9X下必须保证存在SMARTVSD.vxd'--------------------------------------------------------------------------'/****************************************************************************'* *'* THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY *'* KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE *'* IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR *'* PURPOSE. *'* *'* Copyright 1993-98 Microsoft Corporation. All Rights Reserved. *'* *'****************************************************************************/Private Const MAX_IDE_DRIVES As Long = 4 ' Max number of drives assuming primary/secondary, master/slave topologyPrivate Const READ_ATTRIBUTE_BUFFER_SIZE As Long = 512Private Const IDENTIFY_BUFFER_SIZE As Long = 512Private Const READ_THRESHOLD_BUFFER_SIZE As Long = 512'' IOCTL commands'Private Const DFP_GET_VERSION As Long = &H74080Private Const DFP_SEND_DRIVE_COMMAND As Long = &H7C084Private Const DFP_RECEIVE_DRIVE_DATA As Long = &H7C088'---------------------------------------------------------------------' GETVERSIONOUTPARAMS contains the data returned from the' Get Driver Version function.'---------------------------------------------------------------------Private Type GETVERSIONOUTPARAMS bVersion As Byte ' Binary driver version. bRevision As Byte ' Binary driver revision. bReserved As Byte ' Not used. bIDEDeviceMap As Byte ' Bit map of IDE devices. fCapabilities As Long ' Bit mask of driver capabilities. dwReserved(3) As Long ' For future use.End Type
'' Bits returned in the fCapabilities member of GETVERSIONOUTPARAMS'Private Const CAP_IDE_ID_FUNCTION As Long = 1 ' ATA ID command supportedPrivate Const CAP_IDE_ATAPI_ID As Long = 2 ' ATAPI ID command supportedPrivate Const CAP_IDE_EXECUTE_SMART_FUNCTION As Long = 4 ' SMART commannds supported'---------------------------------------------------------------------' IDE registers'---------------------------------------------------------------------Private Type IDEREGS bFeaturesReg As Byte ' Used for specifying SMART "commands". bSectorCountReg As Byte ' IDE sector count register bSectorNumberReg As Byte ' IDE sector number register bCylLowReg As Byte ' IDE low order cylinder value bCylHighReg As Byte ' IDE high order cylinder value bDriveHeadReg As Byte ' IDE drive/head register bCommandReg As Byte ' Actual IDE command. bReserved As Byte ' reserved for future use. Must be zero.End Type'---------------------------------------------------------------------' SENDCMDINPARAMS contains the input parameters for the' Send Command to Drive function.'---------------------------------------------------------------------Private Type SENDCMDINPARAMS cBufferSize As Long ' Buffer size in bytes irDriveRegs As IDEREGS ' Structure with drive register values. bDriveNumber As Byte ' Physical drive number to send ' command to (0,1,2,3). bReserved(2) As Byte ' Reserved for future expansion. dwReserved(3) As Long ' For future use. bBuffer(0) As Byte ' Input buffer.End Type'' Valid values for the bCommandReg member of IDEREGS.'Private Const IDE_ATAPI_ID As Long = &HA1 ' Returns ID sector for ATAPI.Private Const IDE_ID_FUNCTION As Long = &HEC ' Returns ID sector for ATA.Private Const IDE_EXECUTE_SMART_FUNCTION As Long = &HB0 ' Performs SMART cmd. ' Requires valid bFeaturesReg, ' bCylLowReg, and bCylHighReg'' Cylinder register values required when issuing SMART command'Private Const SMART_CYL_LOW As Long = &H4FPrivate Const SMART_CYL_HI As Long = &HC2'---------------------------------------------------------------------' Status returned from driver'---------------------------------------------------------------------Private Type DRIVERSTATUS bDriverError As Byte ' Error code from driver, ' or 0 if no error. bIDEStatus As Byte ' Contents of IDE Error register. ' Only valid when bDriverError ' is SMART_IDE_ERROR. bReserved(1) As Byte ' Reserved for future expansion. dwReserved(1) As Long ' Reserved for future expansion.End Type'' bDriverError values'Private Const SMART_NO_ERROR As Long = 0 ' No errorPrivate Const SMART_IDE_ERROR As Long = 1 ' Error from IDE controllerPrivate Const SMART_INVALID_FLAG As Long = 2 ' Invalid command flagPrivate Const SMART_INVALID_COMMAND As Long = 3 ' Invalid command bytePrivate Const SMART_INVALID_BUFFER As Long = 4 ' Bad buffer (null, invalid addr..)Private Const SMART_INVALID_DRIVE As Long = 5 ' Drive number not validPrivate Const SMART_INVALID_IOCTL As Long = 6 ' Invalid IOCTLPrivate Const SMART_ERROR_NO_MEM As Long = 7 ' Could not lock user's bufferPrivate Const SMART_INVALID_REGISTER As Long = 8 ' Some IDE Register not validPrivate Const SMART_NOT_SUPPORTED As Long = 9 ' Invalid cmd flag setPrivate Const SMART_NO_IDE_DEVICE As Long = 10 ' Cmd issued to device not present ' although drive number is valid' 11-255 reserved'---------------------------------------------------------------------' Structure returned by SMART IOCTL for several commands'---------------------------------------------------------------------Private Type SENDCMDOUTPARAMS cBufferSize As Long ' Size of bBuffer in bytes drvStatus As DRIVERSTATUS ' Driver status structure. bBuffer(0) As Byte ' Buffer of arbitrary length in which to store the data read from the ' drive.End Type'---------------------------------------------------------------------' Feature register defines for SMART "sub commands"'---------------------------------------------------------------------Private Const SMART_READ_ATTRIBUTE_VALUES As Long = &HD0 ' ATA4: Renamed ' SMART READ DATAPrivate Const SMART_READ_ATTRIBUTE_THRESHOLDS As Long = &HD1 ' Obsoleted in ATA4!Private Const SMART_ENABLE_DISABLE_ATTRIBUTE_AUTOSAVE As Long = &HD2Private Const SMART_SAVE_ATTRIBUTE_VALUES As Long = &HD3Private Const SMART_EXECUTE_OFFLINE_IMMEDIATE As Long = &HD4 ' ATA4' Vendor specific commands:Private Const SMART_ENABLE_SMART_OPERATIONS As Long = &HD8Private Const SMART_DISABLE_SMART_OPERATIONS As Long = &HD9Private Const SMART_RETURN_SMART_STATUS As Long = &HDA'---------------------------------------------------------------------' The following structure defines the structure of a Drive Attribute'---------------------------------------------------------------------Private Type DRIVEATTRIBUTE bAttrID As Byte ' Identifies which attribute wStatusFlags As Integer ' see bit definitions below bAttrValue As Byte ' Current normalized value bWorstValue As Byte ' How bad has it ever been? bRawValue(5) As Byte ' Un-normalized value bReserved As Byte ' ...End Type
'---------------------------------------------------------------------' The following structure defines the structure of a Warranty Threshold' Obsoleted in ATA4!'---------------------------------------------------------------------Private Type ATTRTHRESHOLD bAttrID As Byte ' Identifies which attribute bWarrantyThreshold As Byte ' Triggering value bReserved(9) As Byte ' ...End Type'---------------------------------------------------------------------' The following struct defines the interesting part of the IDENTIFY' buffer:'---------------------------------------------------------------------Private Type IDSECTOR wGenConfig As Integer wNumCyls As Integer wReserved As Integer wNumHeads As Integer wBytesPerTrack As Integer wBytesPerSector As Integer wSectorsPerTrack As Integer wVendorUnique(2) As Integer sSerialNumber(19) As Byte wBufferType As Integer wBufferSize As Integer wECCSize As Integer sFirmwareRev(7) As Byte sModelNumber(39) As Byte wMoreVendorUnique As Integer wDoubleWordIO As Integer wCapabilities As Integer wReserved1 As Integer wPIOTiming As Integer wDMATiming As Integer wBS As Integer wNumCurrentCyls As Integer wNumCurrentHeads As Integer wNumCurrentSectorsPerTrack As Integer ulCurrentSectorCapacity As Long wMultSectorStuff As Integer ulTotalAddressableSectors As Long wSingleWordDMA As Integer wMultiWordDMA As Integer bReserved(127) As ByteEnd Type'---------------------------------------------------------------------' Valid Attribute IDs'---------------------------------------------------------------------Private Const ATTR_INVALID As Long = 0Private Const ATTR_READ_ERROR_RATE As Long = 1Private Const ATTR_THROUGHPUT_PERF As Long = 2Private Const ATTR_SPIN_UP_TIME As Long = 3Private Const ATTR_START_STOP_COUNT As Long = 4Private Const ATTR_REALLOC_SECTOR_COUNT As Long = 5Private Const ATTR_READ_CHANNEL_MARGIN As Long = 6Private Const ATTR_SEEK_ERROR_RATE As Long = 7Private Const ATTR_SEEK_TIME_PERF As Long = 8Private Const ATTR_POWER_ON_HRS_COUNT As Long = 9Private Const ATTR_SPIN_RETRY_COUNT As Long = 10Private Const ATTR_CALIBRATION_RETRY_COUNT As Long = 11Private Const ATTR_POWER_CYCLE_COUNT As Long = 12'---------------------------------------------------------------------' Status Flags Values'---------------------------------------------------------------------Private Const PRE_FAILURE_WARRANTY As Long = &H1Private Const ON_LINE_COLLECTION As Long = &H2Private Const PERFORMANCE_ATTRIBUTE As Long = &H4Private Const ERROR_RATE_ATTRIBUTE As Long = &H8Private Const EVENT_COUNT_ATTRIBUTE As Long = &H10Private Const SELF_PRESERVING_ATTRIBUTE As Long = &H20Private Const NUM_ATTRIBUTE_STRUCTS As Long = 30Private Const INVALID_HANDLE_VALUE = -1Private Const VER_PLATFORM_WIN32s = 0Private Const VER_PLATFORM_WIN32_WINDOWS = 1Private Const VER_PLATFORM_WIN32_NT = 2Private Type OSVERSIONINFO dwOSVersionInfoSize As Long dwMajorVersion As Long dwMinorVersion As Long dwBuildNumber As Long dwPlatformId As Long szCSDVersion As String * 128 ' Maintenance string for PSS usageEnd TypePrivate Declare Function GetVersionEx Lib "KERNEL32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As LongPrivate Const CREATE_NEW = 1Private Const GENERIC_READ = &H80000000Private Const GENERIC_WRITE = &H40000000Private Const FILE_SHARE_READ = &H1Private Const FILE_SHARE_WRITE = &H2Private Const OPEN_EXISTING = 3Private Declare Function CreateFile Lib "KERNEL32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As LongPrivate Declare Function DeviceIoControl Lib "KERNEL32" (ByVal hDevice As Long, ByVal dwIoControlCode As Long, lpInBuffer As Any, ByVal nInBufferSize As Long, lpOutBuffer As Any, ByVal nOutBufferSize As Long, lpBytesReturned As Long, ByVal lpOverlapped As Long) As LongPrivate Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)Private Declare Function CloseHandle Lib "KERNEL32" (ByVal hObject As Long) As Long'' Define global buffers.'Private m_DiskInfo As IDSECTOR'---------------------------------------------------------------------' Open SMART to allow DeviceIoControl communications.'---------------------------------------------------------------------Private Function OpenSMART(ByVal nDrive As Byte) As Long Dim hSMARTIOCTL As Long hSMARTIOCTL = INVALID_HANDLE_VALUE Dim hd As String Dim VersionInfo As OSVERSIONINFO VersionInfo.dwOSVersionInfoSize = Len(VersionInfo) GetVersionEx VersionInfo Select Case VersionInfo.dwPlatformId Case VER_PLATFORM_WIN32s OpenSMART = hSMARTIOCTL Case VER_PLATFORM_WIN32_WINDOWS ' Version Windows 95 OSR2, Windows 98 hSMARTIOCTL = CreateFile("\\.\SMARTVSD", 0, 0, 0, CREATE_NEW, 0, 0) Case VER_PLATFORM_WIN32_NT ' Windows NT, Windows 2000 If nDrive < MAX_IDE_DRIVES Then hd = "\\.\PhysicalDrive" & nDrive hSMARTIOCTL = CreateFile(hd, GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0) End If End Select OpenSMART = hSMARTIOCTLEnd Function
GetVolumeInformation("c:\\",NULL,12,&VolumeSerialNumber,NULL,NULL,NULL,10);
这样就得到了C盘的序列号,保存在VolumSerialNumber中了
{
int al;
while ((al=inp(0x1F7)) >=0x80) ;
return al;
}
static void ReadIDE()
{
int al;
int i;
WORD pw[256];
WaitIde();
outp(0x1F6,0xA0);
al = WaitIde();
if ((al&0x50)!=0x50) return;
outp(0x1F6,0xA0);
outp(0x1F7,0xEC);
al = WaitIde();
if ((al&0x58)!=0x58) return;
for (i=0;i< 256;i++)
pw[i] = inpw(0x1F0);
}
------------------------------------------------------------------------------
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
Persistable = 0 'NotPersistable
DataBindingBehavior = 0 'vbNone
DataSourceBehavior = 0 'vbNone
MTSTransactionMode = 0 'NotAnMTSObject
END
Attribute VB_Name = "CDiskInfo"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Option Explicit'--------------------------------------------------------------------------' 模 块: 取磁盘硬件信息处理类' 版 本: 1.0' 文件名: CDiskInfo.cls' 作者: 林天炮' 修改日期:2003-03-13'' 功能说明:获取硬盘序列号、型号、磁道扇区信息等' 版权说明:此为共享代码,根据微软提供的例程改编,可以任意修改及使用,' 作者对此模块运行所引起的错误不承担任何责任。'' 引用此模块时须保留作者署名,有意见或错误请发送至[email protected]'' 注意事项:支持Windows 95 OSR2, Windows 98, Windows NT, Windows 2000' XP没有测试,估计没问题,在Win9X下必须保证存在SMARTVSD.vxd'--------------------------------------------------------------------------'/****************************************************************************'* *'* THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY *'* KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE *'* IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR *'* PURPOSE. *'* *'* Copyright 1993-98 Microsoft Corporation. All Rights Reserved. *'* *'****************************************************************************/Private Const MAX_IDE_DRIVES As Long = 4 ' Max number of drives assuming primary/secondary, master/slave topologyPrivate Const READ_ATTRIBUTE_BUFFER_SIZE As Long = 512Private Const IDENTIFY_BUFFER_SIZE As Long = 512Private Const READ_THRESHOLD_BUFFER_SIZE As Long = 512'' IOCTL commands'Private Const DFP_GET_VERSION As Long = &H74080Private Const DFP_SEND_DRIVE_COMMAND As Long = &H7C084Private Const DFP_RECEIVE_DRIVE_DATA As Long = &H7C088'---------------------------------------------------------------------' GETVERSIONOUTPARAMS contains the data returned from the' Get Driver Version function.'---------------------------------------------------------------------Private Type GETVERSIONOUTPARAMS bVersion As Byte ' Binary driver version. bRevision As Byte ' Binary driver revision. bReserved As Byte ' Not used. bIDEDeviceMap As Byte ' Bit map of IDE devices. fCapabilities As Long ' Bit mask of driver capabilities. dwReserved(3) As Long ' For future use.End Type
http://vip.6to23.com/NowCan1/tech/vb_hd_info.htm
http://vip.6to23.com/NowCan1/code/hd_info.zip
www.jiaxinda.com/dont_delete/98及2K取硬盘id号_类.exe